{
  "manifest_version": "1.0.0",
  "template": {
    "id": "f8e3ba32-cf58-4c22-94ca-19b825181294",
    "slug": "dify-ai-with-qdrant-and-s3",
    "name": "Dify",
    "description": "Dify workflows & RAG, chatbots, plugins, Qdrant and S3. Dify AI (DifyAI).",
    "url": "https://railway.com/deploy/dify-ai-with-qdrant-and-s3",
    "upstream": {
      "image": "nginx:1.28.0-alpine@sha256:30f1c0d78e0ad60901648be663a710bdadf19e4c10ac6782c235200619158284"
    }
  },
  "services": [
    {
      "name": "Redis",
      "source": {
        "image": "redis:7.2.16-bookworm"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "postgres:17.11-bookworm"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Worker",
      "source": {
        "image": "langgenius/dify-api:1.17.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Plugin",
      "source": {
        "image": "langgenius/dify-plugin-daemon:0.6.10-local"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/storage",
      "http": false
    },
    {
      "name": "Sandbox",
      "source": {
        "image": "langgenius/dify-sandbox:0.2.15"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Web",
      "source": {
        "image": "langgenius/dify-web:1.17.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Qdrant",
      "source": {
        "image": "qdrant/qdrant:v1.19.2"
      },
      "needs_volume": true,
      "volume_mount_path": "/qdrant/storage",
      "http": false
    },
    {
      "name": "Dify",
      "source": {
        "image": "nginx:1.28.0-alpine@sha256:30f1c0d78e0ad60901648be663a710bdadf19e4c10ac6782c235200619158284"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Beat",
      "source": {
        "image": "langgenius/dify-api:1.17.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "API",
      "source": {
        "image": "langgenius/dify-api:1.17.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "SSRF-Proxy",
      "source": {
        "image": "ubuntu/squid@sha256:6a097f68bae708cedbabd6188d68c7e2e7a38cedd05a176e1cc0ba29e3bbe029"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "TZ",
      "service": "Postgres",
      "description": "Tz default for the official Dify Postgres service.",
      "secret": false,
      "strategy": "default",
      "default": "UTC"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Persistent PostgreSQL data directory inside the attached volume.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Primary Dify database; Plugin automatically creates its separate dify_plugin database.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Database administrator username used by the Dify stack.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Generated PostgreSQL password. Referenced by Dify and Plugin automatically.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "TZ",
      "service": "Worker",
      "description": "Inherits TZ from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANG",
      "service": "Worker",
      "description": "Inherits LANG from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MODE",
      "service": "Worker",
      "description": "Selects the official Dify API image process: api, worker or beat.",
      "secret": false,
      "strategy": "default",
      "default": "worker"
    },
    {
      "key": "PORT",
      "service": "Worker",
      "description": "Inherits PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LC_ALL",
      "service": "Worker",
      "description": "Inherits LC_ALL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_HOST",
      "service": "Worker",
      "description": "Inherits DB_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Worker",
      "description": "Inherits DB_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Worker",
      "description": "Inherits DB_TYPE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_DB",
      "service": "Worker",
      "description": "Inherits REDIS_DB from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_EXTRAS",
      "service": "Worker",
      "description": "Share API PostgreSQL timeout and TCP keepalive settings for worker recovery after database restart.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_PORT",
      "service": "Worker",
      "description": "Inherits DIFY_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILES_URL",
      "service": "Worker",
      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LOG_LEVEL",
      "service": "Worker",
      "description": "Inherits LOG_LEVEL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Worker",
      "description": "Region of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "Worker",
      "description": "Inherits DEPLOY_ENV from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_URL",
      "service": "Worker",
      "description": "Inherits QDRANT_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "Worker",
      "description": "Inherits REDIS_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Worker",
      "description": "Inherits REDIS_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Worker",
      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "Worker",
      "description": "Published application API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Worker",
      "description": "Published application web URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_DATABASE",
      "service": "Worker",
      "description": "Inherits DB_DATABASE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Worker",
      "description": "Inherits DB_PASSWORD from API so background processes use the same configuration.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "Worker",
      "description": "Inherits DB_SSL_MODE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Worker",
      "description": "Inherits DB_USERNAME from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Worker",
      "description": "S3-compatible endpoint of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "Worker",
      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Worker",
      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Worker",
      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INIT_PASSWORD",
      "service": "Worker",
      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Worker",
      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Worker",
      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ALLOW_REGISTER",
      "service": "Worker",
      "description": "False prevents unrestricted public account registration after first setup.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_API_KEY",
      "service": "Worker",
      "description": "Reference to the generated Qdrant API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Worker",
      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Worker",
      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Worker",
      "description": "Console API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Worker",
      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Worker",
      "description": "Public service API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Worker",
      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_AUTO_SCALE",
      "service": "Worker",
      "description": "Inherits CELERY_AUTO_SCALE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Worker",
      "description": "Inherits CELERY_BROKER_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "Worker",
      "description": "Inherits DIFY_BIND_ADDRESS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Worker",
      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Worker",
      "description": "Reference to the generated plugin daemon API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Worker",
      "description": "Inherits PLUGIN_DAEMON_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEPLOYMENT_EDITION",
      "service": "Worker",
      "description": "Inherits DEPLOYMENT_EDITION from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Worker",
      "description": "Inherits INTERNAL_FILES_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SCARF_NO_ANALYTICS",
      "service": "Worker",
      "description": "Disables Scarf analytics.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_WORKER_CLASS",
      "service": "Worker",
      "description": "Inherits CELERY_WORKER_CLASS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_CHANGE_EMAIL",
      "service": "Worker",
      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "Worker",
      "description": "Inherits MARKETPLACE_ENABLED from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_GRPC_ENABLED",
      "service": "Worker",
      "description": "Inherits QDRANT_GRPC_ENABLED from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_CLASS",
      "service": "Worker",
      "description": "Inherits SERVER_WORKER_CLASS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSRF_PROXY_HTTP_URL",
      "service": "Worker",
      "description": "Inherits SSRF_PROXY_HTTP_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_WORKER_AMOUNT",
      "service": "Worker",
      "description": "Two background-task concurrency slots by default.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_AMOUNT",
      "service": "Worker",
      "description": "One API process by default; increase only after measuring available memory.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_POOL_SIZE",
      "service": "Worker",
      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSRF_PROXY_HTTPS_URL",
      "service": "Worker",
      "description": "Inherits SSRF_PROXY_HTTPS_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "Worker",
      "description": "Inherits ENDPOINT_URL_TEMPLATE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_TIMEOUT",
      "service": "Worker",
      "description": "Inherits PLUGIN_DAEMON_TIMEOUT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ALLOW_CREATE_WORKSPACE",
      "service": "Worker",
      "description": "False prevents unrestricted workspace creation.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Worker",
      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "Worker",
      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Worker",
      "description": "Inherits CODE_EXECUTION_ENDPOINT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_EMAIL_CODE_LOGIN",
      "service": "Worker",
      "description": "Disabled until SMTP/email delivery is configured.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_MAX_OVERFLOW",
      "service": "Worker",
      "description": "Maximum extra PostgreSQL connections per process.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "Worker",
      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_POOL_PRE_PING",
      "service": "Worker",
      "description": "Inherits SQLALCHEMY_POOL_PRE_PING from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_COLLABORATION_MODE",
      "service": "Worker",
      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_CONNECTIONS",
      "service": "Worker",
      "description": "Inherits SERVER_WORKER_CONNECTIONS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "Worker",
      "description": "Inherits CONSOLE_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_HOST",
      "service": "Worker",
      "description": "Inherits PLUGIN_REMOTE_INSTALL_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_PORT",
      "service": "Worker",
      "description": "Inherits PLUGIN_REMOTE_INSTALL_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "Worker",
      "description": "Inherits WEB_API_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_EMAIL_PASSWORD_LOGIN",
      "service": "Worker",
      "description": "Enables normal email/password login without SMTP.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "NEW_USER_DEFAULT_PLUGIN_IDS",
      "service": "Worker",
      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RESPECT_XFORWARD_HEADERS_ENABLED",
      "service": "Worker",
      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TZ",
      "service": "Plugin",
      "description": "Tz default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "UTC"
    },
    {
      "key": "PORT",
      "service": "Plugin",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "DB_HOST",
      "service": "Plugin",
      "description": "Private db hostname inside the Railway project.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "Plugin",
      "description": "Db port default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "DB_TYPE",
      "service": "Plugin",
      "description": "Db type default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_DB",
      "service": "Plugin",
      "description": "Redis db default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "3"
    },
    {
      "key": "REDIS_HOST",
      "service": "Plugin",
      "description": "Private redis hostname inside the Railway project.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "Plugin",
      "description": "Redis port default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "SERVER_KEY",
      "service": "Plugin",
      "description": "Generated plugin daemon API key. Keep Plugin private.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DB_DATABASE",
      "service": "Plugin",
      "description": "Db database default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "dify_plugin"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Plugin",
      "description": "Db password default for the official Dify Plugin service.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "Plugin",
      "description": "Db ssl mode default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "disable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Plugin",
      "description": "Db username default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_PORT",
      "service": "Plugin",
      "description": "Server port default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "PPROF_ENABLED",
      "service": "Plugin",
      "description": "Pprof enabled default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Plugin",
      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SENTRY_ENABLED",
      "service": "Plugin",
      "description": "Sentry enabled default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "DIFY_INNER_API_KEY",
      "service": "Plugin",
      "description": "Reference to the shared internal API key for plugin callbacks.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_INNER_API_URL",
      "service": "Plugin",
      "description": "Dify inner api url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PLUGIN_STORAGE_TYPE",
      "service": "Plugin",
      "description": "Local plugin runtime storage uses the attached persistent Plugin volume.",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "PLUGIN_WORKING_PATH",
      "service": "Plugin",
      "description": "Plugin execution environments persist within the Plugin volume.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage/cwd"
    },
    {
      "key": "PLUGIN_INSTALLED_PATH",
      "service": "Plugin",
      "description": "Plugin installed path default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "plugin"
    },
    {
      "key": "MAX_PLUGIN_PACKAGE_SIZE",
      "service": "Plugin",
      "description": "Max plugin package size default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "52428800"
    },
    {
      "key": "PLUGIN_MEDIA_CACHE_PATH",
      "service": "Plugin",
      "description": "Plugin media cache path default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "assets"
    },
    {
      "key": "PYTHON_ENV_INIT_TIMEOUT",
      "service": "Plugin",
      "description": "Python env init timeout default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "240"
    },
    {
      "key": "FORCE_VERIFYING_SIGNATURE",
      "service": "Plugin",
      "description": "True verifies plugin signatures; keep enabled for marketplace installation.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_PACKAGE_CACHE_PATH",
      "service": "Plugin",
      "description": "Plugin package cache path default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "plugin_packages"
    },
    {
      "key": "PLUGIN_STORAGE_LOCAL_ROOT",
      "service": "Plugin",
      "description": "Plugin packages, assets and runtime environments persist on this mounted directory.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage"
    },
    {
      "key": "PLUGIN_MAX_EXECUTION_TIMEOUT",
      "service": "Plugin",
      "description": "Plugin max execution timeout default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_HOST",
      "service": "Plugin",
      "description": "Private plugin remote installing hostname inside the Railway project.",
      "secret": false,
      "strategy": "default",
      "default": "127.0.0.1"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_PORT",
      "service": "Plugin",
      "description": "Plugin remote installing port default for the official Dify Plugin service.",
      "secret": false,
      "strategy": "default",
      "default": "5003"
    },
    {
      "key": "PORT",
      "service": "Sandbox",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "API_KEY",
      "service": "Sandbox",
      "description": "Generated private code Sandbox API key.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GIN_MODE",
      "service": "Sandbox",
      "description": "Gin mode default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "default",
      "default": "release"
    },
    {
      "key": "HTTP_PROXY",
      "service": "Sandbox",
      "description": "Http proxy default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "HTTPS_PROXY",
      "service": "Sandbox",
      "description": "Https proxy default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SANDBOX_PORT",
      "service": "Sandbox",
      "description": "Sandbox port default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "ENABLE_NETWORK",
      "service": "Sandbox",
      "description": "Enable network default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "WORKER_TIMEOUT",
      "service": "Sandbox",
      "description": "Worker timeout default for the official Dify Sandbox service.",
      "secret": false,
      "strategy": "default",
      "default": "15"
    },
    {
      "key": "PORT",
      "service": "Web",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "HOSTNAME",
      "service": "Web",
      "description": "Hostname default for the official Dify Web service.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "APP_API_URL",
      "service": "Web",
      "description": "Published application API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Web",
      "description": "Console API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MARKETPLACE_URL",
      "service": "Web",
      "description": "Marketplace url configured for this stack.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "Web",
      "description": "Marketplace api url configured for this stack.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "SERVER_CONSOLE_API_URL",
      "service": "Web",
      "description": "Server console api url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NEXT_TELEMETRY_DISABLED",
      "service": "Web",
      "description": "Disables Next.js telemetry.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "EXPERIMENTAL_ENABLE_VINEXT",
      "service": "Web",
      "description": "Experimental enable vinext default for the official Dify Web service.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "TEXT_GENERATION_TIMEOUT_MS",
      "service": "Web",
      "description": "Text generation timeout ms default for the official Dify Web service.",
      "secret": false,
      "strategy": "default",
      "default": "60000"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_AGENT_V2",
      "service": "Web",
      "description": "False: experimental Agent V2 local shell runtime is not included in this template.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_FEATURE_PREVIEW",
      "service": "Web",
      "description": "Disables experimental previews in this production-oriented template.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_AGENT_V2_IN_CHATFLOW",
      "service": "Web",
      "description": "False: experimental Agent V2 inside Chatflow is not included.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PORT",
      "service": "Qdrant",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "6333"
    },
    {
      "key": "QDRANT__SERVICE__HOST",
      "service": "Qdrant",
      "description": "Private qdrant  service  hostname inside the Railway project.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "QDRANT__SERVICE__API_KEY",
      "service": "Qdrant",
      "description": "Generated vector database authentication key. Keep Qdrant private.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "QDRANT__SERVICE__HTTP_PORT",
      "service": "Qdrant",
      "description": "Qdrant  service  http port default for the official Dify Qdrant service.",
      "secret": false,
      "strategy": "default",
      "default": "6333"
    },
    {
      "key": "QDRANT__TELEMETRY_DISABLED",
      "service": "Qdrant",
      "description": "Qdrant  telemetry disabled default for the official Dify Qdrant service.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PORT",
      "service": "Dify",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "API_HOST",
      "service": "Dify",
      "description": "Private Dify API hostname used by the public proxy.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEB_HOST",
      "service": "Dify",
      "description": "Private Dify Web hostname used by the public proxy.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PLUGIN_HOST",
      "service": "Dify",
      "description": "Private Plugin hostname used only for explicitly published endpoint hooks.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NGINX_TEMPLATE_B64",
      "service": "Dify",
      "description": "Base64-encoded single-domain Nginx routing configuration. Preserves HTTPS headers and streams workflow/chat events.",
      "secret": false,
      "strategy": "default",
      "default": "d29ya2VyX3Byb2Nlc3NlcyAxOwpldmVudHMgeyB3b3JrZXJfY29ubmVjdGlvbnMgMTAyNDsgfQpodHRwIHsKIGluY2x1ZGUgL2V0Yy9uZ2lueC9taW1lLnR5cGVzOwogZGVmYXVsdF90eXBlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTsKIGFjY2Vzc19sb2cgL2Rldi9zdGRvdXQ7CiBlcnJvcl9sb2cgL2Rldi9zdGRlcnIgd2FybjsKIHJlc29sdmVyIFJFU09MVkVSIHZhbGlkPTMwcyBpcHY2PW9mZjsKIGNsaWVudF9tYXhfYm9keV9zaXplIDEwMG07CiBtYXAgJGh0dHBfeF9mb3J3YXJkZWRfcHJvdG8gJGZvcndhcmRlZF9zY2hlbWUgeyBkZWZhdWx0ICRodHRwX3hfZm9yd2FyZGVkX3Byb3RvOyAiIiAkc2NoZW1lOyB9CiBzZXJ2ZXIgewogIGxpc3RlbiA4MDgwOwogIHNlcnZlcl9uYW1lIF87CiAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTsKICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7CiAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyOwogIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yOwogIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gJGZvcndhcmRlZF9zY2hlbWU7CiAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uICIiOwogIHByb3h5X3JlYWRfdGltZW91dCAzNjAwczsKICBwcm94eV9zZW5kX3RpbWVvdXQgMzYwMHM7CiAgcHJveHlfYnVmZmVyaW5nIG9mZjsKICBsb2NhdGlvbiB+IF4vKGNvbnNvbGUvYXBpfGFwaXx2MXxvcGVuYXBpfGZpbGVzfG1jcHx0cmlnZ2Vyc3xoZWFsdGgpKC98JCkgeyBzZXQgJHVwc3RyZWFtICR7QVBJX0hPU1R9OjUwMDE7IHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbTsgfQogIGxvY2F0aW9uIC9lLyB7IHNldCAkdXBzdHJlYW0gJHtQTFVHSU5fSE9TVH06NTAwMjsgcHJveHlfcGFzcyBodHRwOi8vJHVwc3RyZWFtOyBwcm94eV9zZXRfaGVhZGVyIERpZnktSG9vay1VcmwgJGZvcndhcmRlZF9zY2hlbWU6Ly8kaG9zdCRyZXF1ZXN0X3VyaTsgfQogIGxvY2F0aW9uIC8geyBzZXQgJHVwc3RyZWFtICR7V0VCX0hPU1R9OjMwMDA7IHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbTsgfQogfQp9Cg=="
    },
    {
      "key": "TZ",
      "service": "Beat",
      "description": "Inherits TZ from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANG",
      "service": "Beat",
      "description": "Inherits LANG from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MODE",
      "service": "Beat",
      "description": "Selects the official Dify API image process: api, worker or beat.",
      "secret": false,
      "strategy": "default",
      "default": "beat"
    },
    {
      "key": "PORT",
      "service": "Beat",
      "description": "Inherits PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LC_ALL",
      "service": "Beat",
      "description": "Inherits LC_ALL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_HOST",
      "service": "Beat",
      "description": "Inherits DB_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Beat",
      "description": "Inherits DB_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Beat",
      "description": "Inherits DB_TYPE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_DB",
      "service": "Beat",
      "description": "Inherits REDIS_DB from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_EXTRAS",
      "service": "Beat",
      "description": "Share API PostgreSQL timeout and TCP keepalive settings for scheduler recovery after database restart.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_PORT",
      "service": "Beat",
      "description": "Inherits DIFY_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILES_URL",
      "service": "Beat",
      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LOG_LEVEL",
      "service": "Beat",
      "description": "Inherits LOG_LEVEL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Beat",
      "description": "Region of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "Beat",
      "description": "Inherits DEPLOY_ENV from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_URL",
      "service": "Beat",
      "description": "Inherits QDRANT_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "Beat",
      "description": "Inherits REDIS_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Beat",
      "description": "Inherits REDIS_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Beat",
      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "Beat",
      "description": "Published application API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Beat",
      "description": "Published application web URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_DATABASE",
      "service": "Beat",
      "description": "Inherits DB_DATABASE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Beat",
      "description": "Inherits DB_PASSWORD from API so background processes use the same configuration.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "Beat",
      "description": "Inherits DB_SSL_MODE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Beat",
      "description": "Inherits DB_USERNAME from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Beat",
      "description": "S3-compatible endpoint of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "Beat",
      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Beat",
      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Beat",
      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INIT_PASSWORD",
      "service": "Beat",
      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Beat",
      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Beat",
      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ALLOW_REGISTER",
      "service": "Beat",
      "description": "False prevents unrestricted public account registration after first setup.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_API_KEY",
      "service": "Beat",
      "description": "Reference to the generated Qdrant API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Beat",
      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Beat",
      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Beat",
      "description": "Console API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Beat",
      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Beat",
      "description": "Public service API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Beat",
      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_AUTO_SCALE",
      "service": "Beat",
      "description": "Inherits CELERY_AUTO_SCALE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Beat",
      "description": "Inherits CELERY_BROKER_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "Beat",
      "description": "Inherits DIFY_BIND_ADDRESS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Beat",
      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Beat",
      "description": "Reference to the generated plugin daemon API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Beat",
      "description": "Inherits PLUGIN_DAEMON_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEPLOYMENT_EDITION",
      "service": "Beat",
      "description": "Inherits DEPLOYMENT_EDITION from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Beat",
      "description": "Inherits INTERNAL_FILES_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SCARF_NO_ANALYTICS",
      "service": "Beat",
      "description": "Disables Scarf analytics.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_WORKER_CLASS",
      "service": "Beat",
      "description": "Inherits CELERY_WORKER_CLASS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_CHANGE_EMAIL",
      "service": "Beat",
      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "Beat",
      "description": "Inherits MARKETPLACE_ENABLED from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_GRPC_ENABLED",
      "service": "Beat",
      "description": "Inherits QDRANT_GRPC_ENABLED from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_CLASS",
      "service": "Beat",
      "description": "Inherits SERVER_WORKER_CLASS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSRF_PROXY_HTTP_URL",
      "service": "Beat",
      "description": "Inherits SSRF_PROXY_HTTP_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_WORKER_AMOUNT",
      "service": "Beat",
      "description": "Two background-task concurrency slots by default.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_AMOUNT",
      "service": "Beat",
      "description": "One API process by default; increase only after measuring available memory.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_POOL_SIZE",
      "service": "Beat",
      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSRF_PROXY_HTTPS_URL",
      "service": "Beat",
      "description": "Inherits SSRF_PROXY_HTTPS_URL from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "Beat",
      "description": "Inherits ENDPOINT_URL_TEMPLATE from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_TIMEOUT",
      "service": "Beat",
      "description": "Inherits PLUGIN_DAEMON_TIMEOUT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ALLOW_CREATE_WORKSPACE",
      "service": "Beat",
      "description": "False prevents unrestricted workspace creation.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Beat",
      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "Beat",
      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Beat",
      "description": "Inherits CODE_EXECUTION_ENDPOINT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_EMAIL_CODE_LOGIN",
      "service": "Beat",
      "description": "Disabled until SMTP/email delivery is configured.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_MAX_OVERFLOW",
      "service": "Beat",
      "description": "Maximum extra PostgreSQL connections per process.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "Beat",
      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQLALCHEMY_POOL_PRE_PING",
      "service": "Beat",
      "description": "Inherits SQLALCHEMY_POOL_PRE_PING from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_COLLABORATION_MODE",
      "service": "Beat",
      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_WORKER_CONNECTIONS",
      "service": "Beat",
      "description": "Inherits SERVER_WORKER_CONNECTIONS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "Beat",
      "description": "Inherits CONSOLE_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_HOST",
      "service": "Beat",
      "description": "Inherits PLUGIN_REMOTE_INSTALL_HOST from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_PORT",
      "service": "Beat",
      "description": "Inherits PLUGIN_REMOTE_INSTALL_PORT from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "Beat",
      "description": "Inherits WEB_API_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_EMAIL_PASSWORD_LOGIN",
      "service": "Beat",
      "description": "Enables normal email/password login without SMTP.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "NEW_USER_DEFAULT_PLUGIN_IDS",
      "service": "Beat",
      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RESPECT_XFORWARD_HEADERS_ENABLED",
      "service": "Beat",
      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TZ",
      "service": "API",
      "description": "Tz default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "UTC"
    },
    {
      "key": "LANG",
      "service": "API",
      "description": "Lang default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "C.UTF-8"
    },
    {
      "key": "MODE",
      "service": "API",
      "description": "Selects the official Dify API image process: api, worker or beat.",
      "secret": false,
      "strategy": "default",
      "default": "api"
    },
    {
      "key": "PORT",
      "service": "API",
      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "LC_ALL",
      "service": "API",
      "description": "Lc all default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "C.UTF-8"
    },
    {
      "key": "DB_HOST",
      "service": "API",
      "description": "Private db hostname inside the Railway project.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "API",
      "description": "Db port default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "DB_TYPE",
      "service": "API",
      "description": "Db type default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_DB",
      "service": "API",
      "description": "Redis db default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DB_EXTRAS",
      "service": "API",
      "description": "PostgreSQL connection timeout and TCP keepalives. Fast recovery when PostgreSQL containers or private IPs change; preserves stable application data.",
      "secret": false,
      "strategy": "default",
      "default": "connect_timeout=10&keepalives=1&keepalives_idle=10&keepalives_interval=5&keepalives_count=3"
    },
    {
      "key": "DIFY_PORT",
      "service": "API",
      "description": "Dify port default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "FILES_URL",
      "service": "API",
      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOG_LEVEL",
      "service": "API",
      "description": "Log level default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "INFO"
    },
    {
      "key": "S3_REGION",
      "service": "API",
      "description": "Region of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "API",
      "description": "Deploy env default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "QDRANT_URL",
      "service": "API",
      "description": "Qdrant url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_HOST",
      "service": "API",
      "description": "Private redis hostname inside the Railway project.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "API",
      "description": "Redis port default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "SECRET_KEY",
      "service": "API",
      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "APP_API_URL",
      "service": "API",
      "description": "Published application API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "API",
      "description": "Published application web URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "API",
      "description": "Db database default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "API",
      "description": "Db password default for the official Dify API service.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "API",
      "description": "Db ssl mode default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "disable"
    },
    {
      "key": "DB_USERNAME",
      "service": "API",
      "description": "Db username default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "API",
      "description": "S3-compatible endpoint of the native Railway Bucket.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "API",
      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "API",
      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "API",
      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
      "secret": false,
      "strategy": "default",
      "default": "qdrant"
    },
    {
      "key": "INIT_PASSWORD",
      "service": "API",
      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "API",
      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "API",
      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ALLOW_REGISTER",
      "service": "API",
      "description": "False prevents unrestricted public account registration after first setup.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "QDRANT_API_KEY",
      "service": "API",
      "description": "Reference to the generated Qdrant API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "API",
      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "API",
      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "API",
      "description": "Console API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "API",
      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "API",
      "description": "Public service API URL follows the single public Dify domain automatically.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "API",
      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
      "secret": false,
      "strategy": "default",
      "default": "virtual"
    },
    {
      "key": "CELERY_AUTO_SCALE",
      "service": "API",
      "description": "Celery auto scale default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "API",
      "description": "Celery broker url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "API",
      "description": "Dify bind address default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "API",
      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "API",
      "description": "Reference to the generated plugin daemon API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "API",
      "description": "Plugin daemon url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DEPLOYMENT_EDITION",
      "service": "API",
      "description": "Deployment edition default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "COMMUNITY"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "API",
      "description": "Internal files url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SCARF_NO_ANALYTICS",
      "service": "API",
      "description": "Disables Scarf analytics.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CELERY_WORKER_CLASS",
      "service": "API",
      "description": "Celery worker class default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "gevent"
    },
    {
      "key": "ENABLE_CHANGE_EMAIL",
      "service": "API",
      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "API",
      "description": "Marketplace enabled default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "QDRANT_GRPC_ENABLED",
      "service": "API",
      "description": "Qdrant grpc enabled default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SERVER_WORKER_CLASS",
      "service": "API",
      "description": "Server worker class default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "gevent"
    },
    {
      "key": "SSRF_PROXY_HTTP_URL",
      "service": "API",
      "description": "Ssrf proxy http url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CELERY_WORKER_AMOUNT",
      "service": "API",
      "description": "Two background-task concurrency slots by default.",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "SERVER_WORKER_AMOUNT",
      "service": "API",
      "description": "One API process by default; increase only after measuring available memory.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "SQLALCHEMY_POOL_SIZE",
      "service": "API",
      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "SSRF_PROXY_HTTPS_URL",
      "service": "API",
      "description": "Ssrf proxy https url configured for this stack.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "API",
      "description": "Endpoint url template default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PLUGIN_DAEMON_TIMEOUT",
      "service": "API",
      "description": "Plugin daemon timeout default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "600.0"
    },
    {
      "key": "ALLOW_CREATE_WORKSPACE",
      "service": "API",
      "description": "False prevents unrestricted workspace creation.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "API",
      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "API",
      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "API",
      "description": "Code execution endpoint default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENABLE_EMAIL_CODE_LOGIN",
      "service": "API",
      "description": "Disabled until SMTP/email delivery is configured.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SQLALCHEMY_MAX_OVERFLOW",
      "service": "API",
      "description": "Maximum extra PostgreSQL connections per process.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "API",
      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SQLALCHEMY_POOL_PRE_PING",
      "service": "API",
      "description": "Sqlalchemy pool pre ping default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ENABLE_COLLABORATION_MODE",
      "service": "API",
      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SERVER_WORKER_CONNECTIONS",
      "service": "API",
      "description": "Server worker connections default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "100"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "API",
      "description": "Console cors allow origins default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_HOST",
      "service": "API",
      "description": "Private plugin remote install hostname inside the Railway project.",
      "secret": false,
      "strategy": "default",
      "default": "127.0.0.1"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALL_PORT",
      "service": "API",
      "description": "Plugin remote install port default for the official Dify API service.",
      "secret": false,
      "strategy": "default",
      "default": "5003"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "API",
      "description": "Web api cors allow origins default for the official Dify API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ENABLE_EMAIL_PASSWORD_LOGIN",
      "service": "API",
      "description": "Enables normal email/password login without SMTP.",
      "secret": true,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "NEW_USER_DEFAULT_PLUGIN_IDS",
      "service": "API",
      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
      "secret": false,
      "strategy": "default",
      "default": "langgenius/openai"
    },
    {
      "key": "RESPECT_XFORWARD_HEADERS_ENABLED",
      "service": "API",
      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SQUID_CONFIG_B64",
      "service": "SSRF-Proxy",
      "description": "Base64-encoded SSRF proxy configuration. Blocks private destination addresses and allows authenticated stack services to access public URLs.",
      "secret": false,
      "strategy": "default",
      "default": "aHR0cF9wb3J0IDMxMjgKYWNsIGxvY2FsbmV0IHNyYyAxMC4wLjAuMC84IDEwMC42NC4wLjAvMTAgMTcyLjE2LjAuMC8xMiAxOTIuMTY4LjAuMC8xNiBmYzAwOjovNyBmZTgwOjovMTAKYWNsIGxvY2FsaG9zdCBzcmMgMTI3LjAuMC4xLzMyIDo6MQphY2wgcHJpdmF0ZSBkc3QgMC4wLjAuMC84IDEwLjAuMC4wLzggMTAwLjY0LjAuMC8xMCAxMjcuMC4wLjAvOCAxNjkuMjU0LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDE5Mi4xNjguMC4wLzE2IDIyNC4wLjAuMC80IDI0MC4wLjAuMC80IDo6LzEyOCA6OjEvMTI4IDo6ZmZmZjowOjAvOTYgOjovOTYgZmMwMDo6LzcgZmU4MDo6LzEwCmFjbCBTU0xfcG9ydHMgcG9ydCA0NDMKYWNsIFNhZmVfcG9ydHMgcG9ydCA4MCA0NDMgMTAyNS02NTUzNQphY2wgQ09OTkVDVCBtZXRob2QgQ09OTkVDVApodHRwX2FjY2VzcyBkZW55ICFTYWZlX3BvcnRzCmh0dHBfYWNjZXNzIGRlbnkgQ09OTkVDVCAhU1NMX3BvcnRzCmh0dHBfYWNjZXNzIGRlbnkgcHJpdmF0ZQpodHRwX2FjY2VzcyBhbGxvdyBsb2NhbG5ldApodHRwX2FjY2VzcyBhbGxvdyBsb2NhbGhvc3QKaHR0cF9hY2Nlc3MgZGVueSBhbGwKY2FjaGUgZGVueSBhbGwKY2FjaGVfbWVtIDE2IE1CCmFjY2Vzc19sb2cgc3RkaW86L2Rldi9zdGRvdXQKY2FjaGVfbG9nIC9kZXYvc3RkZXJyCnBpZF9maWxlbmFtZSAvdG1wL3NxdWlkLnBpZApjb3JlZHVtcF9kaXIgL3RtcApzaHV0ZG93bl9saWZldGltZSAzIHNlY29uZHMK"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "dify-ai-with-qdrant-and-s3"
      }
    },
    "cli": "railway deploy --template dify-ai-with-qdrant-and-s3",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "f8e3ba32-cf58-4c22-94ca-19b825181294",
            "serializedConfig": {
              "buckets": {
                "f4f02845-aa02-43de-9789-2d37db61806d": {
                  "name": "dify-storage"
                }
              },
              "services": {
                "0e10f06c-c5a2-4a80-bc10-a597f26c6622": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg",
                  "name": "Redis",
                  "deploy": {
                    "startCommand": "sh -c 'exec redis-server --bind 0.0.0.0 :: --protected-mode yes --requirepass \"$REDIS_PASSWORD\" --appendonly yes --maxmemory-policy noeviction'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:7.2.16-bookworm"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "0e10f06c-c5a2-4a80-bc10-a597f26c6622": {
                      "mountPath": "/data"
                    }
                  }
                },
                "0f039a7d-7165-43a5-b865-34529bc8c08c": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:17.11-bookworm"
                  },
                  "variables": {
                    "TZ": {
                      "isOptional": false,
                      "description": "Tz default for the official Dify Postgres service.",
                      "defaultValue": "UTC"
                    },
                    "PGDATA": {
                      "description": "Persistent PostgreSQL data directory inside the attached volume.",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "description": "Primary Dify database; Plugin automatically creates its separate dify_plugin database.",
                      "defaultValue": "dify"
                    },
                    "POSTGRES_USER": {
                      "description": "Database administrator username used by the Dify stack.",
                      "defaultValue": "dify"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Generated PostgreSQL password. Referenced by Dify and Plugin automatically.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "0f039a7d-7165-43a5-b865-34529bc8c08c": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "1493ef26-1767-47c3-9d50-a22a306edd13": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Worker",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.17.1"
                  },
                  "variables": {
                    "TZ": {
                      "isOptional": false,
                      "description": "Inherits TZ from API so background processes use the same configuration.",
                      "defaultValue": "${{API.TZ}}"
                    },
                    "LANG": {
                      "description": "Inherits LANG from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LANG}}"
                    },
                    "MODE": {
                      "isOptional": false,
                      "description": "Selects the official Dify API image process: api, worker or beat.",
                      "defaultValue": "worker"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Inherits PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PORT}}"
                    },
                    "LC_ALL": {
                      "description": "Inherits LC_ALL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LC_ALL}}"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Inherits DB_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_HOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Inherits DB_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_PORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Inherits DB_TYPE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_TYPE}}"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Inherits REDIS_DB from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_DB}}"
                    },
                    "DB_EXTRAS": {
                      "isOptional": false,
                      "description": "Share API PostgreSQL timeout and TCP keepalive settings for worker recovery after database restart.",
                      "defaultValue": "${{API.DB_EXTRAS}}"
                    },
                    "DIFY_PORT": {
                      "isOptional": false,
                      "description": "Inherits DIFY_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DIFY_PORT}}"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.FILES_URL}}"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Inherits LOG_LEVEL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LOG_LEVEL}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Region of the native Railway Bucket.",
                      "defaultValue": "${{API.S3_REGION}}"
                    },
                    "DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Inherits DEPLOY_ENV from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DEPLOY_ENV}}"
                    },
                    "QDRANT_URL": {
                      "isOptional": false,
                      "description": "Inherits QDRANT_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.QDRANT_URL}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Inherits REDIS_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_HOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Inherits REDIS_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_PORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
                      "defaultValue": "${{API.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "Published application API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.APP_API_URL}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "description": "Published application web URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.APP_WEB_URL}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Inherits DB_DATABASE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_DATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Inherits DB_PASSWORD from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "isOptional": false,
                      "description": "Inherits DB_SSL_MODE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_SSL_MODE}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Inherits DB_USERNAME from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_USERNAME}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint of the native Railway Bucket.",
                      "defaultValue": "${{API.S3_ENDPOINT}}"
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.TRIGGER_URL}}"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
                      "defaultValue": "${{API.STORAGE_TYPE}}"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
                      "defaultValue": "${{API.VECTOR_STORE}}"
                    },
                    "INIT_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
                      "defaultValue": "${{API.INIT_PASSWORD}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
                      "defaultValue": "${{API.S3_ACCESS_KEY}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
                      "defaultValue": "${{API.S3_SECRET_KEY}}"
                    },
                    "ALLOW_REGISTER": {
                      "isOptional": false,
                      "description": "False prevents unrestricted public account registration after first setup.",
                      "defaultValue": "${{API.ALLOW_REGISTER}}"
                    },
                    "QDRANT_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated Qdrant API key.",
                      "defaultValue": "${{API.QDRANT_API_KEY}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
                      "defaultValue": "${{API.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
                      "defaultValue": "${{API.S3_BUCKET_NAME}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.CONSOLE_API_URL}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.CONSOLE_WEB_URL}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "description": "Public service API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.SERVICE_API_URL}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
                      "defaultValue": "${{API.S3_ADDRESS_STYLE}}"
                    },
                    "CELERY_AUTO_SCALE": {
                      "isOptional": false,
                      "description": "Inherits CELERY_AUTO_SCALE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_AUTO_SCALE}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Inherits CELERY_BROKER_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_BROKER_URL}}"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "isOptional": false,
                      "description": "Inherits DIFY_BIND_ADDRESS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DIFY_BIND_ADDRESS}}"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
                      "defaultValue": "false"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated plugin daemon API key.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_DAEMON_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_URL}}"
                    },
                    "DEPLOYMENT_EDITION": {
                      "isOptional": false,
                      "description": "Inherits DEPLOYMENT_EDITION from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DEPLOYMENT_EDITION}}"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "description": "Inherits INTERNAL_FILES_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.INTERNAL_FILES_URL}}"
                    },
                    "SCARF_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disables Scarf analytics.",
                      "defaultValue": "${{API.SCARF_NO_ANALYTICS}}"
                    },
                    "CELERY_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Inherits CELERY_WORKER_CLASS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_WORKER_CLASS}}"
                    },
                    "ENABLE_CHANGE_EMAIL": {
                      "isOptional": false,
                      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
                      "defaultValue": "${{API.ENABLE_CHANGE_EMAIL}}"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Inherits MARKETPLACE_ENABLED from API so background processes use the same configuration.",
                      "defaultValue": "${{API.MARKETPLACE_ENABLED}}"
                    },
                    "QDRANT_GRPC_ENABLED": {
                      "isOptional": false,
                      "description": "Inherits QDRANT_GRPC_ENABLED from API so background processes use the same configuration.",
                      "defaultValue": "${{API.QDRANT_GRPC_ENABLED}}"
                    },
                    "SERVER_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Inherits SERVER_WORKER_CLASS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SERVER_WORKER_CLASS}}"
                    },
                    "SSRF_PROXY_HTTP_URL": {
                      "isOptional": false,
                      "description": "Inherits SSRF_PROXY_HTTP_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SSRF_PROXY_HTTP_URL}}"
                    },
                    "CELERY_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "Two background-task concurrency slots by default.",
                      "defaultValue": "${{API.CELERY_WORKER_AMOUNT}}"
                    },
                    "SERVER_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "One API process by default; increase only after measuring available memory.",
                      "defaultValue": "${{API.SERVER_WORKER_AMOUNT}}"
                    },
                    "SQLALCHEMY_POOL_SIZE": {
                      "isOptional": false,
                      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
                      "defaultValue": "${{API.SQLALCHEMY_POOL_SIZE}}"
                    },
                    "SSRF_PROXY_HTTPS_URL": {
                      "isOptional": false,
                      "description": "Inherits SSRF_PROXY_HTTPS_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SSRF_PROXY_HTTPS_URL}}"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "description": "Inherits ENDPOINT_URL_TEMPLATE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.ENDPOINT_URL_TEMPLATE}}"
                    },
                    "PLUGIN_DAEMON_TIMEOUT": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_DAEMON_TIMEOUT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_TIMEOUT}}"
                    },
                    "ALLOW_CREATE_WORKSPACE": {
                      "isOptional": false,
                      "description": "False prevents unrestricted workspace creation.",
                      "defaultValue": "${{API.ALLOW_CREATE_WORKSPACE}}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
                      "defaultValue": "${{API.CODE_EXECUTION_API_KEY}}"
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
                      "defaultValue": "${{API.S3_USE_AWS_MANAGED_IAM}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "description": "Inherits CODE_EXECUTION_ENDPOINT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CODE_EXECUTION_ENDPOINT}}"
                    },
                    "ENABLE_EMAIL_CODE_LOGIN": {
                      "isOptional": false,
                      "description": "Disabled until SMTP/email delivery is configured.",
                      "defaultValue": "${{API.ENABLE_EMAIL_CODE_LOGIN}}"
                    },
                    "SQLALCHEMY_MAX_OVERFLOW": {
                      "isOptional": false,
                      "description": "Maximum extra PostgreSQL connections per process.",
                      "defaultValue": "${{API.SQLALCHEMY_MAX_OVERFLOW}}"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "SQLALCHEMY_POOL_PRE_PING": {
                      "isOptional": false,
                      "description": "Inherits SQLALCHEMY_POOL_PRE_PING from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SQLALCHEMY_POOL_PRE_PING}}"
                    },
                    "ENABLE_COLLABORATION_MODE": {
                      "isOptional": false,
                      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
                      "defaultValue": "${{API.ENABLE_COLLABORATION_MODE}}"
                    },
                    "SERVER_WORKER_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Inherits SERVER_WORKER_CONNECTIONS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SERVER_WORKER_CONNECTIONS}}"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Inherits CONSOLE_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CONSOLE_CORS_ALLOW_ORIGINS}}"
                    },
                    "PLUGIN_REMOTE_INSTALL_HOST": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_REMOTE_INSTALL_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_REMOTE_INSTALL_HOST}}"
                    },
                    "PLUGIN_REMOTE_INSTALL_PORT": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_REMOTE_INSTALL_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_REMOTE_INSTALL_PORT}}"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Inherits WEB_API_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.WEB_API_CORS_ALLOW_ORIGINS}}"
                    },
                    "ENABLE_EMAIL_PASSWORD_LOGIN": {
                      "isOptional": false,
                      "description": "Enables normal email/password login without SMTP.",
                      "defaultValue": "${{API.ENABLE_EMAIL_PASSWORD_LOGIN}}"
                    },
                    "NEW_USER_DEFAULT_PLUGIN_IDS": {
                      "isOptional": false,
                      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
                      "defaultValue": "${{API.NEW_USER_DEFAULT_PLUGIN_IDS}}"
                    },
                    "RESPECT_XFORWARD_HEADERS_ENABLED": {
                      "isOptional": false,
                      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
                      "defaultValue": "${{API.RESPECT_XFORWARD_HEADERS_ENABLED}}"
                    }
                  }
                },
                "1eeb3f10-7f2f-4b21-8d6b-8b4b24d58d7e": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Plugin",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health/check",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-plugin-daemon:0.6.10-local"
                  },
                  "variables": {
                    "TZ": {
                      "isOptional": false,
                      "description": "Tz default for the official Dify Plugin service.",
                      "defaultValue": "UTC"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "5002"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Private db hostname inside the Railway project.",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Db port default for the official Dify Plugin service.",
                      "defaultValue": "5432"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Db type default for the official Dify Plugin service.",
                      "defaultValue": "postgresql"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Redis db default for the official Dify Plugin service.",
                      "defaultValue": "3"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Private redis hostname inside the Railway project.",
                      "defaultValue": "${{Redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Redis port default for the official Dify Plugin service.",
                      "defaultValue": "6379"
                    },
                    "SERVER_KEY": {
                      "description": "Generated plugin daemon API key. Keep Plugin private.",
                      "defaultValue": "{{SERVER_KEY}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Db database default for the official Dify Plugin service.",
                      "defaultValue": "dify_plugin"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Db password default for the official Dify Plugin service.",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "isOptional": false,
                      "description": "Db ssl mode default for the official Dify Plugin service.",
                      "defaultValue": "disable"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Db username default for the official Dify Plugin service.",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "SERVER_PORT": {
                      "description": "Server port default for the official Dify Plugin service.",
                      "defaultValue": "5002"
                    },
                    "PPROF_ENABLED": {
                      "description": "Pprof enabled default for the official Dify Plugin service.",
                      "defaultValue": "false"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "SENTRY_ENABLED": {
                      "description": "Sentry enabled default for the official Dify Plugin service.",
                      "defaultValue": "false"
                    },
                    "DIFY_INNER_API_KEY": {
                      "description": "Reference to the shared internal API key for plugin callbacks.",
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "DIFY_INNER_API_URL": {
                      "description": "Dify inner api url configured for this stack.",
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "PLUGIN_STORAGE_TYPE": {
                      "description": "Local plugin runtime storage uses the attached persistent Plugin volume.",
                      "defaultValue": "local"
                    },
                    "PLUGIN_WORKING_PATH": {
                      "description": "Plugin execution environments persist within the Plugin volume.",
                      "defaultValue": "/app/storage/cwd"
                    },
                    "PLUGIN_INSTALLED_PATH": {
                      "description": "Plugin installed path default for the official Dify Plugin service.",
                      "defaultValue": "plugin"
                    },
                    "MAX_PLUGIN_PACKAGE_SIZE": {
                      "description": "Max plugin package size default for the official Dify Plugin service.",
                      "defaultValue": "52428800"
                    },
                    "PLUGIN_MEDIA_CACHE_PATH": {
                      "description": "Plugin media cache path default for the official Dify Plugin service.",
                      "defaultValue": "assets"
                    },
                    "PYTHON_ENV_INIT_TIMEOUT": {
                      "description": "Python env init timeout default for the official Dify Plugin service.",
                      "defaultValue": "240"
                    },
                    "FORCE_VERIFYING_SIGNATURE": {
                      "description": "True verifies plugin signatures; keep enabled for marketplace installation.",
                      "defaultValue": "true"
                    },
                    "PLUGIN_PACKAGE_CACHE_PATH": {
                      "description": "Plugin package cache path default for the official Dify Plugin service.",
                      "defaultValue": "plugin_packages"
                    },
                    "PLUGIN_STORAGE_LOCAL_ROOT": {
                      "description": "Plugin packages, assets and runtime environments persist on this mounted directory.",
                      "defaultValue": "/app/storage"
                    },
                    "PLUGIN_MAX_EXECUTION_TIMEOUT": {
                      "description": "Plugin max execution timeout default for the official Dify Plugin service.",
                      "defaultValue": "600"
                    },
                    "PLUGIN_REMOTE_INSTALLING_HOST": {
                      "description": "Private plugin remote installing hostname inside the Railway project.",
                      "defaultValue": "127.0.0.1"
                    },
                    "PLUGIN_REMOTE_INSTALLING_PORT": {
                      "description": "Plugin remote installing port default for the official Dify Plugin service.",
                      "defaultValue": "5003"
                    }
                  },
                  "volumeMounts": {
                    "1eeb3f10-7f2f-4b21-8d6b-8b4b24d58d7e": {
                      "mountPath": "/app/storage"
                    }
                  }
                },
                "6556310c-09ad-42e1-bdd5-d271c398f8ac": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Sandbox",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-sandbox:0.2.15"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "8194"
                    },
                    "API_KEY": {
                      "description": "Generated private code Sandbox API key.",
                      "defaultValue": "{{API_KEY}}"
                    },
                    "GIN_MODE": {
                      "description": "Gin mode default for the official Dify Sandbox service.",
                      "defaultValue": "release"
                    },
                    "HTTP_PROXY": {
                      "description": "Http proxy default for the official Dify Sandbox service.",
                      "defaultValue": "http://${{SSRF-Proxy.RAILWAY_PRIVATE_DOMAIN}}:3128"
                    },
                    "HTTPS_PROXY": {
                      "description": "Https proxy default for the official Dify Sandbox service.",
                      "defaultValue": "http://${{SSRF-Proxy.RAILWAY_PRIVATE_DOMAIN}}:3128"
                    },
                    "SANDBOX_PORT": {
                      "description": "Sandbox port default for the official Dify Sandbox service.",
                      "defaultValue": "8194"
                    },
                    "ENABLE_NETWORK": {
                      "description": "Enable network default for the official Dify Sandbox service.",
                      "defaultValue": "true"
                    },
                    "WORKER_TIMEOUT": {
                      "description": "Worker timeout default for the official Dify Sandbox service.",
                      "defaultValue": "15"
                    }
                  }
                },
                "6b50bae4-6e5d-42d7-b9ce-e244d5d447dc": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Web",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/signin",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-web:1.17.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "3000"
                    },
                    "HOSTNAME": {
                      "description": "Hostname default for the official Dify Web service.",
                      "defaultValue": "0.0.0.0"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "Published application API URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "MARKETPLACE_URL": {
                      "description": "Marketplace url configured for this stack.",
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "MARKETPLACE_API_URL": {
                      "description": "Marketplace api url configured for this stack.",
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "SERVER_CONSOLE_API_URL": {
                      "description": "Server console api url configured for this stack.",
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "NEXT_TELEMETRY_DISABLED": {
                      "description": "Disables Next.js telemetry.",
                      "defaultValue": "1"
                    },
                    "EXPERIMENTAL_ENABLE_VINEXT": {
                      "description": "Experimental enable vinext default for the official Dify Web service.",
                      "defaultValue": "false"
                    },
                    "TEXT_GENERATION_TIMEOUT_MS": {
                      "description": "Text generation timeout ms default for the official Dify Web service.",
                      "defaultValue": "60000"
                    },
                    "NEXT_PUBLIC_ENABLE_AGENT_V2": {
                      "description": "False: experimental Agent V2 local shell runtime is not included in this template.",
                      "defaultValue": "false"
                    },
                    "NEXT_PUBLIC_ENABLE_FEATURE_PREVIEW": {
                      "description": "Disables experimental previews in this production-oriented template.",
                      "defaultValue": "false"
                    },
                    "NEXT_PUBLIC_ENABLE_AGENT_V2_IN_CHATFLOW": {
                      "description": "False: experimental Agent V2 inside Chatflow is not included.",
                      "defaultValue": "false"
                    }
                  }
                },
                "70becde7-d634-467a-b2af-77a31ff094f8": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/qdrant.svg",
                  "name": "Qdrant",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "qdrant/qdrant:v1.19.2"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "6333"
                    },
                    "QDRANT__SERVICE__HOST": {
                      "description": "Private qdrant  service  hostname inside the Railway project.",
                      "defaultValue": "0.0.0.0"
                    },
                    "QDRANT__SERVICE__API_KEY": {
                      "description": "Generated vector database authentication key. Keep Qdrant private.",
                      "defaultValue": "{{QDRANT__SERVICE__API_KEY}}"
                    },
                    "QDRANT__SERVICE__HTTP_PORT": {
                      "description": "Qdrant  service  http port default for the official Dify Qdrant service.",
                      "defaultValue": "6333"
                    },
                    "QDRANT__TELEMETRY_DISABLED": {
                      "description": "Qdrant  telemetry disabled default for the official Dify Qdrant service.",
                      "defaultValue": "true"
                    }
                  },
                  "volumeMounts": {
                    "70becde7-d634-467a-b2af-77a31ff094f8": {
                      "mountPath": "/qdrant/storage"
                    }
                  }
                },
                "ab678b0c-5a1a-4b76-94a2-3ebde53cad1b": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Dify",
                  "deploy": {
                    "startCommand": "sh -c 'printf %s \"$NGINX_TEMPLATE_B64\" | base64 -d > /tmp/nginx.template; resolver=$(sed -n \"s/^nameserver //p\" /etc/resolv.conf | head -n 1); case \"$resolver\" in *:*) resolver=\"[$resolver]\";; esac; sed \"s/RESOLVER/$resolver/\" /tmp/nginx.template | envsubst \"\\$API_HOST \\$WEB_HOST \\$PLUGIN_HOST\" > /etc/nginx/nginx.conf; exec nginx -g \"daemon off;\"'",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nginx:1.28.0-alpine@sha256:30f1c0d78e0ad60901648be663a710bdadf19e4c10ac6782c235200619158284"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "8080"
                    },
                    "API_HOST": {
                      "description": "Private Dify API hostname used by the public proxy.",
                      "defaultValue": "${{API.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "WEB_HOST": {
                      "description": "Private Dify Web hostname used by the public proxy.",
                      "defaultValue": "${{Web.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PLUGIN_HOST": {
                      "description": "Private Plugin hostname used only for explicitly published endpoint hooks.",
                      "defaultValue": "${{Plugin.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "NGINX_TEMPLATE_B64": {
                      "description": "Base64-encoded single-domain Nginx routing configuration. Preserves HTTPS headers and streams workflow/chat events.",
                      "defaultValue": "d29ya2VyX3Byb2Nlc3NlcyAxOwpldmVudHMgeyB3b3JrZXJfY29ubmVjdGlvbnMgMTAyNDsgfQpodHRwIHsKIGluY2x1ZGUgL2V0Yy9uZ2lueC9taW1lLnR5cGVzOwogZGVmYXVsdF90eXBlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTsKIGFjY2Vzc19sb2cgL2Rldi9zdGRvdXQ7CiBlcnJvcl9sb2cgL2Rldi9zdGRlcnIgd2FybjsKIHJlc29sdmVyIFJFU09MVkVSIHZhbGlkPTMwcyBpcHY2PW9mZjsKIGNsaWVudF9tYXhfYm9keV9zaXplIDEwMG07CiBtYXAgJGh0dHBfeF9mb3J3YXJkZWRfcHJvdG8gJGZvcndhcmRlZF9zY2hlbWUgeyBkZWZhdWx0ICRodHRwX3hfZm9yd2FyZGVkX3Byb3RvOyAiIiAkc2NoZW1lOyB9CiBzZXJ2ZXIgewogIGxpc3RlbiA4MDgwOwogIHNlcnZlcl9uYW1lIF87CiAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTsKICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7CiAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyOwogIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yOwogIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gJGZvcndhcmRlZF9zY2hlbWU7CiAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uICIiOwogIHByb3h5X3JlYWRfdGltZW91dCAzNjAwczsKICBwcm94eV9zZW5kX3RpbWVvdXQgMzYwMHM7CiAgcHJveHlfYnVmZmVyaW5nIG9mZjsKICBsb2NhdGlvbiB+IF4vKGNvbnNvbGUvYXBpfGFwaXx2MXxvcGVuYXBpfGZpbGVzfG1jcHx0cmlnZ2Vyc3xoZWFsdGgpKC98JCkgeyBzZXQgJHVwc3RyZWFtICR7QVBJX0hPU1R9OjUwMDE7IHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbTsgfQogIGxvY2F0aW9uIC9lLyB7IHNldCAkdXBzdHJlYW0gJHtQTFVHSU5fSE9TVH06NTAwMjsgcHJveHlfcGFzcyBodHRwOi8vJHVwc3RyZWFtOyBwcm94eV9zZXRfaGVhZGVyIERpZnktSG9vay1VcmwgJGZvcndhcmRlZF9zY2hlbWU6Ly8kaG9zdCRyZXF1ZXN0X3VyaTsgfQogIGxvY2F0aW9uIC8geyBzZXQgJHVwc3RyZWFtICR7V0VCX0hPU1R9OjMwMDA7IHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbTsgfQogfQp9Cg=="
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "c64de865-de7c-4074-83d8-2d878f504d09": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "Beat",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.17.1"
                  },
                  "variables": {
                    "TZ": {
                      "isOptional": false,
                      "description": "Inherits TZ from API so background processes use the same configuration.",
                      "defaultValue": "${{API.TZ}}"
                    },
                    "LANG": {
                      "description": "Inherits LANG from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LANG}}"
                    },
                    "MODE": {
                      "isOptional": false,
                      "description": "Selects the official Dify API image process: api, worker or beat.",
                      "defaultValue": "beat"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Inherits PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PORT}}"
                    },
                    "LC_ALL": {
                      "description": "Inherits LC_ALL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LC_ALL}}"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Inherits DB_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_HOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Inherits DB_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_PORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Inherits DB_TYPE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_TYPE}}"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Inherits REDIS_DB from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_DB}}"
                    },
                    "DB_EXTRAS": {
                      "isOptional": false,
                      "description": "Share API PostgreSQL timeout and TCP keepalive settings for scheduler recovery after database restart.",
                      "defaultValue": "${{API.DB_EXTRAS}}"
                    },
                    "DIFY_PORT": {
                      "isOptional": false,
                      "description": "Inherits DIFY_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DIFY_PORT}}"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.FILES_URL}}"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Inherits LOG_LEVEL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.LOG_LEVEL}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Region of the native Railway Bucket.",
                      "defaultValue": "${{API.S3_REGION}}"
                    },
                    "DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Inherits DEPLOY_ENV from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DEPLOY_ENV}}"
                    },
                    "QDRANT_URL": {
                      "isOptional": false,
                      "description": "Inherits QDRANT_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.QDRANT_URL}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Inherits REDIS_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_HOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Inherits REDIS_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.REDIS_PORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
                      "defaultValue": "${{API.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "Published application API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.APP_API_URL}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "description": "Published application web URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.APP_WEB_URL}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Inherits DB_DATABASE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_DATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Inherits DB_PASSWORD from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "isOptional": false,
                      "description": "Inherits DB_SSL_MODE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_SSL_MODE}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Inherits DB_USERNAME from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DB_USERNAME}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint of the native Railway Bucket.",
                      "defaultValue": "${{API.S3_ENDPOINT}}"
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.TRIGGER_URL}}"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
                      "defaultValue": "${{API.STORAGE_TYPE}}"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
                      "defaultValue": "${{API.VECTOR_STORE}}"
                    },
                    "INIT_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
                      "defaultValue": "${{API.INIT_PASSWORD}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
                      "defaultValue": "${{API.S3_ACCESS_KEY}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
                      "defaultValue": "${{API.S3_SECRET_KEY}}"
                    },
                    "ALLOW_REGISTER": {
                      "isOptional": false,
                      "description": "False prevents unrestricted public account registration after first setup.",
                      "defaultValue": "${{API.ALLOW_REGISTER}}"
                    },
                    "QDRANT_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated Qdrant API key.",
                      "defaultValue": "${{API.QDRANT_API_KEY}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
                      "defaultValue": "${{API.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
                      "defaultValue": "${{API.S3_BUCKET_NAME}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.CONSOLE_API_URL}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.CONSOLE_WEB_URL}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "description": "Public service API URL follows the single public Dify domain automatically.",
                      "defaultValue": "${{API.SERVICE_API_URL}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
                      "defaultValue": "${{API.S3_ADDRESS_STYLE}}"
                    },
                    "CELERY_AUTO_SCALE": {
                      "isOptional": false,
                      "description": "Inherits CELERY_AUTO_SCALE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_AUTO_SCALE}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Inherits CELERY_BROKER_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_BROKER_URL}}"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "isOptional": false,
                      "description": "Inherits DIFY_BIND_ADDRESS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DIFY_BIND_ADDRESS}}"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
                      "defaultValue": "false"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated plugin daemon API key.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_DAEMON_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_URL}}"
                    },
                    "DEPLOYMENT_EDITION": {
                      "isOptional": false,
                      "description": "Inherits DEPLOYMENT_EDITION from API so background processes use the same configuration.",
                      "defaultValue": "${{API.DEPLOYMENT_EDITION}}"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "description": "Inherits INTERNAL_FILES_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.INTERNAL_FILES_URL}}"
                    },
                    "SCARF_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disables Scarf analytics.",
                      "defaultValue": "${{API.SCARF_NO_ANALYTICS}}"
                    },
                    "CELERY_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Inherits CELERY_WORKER_CLASS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CELERY_WORKER_CLASS}}"
                    },
                    "ENABLE_CHANGE_EMAIL": {
                      "isOptional": false,
                      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
                      "defaultValue": "${{API.ENABLE_CHANGE_EMAIL}}"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Inherits MARKETPLACE_ENABLED from API so background processes use the same configuration.",
                      "defaultValue": "${{API.MARKETPLACE_ENABLED}}"
                    },
                    "QDRANT_GRPC_ENABLED": {
                      "isOptional": false,
                      "description": "Inherits QDRANT_GRPC_ENABLED from API so background processes use the same configuration.",
                      "defaultValue": "${{API.QDRANT_GRPC_ENABLED}}"
                    },
                    "SERVER_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Inherits SERVER_WORKER_CLASS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SERVER_WORKER_CLASS}}"
                    },
                    "SSRF_PROXY_HTTP_URL": {
                      "isOptional": false,
                      "description": "Inherits SSRF_PROXY_HTTP_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SSRF_PROXY_HTTP_URL}}"
                    },
                    "CELERY_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "Two background-task concurrency slots by default.",
                      "defaultValue": "${{API.CELERY_WORKER_AMOUNT}}"
                    },
                    "SERVER_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "One API process by default; increase only after measuring available memory.",
                      "defaultValue": "${{API.SERVER_WORKER_AMOUNT}}"
                    },
                    "SQLALCHEMY_POOL_SIZE": {
                      "isOptional": false,
                      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
                      "defaultValue": "${{API.SQLALCHEMY_POOL_SIZE}}"
                    },
                    "SSRF_PROXY_HTTPS_URL": {
                      "isOptional": false,
                      "description": "Inherits SSRF_PROXY_HTTPS_URL from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SSRF_PROXY_HTTPS_URL}}"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "description": "Inherits ENDPOINT_URL_TEMPLATE from API so background processes use the same configuration.",
                      "defaultValue": "${{API.ENDPOINT_URL_TEMPLATE}}"
                    },
                    "PLUGIN_DAEMON_TIMEOUT": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_DAEMON_TIMEOUT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_DAEMON_TIMEOUT}}"
                    },
                    "ALLOW_CREATE_WORKSPACE": {
                      "isOptional": false,
                      "description": "False prevents unrestricted workspace creation.",
                      "defaultValue": "${{API.ALLOW_CREATE_WORKSPACE}}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
                      "defaultValue": "${{API.CODE_EXECUTION_API_KEY}}"
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
                      "defaultValue": "${{API.S3_USE_AWS_MANAGED_IAM}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "description": "Inherits CODE_EXECUTION_ENDPOINT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CODE_EXECUTION_ENDPOINT}}"
                    },
                    "ENABLE_EMAIL_CODE_LOGIN": {
                      "isOptional": false,
                      "description": "Disabled until SMTP/email delivery is configured.",
                      "defaultValue": "${{API.ENABLE_EMAIL_CODE_LOGIN}}"
                    },
                    "SQLALCHEMY_MAX_OVERFLOW": {
                      "isOptional": false,
                      "description": "Maximum extra PostgreSQL connections per process.",
                      "defaultValue": "${{API.SQLALCHEMY_MAX_OVERFLOW}}"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "SQLALCHEMY_POOL_PRE_PING": {
                      "isOptional": false,
                      "description": "Inherits SQLALCHEMY_POOL_PRE_PING from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SQLALCHEMY_POOL_PRE_PING}}"
                    },
                    "ENABLE_COLLABORATION_MODE": {
                      "isOptional": false,
                      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
                      "defaultValue": "${{API.ENABLE_COLLABORATION_MODE}}"
                    },
                    "SERVER_WORKER_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Inherits SERVER_WORKER_CONNECTIONS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.SERVER_WORKER_CONNECTIONS}}"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Inherits CONSOLE_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.CONSOLE_CORS_ALLOW_ORIGINS}}"
                    },
                    "PLUGIN_REMOTE_INSTALL_HOST": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_REMOTE_INSTALL_HOST from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_REMOTE_INSTALL_HOST}}"
                    },
                    "PLUGIN_REMOTE_INSTALL_PORT": {
                      "isOptional": false,
                      "description": "Inherits PLUGIN_REMOTE_INSTALL_PORT from API so background processes use the same configuration.",
                      "defaultValue": "${{API.PLUGIN_REMOTE_INSTALL_PORT}}"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Inherits WEB_API_CORS_ALLOW_ORIGINS from API so background processes use the same configuration.",
                      "defaultValue": "${{API.WEB_API_CORS_ALLOW_ORIGINS}}"
                    },
                    "ENABLE_EMAIL_PASSWORD_LOGIN": {
                      "isOptional": false,
                      "description": "Enables normal email/password login without SMTP.",
                      "defaultValue": "${{API.ENABLE_EMAIL_PASSWORD_LOGIN}}"
                    },
                    "NEW_USER_DEFAULT_PLUGIN_IDS": {
                      "isOptional": false,
                      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
                      "defaultValue": "${{API.NEW_USER_DEFAULT_PLUGIN_IDS}}"
                    },
                    "RESPECT_XFORWARD_HEADERS_ENABLED": {
                      "isOptional": false,
                      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
                      "defaultValue": "${{API.RESPECT_XFORWARD_HEADERS_ENABLED}}"
                    }
                  }
                },
                "ee388129-b113-4063-8608-53652f1f6e05": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/1.17.1/web/public/favicon.ico",
                  "name": "API",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.17.1"
                  },
                  "variables": {
                    "TZ": {
                      "isOptional": false,
                      "description": "Tz default for the official Dify API service.",
                      "defaultValue": "UTC"
                    },
                    "LANG": {
                      "isOptional": false,
                      "description": "Lang default for the official Dify API service.",
                      "defaultValue": "C.UTF-8"
                    },
                    "MODE": {
                      "isOptional": false,
                      "description": "Selects the official Dify API image process: api, worker or beat.",
                      "defaultValue": "api"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Container HTTP port. Only the Dify proxy receives a public domain.",
                      "defaultValue": "5001"
                    },
                    "LC_ALL": {
                      "isOptional": false,
                      "description": "Lc all default for the official Dify API service.",
                      "defaultValue": "C.UTF-8"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Private db hostname inside the Railway project.",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Db port default for the official Dify API service.",
                      "defaultValue": "5432"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Db type default for the official Dify API service.",
                      "defaultValue": "postgresql"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Redis db default for the official Dify API service.",
                      "defaultValue": "0"
                    },
                    "DB_EXTRAS": {
                      "isOptional": false,
                      "description": "PostgreSQL connection timeout and TCP keepalives. Fast recovery when PostgreSQL containers or private IPs change; preserves stable application data.",
                      "defaultValue": "connect_timeout=10&keepalives=1&keepalives_idle=10&keepalives_interval=5&keepalives_count=3"
                    },
                    "DIFY_PORT": {
                      "isOptional": false,
                      "description": "Dify port default for the official Dify API service.",
                      "defaultValue": "5001"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "description": "Signed file downloads URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Log level default for the official Dify API service.",
                      "defaultValue": "INFO"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Region of the native Railway Bucket.",
                      "defaultValue": "${{dify-storage.REGION}}"
                    },
                    "DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Deploy env default for the official Dify API service.",
                      "defaultValue": "PRODUCTION"
                    },
                    "QDRANT_URL": {
                      "isOptional": false,
                      "description": "Qdrant url configured for this stack.",
                      "defaultValue": "http://${{Qdrant.RAILWAY_PRIVATE_DOMAIN}}:6333"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Private redis hostname inside the Railway project.",
                      "defaultValue": "${{Redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Redis port default for the official Dify API service.",
                      "defaultValue": "6379"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "description": "Generated application signing/encryption secret shared by API and workers. Keep stable across redeploys and backups.",
                      "defaultValue": "{{SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "Published application API URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "description": "Published application web URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Db database default for the official Dify API service.",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Db password default for the official Dify API service.",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "isOptional": false,
                      "description": "Db ssl mode default for the official Dify API service.",
                      "defaultValue": "disable"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Db username default for the official Dify API service.",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint of the native Railway Bucket.",
                      "defaultValue": "${{dify-storage.ENDPOINT}}"
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "description": "Public trigger callbacks URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "S3 lets API and Worker share durable files without shared filesystem volumes.",
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "description": "Qdrant stores embeddings for Knowledge and RAG retrieval.",
                      "defaultValue": "qdrant"
                    },
                    "INIT_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated first-run setup key. Copy from API variables to unlock the initial setup page. This is not your future account password.",
                      "defaultValue": "{{INIT_PASSWORD}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket access key. Required for uploads and per-workspace credential encryption keys.",
                      "defaultValue": "${{dify-storage.ACCESS_KEY_ID}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Native Railway Bucket secret key. Shared automatically with API and workers.",
                      "defaultValue": "${{dify-storage.SECRET_ACCESS_KEY}}"
                    },
                    "ALLOW_REGISTER": {
                      "isOptional": false,
                      "description": "False prevents unrestricted public account registration after first setup.",
                      "defaultValue": "false"
                    },
                    "QDRANT_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated Qdrant API key.",
                      "defaultValue": "${{Qdrant.QDRANT__SERVICE__API_KEY}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated Redis authentication password shared with API, workers and Plugin.",
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Native Railway Bucket for uploaded files and Dify workspace keys.",
                      "defaultValue": "${{dify-storage.BUCKET}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "description": "Browser dashboard URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "description": "Public service API URL follows the single public Dify domain automatically.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "description": "Virtual-host S3 addressing required by Railway native Buckets.",
                      "defaultValue": "virtual"
                    },
                    "CELERY_AUTO_SCALE": {
                      "isOptional": false,
                      "description": "Celery auto scale default for the official Dify API service.",
                      "defaultValue": "false"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery broker url configured for this stack.",
                      "defaultValue": "redis://:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "isOptional": false,
                      "description": "Dify bind address default for the official Dify API service.",
                      "defaultValue": "0.0.0.0"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "description": "Only API runs database migrations. Workers wait for API-created tables; never enable parallel migrations.",
                      "defaultValue": "true"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "description": "Reference to the generated plugin daemon API key.",
                      "defaultValue": "${{Plugin.SERVER_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "description": "Plugin daemon url configured for this stack.",
                      "defaultValue": "http://${{Plugin.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "DEPLOYMENT_EDITION": {
                      "isOptional": false,
                      "description": "Deployment edition default for the official Dify API service.",
                      "defaultValue": "COMMUNITY"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "description": "Internal files url configured for this stack.",
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "SCARF_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disables Scarf analytics.",
                      "defaultValue": "true"
                    },
                    "CELERY_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Celery worker class default for the official Dify API service.",
                      "defaultValue": "gevent"
                    },
                    "ENABLE_CHANGE_EMAIL": {
                      "isOptional": false,
                      "description": "Enables the supported change-email flow; email verification needs configured mail delivery.",
                      "defaultValue": "true"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Marketplace enabled default for the official Dify API service.",
                      "defaultValue": "true"
                    },
                    "QDRANT_GRPC_ENABLED": {
                      "isOptional": false,
                      "description": "Qdrant grpc enabled default for the official Dify API service.",
                      "defaultValue": "false"
                    },
                    "SERVER_WORKER_CLASS": {
                      "isOptional": false,
                      "description": "Server worker class default for the official Dify API service.",
                      "defaultValue": "gevent"
                    },
                    "SSRF_PROXY_HTTP_URL": {
                      "isOptional": false,
                      "description": "Ssrf proxy http url configured for this stack.",
                      "defaultValue": "http://${{SSRF-Proxy.RAILWAY_PRIVATE_DOMAIN}}:3128"
                    },
                    "CELERY_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "Two background-task concurrency slots by default.",
                      "defaultValue": "2"
                    },
                    "SERVER_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "One API process by default; increase only after measuring available memory.",
                      "defaultValue": "1"
                    },
                    "SQLALCHEMY_POOL_SIZE": {
                      "isOptional": false,
                      "description": "Small per-process PostgreSQL connection pool sized for this stack.",
                      "defaultValue": "5"
                    },
                    "SSRF_PROXY_HTTPS_URL": {
                      "isOptional": false,
                      "description": "Ssrf proxy https url configured for this stack.",
                      "defaultValue": "http://${{SSRF-Proxy.RAILWAY_PRIVATE_DOMAIN}}:3128"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "description": "Endpoint url template default for the official Dify API service.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}/e/{hook_id}"
                    },
                    "PLUGIN_DAEMON_TIMEOUT": {
                      "isOptional": false,
                      "description": "Plugin daemon timeout default for the official Dify API service.",
                      "defaultValue": "600.0"
                    },
                    "ALLOW_CREATE_WORKSPACE": {
                      "isOptional": false,
                      "description": "False prevents unrestricted workspace creation.",
                      "defaultValue": "false"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "description": "Reference to the private Sandbox key used for Python/JavaScript code nodes.",
                      "defaultValue": "${{Sandbox.API_KEY}}"
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "description": "False: authenticate to the Railway Bucket using generated bucket credentials.",
                      "defaultValue": "false"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "description": "Code execution endpoint default for the official Dify API service.",
                      "defaultValue": "http://${{Sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "ENABLE_EMAIL_CODE_LOGIN": {
                      "isOptional": false,
                      "description": "Disabled until SMTP/email delivery is configured.",
                      "defaultValue": "false"
                    },
                    "SQLALCHEMY_MAX_OVERFLOW": {
                      "isOptional": false,
                      "description": "Maximum extra PostgreSQL connections per process.",
                      "defaultValue": "5"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "description": "Generated internal API key that authorizes Plugin callbacks into Dify.",
                      "defaultValue": "{{INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "SQLALCHEMY_POOL_PRE_PING": {
                      "isOptional": false,
                      "description": "Sqlalchemy pool pre ping default for the official Dify API service.",
                      "defaultValue": "true"
                    },
                    "ENABLE_COLLABORATION_MODE": {
                      "isOptional": false,
                      "description": "False: realtime workflow co-editing requires a separate websocket service and is not included.",
                      "defaultValue": "false"
                    },
                    "SERVER_WORKER_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Server worker connections default for the official Dify API service.",
                      "defaultValue": "100"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Console cors allow origins default for the official Dify API service.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PLUGIN_REMOTE_INSTALL_HOST": {
                      "isOptional": false,
                      "description": "Private plugin remote install hostname inside the Railway project.",
                      "defaultValue": "127.0.0.1"
                    },
                    "PLUGIN_REMOTE_INSTALL_PORT": {
                      "isOptional": false,
                      "description": "Plugin remote install port default for the official Dify API service.",
                      "defaultValue": "5003"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "Web api cors allow origins default for the official Dify API service.",
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ENABLE_EMAIL_PASSWORD_LOGIN": {
                      "isOptional": false,
                      "description": "Enables normal email/password login without SMTP.",
                      "defaultValue": "true"
                    },
                    "NEW_USER_DEFAULT_PLUGIN_IDS": {
                      "isOptional": false,
                      "description": "Installs the signed official OpenAI provider after first workspace setup. A provider API key is still required for paid models.",
                      "defaultValue": "langgenius/openai"
                    },
                    "RESPECT_XFORWARD_HEADERS_ENABLED": {
                      "isOptional": false,
                      "description": "Trusts the HTTPS forwarding headers set by the Railway edge and public Nginx proxy.",
                      "defaultValue": "true"
                    }
                  }
                },
                "fe927300-3092-4b00-bd4e-b1234d1e1662": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/docker.svg",
                  "name": "SSRF-Proxy",
                  "deploy": {
                    "startCommand": "sh -c 'printf %s \"$SQUID_CONFIG_B64\" | base64 -d > /etc/squid/squid.conf; exec /usr/sbin/squid -f /etc/squid/squid.conf -NYC'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ubuntu/squid@sha256:6a097f68bae708cedbabd6188d68c7e2e7a38cedd05a176e1cc0ba29e3bbe029"
                  },
                  "variables": {
                    "SQUID_CONFIG_B64": {
                      "description": "Base64-encoded SSRF proxy configuration. Blocks private destination addresses and allows authenticated stack services to access public URLs.",
                      "defaultValue": "aHR0cF9wb3J0IDMxMjgKYWNsIGxvY2FsbmV0IHNyYyAxMC4wLjAuMC84IDEwMC42NC4wLjAvMTAgMTcyLjE2LjAuMC8xMiAxOTIuMTY4LjAuMC8xNiBmYzAwOjovNyBmZTgwOjovMTAKYWNsIGxvY2FsaG9zdCBzcmMgMTI3LjAuMC4xLzMyIDo6MQphY2wgcHJpdmF0ZSBkc3QgMC4wLjAuMC84IDEwLjAuMC4wLzggMTAwLjY0LjAuMC8xMCAxMjcuMC4wLjAvOCAxNjkuMjU0LjAuMC8xNiAxNzIuMTYuMC4wLzEyIDE5Mi4xNjguMC4wLzE2IDIyNC4wLjAuMC80IDI0MC4wLjAuMC80IDo6LzEyOCA6OjEvMTI4IDo6ZmZmZjowOjAvOTYgOjovOTYgZmMwMDo6LzcgZmU4MDo6LzEwCmFjbCBTU0xfcG9ydHMgcG9ydCA0NDMKYWNsIFNhZmVfcG9ydHMgcG9ydCA4MCA0NDMgMTAyNS02NTUzNQphY2wgQ09OTkVDVCBtZXRob2QgQ09OTkVDVApodHRwX2FjY2VzcyBkZW55ICFTYWZlX3BvcnRzCmh0dHBfYWNjZXNzIGRlbnkgQ09OTkVDVCAhU1NMX3BvcnRzCmh0dHBfYWNjZXNzIGRlbnkgcHJpdmF0ZQpodHRwX2FjY2VzcyBhbGxvdyBsb2NhbG5ldApodHRwX2FjY2VzcyBhbGxvdyBsb2NhbGhvc3QKaHR0cF9hY2Nlc3MgZGVueSBhbGwKY2FjaGUgZGVueSBhbGwKY2FjaGVfbWVtIDE2IE1CCmFjY2Vzc19sb2cgc3RkaW86L2Rldi9zdGRvdXQKY2FjaGVfbG9nIC9kZXYvc3RkZXJyCnBpZF9maWxlbmFtZSAvdG1wL3NxdWlkLnBpZApjb3JlZHVtcF9kaXIgL3RtcApzaHV0ZG93bl9saWZldGltZSAzIHNlY29uZHMK"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Dify",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 11,
    "needs_volume": true
  },
  "generated_at": "2026-10-14T22:14:45.225Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-10-14T20:29:55.293Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_5ea12fc371464381ab89",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": false,
        "detail": "Your workspace has been restricted. Please contact support to resolve this."
      }
    ]
  }
}
