{"id":25591213,"url":"https://github.com/jusito/docker-ttt","last_synced_at":"2025-04-12T23:12:50.619Z","repository":{"id":45197575,"uuid":"148993249","full_name":"jusito/docker-ttt","owner":"jusito","description":"GMOD TTT server image","archived":false,"fork":false,"pushed_at":"2024-06-29T13:48:55.000Z","size":88,"stargazers_count":24,"open_issues_count":5,"forks_count":9,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-12T23:12:32.090Z","etag":null,"topics":["gmod","gmod-server","lgsm","ttt2","tttt"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/r/jusito/docker-ttt","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jusito.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-16T12:26:24.000Z","updated_at":"2025-03-10T17:23:30.000Z","dependencies_parsed_at":"2025-02-21T09:50:46.169Z","dependency_job_id":"fd933d8c-3735-40f8-b5bc-3f55bbf6f6de","html_url":"https://github.com/jusito/docker-ttt","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jusito%2Fdocker-ttt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jusito%2Fdocker-ttt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jusito%2Fdocker-ttt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jusito%2Fdocker-ttt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jusito","download_url":"https://codeload.github.com/jusito/docker-ttt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248643005,"owners_count":21138355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gmod","gmod-server","lgsm","ttt2","tttt"],"created_at":"2025-02-21T09:50:37.859Z","updated_at":"2025-04-12T23:12:50.597Z","avatar_url":"https://github.com/jusito.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GMOD TTT\nGMOD TTT server image, https://hub.docker.com/r/jusito/\n\n## Important\nIf you use the old image, you should check the environment variables. For example arguments after image name aren't used, use instead `-e SERVER_ADDITIONAL_PARAMETERS=...`.\nThis readme may not be perfect, if you struggle at some point or you see incorrect informations create an issue at git please.\n\n## Getting Started\n### Prepare your server content\n1. Create public workshop collection without maps, dummy ID:=123456. Use `-e WORKSHOP_COLLECTION_ID 123456`.\n2. Create public workshop collection with maps and add this one to \"123456\".\n3. Do you want every user to load the content automatically? Yes you are done, no `-e WORKSHOP_AUTOLOAD=false`. Remember that \"false\" mean, that every user has to manually subscribe to your collection. If you don't separate maps / others, every connecting user would load all maps on first connecting. This would be a pain for some.\n4. Do your content needs CSS, HL2, HLDM, TF2? Use `-e INSTALL_CSS=true` and/or `-e INSTALL_HL2=true` and so on. Most content will need at least CSS.\n\n### Server config\n1. Pick your ports `-e SERVER_PORT=27015 -p 27015:27015/udp` both are always needed. For RCON `[...] -e SERVER_RCON_PASSWORD=\"verySecure\" -p 27015:27015/tcp`.\n2. Set environment variables like servername `-e SERVER_NAME=\"My Server\"`, password `-e SERVER_PASSWORD=\"securepw\"` and timezone for cron `-e TZ=\"Europe/Berlin\"`, default short downtime at Sunday 10 o'clock.\n3. Choose startmap (can be from workshop collection, even linked) `-e SERVER_DEFAULT_MAP=ttt_rooftops_2016_v1` and max players `-e SERVER_MAX_PLAYERS=20`\n4. Get a volume name `-v TTTDev:/home/steam/serverfiles`\n\n### run example without rcon\nIf you need rcon only sometimes, use ulx with this config.\n\n```\ndocker run -d \\\n -p 27015:27015/udp \\\n -e SERVER_PORT=27015 \\\n -e INSTALL_CSS=true \\\n -e WORKSHOP_COLLECTION_ID=123456 \\\n -e SERVER_NAME=\"My Server\" \\\n -e SERVER_PASSWORD=\"securepw\" \\\n -e SERVER_DEFAULT_MAP=\"ttt_lttp_kakariko_a5\" \\\n -v TTTDev:/home/steam/serverfiles \\\n --name \"MyTTTServer\" \\\n jusito/docker-ttt:gmod_ttt_debian\n```\n\n### run example with rcon\n```\ndocker run -d \\\n -p 27015:27015/udp \\\n -e SERVER_PORT=27015 \\\n -e INSTALL_CSS=true \\\n -e WORKSHOP_COLLECTION_ID=123456 \\\n -e SERVER_NAME=\"My Server\" \\\n -e SERVER_PASSWORD=\"securepw\" \\\n -e SERVER_DEFAULT_MAP=\"ttt_lttp_kakariko_a5\" \\\n -v TTTDev:/home/steam/serverfiles \\\n -p 27015:27015/tcp \\\n -e SERVER_RCON_PASSWORD=\"securePW\" \\\n --name \"MyTTTServer\" \\\n jusito/docker-ttt:gmod_ttt_debian\n```\n\n## Tags\n* lgsm\\_debian - Linux Game Server Manager in Debian\n* gmod\\_debian - Garrys Mod with Debian and LGSM\n* gmod\\_ttt\\_debian - Gamemode TTT with LGSM/Debian\n\n## Environment Variables\nBecause you will most likely use many environmental variables, I recommend a env list. Instead of `-e VARNAME=\"VALUE 1\"` write one additional text file:\n\nTTT.env:\n\n```\nVARNAME=Value 1\nSERVER_NAME=My Hood\nSERVER_PASSWORD=Secure_PW\n```\n### LGSM Properties\n#### Free to change\n|Name|Default|Description|\n|----|-------|-----------|\n|CRON\\_MONITOR|\"\\*/5 \\* \\* \\* \\*\"|Every 5 minutes LGSM checks if the server is running and responding, rebooting if needed.|\n|CRON\\_UPDATE|\"\\*/30 \\* \\* \\* \\*\"|Every 30 minutes LGSM checks if game server needs an update which will be executed.|\n|CRON\\_FORCE\\_UPDATE|\"0 10 \\* \\* 0\"|At Sunday 10:00 force update and restart|\n|CRON\\_LOG_ROTATE|\"0 9 \\* \\* 0\"|Rotate log at Stunday 9:00|\n|TZ|Europe/Berlin|[Set timezone for CRON / log](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)|\n\n#### Used for subimage\n|Name|Default|Description|\n|----|-------|-----------|\n|SERVER_EXECUTABLE|\"\"|Name of the lgsm script after installation|\n|SERVER_GAME|\"\"|LGSM name of installation|\n\n#### LGSM Internal\n\u003cdetails\u003e\u003csummary\u003eLGSM Internal Properties (click me)\u003c/summary\u003e\n\u003cp\u003e\n\n|Name|Default|Description|\n|----|-------|-----------|\n|STEAM_PATH|/home/steam|primary workdir, homedir of user|\n|SERVER_PATH|/home/steam/serverfiles|Path to serverfiles after installation|\n|STEAM_CMD|/home/steam/steamcmd|Path to steamcmd files|\n|GROUP_ID|10000|Group ID of the user|\n|USER_ID|10000|User ID of the user|\n|DOCKER_USER|steam|Name of the user|\n|SUPERCRONIC_URL|https://github.com/aptible/supercronic/releases/download/v0.1.9/supercronic-linux-amd64|CRON version|\n|SUPERCRONIC|supercronic-linux-amd64|CRON name after download|\n|SUPERCRONIC_SHA1SUM|5ddf8ea26b56d4a7ff6faecdd8966610d5cb9d85|CRC for CRON download|\n|DEBIAN_FRONTEND|noninteractive|Don't ask questions during installation|\n|LANG|C.UTF-8|Language set|\n|TERM|xterm||\n|DEBUGGING|false||\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n### GMOD Properties\n#### GMOD Content\n|Name|Default|Description|\n|----|-------|-----------|\n|INSTALL\\_CSS|false|Should I install and mount CSS?|\n|INSTALL\\_HL2|false|Should I install and mount HL2?|\n|INSTALL\\_HLDM|false|Should I install and mount HLDM?|\n|INSTALL\\_TF2|false|Should I install and mount TF2?|\n|WORKSHOP\\_COLLECTION_ID|\"\"|Workshop Collection ID for the server. If you use AUTOLOAD you should add maps on a linked collection|\n|WORKSHOP\\_API_KEY|\"\"|Maybe needed for private content.|\n|WORKSHOP\\_AUTOLOAD|true|Every item which is on the given collection, will be downloaded by every client. Elements on linked collections not - so use maps in a linked collection.|\n\n#### GMOD Server\n|Name|Default|Description|\n|----|-------|-----------|\n|SERVER\\_NAME|LinuxGSM||\n|SERVER\\_PASSWORD|\"\"||\n|SERVER\\_RCON\\_PASSWORD|\"\"||\n|SERVER\\_VOICE\\_ENABLE|1||\n|SERVER\\_IP|0.0.0.0||\n|SERVER\\_PORT|27015||\n|SERVER\\_CLIENTPORT|27005||\n|SERVER\\_SOURCETVPORT|27020||\n|SERVER\\_DEFAULT\\_MAP|gm\\_construct||\n|SERVER\\_MAX\\_PLAYERS|16||\n|SERVER\\_TICKRATE|66||\n|SERVER\\_GAMEMODE|sandbox||\n|SERVER\\_LOGIN\\_TOKEN|\"\"||\n|SERVER\\_ADDITIONAL\\_PARAMETERS|-disableluarefresh||\n\t\n#### GMOD LGSM specific\nThese variables are untested, but if they dont work report it please too. [Documentation](https://docs.linuxgsm.com/alerts)\n\n|Name|Default|Description|\n|----|-------|-----------|\n|LGSM\\_DISPLAYIP|\"\"||\n|LGSM\\_POSTALERT|off||\n|LGSM\\_POSTDAYS|7||\n|LGSM\\_POSTTARGET|https://hastebin.com||\n|LGSM\\_DISCORDALERT|off||\n|LGSM\\_DISCORDWEBHOOK|webhook||\n|LGSM\\_EMAILALERT|off||\n|LGSM\\_EMAIL|email@example.com||\n|LGSM\\_EMAILFROM|\"\"||\n|LGSM\\_IFTTTALERT|off||\n|LGSM\\_IFTTTTOKEN|accesstoken||\n|LGSM\\_IFTTTEVENT|linuxgsm\\_alert||\n|LGSM\\_MAILGUNALERT|off||\n|LGSM\\_MAILGUNTOKEN|accesstoken||\n|LGSM\\_MAILGUNDOMAIN|example.com||\n|LGSM\\_MAILGUNEMAILFROM|alert@example.com||\n|LGSM\\_MAILGUNEMAIL|email@myemail.com||\n|LGSM\\_PUSHBULLETALERT|off||\n|LGSM\\_PUSHBULLETTOKEN|accesstoken||\n|LGSM\\_CHANNELTAG|\"\"||\n|LGSM\\_PUSHOVERALERT|off||\n|LGSM\\_PUSHOVERTOKEN|accesstoken||\n|LGSM\\_TELEGRAMALERT|off||\n|LGSM\\_TELEGRAMTOKEN|accesstoken||\n|LGSM\\_TELEGRAMCHATID|\"\"||\n|LGSM\\_CURLCUSTOMSTRING|\"\"||\n|LGSM\\_UPDATEONSTART|off||\n|LGSM\\_MAXBACKUPS|4||\n|LGSM\\_MAXBACKUPDAYS|30||\n|LGSM\\_STOPONBACKUP|on||\n|LGSM\\_CONSOLELOGGING|on||\n|LGSM\\_LOGDAYS|7||\n|LGSM\\_QUERYDELAY|5||\n|LGSM\\_BRANCH|\"\"||\n|LGSM\\_STEAMMASTER|true\"||\n\n#### GMOD Internal\n\u003cdetails\u003e\u003csummary\u003eGMOD Internal Properties (click me)\u003c/summary\u003e\n\u003cp\u003e\n\n|Name|Default|Description|\n|----|-------|-----------|\n|CSS_PATH|/home/steam/addons/css||\n|HL2_PATH|/home/steam/addons/hl2||\n|HLDM_PATH|/home/steam/addons/hldm||\n|TF2_PATH|/home/steam/addons/tf2||\n|SERVER_EXECUTABLE|gmodserver||\n|SERVER_GAME|gmodserver||\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n### TTT Properties\n#### TTT Internal Properties\n|Name|Default|Description|\n|----|-------|-----------|\n|SERVER_GAMEMODE|\"terrortown\"||\n\n## LGSM Usage\nThe container provides links to [LGSM commands](https://docs.linuxgsm.com/commands):\n* docker exec -it CONTAINER details // print various informations like passwords, name, players, status aso.\n* docker exec -it CONTAINER backup\n* docker exec -it CONTAINER console // let you view the current console, docker logs will not work\n* docker exec -it CONTAINER debug\n* docker exec -it CONTAINER force-update\n* docker exec -it CONTAINER install\n* docker exec -it CONTAINER monitor\n* docker exec -it CONTAINER postdetails\n* docker exec -it CONTAINER restart\n* docker exec -it CONTAINER start\n* docker exec -it CONTAINER stop\n* docker exec -it CONTAINER test-alert\n* docker exec -it CONTAINER update\n* docker exec -it CONTAINER update-lgsm\n* docker exec -it CONTAINER validate\n\n## File Locations\n### Volumes\n/home/steam/serverfiles\n\n### Other\nserver.cfg: /home/steam/serverfiles/garrysmod/cfg/gmodserver.cfg \\\nhostname, password, rcon password, voice enabled are managed / will be overwritten\n\n## server config\nhttp://ttt.badking.net/config-and-commands/convars\nhttps://wiki.garrysmod.de/server.cfg\n\nPath in container is:\ndocker cp \"your server.cfg path\" CONTAINER:/home/steam/serverfiles/garrysmod/cfg/gmodserver.cfg\n\n\n## Additional\n- Debian Buster, one dependency is missing: https://packages.debian.org/search?keywords=lib32tinfo5\n- Alpine, steamcmd doesn't like musl\n\n### TODO\n#### image improvements\n* volume for steam workshop\n* volume for other games\n* volume for gmod config (data folder)\n* AppArmor Profile\n\n#### image config, description needed\n* scrds doesn't like different internal / external ports (thats why no ports are exposed)\n* health check -\u003e details\n\n### For local usage\nnavigate to directory with readme.md\nbash test/testBuild.sh (sh doesn't like pipefail, escape if you want to use sh)\n\n\n## FTP Server\n* If your Volume is TTTDev\n* If you didn't change UserID / GroupID\n* If you want to connect to ftp://...:123 (ports 122/123 are free on your network)\n\n### For FileZilla\n\n```\ndocker run -d \\\n -e MY_NAME=\"docker\" -e MY_PASSWORD=\"MySecurePW\" \\\n -e MY_USER_ID=\"10000\" -e MY_GROUP_ID=\"10000\" \\\n -p 122:20 -p 123:21 -p 10090-10100:10090-10100 \\\n -v TTTDev:/home/docker/ \\\n jusito/vsftpd-alpine:simple\n```\n\n### For Windows Network Mount\n* IP of the Host (not container) 1.2.3.4\n* Mount: ftp://1.2.3.4:123\n\n```\ndocker run -d \\\n -e MY_NAME=\"docker\" -e MY_PASSWORD=\"MySecurePW\" \\\n -e MY_USER_ID=\"10000\" -e MY_GROUP_ID=\"10000\" \\\n -p 122:20 -p 123:21 -p 10090-10100:10090-10100 \\\n -v TTTDev:/home/docker/ \\\n -e pasv_address=\"1.2.3.4\" \\\n jusito/vsftpd-alpine:simple\n```\n\n## Synchronize the voice enabled / disabled state with Teamspeak\n[See jusito/ttt_voice_sync](https://hub.docker.com/r/jusito/ttt_voice_sync)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjusito%2Fdocker-ttt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjusito%2Fdocker-ttt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjusito%2Fdocker-ttt/lists"}