{
  "manifest_version": "1.0.0",
  "template": {
    "id": "6800bda1-ead8-42e6-8b9b-a1dabd345b5b",
    "slug": "superset",
    "name": "Apache Superset | Open Source Tableau Alternative",
    "description": "Self-host Apache Superset — open-source BI and data visualization",
    "url": "https://railway.com/deploy/superset",
    "upstream": {
      "image": "apache/superset:latest"
    }
  },
  "services": [
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.2.1"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Superset",
      "source": {
        "image": "apache/superset:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Superset-Worker",
      "source": {
        "image": "apache/superset:latest"
      },
      "needs_volume": false,
      "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": "Superset-Beat",
      "source": {
        "image": "apache/superset:latest"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Internal Redis service hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Redis server listening port",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Redis default authentication user",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Internal Redis connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Redis password environment reference",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Password for Redis authentication",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "REDIS_PUBLIC_URL",
      "service": "Redis",
      "description": "Public Redis connection URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEV_MODE",
      "service": "Superset",
      "description": "Disable dev-mode editable install",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_URL",
      "service": "Superset",
      "description": "Redis broker + cache URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PYTHONPATH",
      "service": "Superset",
      "description": "Location of superset_config.py",
      "secret": false,
      "strategy": "default",
      "default": "/app/pythonpath"
    },
    {
      "key": "DATABASE_URL",
      "service": "Superset",
      "description": "Metadata DB connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_ENV",
      "service": "Superset",
      "description": "Production mode flag",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "SUPERSET_PORT",
      "service": "Superset",
      "description": "Internal gunicorn port",
      "secret": false,
      "strategy": "default",
      "default": "8088"
    },
    {
      "key": "ADMIN_PASSWORD",
      "service": "Superset",
      "description": "Specify Bootstrap admin password. Note bootstrap username is 'admin'",
      "secret": true,
      "strategy": "default",
      "default": "$"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Superset",
      "description": "Run container as root",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DATABASE_DIALECT",
      "service": "Superset",
      "description": "Triggers psycopg2-binary install",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "SUPERSET_CONFIG_B64",
      "service": "Superset",
      "description": "Base64 superset_config.py, feel free to update it with another base64 key at bootstrap",
      "secret": false,
      "strategy": "default",
      "default": "aW1wb3J0IG9zClNRTEFMQ0hFTVlfREFUQUJBU0VfVVJJID0gb3MuZW52aXJvbi5nZXQoIkRBVEFCQVNFX1VSTCIpCnIgPSBvcy5lbnZpcm9uLmdldCgiUkVESVNfVVJMIiwgInJlZGlzOi8vbG9jYWxob3N0OjYzNzkiKS5yc3RyaXAoIi8iKQpjbGFzcyBDZWxlcnlDb25maWc6CiAgICBicm9rZXJfdXJsID0gciArICIvMCIKICAgIHJlc3VsdF9iYWNrZW5kID0gciArICIvMSIKQ0VMRVJZX0NPTkZJRyA9IENlbGVyeUNvbmZpZwpDQUNIRV9DT05GSUcgPSB7IkNBQ0hFX1RZUEUiOiAiUmVkaXNDYWNoZSIsICJDQUNIRV9SRURJU19VUkwiOiByICsgIi8yIiwgIkNBQ0hFX0RFRkFVTFRfVElNRU9VVCI6IDMwMCwgIkNBQ0hFX0tFWV9QUkVGSVgiOiAic3VwZXJzZXRfIn0KREFUQV9DQUNIRV9DT05GSUcgPSB7IkNBQ0hFX1RZUEUiOiAiUmVkaXNDYWNoZSIsICJDQUNIRV9SRURJU19VUkwiOiByICsgIi8zIiwgIkNBQ0hFX0RFRkFVTFRfVElNRU9VVCI6IDMwMCwgIkNBQ0hFX0tFWV9QUkVGSVgiOiAic3VwZXJzZXRfZGF0YV8ifQpGRUFUVVJFX0ZMQUdTID0geyJBTEVSVF9SRVBPUlRTIjogVHJ1ZSwgIkRBU0hCT0FSRF9SQkFDIjogVHJ1ZSwgIkVNQkVEREVEX1NVUEVSU0VUIjogVHJ1ZX0KVEFMSVNNQU5fRU5BQkxFRCA9IEZhbHNlCldURl9DU1JGX0VOQUJMRUQgPSBUcnVlCldURl9DU1JGX1RJTUVfTElNSVQgPSBOb25lClNFU1NJT05fQ09PS0lFX0hUVFBPTkxZID0gVHJ1ZQpTRVNTSU9OX0NPT0tJRV9TRUNVUkUgPSBUcnVlClNFU1NJT05fQ09PS0lFX1NBTUVTSVRFID0gIkxheCIKRU5BQkxFX1BST1hZX0ZJWCA9IFRydWUK"
    },
    {
      "key": "SUPERSET_SECRET_KEY",
      "service": "Superset",
      "description": "Flask session signing key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SUPERSET_LOAD_EXAMPLES",
      "service": "Superset",
      "description": "Skip loading example dashboards",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "DEV_MODE",
      "service": "Superset-Worker",
      "description": "Disable dev mode",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_URL",
      "service": "Superset-Worker",
      "description": "Redis broker + cache URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PYTHONPATH",
      "service": "Superset-Worker",
      "description": "Config file location",
      "secret": false,
      "strategy": "default",
      "default": "/app/pythonpath"
    },
    {
      "key": "DATABASE_URL",
      "service": "Superset-Worker",
      "description": "Metadata DB connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_ENV",
      "service": "Superset-Worker",
      "description": "Production mode",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "SUPERSET_PORT",
      "service": "Superset-Worker",
      "description": "Not used by worker, kept consistent",
      "secret": false,
      "strategy": "default",
      "default": "8088"
    },
    {
      "key": "ADMIN_PASSWORD",
      "service": "Superset-Worker",
      "description": "Match web service admin",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Superset-Worker",
      "description": "Run container as root",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DATABASE_DIALECT",
      "service": "Superset-Worker",
      "description": "psycopg2 install trigger",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "SUPERSET_CONFIG_B64",
      "service": "Superset-Worker",
      "description": "Base64 config",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_SECRET_KEY",
      "service": "Superset-Worker",
      "description": "Match web service key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_LOAD_EXAMPLES",
      "service": "Superset-Worker",
      "description": "Skip examples",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Postgres data storage directory",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres",
      "description": "Internal Postgres host address",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres",
      "description": "Postgres server listening port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres",
      "description": "Default Postgres username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres",
      "description": "Default database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres",
      "description": "Password for Postgres user",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Initial database created on startup",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres",
      "description": "Internal Postgres connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Default database superuser name",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres",
      "description": "Self-signed SSL certificate validity",
      "secret": false,
      "strategy": "default",
      "default": "820"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Postgres database user password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_PUBLIC_URL",
      "service": "Postgres",
      "description": "Public Postgres connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres",
      "description": "Graceful shutdown draining duration",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "DEV_MODE",
      "service": "Superset-Beat",
      "description": "Disable dev mode",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_URL",
      "service": "Superset-Beat",
      "description": "Redis broker + cache URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PYTHONPATH",
      "service": "Superset-Beat",
      "description": "Config file location",
      "secret": false,
      "strategy": "default",
      "default": "/app/pythonpath"
    },
    {
      "key": "DATABASE_URL",
      "service": "Superset-Beat",
      "description": "Metadata DB connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_ENV",
      "service": "Superset-Beat",
      "description": "Production mode",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "SUPERSET_PORT",
      "service": "Superset-Beat",
      "description": "Not used by beat, kept consistent",
      "secret": false,
      "strategy": "default",
      "default": "8088"
    },
    {
      "key": "ADMIN_PASSWORD",
      "service": "Superset-Beat",
      "description": "Match web service admin",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Superset-Beat",
      "description": "Run container as root",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DATABASE_DIALECT",
      "service": "Superset-Beat",
      "description": "psycopg2 install trigger",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "SUPERSET_CONFIG_B64",
      "service": "Superset-Beat",
      "description": "Base64 config",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_SECRET_KEY",
      "service": "Superset-Beat",
      "description": "Match web service key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SUPERSET_LOAD_EXAMPLES",
      "service": "Superset-Beat",
      "description": "Skip examples",
      "secret": false,
      "strategy": "default",
      "default": "no"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "superset"
      }
    },
    "cli": "railway deploy --template superset",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "6800bda1-ead8-42e6-8b9b-a1dabd345b5b",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "00def355-264e-45d1-ab2a-ce88617213d0": {
                  "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\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:8.2.1"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "description": "Internal Redis service hostname",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "description": "Redis server listening port",
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "description": "Redis default authentication user",
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Internal Redis connection string",
                      "defaultValue": "redis://${{REDISUSER}}:${{REDIS_PASSWORD}}@${{REDISHOST}}:${{REDISPORT}}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "description": "Redis password environment reference",
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Password for Redis authentication",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    },
                    "REDIS_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "Public Redis connection URL",
                      "defaultValue": "redis://default:${{REDIS_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}"
                    }
                  },
                  "volumeMounts": {
                    "00def355-264e-45d1-ab2a-ce88617213d0": {
                      "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."
                  }
                },
                "0dfcc426-a1cc-4d99-b38b-2b6b76932130": {
                  "icon": "https://raw.githubusercontent.com/ju-li/apache-superset-railway/main/logo.png",
                  "name": "Superset",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"mkdir -p /app/pythonpath && echo \\\"$SUPERSET_CONFIG_B64\\\" | base64 -d > /app/pythonpath/superset_config.py && /app/docker/docker-init.sh && /app/docker/docker-bootstrap.sh app-gunicorn\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "apache/superset:latest"
                  },
                  "variables": {
                    "DEV_MODE": {
                      "isOptional": false,
                      "description": "Disable dev-mode editable install",
                      "defaultValue": "false"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis broker + cache URL",
                      "defaultValue": "${{Redis.REDIS_URL}}"
                    },
                    "PYTHONPATH": {
                      "isOptional": false,
                      "description": "Location of superset_config.py",
                      "defaultValue": "/app/pythonpath"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Metadata DB connection string",
                      "defaultValue": "${{Postgres.DATABASE_URL}}"
                    },
                    "SUPERSET_ENV": {
                      "isOptional": false,
                      "description": "Production mode flag",
                      "defaultValue": "production"
                    },
                    "SUPERSET_PORT": {
                      "isOptional": false,
                      "description": "Internal gunicorn port",
                      "defaultValue": "8088"
                    },
                    "ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Specify Bootstrap admin password. Note bootstrap username is 'admin'",
                      "defaultValue": "$"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "description": "Run container as root",
                      "defaultValue": "0"
                    },
                    "DATABASE_DIALECT": {
                      "isOptional": false,
                      "description": "Triggers psycopg2-binary install",
                      "defaultValue": "postgresql"
                    },
                    "SUPERSET_CONFIG_B64": {
                      "isOptional": false,
                      "description": "Base64 superset_config.py, feel free to update it with another base64 key at bootstrap",
                      "defaultValue": "aW1wb3J0IG9zClNRTEFMQ0hFTVlfREFUQUJBU0VfVVJJID0gb3MuZW52aXJvbi5nZXQoIkRBVEFCQVNFX1VSTCIpCnIgPSBvcy5lbnZpcm9uLmdldCgiUkVESVNfVVJMIiwgInJlZGlzOi8vbG9jYWxob3N0OjYzNzkiKS5yc3RyaXAoIi8iKQpjbGFzcyBDZWxlcnlDb25maWc6CiAgICBicm9rZXJfdXJsID0gciArICIvMCIKICAgIHJlc3VsdF9iYWNrZW5kID0gciArICIvMSIKQ0VMRVJZX0NPTkZJRyA9IENlbGVyeUNvbmZpZwpDQUNIRV9DT05GSUcgPSB7IkNBQ0hFX1RZUEUiOiAiUmVkaXNDYWNoZSIsICJDQUNIRV9SRURJU19VUkwiOiByICsgIi8yIiwgIkNBQ0hFX0RFRkFVTFRfVElNRU9VVCI6IDMwMCwgIkNBQ0hFX0tFWV9QUkVGSVgiOiAic3VwZXJzZXRfIn0KREFUQV9DQUNIRV9DT05GSUcgPSB7IkNBQ0hFX1RZUEUiOiAiUmVkaXNDYWNoZSIsICJDQUNIRV9SRURJU19VUkwiOiByICsgIi8zIiwgIkNBQ0hFX0RFRkFVTFRfVElNRU9VVCI6IDMwMCwgIkNBQ0hFX0tFWV9QUkVGSVgiOiAic3VwZXJzZXRfZGF0YV8ifQpGRUFUVVJFX0ZMQUdTID0geyJBTEVSVF9SRVBPUlRTIjogVHJ1ZSwgIkRBU0hCT0FSRF9SQkFDIjogVHJ1ZSwgIkVNQkVEREVEX1NVUEVSU0VUIjogVHJ1ZX0KVEFMSVNNQU5fRU5BQkxFRCA9IEZhbHNlCldURl9DU1JGX0VOQUJMRUQgPSBUcnVlCldURl9DU1JGX1RJTUVfTElNSVQgPSBOb25lClNFU1NJT05fQ09PS0lFX0hUVFBPTkxZID0gVHJ1ZQpTRVNTSU9OX0NPT0tJRV9TRUNVUkUgPSBUcnVlClNFU1NJT05fQ09PS0lFX1NBTUVTSVRFID0gIkxheCIKRU5BQkxFX1BST1hZX0ZJWCA9IFRydWUK"
                    },
                    "SUPERSET_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Flask session signing key",
                      "defaultValue": "{{SUPERSET_SECRET_KEY}}"
                    },
                    "SUPERSET_LOAD_EXAMPLES": {
                      "isOptional": false,
                      "description": "Skip loading example dashboards",
                      "defaultValue": "no"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "297e00b8-8880-4097-b0ec-18437bca4ece": {
                  "icon": "https://raw.githubusercontent.com/ju-li/apache-superset-railway/main/logo.png",
                  "name": "Superset-Worker",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"mkdir -p /app/pythonpath && echo \\\"$SUPERSET_CONFIG_B64\\\" | base64 -d > /app/pythonpath/superset_config.py && /app/docker/docker-bootstrap.sh worker\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "apache/superset:latest"
                  },
                  "variables": {
                    "DEV_MODE": {
                      "isOptional": false,
                      "description": "Disable dev mode",
                      "defaultValue": "false"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis broker + cache URL",
                      "defaultValue": "${{Redis.REDIS_URL}}"
                    },
                    "PYTHONPATH": {
                      "isOptional": false,
                      "description": "Config file location",
                      "defaultValue": "/app/pythonpath"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Metadata DB connection string",
                      "defaultValue": "${{Postgres.DATABASE_URL}}"
                    },
                    "SUPERSET_ENV": {
                      "isOptional": false,
                      "description": "Production mode",
                      "defaultValue": "production"
                    },
                    "SUPERSET_PORT": {
                      "isOptional": false,
                      "description": "Not used by worker, kept consistent",
                      "defaultValue": "8088"
                    },
                    "ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Match web service admin",
                      "defaultValue": "${{Superset.ADMIN_PASSWORD}}"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "description": "Run container as root",
                      "defaultValue": "0"
                    },
                    "DATABASE_DIALECT": {
                      "isOptional": false,
                      "description": "psycopg2 install trigger",
                      "defaultValue": "postgresql"
                    },
                    "SUPERSET_CONFIG_B64": {
                      "isOptional": false,
                      "description": "Base64 config",
                      "defaultValue": "${{Superset.SUPERSET_CONFIG_B64}}"
                    },
                    "SUPERSET_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Match web service key",
                      "defaultValue": "${{Superset.SUPERSET_SECRET_KEY}}"
                    },
                    "SUPERSET_LOAD_EXAMPLES": {
                      "isOptional": false,
                      "description": "Skip examples",
                      "defaultValue": "no"
                    }
                  }
                },
                "86b5c990-74d8-4d49-9fe9-807760691a72": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:18"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "Postgres data storage directory",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "description": "Internal Postgres host address",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "isOptional": false,
                      "description": "Postgres server listening port",
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "description": "Default Postgres username",
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "description": "Default database name",
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "description": "Password for Postgres user",
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Initial database created on startup",
                      "defaultValue": "railway"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Internal Postgres connection string",
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Default database superuser name",
                      "defaultValue": "postgres"
                    },
                    "SSL_CERT_DAYS": {
                      "isOptional": false,
                      "description": "Self-signed SSL certificate validity",
                      "defaultValue": "820"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres database user password",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "DATABASE_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "Public Postgres connection string",
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{PGDATABASE}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Graceful shutdown draining duration",
                      "defaultValue": "60"
                    }
                  },
                  "volumeMounts": {
                    "86b5c990-74d8-4d49-9fe9-807760691a72": {
                      "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."
                  }
                },
                "d4ffdabf-2d3b-4445-871e-9e7b0f0bce02": {
                  "icon": "https://raw.githubusercontent.com/ju-li/apache-superset-railway/main/logo.png",
                  "name": "Superset-Beat",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"mkdir -p /app/pythonpath && echo \\\"$SUPERSET_CONFIG_B64\\\" | base64 -d > /app/pythonpath/superset_config.py && rm -f /tmp/celerybeat.pid && /app/docker/docker-bootstrap.sh beat\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "apache/superset:latest"
                  },
                  "variables": {
                    "DEV_MODE": {
                      "isOptional": false,
                      "description": "Disable dev mode",
                      "defaultValue": "false"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis broker + cache URL",
                      "defaultValue": "${{Redis.REDIS_URL}}"
                    },
                    "PYTHONPATH": {
                      "isOptional": false,
                      "description": "Config file location",
                      "defaultValue": "/app/pythonpath"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Metadata DB connection string",
                      "defaultValue": "${{Postgres.DATABASE_URL}}"
                    },
                    "SUPERSET_ENV": {
                      "isOptional": false,
                      "description": "Production mode",
                      "defaultValue": "production"
                    },
                    "SUPERSET_PORT": {
                      "isOptional": false,
                      "description": "Not used by beat, kept consistent",
                      "defaultValue": "8088"
                    },
                    "ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Match web service admin",
                      "defaultValue": "${{Superset.ADMIN_PASSWORD}}"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "description": "Run container as root",
                      "defaultValue": "0"
                    },
                    "DATABASE_DIALECT": {
                      "isOptional": false,
                      "description": "psycopg2 install trigger",
                      "defaultValue": "postgresql"
                    },
                    "SUPERSET_CONFIG_B64": {
                      "isOptional": false,
                      "description": "Base64 config",
                      "defaultValue": "${{Superset.SUPERSET_CONFIG_B64}}"
                    },
                    "SUPERSET_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Match web service key",
                      "defaultValue": "${{Superset.SUPERSET_SECRET_KEY}}"
                    },
                    "SUPERSET_LOAD_EXAMPLES": {
                      "isOptional": false,
                      "description": "Skip examples",
                      "defaultValue": "no"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-21T16:15:12.787Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-20T14:07:49.729Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_ea251d97929c4d69968a",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 87,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "Superset-Beat"
  }
}
