{
  "manifest_version": "1.0.0",
  "template": {
    "id": "4211d4d3-0e39-49fe-8671-e7a6c7142bb0",
    "slug": "cs2",
    "name": "CS2",
    "description": "CS2 Dedicated Server — 30GB+ volume, CSTV, playit.gg UDP tunnel",
    "url": "https://railway.com/deploy/cs2"
  },
  "services": [
    {
      "name": "cs2",
      "source": {
        "repo": "https://github.com/INAPP-Mobile/cs2"
      },
      "needs_volume": true,
      "volume_mount_path": "/home/steam/cs2-dedicated",
      "http": false
    },
    {
      "name": "playit",
      "source": {
        "image": "ghcr.io/playit-cloud/playit-agent:1.0.8"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "TV_PW",
      "service": "cs2",
      "description": "SourceTV password",
      "secret": false,
      "strategy": "default",
      "default": "changeme"
    },
    {
      "key": "CS2_IP",
      "service": "cs2",
      "description": "Bind IP",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "CS2_LAN",
      "service": "cs2",
      "description": "LAN mode (0=Internet, 1=LAN)",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_LOG",
      "service": "cs2",
      "description": "Enable logging",
      "secret": false,
      "strategy": "default",
      "default": "on"
    },
    {
      "key": "TV_PORT",
      "service": "cs2",
      "description": "SourceTV port",
      "secret": false,
      "strategy": "default",
      "default": "27020"
    },
    {
      "key": "CS2_PORT",
      "service": "cs2",
      "description": "Game port",
      "secret": false,
      "strategy": "default",
      "default": "27015"
    },
    {
      "key": "TV_DELAY",
      "service": "cs2",
      "description": "Broadcast delay (seconds)",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "TV_ENABLE",
      "service": "cs2",
      "description": "Enable SourceTV",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_CHEATS",
      "service": "cs2",
      "description": "Enable cheats (0=off, 1=on)",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_RCONPW",
      "service": "cs2",
      "description": "RCON password",
      "secret": false,
      "strategy": "default",
      "default": "changeme"
    },
    {
      "key": "TV_MAXRATE",
      "service": "cs2",
      "description": "Max rate",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "SRCDS_TOKEN",
      "service": "cs2",
      "description": "Steam Game Server Login Token (get from steamcommunity.com/dev/managegameservers)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "TV_RELAY_PW",
      "service": "cs2",
      "description": "SourceTV relay password",
      "secret": false,
      "strategy": "default",
      "default": "changeme"
    },
    {
      "key": "CS2_GAMEMODE",
      "service": "cs2",
      "description": "Game mode",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "CS2_GAMETYPE",
      "service": "cs2",
      "description": "Game type (0=Competitive, 1=Casual)",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_LOG_ECHO",
      "service": "cs2",
      "description": "Log echo",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_LOG_FILE",
      "service": "cs2",
      "description": "Log to file",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_MAPGROUP",
      "service": "cs2",
      "description": "Map group",
      "secret": false,
      "strategy": "default",
      "default": "mg_active"
    },
    {
      "key": "CS2_STARTMAP",
      "service": "cs2",
      "description": "Starting map",
      "secret": false,
      "strategy": "default",
      "default": "de_inferno"
    },
    {
      "key": "CS2_LOG_ITEMS",
      "service": "cs2",
      "description": "Log items",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_LOG_MONEY",
      "service": "cs2",
      "description": "Log money",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "TV_AUTORECORD",
      "service": "cs2",
      "description": "Auto-record demos",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "TV_RELAYVOICE",
      "service": "cs2",
      "description": "Relay voice",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "CS2_LOG_DETAIL",
      "service": "cs2",
      "description": "Log detail",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_MAXPLAYERS",
      "service": "cs2",
      "description": "Max simultaneous players",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "CS2_SERVERNAME",
      "service": "cs2",
      "description": "Server hostname",
      "secret": false,
      "strategy": "default",
      "default": "cs2 private server"
    },
    {
      "key": "CS2_DISCONNECT_KILLS",
      "service": "cs2",
      "description": "Disconnect kills",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_SERVER_HIBERNATE",
      "service": "cs2",
      "description": "Hibernate when empty",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "CS2_SERVER_DELTATICKS_ENFORCE",
      "service": "cs2",
      "description": "Delta ticks enforcement",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "SECRET_KEY",
      "service": "playit",
      "description": "REQUIRED. Playit.gg agent secret key. Create a free account at playit.gg, then Account → Agents → Add Agent → copy the secret key. After deploy, configure the tunnel in the playit.gg dashboard: type UDP, local address cs2.railway.internal, local port 27015 (add a second UDP tunnel on port 27020 if CSTV is enabled).",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "cs2"
      }
    },
    "cli": "railway deploy --template cs2",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "4211d4d3-0e39-49fe-8671-e7a6c7142bb0",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "6a429520-1ffe-4bdf-8902-de02ba08a147": {
                  "icon": null,
                  "name": "cs2",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/INAPP-Mobile/cs2",
                    "rootDirectory": null
                  },
                  "variables": {
                    "TV_PW": {
                      "description": "SourceTV password",
                      "defaultValue": "changeme"
                    },
                    "CS2_IP": {
                      "description": "Bind IP",
                      "defaultValue": "0.0.0.0"
                    },
                    "CS2_LAN": {
                      "description": "LAN mode (0=Internet, 1=LAN)",
                      "defaultValue": "0"
                    },
                    "CS2_LOG": {
                      "description": "Enable logging",
                      "defaultValue": "on"
                    },
                    "TV_PORT": {
                      "description": "SourceTV port",
                      "defaultValue": "27020"
                    },
                    "CS2_PORT": {
                      "description": "Game port",
                      "defaultValue": "27015"
                    },
                    "TV_DELAY": {
                      "description": "Broadcast delay (seconds)",
                      "defaultValue": "0"
                    },
                    "TV_ENABLE": {
                      "description": "Enable SourceTV",
                      "defaultValue": "0"
                    },
                    "CS2_CHEATS": {
                      "description": "Enable cheats (0=off, 1=on)",
                      "defaultValue": "0"
                    },
                    "CS2_RCONPW": {
                      "isOptional": false,
                      "description": "RCON password",
                      "defaultValue": "changeme"
                    },
                    "TV_MAXRATE": {
                      "description": "Max rate",
                      "defaultValue": "0"
                    },
                    "CS2_CFG_URL": {
                      "isOptional": true,
                      "description": "Custom config URL (optional)",
                      "defaultValue": ""
                    },
                    "SRCDS_TOKEN": {
                      "isOptional": false,
                      "description": "Steam Game Server Login Token (get from steamcommunity.com/dev/managegameservers)",
                      "defaultValue": "{{SRCDS_TOKEN}}"
                    },
                    "TV_RELAY_PW": {
                      "description": "SourceTV relay password",
                      "defaultValue": "changeme"
                    },
                    "CS2_GAMEMODE": {
                      "description": "Game mode",
                      "defaultValue": "1"
                    },
                    "CS2_GAMETYPE": {
                      "description": "Game type (0=Competitive, 1=Casual)",
                      "defaultValue": "0"
                    },
                    "CS2_LOG_ECHO": {
                      "description": "Log echo",
                      "defaultValue": "0"
                    },
                    "CS2_LOG_FILE": {
                      "description": "Log to file",
                      "defaultValue": "0"
                    },
                    "CS2_MAPGROUP": {
                      "isOptional": false,
                      "description": "Map group",
                      "defaultValue": "mg_active"
                    },
                    "CS2_STARTMAP": {
                      "isOptional": false,
                      "description": "Starting map",
                      "defaultValue": "de_inferno"
                    },
                    "CS2_GAMEALIAS": {
                      "isOptional": true,
                      "description": "Game alias (optional)",
                      "defaultValue": ""
                    },
                    "CS2_LOG_ITEMS": {
                      "description": "Log items",
                      "defaultValue": "0"
                    },
                    "CS2_LOG_MONEY": {
                      "description": "Log money",
                      "defaultValue": "0"
                    },
                    "CS2_RCON_PORT": {
                      "isOptional": true,
                      "description": "RCON port (optional)",
                      "defaultValue": ""
                    },
                    "TV_AUTORECORD": {
                      "description": "Auto-record demos",
                      "defaultValue": "0"
                    },
                    "TV_RELAYVOICE": {
                      "description": "Relay voice",
                      "defaultValue": "1"
                    },
                    "CS2_LOG_DETAIL": {
                      "description": "Log detail",
                      "defaultValue": "0"
                    },
                    "CS2_MAXPLAYERS": {
                      "isOptional": false,
                      "description": "Max simultaneous players",
                      "defaultValue": "10"
                    },
                    "CS2_SERVERNAME": {
                      "isOptional": false,
                      "description": "Server hostname",
                      "defaultValue": "cs2 private server"
                    },
                    "CS2_LOG_HTTP_URL": {
                      "isOptional": true,
                      "description": "HTTP log URL (optional)",
                      "defaultValue": ""
                    },
                    "CS2_ADDITIONAL_ARGS": {
                      "isOptional": true,
                      "description": "Additional launch arguments (optional)",
                      "defaultValue": ""
                    },
                    "CS2_DISCONNECT_KILLS": {
                      "description": "Disconnect kills",
                      "defaultValue": "0"
                    },
                    "CS2_SERVER_HIBERNATE": {
                      "description": "Hibernate when empty",
                      "defaultValue": "0"
                    },
                    "CS2_HOST_WORKSHOP_MAP": {
                      "isOptional": true,
                      "description": "Workshop map ID (optional)",
                      "defaultValue": ""
                    },
                    "CS2_HOST_WORKSHOP_COLLECTION": {
                      "isOptional": true,
                      "description": "Workshop collection ID (optional)",
                      "defaultValue": ""
                    },
                    "CS2_SERVER_DELTATICKS_ENFORCE": {
                      "description": "Delta ticks enforcement",
                      "defaultValue": "2"
                    }
                  },
                  "volumeMounts": {
                    "6a429520-1ffe-4bdf-8902-de02ba08a147": {
                      "mountPath": "/home/steam/cs2-dedicated"
                    }
                  }
                },
                "71fb782b-2255-4915-baa1-823d7fe03371": {
                  "name": "playit",
                  "source": {
                    "image": "ghcr.io/playit-cloud/playit-agent:1.0.8"
                  },
                  "variables": {
                    "SECRET_KEY": {
                      "description": "REQUIRED. Playit.gg agent secret key. Create a free account at playit.gg, then Account → Agents → Add Agent → copy the secret key. After deploy, configure the tunnel in the playit.gg dashboard: type UDP, local address cs2.railway.internal, local port 27015 (add a second UDP tunnel on port 27020 if CSTV is enabled).",
                      "defaultValue": "{{SECRET_KEY}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-23T16:14:58.907Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-21T19:27:02.729Z",
  "success_rate_30d": 0.4286,
  "validation": {
    "last_run_id": "run_b7648484f897422db1ce",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "CRASHED,SUCCESS"
      }
    ],
    "typical_ready_seconds": 77,
    "typical_build_seconds": 61,
    "typical_start_seconds": 31,
    "slowest_service": "cs2"
  }
}
