{"id":35847367,"url":"https://github.com/radical-egg/vein-dedicated-server","last_synced_at":"2026-04-14T06:00:40.470Z","repository":{"id":325902880,"uuid":"1102676216","full_name":"Radical-Egg/vein-dedicated-server","owner":"Radical-Egg","description":"Unofficial Docker dedicated server for VEIN","archived":false,"fork":false,"pushed_at":"2026-04-13T04:04:47.000Z","size":72,"stargazers_count":16,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-13T06:14:15.432Z","etag":null,"topics":["dedicated-server","gameserver","steamcmd-docker","steamcmd-servers","survival-game","vein","vein-game","vein-linux"],"latest_commit_sha":null,"homepage":"","language":"Python","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/Radical-Egg.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-23T21:57:57.000Z","updated_at":"2026-04-13T04:04:55.000Z","dependencies_parsed_at":"2026-04-14T06:00:36.009Z","dependency_job_id":null,"html_url":"https://github.com/Radical-Egg/vein-dedicated-server","commit_stats":null,"previous_names":["radical-egg/vein-dedicated-server"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Radical-Egg/vein-dedicated-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Radical-Egg%2Fvein-dedicated-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Radical-Egg%2Fvein-dedicated-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Radical-Egg%2Fvein-dedicated-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Radical-Egg%2Fvein-dedicated-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Radical-Egg","download_url":"https://codeload.github.com/Radical-Egg/vein-dedicated-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Radical-Egg%2Fvein-dedicated-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31784254,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["dedicated-server","gameserver","steamcmd-docker","steamcmd-servers","survival-game","vein","vein-game","vein-linux"],"created_at":"2026-01-08T06:19:05.084Z","updated_at":"2026-04-14T06:00:40.463Z","avatar_url":"https://github.com/Radical-Egg.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VEIN Dedicated Server Docker Image\n[![Release](https://img.shields.io/github/v/release/Radical-Egg/vein-dedicated-server?display_name=tag\u0026sort=semver)](https://github.com/Radical-Egg/vein-dedicated-server/releases)\n[![License](https://img.shields.io/github/license/Radical-Egg/vein-dedicated-server)](./LICENSE)\n[![Stars](https://img.shields.io/github/stars/Radical-Egg/vein-dedicated-server?style=flat)](https://github.com/Radical-Egg/vein-dedicated-server/stargazers)\n[![Issues](https://img.shields.io/github/issues/Radical-Egg/vein-dedicated-server)](https://github.com/Radical-Egg/vein-dedicated-server/issues)\n[![Release](https://github.com/Radical-Egg/vein-dedicated-server/actions/workflows/publish-ghcr.yml/badge.svg)](https://github.com/Radical-Egg/vein-dedicated-server/actions/workflows/publish-ghcr.yml)\n\n\nRun a **VEIN dedicated server** with **Docker Compose** — with optional **automatic updates**, **HTTP API**, and **scheduled backups** (local rsync or S3 via rclone).\n\n✅ Fast setup (copy/paste compose)  \n✅ Persistent saves/config via volumes  \n✅ Backups (local or S3)  \n✅ Optional Helm chart for Kubernetes\n\n\u003e This project is **unofficial** and not affiliated with the VEIN developers or Valve.\n\n## Table of contents\n- [Quickstart](#quickstart-docker-compose)\n- [Backups](#backups)\n  - [Local backups](#local-backups-rsync)\n  - [S3 backups](#s3-backups-rclone)\n- [Kubernetes (Helm)](#kubernetes-helm)\n- [Configuration](#environment-variables)\n- [FAQ \u0026 Troubleshooting](#faq--troubleshooting)\n- [Related Resources](#related-resources)\n- [Licensing](#licensing)\n\n## QuickStart (Docker Compose)\n\nBelow is an example setup using Docker compose and local backups. Local backups will rsync your save and configuration files to the `./backup` directory mounted to the sidecar container. See the backups section for more details.\n\n```yaml\nservices:\n  vein:\n    image: ghcr.io/radical-egg/vein-dedicated-server:latest\n    container_name: vein-dedicated-server\n    restart: unless-stopped\n    ports:\n      - \"27015:27015/udp\" # Steam Query Port\n      - \"7777:7777/udp\" # Game Port\n      - \"8080:8080/tcp\" # HTTP API Port\n    volumes:\n      - ./data:/home/vein/server # game data and configs like Game.ini Engine.ini\n      - ./config:/home/vein/.config/Epic/Vein # Experimental branches store save files here\n    environment:\n      TZ: America/Los_Angeles\n      PUID: 1000 # replace with your users UID\n      PGID: 1000 # replace with your users GID\n      VEIN_SERVER_AUTO_UPDATE: true\n      VEIN_SERVER_NAME: \"Vein2Docker\"\n      VEIN_SERVER_DESCRIPTION: '\"Vein Dedicated Server using docker\"'\n      VEIN_SERVER_PASSWORD: \"secret\"\n      VEIN_SERVER_ENABLE_HTTP_API: true\n#      VEIN_SERVER_USE_BETA: true\n#      VEIN_SERVER_ADMIN_STEAM_IDS: \"12345,12345,12345562312\"\n#      VEIN_SERVER_SUPER_ADMIN_STEAM_IDS: \"12345\"\n  vein-backup-sidecar:\n    image: ghcr.io/radical-egg/vein-dedicated-backup:latest\n    container_name: vein-dedicated-backup\n    volumes:\n      - ./data:/data/vein-data:ro\n      - ./config:/data/vein-config:ro\n      - ./backup:/backup:rw\n    environment:\n      PUID: 1000 # replace with your users UID\n      PGID: 1000 # replace with your users GID\n      VEIN_SERVER_BACKUP_INTERVAL_SECONDS: 7200\n      VEIN_SERVER_BACKUP_RETENTION: 10 # set to 0 to keep all backups\n```\n\n## Backups\n\n### Local Backups (Rsync)\n\nYou can use this sidecar container to backup your game saves (Server.vns) and configuration files to a directory mount that you specify in the compose config. It is important to note that the backup container will look for files in `/data` so I recommend using `/data/vein-data` and `/data/vein-config` like the example below.\n\n```yaml\nservices:\n  vein-backup-sidecar:\n    image: ghcr.io/radical-egg/vein-dedicated-backup:latest\n    container_name: vein-dedicated-backup\n    volumes:\n      - ./data:/data/vein-data:ro\n      - ./config:/data/vein-config:ro\n      - ./backup:/backup:rw\n    environment:\n      PUID: 1000 # replace with your users UID\n      PGID: 1000 # replace with your users GID\n      VEIN_SERVER_BACKUP_INTERVAL_SECONDS: 7200\n      VEIN_SERVER_BACKUP_RETENTION: 10 # set to 0 to keep all backups\n```\n\n### S3 Backups (Rclone)\n\nThe backup container has Rclone installed and can be used to send a backup of your Server.vns and\nGame.ini to and S3 bucket. The example configurations below are what I use for my self hosted Garage S3 instance.\n\n```yaml\nservices:\n  vein-backup-sidecar:\n    image: ghcr.io/radical-egg/vein-dedicated-backup:latest\n    container_name: vein-dedicated-backup\n    volumes:\n      - ./data:/data/vein-data:ro\n      - ./config:/data/vein-config:ro\n      - ./backup:/backup:rw\n    environment:\n      PUID: 1000 # replace with your users UID\n      PGID: 1000 # replace with your users GID\n      VEIN_SERVER_BACKUP_INTERVAL_SECONDS: 7200\n      VEIN_SERVER_BACKUP_MODE: s3\n      VEIN_SERVER_BACKUP_S3_BUCKET: backups\n      VEIN_SERVER_BACKUP_S3_ENDPOINT: http://garage.localdomain:3900 # Your S3 endpoint url\n      VEIN_SERVER_BACKUP_S3_PROVIDER: Other # Optional if your provider is not Other\n      VEIN_SERVER_BACKUP_S3_REGION: garage # Optional, some providers care about this\n      VEIN_SERVER_BACKUP_S3_KEY_ID: \u003ckey id\u003e # required, key id\n      VEIN_SERVER_BACKUP_S3_ACCESS_KEY: \u003csecret key\u003e # required secret key\n```\n\n## Kubernetes (Helm)\n\n```bash\nhelm repo add radical-egg https://radical-egg.github.io/pineapple-bun/\nhelm repo update\nhelm install vein radical-egg/vein-k8s \\\n\t--set VEIN_SERVER_NAME=\"Eggs Strange World\" \\\n    --set VEIN_SERVER_DESCRIPTION=\"nollie 360 flips\" \\\n    --set VEIN_SERVER_PASSWORD=\"secretpass\"\n```\n\nThe developers have some documentation on what configurations are available [here](https://ramjet.notion.site/Config-279f9ec29f178011a909f8ea9525936d).\n\n## Environment Variables\n\n### Dedicated Server\n\n| Variable | Default | Description |\n|---------|---------|-------------|\n| PUID    | 1000    | User ID to run the server as |\n| PGID    | 1000    | Group ID to run the server as |\n| VEIN_SERVER_NAME | \"Vein Dedicated Server Docker\" | Name of the game server |\n| VEIN_SERVER_PASSWORD | \"changeme\" | Password for game server |\n| VEIN_SERVER_DESCRIPTION | \"Vein Dedicated server in docker\" | Game server description |\n| VEIN_SERVER_AUTO_UPDATE | true | Update server on startup |\n| VEIN_QUERY_PORT | 27015 | Steam query port (UDP) |\n| VEIN_GAME_PORT | 7777 | Game port (UDP) |\n| VEIN_SERVER_PUBLIC | true | Specify if the gameserver is public  |\n| VEIN_SERVER_HEARTBEAT_INTERVAL | \"5.0\" | Game server heartbeat interval |\n| VEIN_SERVER_MAX_PLAYERS | \"16\" | Max Players for dedicated server |\n| VEIN_SERVER_ADMIN_STEAM_IDS | False | A comma delimited list of AdminSteamIDs |\n| VEIN_SERVER_SUPER_ADMIN_STEAM_IDS | False | A comma delimited list of SuperAdminSteamIDs |\n| VEIN_SERVER_WHITELISTED_PLAYERS | False | a comma delimited list of WhitelistedPlayers |\n| VEIN_SERVER_VAC_ENABLED | 0 | Set bVACEnabled in Game.ini  |\n| VEIN_SERVER_USE_BETA | false | Set true to use -beta argument |\n| VEIN_SERVER_BETA_BRANCH | experimental | The default branch to use with -beta arugment |\n| VEIN_SERVER_VALIDATE_INSTALL | false | Set to true to provide the validate steamcmd argument on server install/update |\n| VEIN_SERVER_HTTP_BIND_ADDRESS | 0.0.0.0 | Set the bind address for the HTTP API listener |\n| VEIN_SERVER_HTTPPORT | 8080 | Set the HTTPPort value for Game.ini. Requires VEIN_SERVER_ENABLE_HTTP_API is set to true |\n| VEIN_SERVER_ENABLE_HTTP_API | False| Set to true to enable HTTP API on VEIN_SERVER_HTTPPORT. By default this is False |  \n| VEIN_EXTRA_ARGS | \"\" | Extra flags passed to the server |\n\n### Dedicated Server Backups\n\n| Variable | Default | Description |\n|---------|---------|-------------|\n| VEIN_SERVER_BACKUP_MODE | rsync | Possible options are rsync or s3 |\n| VEIN_SERVER_BACKUP_S3_BUCKET | \"\" | Name of s3 bucket |\n| VEIN_SERVER_BACKUP_S3_ENDPOINT | \"\" | s3 endpoint for backups |\n| VEIN_SERVER_BACKUP_S3_PROVIDER | Other | name of s3 provider (ex. garage, aws, minio) |\n| VEIN_SERVER_BACKUP_S3_REGION | garage | s3 region for rclone configurations, some providers want this |\n| VEIN_SERVER_BACKUP_S3_KEY_ID | \"\" | The access key ID for your s3 bucket |\n| VEIN_SERVER_BACKUP_S3_ACCESS_KEY | \"\" | The s3 access key for your s3 bucket |\n| VEIN_SERVER_BACKUP_SRC_DIR | /data | The source directory (in the container) of the dedicated server data |\n| VEIN_SERVER_BACKUP_DIR | /backup | The source directory (in the container) of the backup directory |\n| VEIN_SERVER_BACKUP_RETENTION | 5 | How many backups to keep (e.x if 10 is specified the 10 most recents will be kept and everything else deleted) |\n| VEIN_SERVER_BACKUP_INTERVAL_SECONDS | 3600 | How often to run backups (in seconds) |\n\n## FAQ \u0026 Troubleshooting\n\nThis is a list of a frequently asked questions and troubleshooting. **This list usually will be applicable for docker and non-docker users**, so if you are running your server on a Linux or Windows server with steamcmd these solutions generally apply. If they don't, I will be sure to annotate that in the anwsers below.\n\n### Error! App '2131400' state is 0x6 after update job\n\nYou may see logs like:\n\n```bash\nPublic...OK\nWaiting for client config...OK\nWaiting for user info...OK\nError! App '2131400' state is 0x6 after update job.\n...\n```\n\nThis usually means **SteamCMD failed to install or update the server files**. The most common causes are:\n\n- **Networking** (container can’t reach Steam over HTTPS)\n- **Disk space** (not enough free space for download + extraction)\n- **Permissions** (SteamCMD can’t write to the install directory)\n\n#### 1) Check networking (inside the container)\n\nSteamCMD needs outbound access to Steam endpoints over **TCP/443**.\n\nVerify HTTPS + DNS from inside the server container:\n\n```bash\ndocker exec -it vein-dedicated-server curl -I https://api.steampowered.com\n```\n\nIf this fails, check your DNS settings, firewall rules, proxy, VPN, or restrictive outbound policies.\n\n#### 2) Check free disk space\n\nDownloads can temporarily require extra space during unpacking.\n\n```bash\ndf -h\n```\n\nIf you’re using bind mounts / volumes, check the filesystem where your server install actually lives.\n\n#### 3) Check permissions on the install directory\n\nEnsure the user inside the container can **read/write** the install path:\n\n```bash\nls -lah /path/to/gameserver\ntouch /path/to/gameserver/.perm_test \u0026\u0026 rm /path/to/gameserver/.perm_test\n```\n\nIf you’re running rootless or using `PUID/PGID`, make sure the mounted directories on the host are owned by that UID/GID (or are writable).\n\n#### 4) Force SteamCMD to re-download by removing the app manifest (.acf)\n\nSteamCMD tracks install state using an app manifest file at:\n\n`/path/to/gameserver/steamapps/appmanifest_*.acf`\n\nIf the manifest is corrupt or the install state is stuck, you can remove it to force a fresh install on the next update cycle:\n\n```bash\nrm -f /path/to/gameserver/steamapps/appmanifest_*.acf\n```\n\nOn the next start/update, SteamCMD should treat the app as not installed and re-download it.\n\n\u003e Note: Only remove the `appmanifest_*.acf` file(s). Don’t delete your saved data/config unless you intend to reset everything.\n\n#### 5) Last resort: install to a new location, then restore from backup\n\nIf you’ve confirmed networking/space/permissions and it still fails, the install directory may be in a bad state. The cleanest fix is:\n\n1. Deploy to a new empty install path/volume\n2. Let SteamCMD install fresh\n3. Restore saves/config from your backups\n\n\n### How can I restore from a backup?\n\nThe gamestate is saved to a file called Server.vns in the SaveGames directory of your gamefiles. The backup “sidecar” container will do an rsync from your gameserver mount -\u003e the backup mount specified in the compose file. The VEIN_SERVER_BACKUP_RETENTION environment variable specifies how many backups to keep. The process of restoring a backup should be relatively straightforward:\n\n1. Stop your server\n    ```bash\n    docker compose down\n    ```\n\n2. Find your `Server.vns` backup file and place it in your SavedGames directory. **Note the below command will overwrite your current Server.vns file, make sure you back it up if you want to keep it**\n\n    ```bash\n    cp /path/to/backup/Server.vns /path/to/Save/SavedGames/Server.vns\n    ```\n\n3. Start your server back up\n\n    ```bash\n    docker compose up -d\n    ```\n\n### Warning: Failed to heartbeat (no connection string)\n\nThis warning almost always means the dedicated server **can’t be reached from the public internet**, so it fails to complete the heartbeat/registration flow.\n\nThe most common causes are:\n\n- **Missing/incorrect port forwarding** on your router (UDP)\n  - **Game port:** `7777/udp` (default)\n  - **Steam query port:** `27015/udp` (default)\n- **Firewall/security rules** blocking inbound UDP to the host (router firewall, host firewall, VPS security group)\n- **NAT issues (CGNAT / double NAT)** where inbound connections can’t reach your network at all\n\n\u003e ### Important Note  \n\u003e Make sure you’re forwarding **UDP**, not TCP, and that the forwarding target is the **actual host** running the server.  \n\u003e Before you test: ensure the server is running  \n\u003e UDP “port checks” can be misleading if the server isn’t running.  \n\u003e Start the container and confirm it’s listening, then test.\n\n## Verify reachability from the outside world\n\nThe most reliable test is from a **different network** (phone hotspot, friend’s network, a cheap VPS, etc.). Testing from inside your own LAN often won’t prove public reachability.\n\n### Option A: Nmap (best quick signal)\n\n```bash\nnmap -sU -p 7777 \u003cyour.public.ip\u003e\nnmap -sU -p 27015 \u003cyour.public.ip\u003e\n```\n\nNotes:\n- UDP scans often show `open|filtered` even when things are fine (because UDP has no handshake).\n- If you see `closed`, something is definitely wrong (port not forwarded, firewall, or server not listening).\n\n### Option B: Netcat (UDP probe)\n\n```bash\necho \"hello\" | nc -u -w2 \u003cyour.public.ip\u003e 7777\necho \"hello\" | nc -u -w2 \u003cyour.public.ip\u003e 27015\n```\n\nNotes:\n- UDP netcat probes don’t always give a clear success/failure signal.\n- If it hangs or times out, treat that as “likely not reachable” and continue debugging.\n\n\n\n## If it’s not reachable: quick checklist\n\n1) **Docker is exposing the ports**\n    - In your compose file, you should have something like:\n      - `27015:27015/udp`\n      - `7777:7777/udp`\n\n2) **Router port forward is correct**\n    - External port → internal host IP → same port (UDP)\n    - The internal host IP should be static/reserved via DHCP\n\n3) **Host firewall allows UDP**\n    - Linux `ufw` / `firewalld` rules must allow inbound UDP on both ports\n\n4) **CGNAT / double NAT**\n    - If your “WAN IP” on your router doesn’t match what websites show as your public IP, you’re likely behind CGNAT.\n    - In that case, public hosting may be impossible without a real public IP, a VPN/tunnel solution, or hosting on a VPS.\n\n\n### Unable to connect to server - `LogHttp: Warning: Request ... waited in queue ...`\nIf you see warnings like this **and** your server shows up in the server list but **players can’t join** (connection fails/timeouts), a very common cause is **CGNAT** (Carrier-Grade NAT) from your ISP.\n\n**What this means:**  \nSome internet providers don’t give your home network its own true public IP address. Instead, you share one with other customers. When that happens, **normal port forwarding often can’t work**, even if you set it up correctly in your router.\n\n**Why the server list can still work:**  \nYour server can usually *register itself* with Steam / matchmaking because it makes the first outbound connection. But when a player tries to connect back in, there may be **no direct route to your server**—so the join fails.\n\n**How to confirm:**  \n- Check your router’s “WAN / Internet IP”. If it differs from what sites like “what is my IP” show, you’re *likely* behind CGNAT.\n- Another hint: your router WAN IP is in ranges like `100.64.x.x` – `100.127.x.x`.\n\n**Fix options:**  \n- Some ISPs will allow you to purchase a dedicated IP address, this would solve your issue.\n- Host the server on a **VPS / cloud provider** (DigitalOcean, AWS, etc.) where you get a public IP by default.\n- Use a **tunneling / relay solution** (example: Cloudflare Tunnel, Tailscale, ZeroTier). These can work around CGNAT, but setup varies by provider and game.\n\nIf you’re unsure, your best bet may be to ask your ISP provider directly if you are behind CGNAT.\n\n\n## Related resources\n\nHere are some references that may be helpful for configuring VEIN with or without docker.\n\n* VEIN dedicated server setup docs / references (non-Docker): https://vein.wiki.gg/wiki/Vein_Dedicated_Server_Setup\n* Developer website for dedicated server setup: https://ramjet.notion.site/dedicated-servers\n* VEIN config generator: https://vein-germany.de/config/\n\n## Licensing\n\nThis repository and container image include only orchestration code and do NOT distribute any game binaries or assets. Game files are downloaded by the user via SteamCMD under the Steam Subscriber Agreement.\n\nYou are responsible for complying with all licenses, terms of service, and EULAs associated with the game.\n\nThis project is not affiliated with the game developers or Valve.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradical-egg%2Fvein-dedicated-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradical-egg%2Fvein-dedicated-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradical-egg%2Fvein-dedicated-server/lists"}