{
  "manifest_version": "1.0.0",
  "template": {
    "id": "c7592665-9e1d-4edd-af6c-e04b5c58c9f1",
    "slug": "pneumatic-files",
    "name": "Pneumatic files",
    "description": "Open-source workflow management platform by Pneumatic",
    "url": "https://railway.com/deploy/pneumatic-files",
    "upstream": {
      "repo_url": "https://github.com/pneumaticapp/pneumaticworkflow"
    }
  },
  "services": [
    {
      "name": "nginx",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Backend",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "SeaweedFS Filer",
      "source": {
        "image": "chrislusf/seaweedfs:3.95"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Frontend",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "file-postgres",
      "source": {
        "image": "postgres:15-bookworm"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "postgres:15-bookworm"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "SeaweedFS Volume",
      "source": {
        "image": "chrislusf/seaweedfs:3.95"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "celery-beat",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "file-service",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "rabbitmq",
      "source": {
        "image": "rabbitmq:3.13-management"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "SeaweedFS Master",
      "source": {
        "image": "chrislusf/seaweedfs:3.95"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:6.2.6"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "celery-worker",
      "source": {
        "repo": "https://github.com/pneumaticapp/pneumaticworkflow"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "nginx",
      "description": "Port nginx listens on (Railway requirement)",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "BACKEND_HOST",
      "service": "nginx",
      "description": "Backend upstream host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FRONTEND_HOST",
      "service": "nginx",
      "description": "Frontend upstream host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SERVICE_HOST",
      "service": "nginx",
      "description": "File service upstream host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AI",
      "service": "Backend",
      "description": "Enable AI features",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "PORT",
      "service": "Backend",
      "description": "Gunicorn listen port — Railway may auto-inject 8080, override to 8000",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "PUSH",
      "service": "Backend",
      "description": "Enable push notifications",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "EMAIL",
      "service": "Backend",
      "description": "Enable email sending",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "SIGNUP",
      "service": "Backend",
      "description": "Allow user registration",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "BILLING",
      "service": "Backend",
      "description": "Enable billing/payments",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CAPTCHA",
      "service": "Backend",
      "description": "Enable reCAPTCHA verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "MS_AUTH",
      "service": "Backend",
      "description": "Enable Microsoft OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "RELEASE",
      "service": "Backend",
      "description": "Application version",
      "secret": false,
      "strategy": "default",
      "default": "1.0.0"
    },
    {
      "key": "WSS_URL",
      "service": "Backend",
      "description": "WebSocket URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SSO_AUTH",
      "service": "Backend",
      "description": "Enable SSO authentication",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "ANALYTICS",
      "service": "Backend",
      "description": "Enable analytics tracking",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FORMS_URL",
      "service": "Backend",
      "description": "Public forms URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ADMIN_PATH",
      "service": "Backend",
      "description": "Django admin URL path",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "BACKEND_URL",
      "service": "Backend",
      "description": "Public backend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ENVIRONMENT",
      "service": "Backend",
      "description": "Runtime environment name",
      "secret": false,
      "strategy": "default",
      "default": "Production"
    },
    {
      "key": "GOOGLE_AUTH",
      "service": "Backend",
      "description": "Enable Google OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Backend",
      "description": "PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DJANGO_DEBUG",
      "service": "Backend",
      "description": "Django debug mode",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FRONTEND_URL",
      "service": "Backend",
      "description": "Public frontend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ALLOWED_HOSTS",
      "service": "Backend",
      "description": "Allowed HTTP hosts",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "LANGUAGE_CODE",
      "service": "Backend",
      "description": "Default language",
      "secret": false,
      "strategy": "default",
      "default": "en"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "Backend",
      "description": "PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Backend",
      "description": "PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WORKERS_COUNT",
      "service": "Backend",
      "description": "Gunicorn worker count",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "AUTH_REDIS_URL",
      "service": "Backend",
      "description": "Redis auth tokens (db1)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENABLE_LOGGING",
      "service": "Backend",
      "description": "Enable application logging",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "CACHE_REDIS_URL",
      "service": "Backend",
      "description": "Redis cache (db0)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_DB",
      "service": "Backend",
      "description": "File service PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILE_SERVICE_URL",
      "service": "Backend",
      "description": "Public file service URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Backend",
      "description": "Celery message broker",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DJANGO_SECRET_KEY",
      "service": "Backend",
      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
      "secret": true,
      "strategy": "default",
      "default": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Backend",
      "description": "PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SESSION_REDIS_URL",
      "service": "Backend",
      "description": "Redis sessions (db3)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CHANNELS_REDIS_URL",
      "service": "Backend",
      "description": "Django Channels WebSocket (db2)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_HOST",
      "service": "Backend",
      "description": "File service PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_PORT",
      "service": "Backend",
      "description": "File service PostgreSQL port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FILE_POSTGRES_USER",
      "service": "Backend",
      "description": "File service PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VERIFICATION_CHECK",
      "service": "Backend",
      "description": "Enable email verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_REPLICA_DB",
      "service": "Backend",
      "description": "Read-replica database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ORIGIN_ALLOW_ALL",
      "service": "Backend",
      "description": "Allow all CORS origins",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CORS_ORIGIN_WHITELIST",
      "service": "Backend",
      "description": "CORS allowed origin",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "POSTGRES_REPLICA_HOST",
      "service": "Backend",
      "description": "Read-replica host (same as primary if no replica)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_REPLICA_USER",
      "service": "Backend",
      "description": "Read-replica username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ALLOW_CREDENTIALS",
      "service": "Backend",
      "description": "Allow credentials in CORS requests",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "DJANGO_SETTINGS_MODULE",
      "service": "Backend",
      "description": "Django settings module path",
      "secret": false,
      "strategy": "default",
      "default": "src.settings"
    },
    {
      "key": "FILE_POSTGRES_PASSWORD",
      "service": "Backend",
      "description": "File service PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_REPLICA_PASSWORD",
      "service": "Backend",
      "description": "Read-replica password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SEAWEED_MASTER",
      "service": "SeaweedFS Filer",
      "description": "SeaweedFS master address for filer operations",
      "secret": false,
      "strategy": "default",
      "default": "seaweedfs-master.railway.internal:9333"
    },
    {
      "key": "AI",
      "service": "Frontend",
      "description": "Enable AI features in UI",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "PUSH",
      "service": "Frontend",
      "description": "Enable push notifications UI",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "SIGNUP",
      "service": "Frontend",
      "description": "Show registration form",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "BILLING",
      "service": "Frontend",
      "description": "Enable billing UI",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CAPTCHA",
      "service": "Frontend",
      "description": "Enable reCAPTCHA in forms",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "MS_AUTH",
      "service": "Frontend",
      "description": "Show Microsoft login button",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "RELEASE",
      "service": "Frontend",
      "description": "Application version",
      "secret": false,
      "strategy": "default",
      "default": "1.0.0"
    },
    {
      "key": "WSS_URL",
      "service": "Frontend",
      "description": "WebSocket connection URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SSO_AUTH",
      "service": "Frontend",
      "description": "Enable SSO login",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "ANALYTICS",
      "service": "Frontend",
      "description": "Enable analytics tracking",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "BACKEND_URL",
      "service": "Frontend",
      "description": "Public backend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GOOGLE_AUTH",
      "service": "Frontend",
      "description": "Show Google login button",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "MCS_RUN_ENV",
      "service": "Frontend",
      "description": "Runtime environment (prod/dev)",
      "secret": false,
      "strategy": "default",
      "default": "prod"
    },
    {
      "key": "FRONTEND_URL",
      "service": "Frontend",
      "description": "Public frontend URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NODE_OPTIONS",
      "service": "Frontend",
      "description": "Node.js memory limit",
      "secret": false,
      "strategy": "default",
      "default": "--max-old-space-size=3072"
    },
    {
      "key": "LANGUAGE_CODE",
      "service": "Frontend",
      "description": "Default UI language",
      "secret": false,
      "strategy": "default",
      "default": "en"
    },
    {
      "key": "FILE_SERVICE_URL",
      "service": "Frontend",
      "description": "Public file service URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BACKEND_PRIVATE_URL",
      "service": "Frontend",
      "description": "Private backend URL for SSR",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGDATA",
      "service": "file-postgres",
      "description": "PostgreSQL data directory path",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "file-postgres",
      "description": "PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "file-postgres",
      "description": "PostgreSQL port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "file-postgres",
      "description": "PostgreSQL user (reference)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "file-postgres",
      "description": "PostgreSQL database (reference)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "file-postgres",
      "description": "PostgreSQL password (reference)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "file-postgres",
      "description": "Database name",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "DATABASE_URL",
      "service": "file-postgres",
      "description": "Internal connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "file-postgres",
      "description": "PostgreSQL superuser name",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "file-postgres",
      "description": "PostgreSQL password (auto-generated)",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_PUBLIC_URL",
      "service": "file-postgres",
      "description": "External connection string (TCP proxy)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "PostgreSQL data directory path",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres",
      "description": "PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres",
      "description": "PostgreSQL port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres",
      "description": "PostgreSQL user (reference)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres",
      "description": "PostgreSQL database (reference)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres",
      "description": "PostgreSQL password (reference)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Database name",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres",
      "description": "Internal connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "PostgreSQL superuser name",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "PostgreSQL password (auto-generated)",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_PUBLIC_URL",
      "service": "Postgres",
      "description": "External connection string (TCP proxy)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SEAWEED_MASTER",
      "service": "SeaweedFS Volume",
      "description": "SeaweedFS master address for volume registration",
      "secret": false,
      "strategy": "default",
      "default": "seaweedfs-master.railway.internal:9333"
    },
    {
      "key": "AI",
      "service": "celery-beat",
      "description": "Enable AI features",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "PUSH",
      "service": "celery-beat",
      "description": "Enable push notifications",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "EMAIL",
      "service": "celery-beat",
      "description": "Enable email sending",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "SIGNUP",
      "service": "celery-beat",
      "description": "Allow user registration",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "BILLING",
      "service": "celery-beat",
      "description": "Enable billing/payments",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CAPTCHA",
      "service": "celery-beat",
      "description": "Enable reCAPTCHA verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "MS_AUTH",
      "service": "celery-beat",
      "description": "Enable Microsoft OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "RELEASE",
      "service": "celery-beat",
      "description": "Application version",
      "secret": false,
      "strategy": "default",
      "default": "1.0.0"
    },
    {
      "key": "WSS_URL",
      "service": "celery-beat",
      "description": "WebSocket URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SSO_AUTH",
      "service": "celery-beat",
      "description": "Enable SSO authentication",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "ANALYTICS",
      "service": "celery-beat",
      "description": "Enable analytics tracking",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FORMS_URL",
      "service": "celery-beat",
      "description": "Public forms URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ADMIN_PATH",
      "service": "celery-beat",
      "description": "Django admin URL path",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "BACKEND_URL",
      "service": "celery-beat",
      "description": "Public backend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ENVIRONMENT",
      "service": "celery-beat",
      "description": "Runtime environment name",
      "secret": false,
      "strategy": "default",
      "default": "Production"
    },
    {
      "key": "GOOGLE_AUTH",
      "service": "celery-beat",
      "description": "Enable Google OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_DB",
      "service": "celery-beat",
      "description": "PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DJANGO_DEBUG",
      "service": "celery-beat",
      "description": "Django debug mode",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FRONTEND_URL",
      "service": "celery-beat",
      "description": "Public frontend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ALLOWED_HOSTS",
      "service": "celery-beat",
      "description": "Allowed HTTP hosts",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "LANGUAGE_CODE",
      "service": "celery-beat",
      "description": "Default language",
      "secret": false,
      "strategy": "default",
      "default": "en"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "celery-beat",
      "description": "PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "celery-beat",
      "description": "PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_REDIS_URL",
      "service": "celery-beat",
      "description": "Redis auth tokens (db1)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENABLE_LOGGING",
      "service": "celery-beat",
      "description": "Enable application logging",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "CACHE_REDIS_URL",
      "service": "celery-beat",
      "description": "Redis cache (db0)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_DB",
      "service": "celery-beat",
      "description": "File service PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILE_SERVICE_URL",
      "service": "celery-beat",
      "description": "Public file service URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "celery-beat",
      "description": "Celery message broker",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DJANGO_SECRET_KEY",
      "service": "celery-beat",
      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
      "secret": true,
      "strategy": "default",
      "default": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "celery-beat",
      "description": "PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SESSION_REDIS_URL",
      "service": "celery-beat",
      "description": "Redis sessions (db3)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CHANNELS_REDIS_URL",
      "service": "celery-beat",
      "description": "Django Channels WebSocket (db2)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_HOST",
      "service": "celery-beat",
      "description": "File service PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_PORT",
      "service": "celery-beat",
      "description": "File service PostgreSQL port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FILE_POSTGRES_USER",
      "service": "celery-beat",
      "description": "File service PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VERIFICATION_CHECK",
      "service": "celery-beat",
      "description": "Enable email verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_REPLICA_DB",
      "service": "celery-beat",
      "description": "Read-replica database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ORIGIN_ALLOW_ALL",
      "service": "celery-beat",
      "description": "Allow all CORS origins",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CORS_ORIGIN_WHITELIST",
      "service": "celery-beat",
      "description": "CORS allowed origin",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "POSTGRES_REPLICA_HOST",
      "service": "celery-beat",
      "description": "Read-replica host (same as primary if no replica)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_REPLICA_USER",
      "service": "celery-beat",
      "description": "Read-replica username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ALLOW_CREDENTIALS",
      "service": "celery-beat",
      "description": "Allow credentials in CORS requests",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "DJANGO_SETTINGS_MODULE",
      "service": "celery-beat",
      "description": "Django settings module path",
      "secret": false,
      "strategy": "default",
      "default": "src.settings"
    },
    {
      "key": "FILE_POSTGRES_PASSWORD",
      "service": "celery-beat",
      "description": "File service PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_REPLICA_PASSWORD",
      "service": "celery-beat",
      "description": "Read-replica password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "file-service",
      "description": "Application port",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "DEBUG",
      "service": "file-service",
      "description": "Debug mode",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CONFIG",
      "service": "file-service",
      "description": "Configuration profile",
      "secret": false,
      "strategy": "default",
      "default": "Production"
    },
    {
      "key": "WORKERS",
      "service": "file-service",
      "description": "Uvicorn worker count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FORMS_URL",
      "service": "file-service",
      "description": "Public forms URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CHUNK_SIZE",
      "service": "file-service",
      "description": "File chunk size in bytes (1MB)",
      "secret": false,
      "strategy": "default",
      "default": "1048576"
    },
    {
      "key": "POSTGRES_DB",
      "service": "file-service",
      "description": "File-postgres database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FRONTEND_URL",
      "service": "file-service",
      "description": "Public frontend URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "file-service",
      "description": "Storage type (local = SeaweedFS)",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "BUCKET_PREFIX",
      "service": "file-service",
      "description": "S3 bucket prefix for file storage",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "MAX_FILE_SIZE",
      "service": "file-service",
      "description": "Maximum file size in bytes (100MB)",
      "secret": false,
      "strategy": "default",
      "default": "104857600"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "file-service",
      "description": "File-postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_PORT",
      "service": "file-service",
      "description": "File-postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "POSTGRES_USER",
      "service": "file-service",
      "description": "File-postgres username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_REDIS_URL",
      "service": "file-service",
      "description": "Redis auth tokens (db1, same as Backend)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FASTAPI_BASE_URL",
      "service": "file-service",
      "description": "Public file service base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "KEY_PREFIX_REDIS",
      "service": "file-service",
      "description": "Redis key prefix for auth token lookup",
      "secret": true,
      "strategy": "default",
      "default": ":1:"
    },
    {
      "key": "DJANGO_SECRET_KEY",
      "service": "file-service",
      "description": "Must match Backend's secret key for auth token verification",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "file-service",
      "description": "File-postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BACKEND_PRIVATE_URL",
      "service": "file-service",
      "description": "Private backend URL for internal API calls",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SEAWEEDFS_S3_REGION",
      "service": "file-service",
      "description": "SeaweedFS S3 region (required by boto3)",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "SEAWEEDFS_S3_USE_SSL",
      "service": "file-service",
      "description": "Use SSL for SeaweedFS connection",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "AUTH_TOKEN_ITERATIONS",
      "service": "file-service",
      "description": "Auth token hashing iterations",
      "secret": true,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "SEAWEEDFS_S3_ENDPOINT",
      "service": "file-service",
      "description": "SeaweedFS S3-compatible endpoint",
      "secret": false,
      "strategy": "default",
      "default": "http://seaweedfs-filer.railway.internal:8333"
    },
    {
      "key": "SEAWEEDFS_S3_ACCESS_KEY",
      "service": "file-service",
      "description": "SeaweedFS S3 access key",
      "secret": true,
      "strategy": "default",
      "default": "any-secret-key-will-work"
    },
    {
      "key": "SEAWEEDFS_S3_SECRET_KEY",
      "service": "file-service",
      "description": "SeaweedFS S3 secret key",
      "secret": true,
      "strategy": "default",
      "default": "any-secret-key-will-work"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "rabbitmq",
      "description": "Default RabbitMQ password (auto-generated)",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "rabbitmq",
      "description": "Default RabbitMQ username",
      "secret": false,
      "strategy": "default",
      "default": "pneumatic"
    },
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Redis server hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Redis server port",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Redis username",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Internal connection URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Redis password (alias reference)",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Redis authentication password (auto-generated)",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "REDIS_PUBLIC_URL",
      "service": "Redis",
      "description": "External connection URL (TCP proxy)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AI",
      "service": "celery-worker",
      "description": "Enable AI features",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "PUSH",
      "service": "celery-worker",
      "description": "Enable push notifications",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "EMAIL",
      "service": "celery-worker",
      "description": "Enable email sending",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "SIGNUP",
      "service": "celery-worker",
      "description": "Allow user registration",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "BILLING",
      "service": "celery-worker",
      "description": "Enable billing/payments",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CAPTCHA",
      "service": "celery-worker",
      "description": "Enable reCAPTCHA verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "MS_AUTH",
      "service": "celery-worker",
      "description": "Enable Microsoft OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "RELEASE",
      "service": "celery-worker",
      "description": "Application version",
      "secret": false,
      "strategy": "default",
      "default": "1.0.0"
    },
    {
      "key": "WSS_URL",
      "service": "celery-worker",
      "description": "WebSocket URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SSO_AUTH",
      "service": "celery-worker",
      "description": "Enable SSO authentication",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "ANALYTICS",
      "service": "celery-worker",
      "description": "Enable analytics tracking",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FORMS_URL",
      "service": "celery-worker",
      "description": "Public forms URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ADMIN_PATH",
      "service": "celery-worker",
      "description": "Django admin URL path",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "BACKEND_URL",
      "service": "celery-worker",
      "description": "Public backend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ENVIRONMENT",
      "service": "celery-worker",
      "description": "Runtime environment name",
      "secret": false,
      "strategy": "default",
      "default": "Production"
    },
    {
      "key": "GOOGLE_AUTH",
      "service": "celery-worker",
      "description": "Enable Google OAuth",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_DB",
      "service": "celery-worker",
      "description": "PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DJANGO_DEBUG",
      "service": "celery-worker",
      "description": "Django debug mode",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "FRONTEND_URL",
      "service": "celery-worker",
      "description": "Public frontend URL (via nginx)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ALLOWED_HOSTS",
      "service": "celery-worker",
      "description": "Allowed HTTP hosts",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "LANGUAGE_CODE",
      "service": "celery-worker",
      "description": "Default language",
      "secret": false,
      "strategy": "default",
      "default": "en"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "celery-worker",
      "description": "PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "celery-worker",
      "description": "PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_REDIS_URL",
      "service": "celery-worker",
      "description": "Redis auth tokens (db1)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENABLE_LOGGING",
      "service": "celery-worker",
      "description": "Enable application logging",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "CACHE_REDIS_URL",
      "service": "celery-worker",
      "description": "Redis cache (db0)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_DB",
      "service": "celery-worker",
      "description": "File service PostgreSQL database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILE_SERVICE_URL",
      "service": "celery-worker",
      "description": "Public file service URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "celery-worker",
      "description": "Celery message broker",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DJANGO_SECRET_KEY",
      "service": "celery-worker",
      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
      "secret": true,
      "strategy": "default",
      "default": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "celery-worker",
      "description": "PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SESSION_REDIS_URL",
      "service": "celery-worker",
      "description": "Redis sessions (db3)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CHANNELS_REDIS_URL",
      "service": "celery-worker",
      "description": "Django Channels WebSocket (db2)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_HOST",
      "service": "celery-worker",
      "description": "File service PostgreSQL host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_POSTGRES_PORT",
      "service": "celery-worker",
      "description": "File service PostgreSQL port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FILE_POSTGRES_USER",
      "service": "celery-worker",
      "description": "File service PostgreSQL username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VERIFICATION_CHECK",
      "service": "celery-worker",
      "description": "Enable email verification",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "POSTGRES_REPLICA_DB",
      "service": "celery-worker",
      "description": "Read-replica database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ORIGIN_ALLOW_ALL",
      "service": "celery-worker",
      "description": "Allow all CORS origins",
      "secret": false,
      "strategy": "default",
      "default": "no"
    },
    {
      "key": "CORS_ORIGIN_WHITELIST",
      "service": "celery-worker",
      "description": "CORS allowed origin",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "POSTGRES_REPLICA_HOST",
      "service": "celery-worker",
      "description": "Read-replica host (same as primary if no replica)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_REPLICA_USER",
      "service": "celery-worker",
      "description": "Read-replica username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CORS_ALLOW_CREDENTIALS",
      "service": "celery-worker",
      "description": "Allow credentials in CORS requests",
      "secret": false,
      "strategy": "default",
      "default": "yes"
    },
    {
      "key": "DJANGO_SETTINGS_MODULE",
      "service": "celery-worker",
      "description": "Django settings module path",
      "secret": false,
      "strategy": "default",
      "default": "src.settings"
    },
    {
      "key": "FILE_POSTGRES_PASSWORD",
      "service": "celery-worker",
      "description": "File service PostgreSQL password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_REPLICA_PASSWORD",
      "service": "celery-worker",
      "description": "Read-replica password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "pneumatic-files"
      }
    },
    "cli": "railway deploy --template pneumatic-files",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "c7592665-9e1d-4edd-af6c-e04b5c58c9f1",
            "serializedConfig": {
              "services": {
                "04ade0a0-432e-47ab-a351-0cd33c26020c": {
                  "icon": "https://devicons.railway.app/i/nginx.svg",
                  "name": "nginx",
                  "deploy": {
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "repo": "pneumaticapp/pneumaticworkflow",
                    "branch": null,
                    "rootDirectory": "nginx/railway"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Port nginx listens on (Railway requirement)",
                      "defaultValue": "8080"
                    },
                    "BACKEND_HOST": {
                      "description": "Backend upstream host",
                      "defaultValue": "${{Backend.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    },
                    "FRONTEND_HOST": {
                      "description": "Frontend upstream host",
                      "defaultValue": "${{Frontend.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    },
                    "FILE_SERVICE_HOST": {
                      "description": "File service upstream host",
                      "defaultValue": "${{file-service.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    }
                  }
                },
                "0c276afb-7d28-4716-8bb8-20803886c1e4": {
                  "icon": "https://www.pneumatic.app/images/favicon.png",
                  "name": "Backend",
                  "deploy": {
                    "startCommand": "sh -c \"python manage.py migrate && python manage.py collectstatic --no-input && python manage.py init_periodic_tasks && python manage.py compilemessages && gunicorn src.asgi:application --workers ${WORKERS_COUNT:-2} -k uvicorn.workers.UvicornWorker --worker-tmp-dir /dev/shm --bind [::]:8000 --timeout 200\"",
                    "healthcheckPath": "",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/pneumaticapp/pneumaticworkflow",
                    "rootDirectory": "/backend"
                  },
                  "variables": {
                    "AI": {
                      "description": "Enable AI features",
                      "defaultValue": "no"
                    },
                    "PORT": {
                      "description": "Gunicorn listen port — Railway may auto-inject 8080, override to 8000",
                      "defaultValue": "8000"
                    },
                    "PUSH": {
                      "description": "Enable push notifications",
                      "defaultValue": "no"
                    },
                    "EMAIL": {
                      "description": "Enable email sending",
                      "defaultValue": "no"
                    },
                    "SIGNUP": {
                      "description": "Allow user registration",
                      "defaultValue": "yes"
                    },
                    "BILLING": {
                      "description": "Enable billing/payments",
                      "defaultValue": "no"
                    },
                    "CAPTCHA": {
                      "description": "Enable reCAPTCHA verification",
                      "defaultValue": "no"
                    },
                    "MS_AUTH": {
                      "description": "Enable Microsoft OAuth",
                      "defaultValue": "no"
                    },
                    "RELEASE": {
                      "description": "Application version",
                      "defaultValue": "1.0.0"
                    },
                    "WSS_URL": {
                      "description": "WebSocket URL",
                      "defaultValue": "wss://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SSO_AUTH": {
                      "description": "Enable SSO authentication",
                      "defaultValue": "no"
                    },
                    "ANALYTICS": {
                      "description": "Enable analytics tracking",
                      "defaultValue": "no"
                    },
                    "FORMS_URL": {
                      "isOptional": false,
                      "description": "Public forms URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/forms"
                    },
                    "ADMIN_PATH": {
                      "description": "Django admin URL path",
                      "defaultValue": "admin"
                    },
                    "BACKEND_URL": {
                      "isOptional": false,
                      "description": "Public backend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ENVIRONMENT": {
                      "description": "Runtime environment name",
                      "defaultValue": "Production"
                    },
                    "GOOGLE_AUTH": {
                      "description": "Enable Google OAuth",
                      "defaultValue": "no"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "PostgreSQL database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "DJANGO_DEBUG": {
                      "description": "Django debug mode",
                      "defaultValue": "no"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Public frontend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ALLOWED_HOSTS": {
                      "isOptional": false,
                      "description": "Allowed HTTP hosts",
                      "defaultValue": "*"
                    },
                    "LANGUAGE_CODE": {
                      "description": "Default language",
                      "defaultValue": "en"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "PostgreSQL host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "PostgreSQL username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "WORKERS_COUNT": {
                      "description": "Gunicorn worker count",
                      "defaultValue": "2"
                    },
                    "AUTH_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis auth tokens (db1)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "ENABLE_LOGGING": {
                      "description": "Enable application logging",
                      "defaultValue": "yes"
                    },
                    "CACHE_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis cache (db0)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FILE_POSTGRES_DB": {
                      "description": "File service PostgreSQL database name",
                      "defaultValue": "${{file-postgres.POSTGRES_DB}}"
                    },
                    "FILE_SERVICE_URL": {
                      "description": "Public file service URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/files"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery message broker",
                      "defaultValue": "amqp://${{rabbitmq.RABBITMQ_DEFAULT_USER}}:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672"
                    },
                    "DJANGO_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
                      "defaultValue": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "SESSION_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis sessions (db3)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/3"
                    },
                    "CHANNELS_REDIS_URL": {
                      "isOptional": false,
                      "description": "Django Channels WebSocket (db2)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/2"
                    },
                    "FILE_POSTGRES_HOST": {
                      "description": "File service PostgreSQL host",
                      "defaultValue": "${{file-postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FILE_POSTGRES_PORT": {
                      "description": "File service PostgreSQL port",
                      "defaultValue": "5432"
                    },
                    "FILE_POSTGRES_USER": {
                      "description": "File service PostgreSQL username",
                      "defaultValue": "${{file-postgres.POSTGRES_USER}}"
                    },
                    "VERIFICATION_CHECK": {
                      "description": "Enable email verification",
                      "defaultValue": "no"
                    },
                    "POSTGRES_REPLICA_DB": {
                      "isOptional": false,
                      "description": "Read-replica database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "CORS_ORIGIN_ALLOW_ALL": {
                      "description": "Allow all CORS origins",
                      "defaultValue": "no"
                    },
                    "CORS_ORIGIN_WHITELIST": {
                      "isOptional": false,
                      "description": "CORS allowed origin",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_HOST": {
                      "isOptional": false,
                      "description": "Read-replica host (same as primary if no replica)",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_USER": {
                      "isOptional": false,
                      "description": "Read-replica username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "CORS_ALLOW_CREDENTIALS": {
                      "description": "Allow credentials in CORS requests",
                      "defaultValue": "yes"
                    },
                    "DJANGO_SETTINGS_MODULE": {
                      "description": "Django settings module path",
                      "defaultValue": "src.settings"
                    },
                    "FILE_POSTGRES_PASSWORD": {
                      "description": "File service PostgreSQL password",
                      "defaultValue": "${{file-postgres.POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_REPLICA_PASSWORD": {
                      "isOptional": false,
                      "description": "Read-replica password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    }
                  },
                  "networking": {}
                },
                "20b1a2a4-1592-4a43-ab8e-5aa66b99101e": {
                  "icon": "https://devicons.railway.app/i/minio.svg",
                  "name": "SeaweedFS Filer",
                  "deploy": {
                    "startCommand": "sh -c \"weed filer -master=$SEAWEED_MASTER -ip=$RAILWAY_PRIVATE_DOMAIN -port=8888 -s3 -s3.port=8333\"",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "chrislusf/seaweedfs:3.95"
                  },
                  "variables": {
                    "SEAWEED_MASTER": {
                      "description": "SeaweedFS master address for filer operations",
                      "defaultValue": "seaweedfs-master.railway.internal:9333"
                    }
                  },
                  "volumeMounts": {
                    "20b1a2a4-1592-4a43-ab8e-5aa66b99101e": {
                      "mountPath": "/data"
                    }
                  }
                },
                "26066ead-a50f-44ad-84fe-4660e4261af3": {
                  "icon": "https://www.pneumatic.app/images/favicon.png",
                  "name": "Frontend",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/pneumaticapp/pneumaticworkflow",
                    "rootDirectory": "/frontend"
                  },
                  "variables": {
                    "AI": {
                      "description": "Enable AI features in UI",
                      "defaultValue": "no"
                    },
                    "PUSH": {
                      "description": "Enable push notifications UI",
                      "defaultValue": "no"
                    },
                    "SIGNUP": {
                      "description": "Show registration form",
                      "defaultValue": "yes"
                    },
                    "BILLING": {
                      "description": "Enable billing UI",
                      "defaultValue": "no"
                    },
                    "CAPTCHA": {
                      "description": "Enable reCAPTCHA in forms",
                      "defaultValue": "no"
                    },
                    "MS_AUTH": {
                      "description": "Show Microsoft login button",
                      "defaultValue": "no"
                    },
                    "RELEASE": {
                      "description": "Application version",
                      "defaultValue": "1.0.0"
                    },
                    "WSS_URL": {
                      "isOptional": false,
                      "description": "WebSocket connection URL",
                      "defaultValue": "wss://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SSO_AUTH": {
                      "description": "Enable SSO login",
                      "defaultValue": "no"
                    },
                    "ANALYTICS": {
                      "description": "Enable analytics tracking",
                      "defaultValue": "no"
                    },
                    "BACKEND_URL": {
                      "isOptional": false,
                      "description": "Public backend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "GOOGLE_AUTH": {
                      "description": "Show Google login button",
                      "defaultValue": "no"
                    },
                    "MCS_RUN_ENV": {
                      "description": "Runtime environment (prod/dev)",
                      "defaultValue": "prod"
                    },
                    "FRONTEND_URL": {
                      "description": "Public frontend URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "NODE_OPTIONS": {
                      "description": "Node.js memory limit",
                      "defaultValue": "--max-old-space-size=3072"
                    },
                    "LANGUAGE_CODE": {
                      "description": "Default UI language",
                      "defaultValue": "en"
                    },
                    "FILE_SERVICE_URL": {
                      "description": "Public file service URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/files"
                    },
                    "BACKEND_PRIVATE_URL": {
                      "isOptional": false,
                      "description": "Private backend URL for SSR",
                      "defaultValue": "http://${{Backend.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "2ac31d91-7e9c-49d1-a60a-79a732b2c763": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "file-postgres",
                  "deploy": {
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "postgres:15-bookworm"
                  },
                  "variables": {
                    "PGDATA": {
                      "description": "PostgreSQL data directory path",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "description": "PostgreSQL host",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "description": "PostgreSQL port",
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "description": "PostgreSQL user (reference)",
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "description": "PostgreSQL database (reference)",
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "description": "PostgreSQL password (reference)",
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "description": "Database name",
                      "defaultValue": "pneumatic"
                    },
                    "DATABASE_URL": {
                      "description": "Internal connection string",
                      "defaultValue": "postgresql://${{POSTGRES_USER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{POSTGRES_DB}}"
                    },
                    "POSTGRES_USER": {
                      "description": "PostgreSQL superuser name",
                      "defaultValue": "pneumatic"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "PostgreSQL password (auto-generated)",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "DATABASE_PUBLIC_URL": {
                      "description": "External connection string (TCP proxy)",
                      "defaultValue": "postgresql://${{POSTGRES_USER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{POSTGRES_DB}}"
                    }
                  },
                  "volumeMounts": {
                    "2ac31d91-7e9c-49d1-a60a-79a732b2c763": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "2dd41eff-8ce2-400c-8308-031536a0bdc5": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:15-bookworm"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "PostgreSQL data directory path",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "description": "PostgreSQL host",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "description": "PostgreSQL port",
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "description": "PostgreSQL user (reference)",
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "description": "PostgreSQL database (reference)",
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password (reference)",
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "description": "Database name",
                      "defaultValue": "pneumatic"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Internal connection string",
                      "defaultValue": "postgresql://${{POSTGRES_USER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{POSTGRES_DB}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "PostgreSQL superuser name",
                      "defaultValue": "pneumatic"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password (auto-generated)",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "DATABASE_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "External connection string (TCP proxy)",
                      "defaultValue": "postgresql://${{POSTGRES_USER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{POSTGRES_DB}}"
                    }
                  },
                  "volumeMounts": {
                    "2dd41eff-8ce2-400c-8308-031536a0bdc5": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "66366f7a-af9e-4d6c-82db-c5742d6defa5": {
                  "icon": "https://devicons.railway.app/i/minio.svg",
                  "name": "SeaweedFS Volume",
                  "deploy": {
                    "startCommand": "sh -c \"weed volume -mserver=$SEAWEED_MASTER -ip=$RAILWAY_PRIVATE_DOMAIN -port=8080 -dir=/data\"",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "chrislusf/seaweedfs:3.95"
                  },
                  "variables": {
                    "SEAWEED_MASTER": {
                      "description": "SeaweedFS master address for volume registration",
                      "defaultValue": "seaweedfs-master.railway.internal:9333"
                    }
                  },
                  "volumeMounts": {
                    "66366f7a-af9e-4d6c-82db-c5742d6defa5": {
                      "mountPath": "/data"
                    }
                  }
                },
                "67bb9ae9-a5c7-4e13-ac31-0c716154ea48": {
                  "icon": "https://docs.celeryq.dev/en/latest/_static/favicon.ico",
                  "name": "celery-beat",
                  "deploy": {
                    "startCommand": "celery --pidfile= --app src.celery_app:app beat -l warning -S django",
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/pneumaticapp/pneumaticworkflow",
                    "rootDirectory": "/backend"
                  },
                  "variables": {
                    "AI": {
                      "description": "Enable AI features",
                      "defaultValue": "no"
                    },
                    "PUSH": {
                      "description": "Enable push notifications",
                      "defaultValue": "no"
                    },
                    "EMAIL": {
                      "description": "Enable email sending",
                      "defaultValue": "no"
                    },
                    "SIGNUP": {
                      "description": "Allow user registration",
                      "defaultValue": "yes"
                    },
                    "BILLING": {
                      "description": "Enable billing/payments",
                      "defaultValue": "no"
                    },
                    "CAPTCHA": {
                      "description": "Enable reCAPTCHA verification",
                      "defaultValue": "no"
                    },
                    "MS_AUTH": {
                      "description": "Enable Microsoft OAuth",
                      "defaultValue": "no"
                    },
                    "RELEASE": {
                      "description": "Application version",
                      "defaultValue": "1.0.0"
                    },
                    "WSS_URL": {
                      "description": "WebSocket URL",
                      "defaultValue": "wss://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SSO_AUTH": {
                      "description": "Enable SSO authentication",
                      "defaultValue": "no"
                    },
                    "ANALYTICS": {
                      "description": "Enable analytics tracking",
                      "defaultValue": "no"
                    },
                    "FORMS_URL": {
                      "description": "Public forms URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/forms"
                    },
                    "ADMIN_PATH": {
                      "description": "Django admin URL path",
                      "defaultValue": "admin"
                    },
                    "BACKEND_URL": {
                      "isOptional": false,
                      "description": "Public backend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ENVIRONMENT": {
                      "description": "Runtime environment name",
                      "defaultValue": "Production"
                    },
                    "GOOGLE_AUTH": {
                      "description": "Enable Google OAuth",
                      "defaultValue": "no"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "PostgreSQL database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "DJANGO_DEBUG": {
                      "description": "Django debug mode",
                      "defaultValue": "no"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Public frontend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ALLOWED_HOSTS": {
                      "description": "Allowed HTTP hosts",
                      "defaultValue": "*"
                    },
                    "LANGUAGE_CODE": {
                      "description": "Default language",
                      "defaultValue": "en"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "PostgreSQL host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "PostgreSQL username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "AUTH_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis auth tokens (db1)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "ENABLE_LOGGING": {
                      "description": "Enable application logging",
                      "defaultValue": "yes"
                    },
                    "CACHE_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis cache (db0)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FILE_POSTGRES_DB": {
                      "description": "File service PostgreSQL database name",
                      "defaultValue": "${{file-postgres.POSTGRES_DB}}"
                    },
                    "FILE_SERVICE_URL": {
                      "description": "Public file service URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/files"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery message broker",
                      "defaultValue": "amqp://${{rabbitmq.RABBITMQ_DEFAULT_USER}}:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672"
                    },
                    "DJANGO_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
                      "defaultValue": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "SESSION_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis sessions (db3)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/3"
                    },
                    "CHANNELS_REDIS_URL": {
                      "isOptional": false,
                      "description": "Django Channels WebSocket (db2)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/2"
                    },
                    "FILE_POSTGRES_HOST": {
                      "description": "File service PostgreSQL host",
                      "defaultValue": "${{file-postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FILE_POSTGRES_PORT": {
                      "description": "File service PostgreSQL port",
                      "defaultValue": "5432"
                    },
                    "FILE_POSTGRES_USER": {
                      "description": "File service PostgreSQL username",
                      "defaultValue": "${{file-postgres.POSTGRES_USER}}"
                    },
                    "VERIFICATION_CHECK": {
                      "description": "Enable email verification",
                      "defaultValue": "no"
                    },
                    "POSTGRES_REPLICA_DB": {
                      "isOptional": false,
                      "description": "Read-replica database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "CORS_ORIGIN_ALLOW_ALL": {
                      "description": "Allow all CORS origins",
                      "defaultValue": "no"
                    },
                    "CORS_ORIGIN_WHITELIST": {
                      "description": "CORS allowed origin",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_HOST": {
                      "isOptional": false,
                      "description": "Read-replica host (same as primary if no replica)",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_USER": {
                      "isOptional": false,
                      "description": "Read-replica username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "CORS_ALLOW_CREDENTIALS": {
                      "description": "Allow credentials in CORS requests",
                      "defaultValue": "yes"
                    },
                    "DJANGO_SETTINGS_MODULE": {
                      "description": "Django settings module path",
                      "defaultValue": "src.settings"
                    },
                    "FILE_POSTGRES_PASSWORD": {
                      "description": "File service PostgreSQL password",
                      "defaultValue": "${{file-postgres.POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_REPLICA_PASSWORD": {
                      "isOptional": false,
                      "description": "Read-replica password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    }
                  }
                },
                "88f3a445-9c98-4757-9651-095cc55afad0": {
                  "icon": "https://devicons.railway.app/i/fastapi.svg",
                  "name": "file-service",
                  "deploy": {
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "repo": "pneumaticapp/pneumaticworkflow",
                    "branch": null,
                    "rootDirectory": "/storage"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Application port",
                      "defaultValue": "8000"
                    },
                    "DEBUG": {
                      "description": "Debug mode",
                      "defaultValue": "false"
                    },
                    "CONFIG": {
                      "description": "Configuration profile",
                      "defaultValue": "Production"
                    },
                    "WORKERS": {
                      "description": "Uvicorn worker count",
                      "defaultValue": "1"
                    },
                    "FORMS_URL": {
                      "description": "Public forms URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/forms"
                    },
                    "CHUNK_SIZE": {
                      "description": "File chunk size in bytes (1MB)",
                      "defaultValue": "1048576"
                    },
                    "POSTGRES_DB": {
                      "description": "File-postgres database name",
                      "defaultValue": "${{file-postgres.POSTGRES_DB}}"
                    },
                    "FRONTEND_URL": {
                      "description": "Public frontend URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "STORAGE_TYPE": {
                      "description": "Storage type (local = SeaweedFS)",
                      "defaultValue": "local"
                    },
                    "BUCKET_PREFIX": {
                      "description": "S3 bucket prefix for file storage",
                      "defaultValue": "pneumatic"
                    },
                    "MAX_FILE_SIZE": {
                      "description": "Maximum file size in bytes (100MB)",
                      "defaultValue": "104857600"
                    },
                    "POSTGRES_HOST": {
                      "description": "File-postgres host",
                      "defaultValue": "${{file-postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_PORT": {
                      "description": "File-postgres port",
                      "defaultValue": "5432"
                    },
                    "POSTGRES_USER": {
                      "description": "File-postgres username",
                      "defaultValue": "${{file-postgres.POSTGRES_USER}}"
                    },
                    "AUTH_REDIS_URL": {
                      "description": "Redis auth tokens (db1, same as Backend)",
                      "defaultValue": "redis://:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "FASTAPI_BASE_URL": {
                      "description": "Public file service base URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/files"
                    },
                    "KEY_PREFIX_REDIS": {
                      "description": "Redis key prefix for auth token lookup",
                      "defaultValue": ":1:"
                    },
                    "DJANGO_SECRET_KEY": {
                      "description": "Must match Backend's secret key for auth token verification",
                      "defaultValue": "${{Backend.DJANGO_SECRET_KEY}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "File-postgres password",
                      "defaultValue": "${{file-postgres.POSTGRES_PASSWORD}}"
                    },
                    "BACKEND_PRIVATE_URL": {
                      "description": "Private backend URL for internal API calls",
                      "defaultValue": "http://${{Backend.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "SEAWEEDFS_S3_REGION": {
                      "description": "SeaweedFS S3 region (required by boto3)",
                      "defaultValue": "us-east-1"
                    },
                    "SEAWEEDFS_S3_USE_SSL": {
                      "description": "Use SSL for SeaweedFS connection",
                      "defaultValue": "false"
                    },
                    "AUTH_TOKEN_ITERATIONS": {
                      "description": "Auth token hashing iterations",
                      "defaultValue": "1"
                    },
                    "SEAWEEDFS_S3_ENDPOINT": {
                      "description": "SeaweedFS S3-compatible endpoint",
                      "defaultValue": "http://seaweedfs-filer.railway.internal:8333"
                    },
                    "SEAWEEDFS_S3_ACCESS_KEY": {
                      "description": "SeaweedFS S3 access key",
                      "defaultValue": "any-secret-key-will-work"
                    },
                    "SEAWEEDFS_S3_SECRET_KEY": {
                      "description": "SeaweedFS S3 secret key",
                      "defaultValue": "any-secret-key-will-work"
                    }
                  }
                },
                "bdc11664-b637-4059-985c-b4ee569dbdfe": {
                  "icon": "https://www.rabbitmq.com/img/rabbitmq-logo.svg",
                  "name": "rabbitmq",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "rabbitmq:3.13-management"
                  },
                  "variables": {
                    "RABBITMQ_DEFAULT_PASS": {
                      "isOptional": false,
                      "description": "Default RabbitMQ password (auto-generated)",
                      "defaultValue": "{{RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "isOptional": false,
                      "description": "Default RabbitMQ username",
                      "defaultValue": "pneumatic"
                    }
                  }
                },
                "d507642a-0eea-47c7-8227-e3201f6dd9e3": {
                  "icon": "https://devicons.railway.app/i/minio.svg",
                  "name": "SeaweedFS Master",
                  "deploy": {
                    "startCommand": "sh -c \"weed master -ip=$RAILWAY_PRIVATE_DOMAIN -port=9333 -mdir=/data\"",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "chrislusf/seaweedfs:3.95"
                  },
                  "volumeMounts": {
                    "d507642a-0eea-47c7-8227-e3201f6dd9e3": {
                      "mountPath": "/data"
                    }
                  }
                },
                "eb83dadf-ae56-4eff-8ceb-e37505055db9": {
                  "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": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:6.2.6"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "description": "Redis server hostname",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "description": "Redis server port",
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "description": "Redis username",
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Internal connection URL",
                      "defaultValue": "redis://${{REDISUSER}}:${{REDIS_PASSWORD}}@${{REDISHOST}}:${{REDISPORT}}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "description": "Redis password (alias reference)",
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Redis authentication password (auto-generated)",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    },
                    "REDIS_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "External connection URL (TCP proxy)",
                      "defaultValue": "redis://default:${{REDIS_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}"
                    }
                  },
                  "volumeMounts": {
                    "eb83dadf-ae56-4eff-8ceb-e37505055db9": {
                      "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."
                  }
                },
                "edf661fc-0397-422c-a961-615529ecb587": {
                  "icon": "https://docs.celeryq.dev/en/latest/_static/favicon.ico",
                  "name": "celery-worker",
                  "deploy": {
                    "startCommand": "celery --app src.celery_app:app worker -l warning",
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/pneumaticapp/pneumaticworkflow",
                    "rootDirectory": "/backend"
                  },
                  "variables": {
                    "AI": {
                      "description": "Enable AI features",
                      "defaultValue": "no"
                    },
                    "PUSH": {
                      "description": "Enable push notifications",
                      "defaultValue": "no"
                    },
                    "EMAIL": {
                      "description": "Enable email sending",
                      "defaultValue": "no"
                    },
                    "SIGNUP": {
                      "description": "Allow user registration",
                      "defaultValue": "yes"
                    },
                    "BILLING": {
                      "description": "Enable billing/payments",
                      "defaultValue": "no"
                    },
                    "CAPTCHA": {
                      "description": "Enable reCAPTCHA verification",
                      "defaultValue": "no"
                    },
                    "MS_AUTH": {
                      "description": "Enable Microsoft OAuth",
                      "defaultValue": "no"
                    },
                    "RELEASE": {
                      "description": "Application version",
                      "defaultValue": "1.0.0"
                    },
                    "WSS_URL": {
                      "description": "WebSocket URL",
                      "defaultValue": "wss://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SSO_AUTH": {
                      "description": "Enable SSO authentication",
                      "defaultValue": "no"
                    },
                    "ANALYTICS": {
                      "description": "Enable analytics tracking",
                      "defaultValue": "no"
                    },
                    "FORMS_URL": {
                      "description": "Public forms URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/forms"
                    },
                    "ADMIN_PATH": {
                      "description": "Django admin URL path",
                      "defaultValue": "admin"
                    },
                    "BACKEND_URL": {
                      "isOptional": false,
                      "description": "Public backend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ENVIRONMENT": {
                      "isOptional": false,
                      "description": "Runtime environment name",
                      "defaultValue": "Production"
                    },
                    "GOOGLE_AUTH": {
                      "description": "Enable Google OAuth",
                      "defaultValue": "no"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "PostgreSQL database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "DJANGO_DEBUG": {
                      "description": "Django debug mode",
                      "defaultValue": "no"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Public frontend URL (via nginx)",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ALLOWED_HOSTS": {
                      "description": "Allowed HTTP hosts",
                      "defaultValue": "*"
                    },
                    "LANGUAGE_CODE": {
                      "description": "Default language",
                      "defaultValue": "en"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "PostgreSQL host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "PostgreSQL username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "AUTH_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis auth tokens (db1)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "ENABLE_LOGGING": {
                      "description": "Enable application logging",
                      "defaultValue": "yes"
                    },
                    "CACHE_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis cache (db0)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FILE_POSTGRES_DB": {
                      "description": "File service PostgreSQL database name",
                      "defaultValue": "${{file-postgres.POSTGRES_DB}}"
                    },
                    "FILE_SERVICE_URL": {
                      "description": "Public file service URL",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}/files"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery message broker",
                      "defaultValue": "amqp://${{rabbitmq.RABBITMQ_DEFAULT_USER}}:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672"
                    },
                    "DJANGO_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Django secret key — shared across Backend, file-service, celery-worker, celery-beat. Must be identical!",
                      "defaultValue": "CHANGE_ME_GENERATE_A_REAL_SECRET_KEY"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "SESSION_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis sessions (db3)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/3"
                    },
                    "CHANNELS_REDIS_URL": {
                      "isOptional": false,
                      "description": "Django Channels WebSocket (db2)",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/2"
                    },
                    "FILE_POSTGRES_HOST": {
                      "description": "File service PostgreSQL host",
                      "defaultValue": "${{file-postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FILE_POSTGRES_PORT": {
                      "description": "File service PostgreSQL port",
                      "defaultValue": "5432"
                    },
                    "FILE_POSTGRES_USER": {
                      "description": "File service PostgreSQL username",
                      "defaultValue": "${{file-postgres.POSTGRES_USER}}"
                    },
                    "VERIFICATION_CHECK": {
                      "description": "Enable email verification",
                      "defaultValue": "no"
                    },
                    "POSTGRES_REPLICA_DB": {
                      "isOptional": false,
                      "description": "Read-replica database name",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "CORS_ORIGIN_ALLOW_ALL": {
                      "description": "Allow all CORS origins",
                      "defaultValue": "no"
                    },
                    "CORS_ORIGIN_WHITELIST": {
                      "description": "CORS allowed origin",
                      "defaultValue": "https://${{nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_HOST": {
                      "isOptional": false,
                      "description": "Read-replica host (same as primary if no replica)",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_REPLICA_USER": {
                      "isOptional": false,
                      "description": "Read-replica username",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "CORS_ALLOW_CREDENTIALS": {
                      "description": "Allow credentials in CORS requests",
                      "defaultValue": "yes"
                    },
                    "DJANGO_SETTINGS_MODULE": {
                      "description": "Django settings module path",
                      "defaultValue": "src.settings"
                    },
                    "FILE_POSTGRES_PASSWORD": {
                      "description": "File service PostgreSQL password",
                      "defaultValue": "${{file-postgres.POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_REPLICA_PASSWORD": {
                      "isOptional": false,
                      "description": "Read-replica password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 13,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-09T04:52:15.012Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_968eff86299c48ef8da1",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 383,
    "typical_build_seconds": 233,
    "typical_start_seconds": 30,
    "slowest_service": "Frontend"
  }
}
