{
  "manifest_version": "1.0.0",
  "template": {
    "id": "9b248a6c-55ad-4176-a58d-db297a8d5956",
    "slug": "nhost-or-just-updated-firebase-alternati",
    "name": "Nhost | (Just Updated) Firebase Alternative, Auth + GraphQL + Storage, Secrets Generated",
    "description": "Auth, GraphQL API and file storage in one stack, secrets generated",
    "url": "https://railway.com/deploy/nhost-or-just-updated-firebase-alternati",
    "upstream": {
      "image": "caddy@sha256:d8542f48d34a9cf4e4c11a478865229840e87e4c96ea3f439101f31a5d35f75f"
    }
  },
  "services": [
    {
      "name": "storage",
      "source": {
        "image": "nhost/storage:0.7.2@sha256:8692cf7eba6b775681863796bfb53160d41167818bbfebe8392dea4ce264eb27"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "graphql",
      "source": {
        "image": "nhost/graphql-engine:v2.46.0-ce@sha256:bfc3e5fd51e87f99dc0894976f16c14165d9c0fbd1fe503a3ebfbaf02600fed0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "gateway",
      "source": {
        "image": "caddy@sha256:d8542f48d34a9cf4e4c11a478865229840e87e4c96ea3f439101f31a5d35f75f"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "auth",
      "source": {
        "image": "nhost/auth:0.40.2@sha256:8674c405184e0b14f5cb80912b1275ac51fb0325035862dacfe943ad77de95b3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "objects",
      "source": {
        "image": "ghcr.io/bon5co/buzz-railway-minio:latest@sha256:6842303eaf3e2c6413d84c2f67b9dd51ab2992214ecc72230dde4c3050145f00"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "image": "postgres:18.6@sha256:74935e72241653ca55e0414067e6d8763aceb8a810eb51b452253ec3dcfc4336"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "S3_BUCKET",
      "service": "storage",
      "description": "Provide a value for S3_BUCKET.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PUBLIC_URL",
      "service": "storage",
      "description": "Provide a value for PUBLIC_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "storage",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "storage",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "storage",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HASURA_ENDPOINT",
      "service": "storage",
      "description": "Provide a value for HASURA_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "HASURA_METADATA",
      "service": "storage",
      "description": "Provide a value for HASURA_METADATA.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "POSTGRES_MIGRATIONS",
      "service": "storage",
      "description": "Provide a value for POSTGRES_MIGRATIONS.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "POSTGRES_MIGRATIONS_SOURCE",
      "service": "storage",
      "description": "Provide a value for POSTGRES_MIGRATIONS_SOURCE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "HASURA_GRAPHQL_ADMIN_SECRET",
      "service": "storage",
      "description": "Provide a value for HASURA_GRAPHQL_ADMIN_SECRET.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "JWT_KEY",
      "service": "graphql",
      "description": "Provide a value for JWT_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "HASURA_GRAPHQL_JWT_SECRET",
      "service": "graphql",
      "description": "Provide a value for HASURA_GRAPHQL_JWT_SECRET.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HASURA_GRAPHQL_ADMIN_SECRET",
      "service": "graphql",
      "description": "Provide a value for HASURA_GRAPHQL_ADMIN_SECRET.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "HASURA_GRAPHQL_DATABASE_URL",
      "service": "graphql",
      "description": "Provide a value for HASURA_GRAPHQL_DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_HOST",
      "service": "gateway",
      "description": "Provide a value for AUTH_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "GRAPHQL_HOST",
      "service": "gateway",
      "description": "Provide a value for GRAPHQL_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_HOST",
      "service": "gateway",
      "description": "Provide a value for STORAGE_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_CLIENT_URL",
      "service": "auth",
      "description": "Provide a value for AUTH_CLIENT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_SERVER_URL",
      "service": "auth",
      "description": "Provide a value for AUTH_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HASURA_GRAPHQL_JWT_SECRET",
      "service": "auth",
      "description": "Provide a value for HASURA_GRAPHQL_JWT_SECRET.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HASURA_GRAPHQL_GRAPHQL_URL",
      "service": "auth",
      "description": "Provide a value for HASURA_GRAPHQL_GRAPHQL_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "HASURA_GRAPHQL_ADMIN_SECRET",
      "service": "auth",
      "description": "Provide a value for HASURA_GRAPHQL_ADMIN_SECRET.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HASURA_GRAPHQL_DATABASE_URL",
      "service": "auth",
      "description": "Provide a value for HASURA_GRAPHQL_DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_MIGRATIONS_CONNECTION",
      "service": "auth",
      "description": "Provide a value for POSTGRES_MIGRATIONS_CONNECTION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_EMAIL_SIGNIN_EMAIL_VERIFIED_REQUIRED",
      "service": "auth",
      "description": "Provide a value for AUTH_EMAIL_SIGNIN_EMAIL_VERIFIED_REQUIRED.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "BUZZ_S3_BUCKET",
      "service": "objects",
      "description": "Provide a value for BUZZ_S3_BUCKET.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "objects",
      "description": "Provide a value for MINIO_ROOT_USER.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "objects",
      "description": "Provide a value for MINIO_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "nhost-or-just-updated-firebase-alternati"
      }
    },
    "cli": "railway deploy --template nhost-or-just-updated-firebase-alternati",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "9b248a6c-55ad-4176-a58d-db297a8d5956",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "0266bd36-130d-4d69-9ce3-210c89c0f474": {
                  "icon": null,
                  "name": "storage",
                  "deploy": {
                    "startCommand": "/nix/store/99kk118sis0wavsvvgidfh536pslm524-hasura-storage-0.7.2/bin/hasura-storage serve",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nhost/storage:0.7.2@sha256:8692cf7eba6b775681863796bfb53160d41167818bbfebe8392dea4ce264eb27"
                  },
                  "variables": {
                    "S3_BUCKET": {
                      "isOptional": false,
                      "defaultValue": "${{objects.RAILWAY_SERVICE_NAME}}"
                    },
                    "PUBLIC_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_SERVICE_GATEWAY_URL}}/storage"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "http://${{objects.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{objects.MINIO_ROOT_USER}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{objects.MINIO_ROOT_PASSWORD}}"
                    },
                    "HASURA_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "http://${{graphql.RAILWAY_PRIVATE_DOMAIN}}:8080/v1"
                    },
                    "HASURA_METADATA": {
                      "isOptional": false,
                      "defaultValue": "{{HASURA_METADATA}}"
                    },
                    "POSTGRES_MIGRATIONS": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_MIGRATIONS}}"
                    },
                    "POSTGRES_MIGRATIONS_SOURCE": {
                      "isOptional": false,
                      "defaultValue": "postgres://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?sslmode=disable"
                    },
                    "HASURA_GRAPHQL_ADMIN_SECRET": {
                      "isOptional": false,
                      "defaultValue": "${{graphql.HASURA_GRAPHQL_ADMIN_SECRET}}"
                    }
                  }
                },
                "0ce7bd17-cce5-4832-b38c-3401e41a3b31": {
                  "icon": null,
                  "name": "graphql",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'export HASURA_GRAPHQL_ENABLE_CONSOLE=true HASURA_GRAPHQL_DEV_MODE=false HASURA_GRAPHQL_SERVER_HOST=\"*\" HASURA_GRAPHQL_SERVER_PORT=8080 HASURA_GRAPHQL_ENABLE_TELEMETRY=false HASURA_GRAPHQL_UNAUTHORIZED_ROLE=public HASURA_GRAPHQL_CORS_DOMAIN=\"*\"; exec graphql-engine serve'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nhost/graphql-engine:v2.46.0-ce@sha256:bfc3e5fd51e87f99dc0894976f16c14165d9c0fbd1fe503a3ebfbaf02600fed0"
                  },
                  "variables": {
                    "JWT_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{JWT_KEY}}"
                    },
                    "HASURA_GRAPHQL_JWT_SECRET": {
                      "isOptional": false,
                      "defaultValue": "{\"type\":\"HS256\",\"key\":\"${{JWT_KEY}}\"}"
                    },
                    "HASURA_GRAPHQL_ADMIN_SECRET": {
                      "isOptional": false,
                      "defaultValue": "{{HASURA_GRAPHQL_ADMIN_SECRET}}"
                    },
                    "HASURA_GRAPHQL_DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgres://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?sslmode=disable"
                    }
                  }
                },
                "17c7bb4b-e6eb-44f3-aa54-25a4899e6d93": {
                  "icon": null,
                  "name": "gateway",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'printf \":%s {\\n\\thandle /railway_health {\\n\\t\\trespond \\\"ok\\\" 200\\n\\t}\\n\\thandle_path /auth/v1/* {\\n\\t\\treverse_proxy %s:4000\\n\\t}\\n\\thandle /storage/* {\\n\\t\\turi strip_prefix /storage\\n\\t\\treverse_proxy %s:8000\\n\\t}\\n\\thandle {\\n\\t\\treverse_proxy %s:8080\\n\\t}\\n}\\n\" \"$PORT\" \"$AUTH_HOST\" \"$STORAGE_HOST\" \"$GRAPHQL_HOST\" > /etc/caddy/Caddyfile && exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile'",
                    "healthcheckPath": "/railway_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "caddy@sha256:d8542f48d34a9cf4e4c11a478865229840e87e4c96ea3f439101f31a5d35f75f"
                  },
                  "variables": {
                    "AUTH_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{auth.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "GRAPHQL_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{graphql.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "STORAGE_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{storage.RAILWAY_PRIVATE_DOMAIN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "8638cc9f-be35-4fe2-8272-ab0abe838443": {
                  "icon": null,
                  "name": "auth",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nhost/auth:0.40.2@sha256:8674c405184e0b14f5cb80912b1275ac51fb0325035862dacfe943ad77de95b3"
                  },
                  "variables": {
                    "AUTH_CLIENT_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_SERVICE_GATEWAY_URL}}"
                    },
                    "AUTH_SERVER_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_SERVICE_GATEWAY_URL}}/auth/v1"
                    },
                    "HASURA_GRAPHQL_JWT_SECRET": {
                      "isOptional": false,
                      "defaultValue": "{\"type\":\"HS256\",\"key\":\"${{graphql.JWT_KEY}}\"}"
                    },
                    "HASURA_GRAPHQL_GRAPHQL_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{graphql.RAILWAY_PRIVATE_DOMAIN}}:8080/v1/graphql"
                    },
                    "HASURA_GRAPHQL_ADMIN_SECRET": {
                      "isOptional": false,
                      "defaultValue": "${{graphql.HASURA_GRAPHQL_ADMIN_SECRET}}"
                    },
                    "HASURA_GRAPHQL_DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgres://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?sslmode=disable"
                    },
                    "POSTGRES_MIGRATIONS_CONNECTION": {
                      "isOptional": false,
                      "defaultValue": "postgres://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?sslmode=disable"
                    },
                    "AUTH_EMAIL_SIGNIN_EMAIL_VERIFIED_REQUIRED": {
                      "isOptional": false,
                      "defaultValue": "{{AUTH_EMAIL_SIGNIN_EMAIL_VERIFIED_REQUIRED}}"
                    }
                  }
                },
                "92bbda70-a6fb-4c0c-bb0e-0629c243dabd": {
                  "icon": null,
                  "name": "objects",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/bon5co/buzz-railway-minio:latest@sha256:6842303eaf3e2c6413d84c2f67b9dd51ab2992214ecc72230dde4c3050145f00"
                  },
                  "variables": {
                    "BUZZ_S3_BUCKET": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_SERVICE_NAME}}"
                    },
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "defaultValue": "{{MINIO_ROOT_USER}}"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "92bbda70-a6fb-4c0c-bb0e-0629c243dabd": {
                      "mountPath": "/data"
                    }
                  }
                },
                "9bff19d2-2843-4466-9bea-acdb5b5748a8": {
                  "icon": null,
                  "name": "postgres",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'printf \"CREATE SCHEMA IF NOT EXISTS auth;\\nCREATE SCHEMA IF NOT EXISTS storage;\\nCREATE EXTENSION IF NOT EXISTS pgcrypto;\\nCREATE EXTENSION IF NOT EXISTS citext;\\n\" > /docker-entrypoint-initdb.d/00-nhost.sql; exec docker-entrypoint.sh postgres'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:18.6@sha256:74935e72241653ca55e0414067e6d8763aceb8a810eb51b452253ec3dcfc4336"
                  },
                  "variables": {
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "9bff19d2-2843-4466-9bea-acdb5b5748a8": {
                      "mountPath": "/var/lib/postgresql"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "gateway",
      "method": "GET",
      "path": "/railway_health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 6,
    "needs_volume": true
  },
  "generated_at": "2026-10-15T22:14:42.788Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-10-15T21:52:55.132Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_069e520d6cfc4a61917e",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 57,
    "typical_build_seconds": 0,
    "typical_start_seconds": 20,
    "slowest_service": "gateway"
  }
}
