{
  "manifest_version": "1.0.0",
  "template": {
    "id": "f7994879-1343-4bfc-8450-dfe86c129c6f",
    "slug": "supabase-self-hosted-full-stack",
    "name": "Supabase (Self-Hosted, Full Stack)",
    "description": "Full Supabase stack: Postgres, Auth, REST, Storage, Studio behind Kong.",
    "url": "https://railway.com/deploy/supabase-self-hosted-full-stack",
    "upstream": {
      "image": "kong/kong:3.9.1"
    }
  },
  "services": [
    {
      "name": "rest",
      "source": {
        "image": "postgrest/postgrest:v14.12"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "auth",
      "source": {
        "image": "supabase/gotrue:v2.189.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "supabase/postgres:17.6.1.136"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql",
      "http": false
    },
    {
      "name": "studio",
      "source": {
        "image": "supabase/studio:2026.07.07-sha-a6a04f2"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "storage",
      "source": {
        "image": "supabase/storage-api:v1.60.4"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/storage",
      "http": false
    },
    {
      "name": "meta",
      "source": {
        "image": "supabase/postgres-meta:v0.96.6"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "kong",
      "source": {
        "image": "kong/kong:3.9.1"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PGRST_DB_URI",
      "service": "rest",
      "description": "Database connection over private networking. Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGRST_DB_SCHEMAS",
      "service": "rest",
      "description": "Schemas exposed by the REST API.",
      "secret": false,
      "strategy": "default",
      "default": "public,storage,graphql_public"
    },
    {
      "key": "PGRST_JWT_SECRET",
      "service": "rest",
      "description": "Shared JWT secret. Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGRST_DB_ANON_ROLE",
      "service": "rest",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "anon"
    },
    {
      "key": "PGRST_DB_USE_LEGACY_GUCS",
      "service": "rest",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PGRST_APP_SETTINGS_JWT_EXP",
      "service": "rest",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGRST_APP_SETTINGS_JWT_SECRET",
      "service": "rest",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GOTRUE_JWT_AUD",
      "service": "auth",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "authenticated"
    },
    {
      "key": "GOTRUE_JWT_EXP",
      "service": "auth",
      "description": "JWT expiry. Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GOTRUE_API_HOST",
      "service": "auth",
      "description": "Bind address. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "GOTRUE_API_PORT",
      "service": "auth",
      "description": "GoTrue port. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "9999"
    },
    {
      "key": "GOTRUE_SITE_URL",
      "service": "auth",
      "description": "Your app's URL used in auth redirects and emails. Change to your frontend URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "API_EXTERNAL_URL",
      "service": "auth",
      "description": "Public URL of the Supabase API gateway (Kong).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GOTRUE_DB_DRIVER",
      "service": "auth",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "GOTRUE_JWT_SECRET",
      "service": "auth",
      "description": "Shared JWT secret. Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GOTRUE_DISABLE_SIGNUP",
      "service": "auth",
      "description": "Set true to block new user signups.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "GOTRUE_DB_DATABASE_URL",
      "service": "auth",
      "description": "Auth database connection over private networking. Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "GOTRUE_JWT_ADMIN_ROLES",
      "service": "auth",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "service_role"
    },
    {
      "key": "GOTRUE_MAILER_AUTOCONFIRM",
      "service": "auth",
      "description": "Auto-confirm signups (no SMTP configured). Set false once you add SMTP.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "GOTRUE_EXTERNAL_EMAIL_ENABLED",
      "service": "auth",
      "description": "Enable email/password auth.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "GOTRUE_JWT_DEFAULT_GROUP_NAME",
      "service": "auth",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "authenticated"
    },
    {
      "key": "JWT_EXP",
      "service": "Postgres",
      "description": "JWT expiry in seconds.",
      "secret": false,
      "strategy": "default",
      "default": "3600"
    },
    {
      "key": "JWT_SECRET",
      "service": "Postgres",
      "description": "REQUIRED. 40+ char JWT secret shared by all Supabase services. Generate it together with matching ANON_KEY and SERVICE_ROLE_KEY at https://supabase.com/docs/guides/self-hosting/docker#securing-your-services",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Main database name. Keep as postgres.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Postgres",
      "description": "Run entrypoint as root so it can prepare the volume, then drop to the postgres user. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Auto-generated password for all internal Supabase database roles.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "studio",
      "description": "Pin Studio to port 3000 so Kong can reach it. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "HOSTNAME",
      "service": "studio",
      "description": "Bind address so the Railway edge and Kong can reach Studio. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "POSTGRES_DB",
      "service": "studio",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPABASE_URL",
      "service": "studio",
      "description": "Internal Kong URL. Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "studio",
      "description": "DB host for Studio's SQL/Table editor. Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_PORT",
      "service": "studio",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "POSTGRES_USER",
      "service": "studio",
      "description": "DB user Studio's query editor connects as. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "supabase_admin"
    },
    {
      "key": "AUTH_JWT_SECRET",
      "service": "studio",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "studio",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPABASE_ANON_KEY",
      "service": "studio",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STUDIO_PG_META_URL",
      "service": "studio",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SUPABASE_PUBLIC_URL",
      "service": "studio",
      "description": "Public Supabase API URL shown in Studio connect instructions.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DEFAULT_PROJECT_NAME",
      "service": "studio",
      "description": "Project name shown in Studio.",
      "secret": false,
      "strategy": "default",
      "default": "My Project"
    },
    {
      "key": "SUPABASE_SERVICE_KEY",
      "service": "studio",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_LOGS",
      "service": "studio",
      "description": "Logs UI needs the analytics stack (not included). Keep false.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "DEFAULT_ORGANIZATION_NAME",
      "service": "studio",
      "description": "Organization name shown in Studio.",
      "secret": false,
      "strategy": "default",
      "default": "My Organization"
    },
    {
      "key": "PORT",
      "service": "storage",
      "description": "Pin Storage API to port 5000 so Kong can reach it. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "5000"
    },
    {
      "key": "REGION",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "stub"
    },
    {
      "key": "ANON_KEY",
      "service": "storage",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TENANT_ID",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "stub"
    },
    {
      "key": "SERVICE_KEY",
      "service": "storage",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGREST_URL",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SIZE_LIMIT",
      "service": "storage",
      "description": "Max upload size in bytes (50 MB default).",
      "secret": false,
      "strategy": "default",
      "default": "52428800"
    },
    {
      "key": "STORAGE_BACKEND",
      "service": "storage",
      "description": "Files stored on the attached Railway volume.",
      "secret": false,
      "strategy": "default",
      "default": "file"
    },
    {
      "key": "GLOBAL_S3_BUCKET",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "stub"
    },
    {
      "key": "PGRST_JWT_SECRET",
      "service": "storage",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILE_STORAGE_BACKEND_PATH",
      "service": "storage",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/storage"
    },
    {
      "key": "ENABLE_IMAGE_TRANSFORMATION",
      "service": "storage",
      "description": "Requires imgproxy with a shared volume, which Railway does not support. Keep false.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PG_META_PORT",
      "service": "meta",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "PG_META_DB_HOST",
      "service": "meta",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PG_META_DB_NAME",
      "service": "meta",
      "description": "Do not change.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PG_META_DB_PORT",
      "service": "meta",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PG_META_DB_USER",
      "service": "meta",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "supabase_admin"
    },
    {
      "key": "PG_META_DB_PASSWORD",
      "service": "meta",
      "description": "Do not change.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ANON_KEY",
      "service": "kong",
      "description": "REQUIRED. Public anon API key (a JWT signed with your JWT_SECRET). Generate at https://supabase.com/docs/guides/self-hosting/docker#securing-your-services",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "KONG_PLUGINS",
      "service": "kong",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "request-transformer,cors,key-auth,acl,basic-auth"
    },
    {
      "key": "KONG_DATABASE",
      "service": "kong",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "off"
    },
    {
      "key": "KONG_DNS_ORDER",
      "service": "kong",
      "description": "Resolves Railway private IPv6 network. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "LAST,A,AAAA,CNAME"
    },
    {
      "key": "SERVICE_ROLE_KEY",
      "service": "kong",
      "description": "REQUIRED. Secret service_role API key (a JWT signed with your JWT_SECRET). Generate together with ANON_KEY. Never expose to browsers.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "KONG_PROXY_LISTEN",
      "service": "kong",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0:8000"
    },
    {
      "key": "DASHBOARD_PASSWORD",
      "service": "kong",
      "description": "Auto-generated password for the Studio dashboard login.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DASHBOARD_USERNAME",
      "service": "kong",
      "description": "Username for the Studio dashboard login.",
      "secret": false,
      "strategy": "default",
      "default": "supabase"
    },
    {
      "key": "KONG_DECLARATIVE_CONFIG_STRING",
      "service": "kong",
      "description": "Provide a value for KONG_DECLARATIVE_CONFIG_STRING.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "KONG_NGINX_PROXY_PROXY_BUFFERS",
      "service": "kong",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "64 160k"
    },
    {
      "key": "KONG_NGINX_PROXY_PROXY_BUFFER_SIZE",
      "service": "kong",
      "description": "Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "160k"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "supabase-self-hosted-full-stack"
      }
    },
    "cli": "railway deploy --template supabase-self-hosted-full-stack",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "f7994879-1343-4bfc-8450-dfe86c129c6f",
            "serializedConfig": {
              "services": {
                "55bcf794-8300-46cc-b875-83db898c39cd": {
                  "name": "rest",
                  "source": {
                    "image": "postgrest/postgrest:v14.12"
                  },
                  "variables": {
                    "PGRST_DB_URI": {
                      "description": "Database connection over private networking. Do not change.",
                      "defaultValue": "postgres://supabase_admin:${{ Postgres.POSTGRES_PASSWORD }}@${{ Postgres.RAILWAY_PRIVATE_DOMAIN }}:5432/${{ Postgres.POSTGRES_DB }}"
                    },
                    "PGRST_DB_SCHEMAS": {
                      "description": "Schemas exposed by the REST API.",
                      "defaultValue": "public,storage,graphql_public"
                    },
                    "PGRST_JWT_SECRET": {
                      "description": "Shared JWT secret. Do not change.",
                      "defaultValue": "${{ Postgres.JWT_SECRET }}"
                    },
                    "PGRST_DB_ANON_ROLE": {
                      "description": "Do not change.",
                      "defaultValue": "anon"
                    },
                    "PGRST_DB_USE_LEGACY_GUCS": {
                      "description": "Do not change.",
                      "defaultValue": "false"
                    },
                    "PGRST_APP_SETTINGS_JWT_EXP": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.JWT_EXP }}"
                    },
                    "PGRST_APP_SETTINGS_JWT_SECRET": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.JWT_SECRET }}"
                    }
                  }
                },
                "7675ed32-3bc1-4b81-aa97-9954e346d3eb": {
                  "name": "auth",
                  "source": {
                    "image": "supabase/gotrue:v2.189.0"
                  },
                  "variables": {
                    "GOTRUE_JWT_AUD": {
                      "description": "Do not change.",
                      "defaultValue": "authenticated"
                    },
                    "GOTRUE_JWT_EXP": {
                      "description": "JWT expiry. Do not change.",
                      "defaultValue": "${{ Postgres.JWT_EXP }}"
                    },
                    "GOTRUE_API_HOST": {
                      "description": "Bind address. Do not change.",
                      "defaultValue": "0.0.0.0"
                    },
                    "GOTRUE_API_PORT": {
                      "description": "GoTrue port. Do not change.",
                      "defaultValue": "9999"
                    },
                    "GOTRUE_SITE_URL": {
                      "description": "Your app's URL used in auth redirects and emails. Change to your frontend URL.",
                      "defaultValue": "https://${{ kong.RAILWAY_PUBLIC_DOMAIN }}"
                    },
                    "API_EXTERNAL_URL": {
                      "description": "Public URL of the Supabase API gateway (Kong).",
                      "defaultValue": "https://${{ kong.RAILWAY_PUBLIC_DOMAIN }}"
                    },
                    "GOTRUE_DB_DRIVER": {
                      "description": "Do not change.",
                      "defaultValue": "postgres"
                    },
                    "GOTRUE_JWT_SECRET": {
                      "description": "Shared JWT secret. Do not change.",
                      "defaultValue": "${{ Postgres.JWT_SECRET }}"
                    },
                    "GOTRUE_DISABLE_SIGNUP": {
                      "description": "Set true to block new user signups.",
                      "defaultValue": "false"
                    },
                    "GOTRUE_DB_DATABASE_URL": {
                      "description": "Auth database connection over private networking. Do not change.",
                      "defaultValue": "postgres://supabase_admin:${{ Postgres.POSTGRES_PASSWORD }}@${{ Postgres.RAILWAY_PRIVATE_DOMAIN }}:5432/${{ Postgres.POSTGRES_DB }}"
                    },
                    "GOTRUE_JWT_ADMIN_ROLES": {
                      "description": "Do not change.",
                      "defaultValue": "service_role"
                    },
                    "GOTRUE_MAILER_AUTOCONFIRM": {
                      "description": "Auto-confirm signups (no SMTP configured). Set false once you add SMTP.",
                      "defaultValue": "true"
                    },
                    "GOTRUE_EXTERNAL_EMAIL_ENABLED": {
                      "description": "Enable email/password auth.",
                      "defaultValue": "true"
                    },
                    "GOTRUE_JWT_DEFAULT_GROUP_NAME": {
                      "description": "Do not change.",
                      "defaultValue": "authenticated"
                    }
                  }
                },
                "85798f69-4274-4348-a091-e4ab433c9ae0": {
                  "name": "Postgres",
                  "source": {
                    "image": "supabase/postgres:17.6.1.136"
                  },
                  "variables": {
                    "JWT_EXP": {
                      "description": "JWT expiry in seconds.",
                      "defaultValue": "3600"
                    },
                    "JWT_SECRET": {
                      "description": "REQUIRED. 40+ char JWT secret shared by all Supabase services. Generate it together with matching ANON_KEY and SERVICE_ROLE_KEY at https://supabase.com/docs/guides/self-hosting/docker#securing-your-services",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "POSTGRES_DB": {
                      "description": "Main database name. Keep as postgres.",
                      "defaultValue": "postgres"
                    },
                    "RAILWAY_RUN_UID": {
                      "description": "Run entrypoint as root so it can prepare the volume, then drop to the postgres user. Do not change.",
                      "defaultValue": "0"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Auto-generated password for all internal Supabase database roles.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "85798f69-4274-4348-a091-e4ab433c9ae0": {
                      "mountPath": "/var/lib/postgresql"
                    }
                  }
                },
                "afcb993f-9e66-4671-b37d-957998adf93d": {
                  "name": "studio",
                  "source": {
                    "image": "supabase/studio:2026.07.07-sha-a6a04f2"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Pin Studio to port 3000 so Kong can reach it. Do not change.",
                      "defaultValue": "3000"
                    },
                    "HOSTNAME": {
                      "description": "Bind address so the Railway edge and Kong can reach Studio. Do not change.",
                      "defaultValue": "0.0.0.0"
                    },
                    "POSTGRES_DB": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.POSTGRES_DB }}"
                    },
                    "SUPABASE_URL": {
                      "description": "Internal Kong URL. Do not change.",
                      "defaultValue": "http://${{ kong.RAILWAY_PRIVATE_DOMAIN }}:8000"
                    },
                    "POSTGRES_HOST": {
                      "description": "DB host for Studio's SQL/Table editor. Do not change.",
                      "defaultValue": "${{ Postgres.RAILWAY_PRIVATE_DOMAIN }}"
                    },
                    "POSTGRES_PORT": {
                      "description": "Do not change.",
                      "defaultValue": "5432"
                    },
                    "POSTGRES_USER": {
                      "description": "DB user Studio's query editor connects as. Do not change.",
                      "defaultValue": "supabase_admin"
                    },
                    "AUTH_JWT_SECRET": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.JWT_SECRET }}"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.POSTGRES_PASSWORD }}"
                    },
                    "SUPABASE_ANON_KEY": {
                      "description": "Do not change.",
                      "defaultValue": "${{ kong.ANON_KEY }}"
                    },
                    "STUDIO_PG_META_URL": {
                      "description": "Do not change.",
                      "defaultValue": "http://${{ meta.RAILWAY_PRIVATE_DOMAIN }}:8080"
                    },
                    "SUPABASE_PUBLIC_URL": {
                      "description": "Public Supabase API URL shown in Studio connect instructions.",
                      "defaultValue": "https://${{ kong.RAILWAY_PUBLIC_DOMAIN }}"
                    },
                    "DEFAULT_PROJECT_NAME": {
                      "description": "Project name shown in Studio.",
                      "defaultValue": "My Project"
                    },
                    "SUPABASE_SERVICE_KEY": {
                      "description": "Do not change.",
                      "defaultValue": "${{ kong.SERVICE_ROLE_KEY }}"
                    },
                    "NEXT_PUBLIC_ENABLE_LOGS": {
                      "description": "Logs UI needs the analytics stack (not included). Keep false.",
                      "defaultValue": "false"
                    },
                    "DEFAULT_ORGANIZATION_NAME": {
                      "description": "Organization name shown in Studio.",
                      "defaultValue": "My Organization"
                    }
                  }
                },
                "b7500aa0-117a-4304-a664-1de907d49117": {
                  "name": "storage",
                  "source": {
                    "image": "supabase/storage-api:v1.60.4"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Pin Storage API to port 5000 so Kong can reach it. Do not change.",
                      "defaultValue": "5000"
                    },
                    "REGION": {
                      "description": "Do not change.",
                      "defaultValue": "stub"
                    },
                    "ANON_KEY": {
                      "description": "Do not change.",
                      "defaultValue": "${{ kong.ANON_KEY }}"
                    },
                    "TENANT_ID": {
                      "description": "Do not change.",
                      "defaultValue": "stub"
                    },
                    "SERVICE_KEY": {
                      "description": "Do not change.",
                      "defaultValue": "${{ kong.SERVICE_ROLE_KEY }}"
                    },
                    "DATABASE_URL": {
                      "description": "Do not change.",
                      "defaultValue": "postgres://supabase_admin:${{ Postgres.POSTGRES_PASSWORD }}@${{ Postgres.RAILWAY_PRIVATE_DOMAIN }}:5432/${{ Postgres.POSTGRES_DB }}"
                    },
                    "POSTGREST_URL": {
                      "description": "Do not change.",
                      "defaultValue": "http://${{ rest.RAILWAY_PRIVATE_DOMAIN }}:3000"
                    },
                    "FILE_SIZE_LIMIT": {
                      "description": "Max upload size in bytes (50 MB default).",
                      "defaultValue": "52428800"
                    },
                    "STORAGE_BACKEND": {
                      "description": "Files stored on the attached Railway volume.",
                      "defaultValue": "file"
                    },
                    "GLOBAL_S3_BUCKET": {
                      "description": "Do not change.",
                      "defaultValue": "stub"
                    },
                    "PGRST_JWT_SECRET": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.JWT_SECRET }}"
                    },
                    "FILE_STORAGE_BACKEND_PATH": {
                      "description": "Do not change.",
                      "defaultValue": "/var/lib/storage"
                    },
                    "ENABLE_IMAGE_TRANSFORMATION": {
                      "description": "Requires imgproxy with a shared volume, which Railway does not support. Keep false.",
                      "defaultValue": "false"
                    }
                  },
                  "volumeMounts": {
                    "b7500aa0-117a-4304-a664-1de907d49117": {
                      "mountPath": "/var/lib/storage"
                    }
                  }
                },
                "bb48429f-d810-446a-91e8-0c73c28973c4": {
                  "name": "meta",
                  "source": {
                    "image": "supabase/postgres-meta:v0.96.6"
                  },
                  "variables": {
                    "PG_META_PORT": {
                      "description": "Do not change.",
                      "defaultValue": "8080"
                    },
                    "PG_META_DB_HOST": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.RAILWAY_PRIVATE_DOMAIN }}"
                    },
                    "PG_META_DB_NAME": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.POSTGRES_DB }}"
                    },
                    "PG_META_DB_PORT": {
                      "description": "Do not change.",
                      "defaultValue": "5432"
                    },
                    "PG_META_DB_USER": {
                      "description": "Do not change.",
                      "defaultValue": "supabase_admin"
                    },
                    "PG_META_DB_PASSWORD": {
                      "description": "Do not change.",
                      "defaultValue": "${{ Postgres.POSTGRES_PASSWORD }}"
                    }
                  }
                },
                "da78e5f6-25ae-4ea0-a45a-045009fc2674": {
                  "name": "kong",
                  "source": {
                    "image": "kong/kong:3.9.1"
                  },
                  "variables": {
                    "ANON_KEY": {
                      "description": "REQUIRED. Public anon API key (a JWT signed with your JWT_SECRET). Generate at https://supabase.com/docs/guides/self-hosting/docker#securing-your-services",
                      "defaultValue": "{{ANON_KEY}}"
                    },
                    "KONG_PLUGINS": {
                      "description": "Do not change.",
                      "defaultValue": "request-transformer,cors,key-auth,acl,basic-auth"
                    },
                    "KONG_DATABASE": {
                      "description": "Do not change.",
                      "defaultValue": "off"
                    },
                    "KONG_DNS_ORDER": {
                      "description": "Resolves Railway private IPv6 network. Do not change.",
                      "defaultValue": "LAST,A,AAAA,CNAME"
                    },
                    "SERVICE_ROLE_KEY": {
                      "description": "REQUIRED. Secret service_role API key (a JWT signed with your JWT_SECRET). Generate together with ANON_KEY. Never expose to browsers.",
                      "defaultValue": "{{SERVICE_ROLE_KEY}}"
                    },
                    "KONG_PROXY_LISTEN": {
                      "description": "Do not change.",
                      "defaultValue": "0.0.0.0:8000"
                    },
                    "DASHBOARD_PASSWORD": {
                      "description": "Auto-generated password for the Studio dashboard login.",
                      "defaultValue": "{{DASHBOARD_PASSWORD}}"
                    },
                    "DASHBOARD_USERNAME": {
                      "description": "Username for the Studio dashboard login.",
                      "defaultValue": "supabase"
                    },
                    "KONG_DECLARATIVE_CONFIG_STRING": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "{\"_format_version\":\"3.0\",\"consumers\":[{\"username\":\"anon\",\"keyauth_credentials\":[{\"key\":\"${{ ANON_KEY }}\"}],\"acls\":[{\"group\":\"anon\"}]},{\"username\":\"service_role\",\"keyauth_credentials\":[{\"key\":\"${{ SERVICE_ROLE_KEY }}\"}],\"acls\":[{\"group\":\"admin\"}]},{\"username\":\"DASHBOARD\",\"basicauth_credentials\":[{\"username\":\"${{ DASHBOARD_USERNAME }}\",\"password\":\"${{ DASHBOARD_PASSWORD }}\"}]}],\"services\":[{\"name\":\"auth-v1\",\"url\":\"http://${{ auth.RAILWAY_PRIVATE_DOMAIN }}:9999/\",\"routes\":[{\"name\":\"auth-v1-all\",\"strip_path\":true,\"paths\":[\"/auth/v1/\"]}],\"plugins\":[{\"name\":\"cors\"}]},{\"name\":\"rest-v1\",\"url\":\"http://${{ rest.RAILWAY_PRIVATE_DOMAIN }}:3000/\",\"routes\":[{\"name\":\"rest-v1-all\",\"strip_path\":true,\"paths\":[\"/rest/v1/\"]}],\"plugins\":[{\"name\":\"cors\"},{\"name\":\"key-auth\",\"config\":{\"hide_credentials\":true}},{\"name\":\"acl\",\"config\":{\"hide_groups_header\":true,\"allow\":[\"admin\",\"anon\"]}}]},{\"name\":\"graphql-v1\",\"url\":\"http://${{ rest.RAILWAY_PRIVATE_DOMAIN }}:3000/rpc/graphql\",\"routes\":[{\"name\":\"graphql-v1-all\",\"strip_path\":true,\"paths\":[\"/graphql/v1\"]}],\"plugins\":[{\"name\":\"cors\"},{\"name\":\"key-auth\",\"config\":{\"hide_credentials\":true}},{\"name\":\"request-transformer\",\"config\":{\"add\":{\"headers\":[\"Content-Profile:graphql_public\"]}}},{\"name\":\"acl\",\"config\":{\"hide_groups_header\":true,\"allow\":[\"admin\",\"anon\"]}}]},{\"name\":\"storage-v1\",\"url\":\"http://${{ storage.RAILWAY_PRIVATE_DOMAIN }}:5000/\",\"routes\":[{\"name\":\"storage-v1-all\",\"strip_path\":true,\"paths\":[\"/storage/v1/\"]}],\"plugins\":[{\"name\":\"cors\"}]},{\"name\":\"meta\",\"url\":\"http://${{ meta.RAILWAY_PRIVATE_DOMAIN }}:8080/\",\"routes\":[{\"name\":\"meta-all\",\"strip_path\":true,\"paths\":[\"/pg/\"]}],\"plugins\":[{\"name\":\"key-auth\",\"config\":{\"hide_credentials\":false}},{\"name\":\"acl\",\"config\":{\"hide_groups_header\":true,\"allow\":[\"admin\"]}}]},{\"name\":\"dashboard\",\"url\":\"http://${{ studio.RAILWAY_PRIVATE_DOMAIN }}:3000/\",\"routes\":[{\"name\":\"dashboard-all\",\"strip_path\":true,\"paths\":[\"/\"]}],\"plugins\":[{\"name\":\"cors\"},{\"name\":\"basic-auth\",\"config\":{\"hide_credentials\":true}}]}]}"
                    },
                    "KONG_NGINX_PROXY_PROXY_BUFFERS": {
                      "description": "Do not change.",
                      "defaultValue": "64 160k"
                    },
                    "KONG_NGINX_PROXY_PROXY_BUFFER_SIZE": {
                      "description": "Do not change.",
                      "defaultValue": "160k"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8000": {
                        "port": 8000
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 7,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-08T23:41:49.267Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_78c144610c774212b3d6",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 114,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "studio"
  }
}
