{
  "manifest_version": "1.0.0",
  "template": {
    "id": "8976f08b-9eba-462a-be7b-cae007d139d6",
    "slug": "autogpt",
    "name": "AutoGPT",
    "description": "AutoGPT provides accessible AI tools to build and automate tasks.",
    "url": "https://railway.com/deploy/autogpt",
    "upstream": {
      "image": "ghcr.io/hmseeb/autogpt-railway-backend:autogpt-platform-beta-v0.7.0"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "backend",
      "source": {
        "image": "ghcr.io/hmseeb/autogpt-railway-backend:autogpt-platform-beta-v0.7.0"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/autogpt_platform/backend/workspaces",
      "http": true
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:8.2.1"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ssl:18"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "frontend",
      "source": {
        "image": "ghcr.io/hmseeb/autogpt-railway-frontend:autogpt-platform-beta-v0.7.0"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "rabbitmq",
      "source": {
        "image": "rabbitmq:4.1.4"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/rabbitmq",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "backend",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "DB_HOST",
      "service": "backend",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_NAME",
      "service": "backend",
      "description": "Provide a value for DB_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "DB_PASS",
      "service": "backend",
      "description": "Provide a value for DB_PASS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "backend",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "DB_USER",
      "service": "backend",
      "description": "Provide a value for DB_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "DIRECT_URL",
      "service": "backend",
      "description": "Provide a value for DIRECT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_HOST",
      "service": "backend",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "backend",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "CHAT_API_KEY",
      "service": "backend",
      "description": "The key for the endpoint in CHAT_BASE_URL. Only needed if you set that.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DATABASE_URL",
      "service": "backend",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "JWT_JWKS_URL",
      "service": "backend",
      "description": "Provide a value for JWT_JWKS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CHAT_BASE_URL",
      "service": "backend",
      "description": "Optional. Any OpenAI-compatible endpoint that should write the replies, including OpenAI itself (https://api.openai.com/v1) or your own Ollama or vLLM server. Pair with CHAT_API_KEY. Covers the conversation only.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "RABBITMQ_HOST",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RABBITMQ_PORT",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5672"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "backend",
      "description": "Provide a value for ENCRYPTION_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "JWT_VERIFY_KEY",
      "service": "backend",
      "description": "Provide a value for JWT_VERIFY_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ANTHROPIC_API_KEY",
      "service": "backend",
      "description": "Optional. Use Anthropic to write the replies instead of OpenRouter. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FRONTEND_BASE_URL",
      "service": "backend",
      "description": "Provide a value for FRONTEND_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PLATFORM_BASE_URL",
      "service": "backend",
      "description": "Provide a value for PLATFORM_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "OPEN_ROUTER_API_KEY",
      "service": "backend",
      "description": "RECOMMENDED, and the only single credential that gives a complete assistant. Get one at openrouter.ai/keys. The assistant's web search and the marketplace search both run through OpenRouter no matter which model writes the replies, so without this they report themselves unavailable.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_DEFAULT_PASS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_DEFAULT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "autogpt"
    },
    {
      "key": "CLAMAV_SERVICE_ENABLED",
      "service": "backend",
      "description": "Provide a value for CLAMAV_SERVICE_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "UNSUBSCRIBE_SECRET_KEY",
      "service": "backend",
      "description": "Provide a value for UNSUBSCRIBE_SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CLAUDE_CODE_OAUTH_TOKEN",
      "service": "backend",
      "description": "Optional. Use your own Claude Pro or Max subscription to write the replies: run 'claude setup-token' on a machine signed in to Claude Code and paste the result. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search. Personal instances only, a consumer subscription is not licensed to serve other people.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "BACKEND_CORS_ALLOW_ORIGINS",
      "service": "backend",
      "description": "Provide a value for BACKEND_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "REDISHOST",
      "service": "redis",
      "description": "Provide a value for REDISHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "redis",
      "description": "Provide a value for REDISPORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "redis",
      "description": "Provide a value for REDISUSER.",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "redis",
      "description": "Connection string for connecting to redis using the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "redis",
      "description": "Provide a value for REDISPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Location where the database will be initialized",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "postgres",
      "description": "Railway Private Domain Name.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "postgres",
      "description": "Port to connect to Postgres.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "postgres",
      "description": "Required variable for Data panel",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "postgres",
      "description": "Required variable for the data panel.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "postgres",
      "description": "Required variable for Data panel",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Default database created when image is started.",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "DATABASE_URL",
      "service": "postgres",
      "description": "URL to connect to Postgres database.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "User to connect to Postgres DB",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "postgres",
      "description": "SSL certificate expiry in days.",
      "secret": false,
      "strategy": "default",
      "default": "820"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Password to connect to DB",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "postgres",
      "description": "Allow Postgres to cleanly shut down",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PORT",
      "service": "frontend",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "DATABASE_URL",
      "service": "frontend",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_DB_SCHEMA",
      "service": "frontend",
      "description": "Provide a value for AUTH_DB_SCHEMA.",
      "secret": false,
      "strategy": "default",
      "default": "platform"
    },
    {
      "key": "AGPT_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for AGPT_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BETTER_AUTH_URL",
      "service": "frontend",
      "description": "Provide a value for BETTER_AUTH_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AGPT_WS_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for AGPT_WS_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BETTER_AUTH_SECRET",
      "service": "frontend",
      "description": "Provide a value for BETTER_AUTH_SECRET.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "NEXT_PUBLIC_AGPT_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_AGPT_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_FRONTEND_BASE_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_FRONTEND_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_AGPT_WS_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_AGPT_WS_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AUTH_REQUIRE_EMAIL_VERIFICATION",
      "service": "frontend",
      "description": "Provide a value for AUTH_REQUIRE_EMAIL_VERIFICATION.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_PASS.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "autogpt"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "autogpt"
      }
    },
    "cli": "railway deploy --template autogpt",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "8976f08b-9eba-462a-be7b-cae007d139d6",
            "serializedConfig": {
              "services": {
                "2303c671-cca4-43e9-9dc6-5ed8491f846a": {
                  "name": "backend",
                  "source": {
                    "image": "ghcr.io/hmseeb/autogpt-railway-backend:autogpt-platform-beta-v0.7.0"
                  },
                  "variables": {
                    "PORT": {
                      "defaultValue": "8080"
                    },
                    "DB_HOST": {
                      "defaultValue": "${{postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_NAME": {
                      "defaultValue": "postgres"
                    },
                    "DB_PASS": {
                      "defaultValue": "${{postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_PORT": {
                      "defaultValue": "5432"
                    },
                    "DB_USER": {
                      "defaultValue": "postgres"
                    },
                    "DIRECT_URL": {
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?connect_timeout=60&schema=platform"
                    },
                    "REDIS_HOST": {
                      "defaultValue": "${{redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "defaultValue": "6379"
                    },
                    "CHAT_API_KEY": {
                      "description": "The key for the endpoint in CHAT_BASE_URL. Only needed if you set that.",
                      "defaultValue": "{{CHAT_API_KEY}}"
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?connect_timeout=60&schema=platform"
                    },
                    "JWT_JWKS_URL": {
                      "defaultValue": "https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}/api/auth/jwks"
                    },
                    "CHAT_BASE_URL": {
                      "description": "Optional. Any OpenAI-compatible endpoint that should write the replies, including OpenAI itself (https://api.openai.com/v1) or your own Ollama or vLLM server. Pair with CHAT_API_KEY. Covers the conversation only.",
                      "defaultValue": "{{CHAT_BASE_URL}}"
                    },
                    "RABBITMQ_HOST": {
                      "defaultValue": "${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "RABBITMQ_PORT": {
                      "defaultValue": "5672"
                    },
                    "ENCRYPTION_KEY": {
                      "defaultValue": "{{ENCRYPTION_KEY}}"
                    },
                    "JWT_VERIFY_KEY": {
                      "defaultValue": "{{JWT_VERIFY_KEY}}"
                    },
                    "ANTHROPIC_API_KEY": {
                      "description": "Optional. Use Anthropic to write the replies instead of OpenRouter. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search.",
                      "defaultValue": "{{ANTHROPIC_API_KEY}}"
                    },
                    "FRONTEND_BASE_URL": {
                      "defaultValue": "https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PLATFORM_BASE_URL": {
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "OPEN_ROUTER_API_KEY": {
                      "description": "RECOMMENDED, and the only single credential that gives a complete assistant. Get one at openrouter.ai/keys. The assistant's web search and the marketplace search both run through OpenRouter no matter which model writes the replies, so without this they report themselves unavailable.",
                      "defaultValue": "{{OPEN_ROUTER_API_KEY}}"
                    },
                    "RABBITMQ_DEFAULT_PASS": {
                      "defaultValue": "${{rabbitmq.RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "defaultValue": "autogpt"
                    },
                    "CLAMAV_SERVICE_ENABLED": {
                      "defaultValue": "false"
                    },
                    "UNSUBSCRIBE_SECRET_KEY": {
                      "defaultValue": "{{UNSUBSCRIBE_SECRET_KEY}}"
                    },
                    "CLAUDE_CODE_OAUTH_TOKEN": {
                      "description": "Optional. Use your own Claude Pro or Max subscription to write the replies: run 'claude setup-token' on a machine signed in to Claude Code and paste the result. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search. Personal instances only, a consumer subscription is not licensed to serve other people.",
                      "defaultValue": "{{CLAUDE_CODE_OAUTH_TOKEN}}"
                    },
                    "BACKEND_CORS_ALLOW_ORIGINS": {
                      "defaultValue": "[\"https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}\"]"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  },
                  "volumeMounts": {
                    "2303c671-cca4-43e9-9dc6-5ed8491f846a": {
                      "mountPath": "/app/autogpt_platform/backend/workspaces"
                    }
                  }
                },
                "9040d120-ef39-46bc-ad44-4138a0a9e3d3": {
                  "icon": "https://cdn.sanity.io/images/sy1jschh/production/0ce0bfdcfbdbf69662b1116671f97c2dd788b655-157x157.svg",
                  "name": "redis",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH\""
                  },
                  "source": {
                    "image": "redis:8.2.1"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Connection string for connecting to redis using the private network",
                      "defaultValue": "redis://${{ REDISUSER }}:${{ REDIS_PASSWORD }}@${{ REDISHOST }}:${{ REDISPORT }}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "9040d120-ef39-46bc-ad44-4138a0a9e3d3": {
                      "mountPath": "/data"
                    }
                  },
                  "haTemplateCode": "redis-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxies",
                      "options": [
                        1,
                        2
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "HAProxy instances routing writes to the primary",
                      "defaultValue": 2
                    },
                    "replica": {
                      "label": "Redis Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "Redis",
                      "description": "Nodes running Redis + colocated Sentinel",
                      "defaultValue": 2
                    },
                    "internal": null,
                    "description": "This will convert your Redis instance to an HA cluster with Sentinel failover and HAProxy routing to the primary."
                  }
                },
                "d92cb7a9-61ad-4133-895e-541f1f580e62": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "postgres",
                  "build": {},
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:18"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "Location where the database will be initialized",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "description": "Railway Private Domain Name.",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "isOptional": false,
                      "description": "Port to connect to Postgres.",
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "description": "Required variable for Data panel",
                      "defaultValue": "${{ POSTGRES_USER }}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "description": "Required variable for the data panel.",
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "description": "Required variable for Data panel",
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Default database created when image is started.",
                      "defaultValue": "railway"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "URL to connect to Postgres database.",
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "User to connect to Postgres DB",
                      "defaultValue": "postgres"
                    },
                    "SSL_CERT_DAYS": {
                      "isOptional": true,
                      "description": "SSL certificate expiry in days.",
                      "defaultValue": "820"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Password to connect to DB",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Allow Postgres to cleanly shut down",
                      "defaultValue": "60"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "d92cb7a9-61ad-4133-895e-541f1f580e62": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  },
                  "haTemplateCode": "postgres-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxy",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "Routes traffic to the primary",
                      "defaultValue": 3
                    },
                    "replica": {
                      "label": "Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5,
                        6,
                        7
                      ],
                      "nodeLabel": "Postgres",
                      "description": "Streaming replicas for automatic failover",
                      "defaultValue": 2
                    },
                    "internal": {
                      "label": "Coordinator Nodes",
                      "options": [
                        3,
                        5,
                        7,
                        9
                      ],
                      "nodeLabel": "etcd",
                      "defaultValue": 3
                    },
                    "description": "This will convert your Postgres database to an HA cluster with Patroni failover and etcd consensus."
                  }
                },
                "dc39a105-08ce-4c2f-99cf-c252b574d18f": {
                  "name": "frontend",
                  "source": {
                    "image": "ghcr.io/hmseeb/autogpt-railway-frontend:autogpt-platform-beta-v0.7.0"
                  },
                  "variables": {
                    "PORT": {
                      "defaultValue": "3000"
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres"
                    },
                    "AUTH_DB_SCHEMA": {
                      "defaultValue": "platform"
                    },
                    "AGPT_SERVER_URL": {
                      "defaultValue": "https://${{backend.RAILWAY_PUBLIC_DOMAIN}}/api"
                    },
                    "BETTER_AUTH_URL": {
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AGPT_WS_SERVER_URL": {
                      "defaultValue": "wss://${{backend.RAILWAY_PUBLIC_DOMAIN}}/ws"
                    },
                    "BETTER_AUTH_SECRET": {
                      "defaultValue": "{{BETTER_AUTH_SECRET}}"
                    },
                    "NEXT_PUBLIC_AGPT_SERVER_URL": {
                      "defaultValue": "https://${{backend.RAILWAY_PUBLIC_DOMAIN}}/api"
                    },
                    "NEXT_PUBLIC_FRONTEND_BASE_URL": {
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "NEXT_PUBLIC_AGPT_WS_SERVER_URL": {
                      "defaultValue": "wss://${{backend.RAILWAY_PUBLIC_DOMAIN}}/ws"
                    },
                    "AUTH_REQUIRE_EMAIL_VERIFICATION": {
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {
                        "port": 3000
                      }
                    }
                  }
                },
                "f135c54a-dcc2-41ec-99d9-1808bd9ef630": {
                  "name": "rabbitmq",
                  "source": {
                    "image": "rabbitmq:4.1.4"
                  },
                  "variables": {
                    "RABBITMQ_DEFAULT_PASS": {
                      "defaultValue": "{{RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "defaultValue": "autogpt"
                    }
                  },
                  "volumeMounts": {
                    "f135c54a-dcc2-41ec-99d9-1808bd9ef630": {
                      "mountPath": "/var/lib/rabbitmq"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0"
}
