{
  "manifest_version": "1.0.0",
  "template": {
    "id": "0748d7a5-cb4a-4c19-b082-ec3d251c2ec4",
    "slug": "appflowy-cloud",
    "name": "AppFlowy Cloud",
    "description": "Collaborative workspace backend with private data and public file URLs.",
    "url": "https://railway.com/deploy/appflowy-cloud",
    "upstream": {
      "repo_url": "https://github.com/orenaksakal/railway-templates"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "web",
      "source": {
        "image": "appflowyinc/appflowy_web:0.17.1@sha256:dedc8ded52c89500bbc7db48fa80e04687b97e1e2623d687ecaa47b3dae895b4"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "storage",
      "source": {
        "repo": "https://github.com/orenaksakal/railway-templates"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": true
    },
    {
      "name": "worker",
      "source": {
        "image": "appflowyinc/appflowy_worker:0.18.3@sha256:68749ee2cac1e08173b1430376e09b99b30be74fb8dc5e7a576a90437702dc58"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "repo": "https://github.com/orenaksakal/railway-templates"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:7.4@sha256:71da9275c5f3fcb97d0fa0c8c5b36cc995327265420f17a04bfd544f458059f7"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "admin",
      "source": {
        "image": "appflowyinc/admin_frontend:latest@sha256:600f3b98197e41a34e504aaaa4db361cc864682f94b31090daeff5223e4c59e8"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "cloud",
      "source": {
        "image": "appflowyinc/appflowy_cloud:0.18.3@sha256:de5e3e1eaaa7482c85cfce6adeb9e8e2a7f41b65c1e7301d5ce06d33b6c80b1e"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "gotrue",
      "source": {
        "image": "appflowyinc/gotrue:latest@sha256:647abb4fc8925fc5fee8e2f4dc307559a55751a7b72f3257592959c93c952f5a"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "appflowy",
      "source": {
        "repo": "https://github.com/orenaksakal/railway-templates"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "web",
      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
      "secret": false,
      "strategy": "default",
      "default": "80"
    },
    {
      "key": "APPFLOWY_BASE_URL",
      "service": "web",
      "description": "Appflowy base url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APPFLOWY_WS_BASE_URL",
      "service": "web",
      "description": "Appflowy ws base url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APPFLOWY_GOTRUE_BASE_URL",
      "service": "web",
      "description": "Appflowy gotrue base url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PORT",
      "service": "storage",
      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
      "secret": false,
      "strategy": "default",
      "default": "9000"
    },
    {
      "key": "S3_BUCKET",
      "service": "storage",
      "description": "Private bucket created on first startup; changing this does not move existing objects.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "storage",
      "description": "Generated minio root user. Keep private and preserve with backups.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "storage",
      "description": "Generated minio root password. Keep private and preserve with backups.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DOCKERFILE_PATH",
      "service": "storage",
      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
      "secret": false,
      "strategy": "default",
      "default": "shared/draft-storage/Dockerfile"
    },
    {
      "key": "RUST_LOG",
      "service": "worker",
      "description": "Rust log for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "info"
    },
    {
      "key": "APPFLOWY_S3_BUCKET",
      "service": "worker",
      "description": "Appflowy s3 bucket for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "APPFLOWY_S3_REGION",
      "service": "worker",
      "description": "Appflowy s3 region for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "APPFLOWY_ENVIRONMENT",
      "service": "worker",
      "description": "Appflowy environment for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "APPFLOWY_S3_MINIO_URL",
      "service": "worker",
      "description": "Appflowy s3 minio url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "APPFLOWY_S3_USE_MINIO",
      "service": "worker",
      "description": "Appflowy s3 use minio for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APPFLOWY_S3_ACCESS_KEY",
      "service": "worker",
      "description": "Appflowy s3 access key resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_S3_SECRET_KEY",
      "service": "worker",
      "description": "Appflowy s3 secret key resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_S3_CREATE_BUCKET",
      "service": "worker",
      "description": "Appflowy s3 create bucket for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APPFLOWY_WORKER_REDIS_URL",
      "service": "worker",
      "description": "Appflowy worker redis url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_WORKER_ENVIRONMENT",
      "service": "worker",
      "description": "Appflowy worker environment for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "APPFLOWY_WORKER_DATABASE_URL",
      "service": "worker",
      "description": "Appflowy worker database url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_WORKER_DATABASE_NAME",
      "service": "worker",
      "description": "Appflowy worker database name for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "APPFLOWY_WORKER_IMPORT_TICK_INTERVAL",
      "service": "worker",
      "description": "Appflowy worker import tick interval for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "30"
    },
    {
      "key": "APP_DB",
      "service": "postgres",
      "description": "Application database created during first initialization of an empty PostgreSQL volume.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "PostgreSQL data directory within the persistent volume. Do not change on an existing database.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "APP_USER",
      "service": "postgres",
      "description": "Dedicated application database role created during first initialization.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Initial PostgreSQL database name, or the matching database selected by the application.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "APP_PASSWORD",
      "service": "postgres",
      "description": "Generated password for the application database role. Preserve it with your backups.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_URL",
      "service": "postgres",
      "description": "Private PostgreSQL connection URL assembled from generated credentials and service references. No manual value is needed.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENABLE_VECTOR",
      "service": "postgres",
      "description": "Initialize the pgvector extension for applications that require vector storage. Keep the supplied value.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "PostgreSQL initialization user, or the matching connection user for the private database.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "PostgreSQL password. Generated for the database and referenced by dependent services; keep private.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DOCKERFILE_PATH",
      "service": "postgres",
      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
      "secret": false,
      "strategy": "default",
      "default": "templates/appflowy/Postgres.Dockerfile"
    },
    {
      "key": "ALLOW_APP_DATABASE_CREATION",
      "service": "postgres",
      "description": "Grant database and role creation privileges required by ToolJet. Keep false for other applications.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_URL",
      "service": "redis",
      "description": "Private authenticated Redis/Valkey connection URL. Automatically assembled from service references.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Generated private Redis/Valkey password, or a reference to that password. Keep secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "ADMIN_FRONTEND_REDIS_URL",
      "service": "admin",
      "description": "Admin frontend redis url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ADMIN_FRONTEND_GOTRUE_URL",
      "service": "admin",
      "description": "Admin frontend gotrue url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ADMIN_FRONTEND_PATH_PREFIX",
      "service": "admin",
      "description": "Admin frontend path prefix for admin. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "/console"
    },
    {
      "key": "ADMIN_FRONTEND_APPFLOWY_CLOUD_URL",
      "service": "admin",
      "description": "Admin frontend appflowy cloud url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RUST_LOG",
      "service": "cloud",
      "description": "Rust log for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "info"
    },
    {
      "key": "APPFLOWY_WEB_URL",
      "service": "cloud",
      "description": "Appflowy web url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APPFLOWY_BASE_URL",
      "service": "cloud",
      "description": "Appflowy base url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APPFLOWY_REDIS_URI",
      "service": "cloud",
      "description": "Appflowy redis uri resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_S3_BUCKET",
      "service": "cloud",
      "description": "Appflowy s3 bucket for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy"
    },
    {
      "key": "APPFLOWY_S3_REGION",
      "service": "cloud",
      "description": "Appflowy s3 region for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "APPFLOWY_ENVIRONMENT",
      "service": "cloud",
      "description": "Appflowy environment for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "APPFLOWY_DATABASE_URL",
      "service": "cloud",
      "description": "Appflowy database url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_S3_MINIO_URL",
      "service": "cloud",
      "description": "Appflowy s3 minio url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "APPFLOWY_S3_USE_MINIO",
      "service": "cloud",
      "description": "Appflowy s3 use minio for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APPFLOWY_S3_ACCESS_KEY",
      "service": "cloud",
      "description": "Appflowy s3 access key resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_S3_SECRET_KEY",
      "service": "cloud",
      "description": "Appflowy s3 secret key resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_ACCESS_CONTROL",
      "service": "cloud",
      "description": "Appflowy access control for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APPFLOWY_GOTRUE_JWT_EXP",
      "service": "cloud",
      "description": "Appflowy gotrue jwt exp for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "7200"
    },
    {
      "key": "APPFLOWY_GOTRUE_BASE_URL",
      "service": "cloud",
      "description": "Appflowy gotrue base url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "APPFLOWY_INDEXER_ENABLED",
      "service": "cloud",
      "description": "Optional AI indexer is not included in this draft.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "APPFLOWY_S3_CREATE_BUCKET",
      "service": "cloud",
      "description": "Appflowy s3 create bucket for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APPFLOWY_GOTRUE_JWT_SECRET",
      "service": "cloud",
      "description": "Appflowy gotrue jwt secret resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APPFLOWY_DATABASE_MAX_CONNECTIONS",
      "service": "cloud",
      "description": "Appflowy database max connections for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "20"
    },
    {
      "key": "APPFLOWY_S3_PRESIGNED_URL_ENDPOINT",
      "service": "cloud",
      "description": "Appflowy s3 presigned url endpoint resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PORT",
      "service": "gotrue",
      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
      "secret": false,
      "strategy": "default",
      "default": "9999"
    },
    {
      "key": "DATABASE_URL",
      "service": "gotrue",
      "description": "Private PostgreSQL connection URL assembled from generated credentials and service references. No manual value is needed.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GOTRUE_JWT_EXP",
      "service": "gotrue",
      "description": "Gotrue jwt exp for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "7200"
    },
    {
      "key": "GOTRUE_SITE_URL",
      "service": "gotrue",
      "description": "Gotrue site url for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "appflowy-flutter://"
    },
    {
      "key": "API_EXTERNAL_URL",
      "service": "gotrue",
      "description": "Api external url resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GOTRUE_DB_DRIVER",
      "service": "gotrue",
      "description": "Gotrue db driver for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "GOTRUE_JWT_SECRET",
      "service": "gotrue",
      "description": "Generated gotrue jwt secret. Keep private and preserve with backups.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GOTRUE_ADMIN_EMAIL",
      "service": "gotrue",
      "description": "Required service-administrator email. This is not the end-user AppFlowy account; sign up separately in the app.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "GOTRUE_ADMIN_PASSWORD",
      "service": "gotrue",
      "description": "Generated gotrue admin password. Keep private and preserve with backups.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "GOTRUE_DISABLE_SIGNUP",
      "service": "gotrue",
      "description": "Gotrue disable signup for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "GOTRUE_URI_ALLOW_LIST",
      "service": "gotrue",
      "description": "Gotrue uri allow list resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GOTRUE_MAILER_AUTOCONFIRM",
      "service": "gotrue",
      "description": "No SMTP is configured. Email confirmation is bypassed until you configure delivery.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "GOTRUE_JWT_ADMIN_GROUP_NAME",
      "service": "gotrue",
      "description": "Gotrue jwt admin group name for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "supabase_admin"
    },
    {
      "key": "GOTRUE_MAILER_URLPATHS_RECOVERY",
      "service": "gotrue",
      "description": "Gotrue mailer urlpaths recovery for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "/gotrue/verify"
    },
    {
      "key": "GOTRUE_MAILER_URLPATHS_CONFIRMATION",
      "service": "gotrue",
      "description": "Gotrue mailer urlpaths confirmation for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
      "secret": false,
      "strategy": "default",
      "default": "/gotrue/verify"
    },
    {
      "key": "PORT",
      "service": "appflowy",
      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "API_HOST",
      "service": "appflowy",
      "description": "Api host resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEB_HOST",
      "service": "appflowy",
      "description": "Web host resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_HOST",
      "service": "appflowy",
      "description": "Auth host resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ADMIN_HOST",
      "service": "appflowy",
      "description": "Admin host resolved automatically from the linked service. Keep this reference when using the included topology.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RAILWAY_DOCKERFILE_PATH",
      "service": "appflowy",
      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
      "secret": false,
      "strategy": "default",
      "default": "templates/appflowy/Gateway.Dockerfile"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "appflowy-cloud"
      }
    },
    "cli": "railway deploy --template appflowy-cloud",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "0748d7a5-cb4a-4c19-b082-ec3d251c2ec4",
            "serializedConfig": {
              "services": {
                "07569f86-040f-5d5a-b177-228806da7bf3": {
                  "name": "web",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "appflowyinc/appflowy_web:0.17.1@sha256:dedc8ded52c89500bbc7db48fa80e04687b97e1e2623d687ecaa47b3dae895b4"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
                      "defaultValue": "80"
                    },
                    "APPFLOWY_BASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy base url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APPFLOWY_WS_BASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy ws base url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "wss://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}/ws/v2"
                    },
                    "APPFLOWY_GOTRUE_BASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy gotrue base url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}/gotrue"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "2897e023-991d-5cfb-8823-91228c6e0c2a": {
                  "name": "storage",
                  "build": {
                    "builder": "RAILPACK",
                    "dockerfilePath": "shared/draft-storage/Dockerfile"
                  },
                  "deploy": {
                    "healthcheckPath": "/minio/health/live",
                    "requiredMountPath": "/data",
                    "restartPolicyType": "ON_FAILURE",
                    "healthcheckTimeout": 600,
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "orenaksakal/railway-templates",
                    "branch": "codex/remaining-template-drafts"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
                      "defaultValue": "9000"
                    },
                    "S3_BUCKET": {
                      "isOptional": false,
                      "description": "Private bucket created on first startup; changing this does not move existing objects.",
                      "defaultValue": "appflowy"
                    },
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "description": "Generated minio root user. Keep private and preserve with backups.",
                      "defaultValue": "{{MINIO_ROOT_USER}}"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated minio root password. Keep private and preserve with backups.",
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    },
                    "RAILWAY_DOCKERFILE_PATH": {
                      "isOptional": false,
                      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
                      "defaultValue": "shared/draft-storage/Dockerfile"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:9000": {
                        "port": 9000
                      }
                    }
                  },
                  "volumeMounts": {
                    "d2311c1b-a75d-5436-8bbb-3a030b29a229": {
                      "mountPath": "/data"
                    }
                  }
                },
                "29858153-5dc0-5a8f-b9be-efdc6ce765a0": {
                  "name": "worker",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "appflowyinc/appflowy_worker:0.18.3@sha256:68749ee2cac1e08173b1430376e09b99b30be74fb8dc5e7a576a90437702dc58"
                  },
                  "variables": {
                    "RUST_LOG": {
                      "isOptional": false,
                      "description": "Rust log for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "info"
                    },
                    "APPFLOWY_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Appflowy s3 bucket for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "appflowy"
                    },
                    "APPFLOWY_S3_REGION": {
                      "isOptional": false,
                      "description": "Appflowy s3 region for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "us-east-1"
                    },
                    "APPFLOWY_ENVIRONMENT": {
                      "isOptional": false,
                      "description": "Appflowy environment for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "production"
                    },
                    "APPFLOWY_S3_MINIO_URL": {
                      "isOptional": false,
                      "description": "Appflowy s3 minio url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "http://${{storage.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "APPFLOWY_S3_USE_MINIO": {
                      "isOptional": false,
                      "description": "Appflowy s3 use minio for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "true"
                    },
                    "APPFLOWY_S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Appflowy s3 access key resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{storage.MINIO_ROOT_USER}}"
                    },
                    "APPFLOWY_S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Appflowy s3 secret key resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{storage.MINIO_ROOT_PASSWORD}}"
                    },
                    "APPFLOWY_S3_CREATE_BUCKET": {
                      "isOptional": false,
                      "description": "Appflowy s3 create bucket for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "true"
                    },
                    "APPFLOWY_WORKER_REDIS_URL": {
                      "isOptional": false,
                      "description": "Appflowy worker redis url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{redis.REDIS_URL}}"
                    },
                    "APPFLOWY_WORKER_ENVIRONMENT": {
                      "isOptional": false,
                      "description": "Appflowy worker environment for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "production"
                    },
                    "APPFLOWY_WORKER_DATABASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy worker database url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{postgres.DATABASE_URL}}"
                    },
                    "APPFLOWY_WORKER_DATABASE_NAME": {
                      "isOptional": false,
                      "description": "Appflowy worker database name for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "appflowy"
                    },
                    "APPFLOWY_WORKER_IMPORT_TICK_INTERVAL": {
                      "isOptional": false,
                      "description": "Appflowy worker import tick interval for worker. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "30"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "52701593-03c9-5caf-beab-f21665e71856": {
                  "name": "postgres",
                  "build": {
                    "builder": "RAILPACK",
                    "dockerfilePath": "templates/appflowy/Postgres.Dockerfile"
                  },
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "orenaksakal/railway-templates",
                    "branch": "codex/remaining-template-drafts"
                  },
                  "variables": {
                    "APP_DB": {
                      "isOptional": false,
                      "description": "Application database created during first initialization of an empty PostgreSQL volume.",
                      "defaultValue": "appflowy"
                    },
                    "PGDATA": {
                      "isOptional": false,
                      "description": "PostgreSQL data directory within the persistent volume. Do not change on an existing database.",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "APP_USER": {
                      "isOptional": false,
                      "description": "Dedicated application database role created during first initialization.",
                      "defaultValue": "appflowy"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Initial PostgreSQL database name, or the matching database selected by the application.",
                      "defaultValue": "postgres"
                    },
                    "APP_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated password for the application database role. Preserve it with your backups.",
                      "defaultValue": "{{APP_PASSWORD}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Private PostgreSQL connection URL assembled from generated credentials and service references. No manual value is needed.",
                      "defaultValue": "postgresql://appflowy:${{postgres.APP_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/appflowy"
                    },
                    "ENABLE_VECTOR": {
                      "isOptional": false,
                      "description": "Initialize the pgvector extension for applications that require vector storage. Keep the supplied value.",
                      "defaultValue": "true"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "PostgreSQL initialization user, or the matching connection user for the private database.",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "PostgreSQL password. Generated for the database and referenced by dependent services; keep private.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "RAILWAY_DOCKERFILE_PATH": {
                      "isOptional": false,
                      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
                      "defaultValue": "templates/appflowy/Postgres.Dockerfile"
                    },
                    "ALLOW_APP_DATABASE_CREATION": {
                      "isOptional": false,
                      "description": "Grant database and role creation privileges required by ToolJet. Keep false for other applications.",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "fce22db3-b075-5a94-ba1f-d1525bbeaff1": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "5628ae19-00fb-5300-97e3-ae587db338cc": {
                  "name": "redis",
                  "deploy": {
                    "startCommand": "sh -c 'exec redis-server --bind 0.0.0.0 :: --appendonly yes --maxmemory-policy noeviction --requirepass \"$REDIS_PASSWORD\"'",
                    "requiredMountPath": "/data",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:7.4@sha256:71da9275c5f3fcb97d0fa0c8c5b36cc995327265420f17a04bfd544f458059f7"
                  },
                  "variables": {
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Private authenticated Redis/Valkey connection URL. Automatically assembled from service references.",
                      "defaultValue": "redis://:${{redis.REDIS_PASSWORD}}@${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated private Redis/Valkey password, or a reference to that password. Keep secret.",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "623ea7a2-1826-5278-87cc-fb0123bbac1d": {
                      "mountPath": "/data"
                    }
                  }
                },
                "9da8f2f0-5d77-5b04-a5e1-61c7821de78f": {
                  "name": "admin",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "appflowyinc/admin_frontend:latest@sha256:600f3b98197e41a34e504aaaa4db361cc864682f94b31090daeff5223e4c59e8"
                  },
                  "variables": {
                    "ADMIN_FRONTEND_REDIS_URL": {
                      "isOptional": false,
                      "description": "Admin frontend redis url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{redis.REDIS_URL}}"
                    },
                    "ADMIN_FRONTEND_GOTRUE_URL": {
                      "isOptional": false,
                      "description": "Admin frontend gotrue url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "http://${{gotrue.RAILWAY_PRIVATE_DOMAIN}}:9999"
                    },
                    "ADMIN_FRONTEND_PATH_PREFIX": {
                      "isOptional": false,
                      "description": "Admin frontend path prefix for admin. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "/console"
                    },
                    "ADMIN_FRONTEND_APPFLOWY_CLOUD_URL": {
                      "isOptional": false,
                      "description": "Admin frontend appflowy cloud url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "http://${{cloud.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "add93d4e-a548-5eec-98e0-ca0569f72871": {
                  "name": "cloud",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "appflowyinc/appflowy_cloud:0.18.3@sha256:de5e3e1eaaa7482c85cfce6adeb9e8e2a7f41b65c1e7301d5ce06d33b6c80b1e"
                  },
                  "variables": {
                    "RUST_LOG": {
                      "isOptional": false,
                      "description": "Rust log for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "info"
                    },
                    "APPFLOWY_WEB_URL": {
                      "isOptional": false,
                      "description": "Appflowy web url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APPFLOWY_BASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy base url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APPFLOWY_REDIS_URI": {
                      "isOptional": false,
                      "description": "Appflowy redis uri resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{redis.REDIS_URL}}"
                    },
                    "APPFLOWY_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Appflowy s3 bucket for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "appflowy"
                    },
                    "APPFLOWY_S3_REGION": {
                      "isOptional": false,
                      "description": "Appflowy s3 region for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "us-east-1"
                    },
                    "APPFLOWY_ENVIRONMENT": {
                      "isOptional": false,
                      "description": "Appflowy environment for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "production"
                    },
                    "APPFLOWY_DATABASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy database url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{postgres.DATABASE_URL}}"
                    },
                    "APPFLOWY_S3_MINIO_URL": {
                      "isOptional": false,
                      "description": "Appflowy s3 minio url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "http://${{storage.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "APPFLOWY_S3_USE_MINIO": {
                      "isOptional": false,
                      "description": "Appflowy s3 use minio for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "true"
                    },
                    "APPFLOWY_S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Appflowy s3 access key resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{storage.MINIO_ROOT_USER}}"
                    },
                    "APPFLOWY_S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Appflowy s3 secret key resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{storage.MINIO_ROOT_PASSWORD}}"
                    },
                    "APPFLOWY_ACCESS_CONTROL": {
                      "isOptional": false,
                      "description": "Appflowy access control for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "true"
                    },
                    "APPFLOWY_GOTRUE_JWT_EXP": {
                      "isOptional": false,
                      "description": "Appflowy gotrue jwt exp for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "7200"
                    },
                    "APPFLOWY_GOTRUE_BASE_URL": {
                      "isOptional": false,
                      "description": "Appflowy gotrue base url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "http://${{gotrue.RAILWAY_PRIVATE_DOMAIN}}:9999"
                    },
                    "APPFLOWY_INDEXER_ENABLED": {
                      "isOptional": false,
                      "description": "Optional AI indexer is not included in this draft.",
                      "defaultValue": "false"
                    },
                    "APPFLOWY_S3_CREATE_BUCKET": {
                      "isOptional": false,
                      "description": "Appflowy s3 create bucket for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "true"
                    },
                    "APPFLOWY_GOTRUE_JWT_SECRET": {
                      "isOptional": false,
                      "description": "Appflowy gotrue jwt secret resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{gotrue.GOTRUE_JWT_SECRET}}"
                    },
                    "APPFLOWY_DATABASE_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Appflowy database max connections for cloud. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "20"
                    },
                    "APPFLOWY_S3_PRESIGNED_URL_ENDPOINT": {
                      "isOptional": false,
                      "description": "Appflowy s3 presigned url endpoint resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{storage.RAILWAY_PUBLIC_DOMAIN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "b09559e7-01cc-5de9-85ba-363639711775": {
                  "name": "gotrue",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "appflowyinc/gotrue:latest@sha256:647abb4fc8925fc5fee8e2f4dc307559a55751a7b72f3257592959c93c952f5a"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
                      "defaultValue": "9999"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Private PostgreSQL connection URL assembled from generated credentials and service references. No manual value is needed.",
                      "defaultValue": "${{postgres.DATABASE_URL}}?search_path=auth"
                    },
                    "GOTRUE_JWT_EXP": {
                      "isOptional": false,
                      "description": "Gotrue jwt exp for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "7200"
                    },
                    "GOTRUE_SITE_URL": {
                      "isOptional": false,
                      "description": "Gotrue site url for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "appflowy-flutter://"
                    },
                    "API_EXTERNAL_URL": {
                      "isOptional": false,
                      "description": "Api external url resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}/gotrue"
                    },
                    "GOTRUE_DB_DRIVER": {
                      "isOptional": false,
                      "description": "Gotrue db driver for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "postgres"
                    },
                    "GOTRUE_JWT_SECRET": {
                      "isOptional": false,
                      "description": "Generated gotrue jwt secret. Keep private and preserve with backups.",
                      "defaultValue": "{{GOTRUE_JWT_SECRET}}"
                    },
                    "GOTRUE_ADMIN_EMAIL": {
                      "isOptional": false,
                      "description": "Required service-administrator email. This is not the end-user AppFlowy account; sign up separately in the app.",
                      "defaultValue": "{{GOTRUE_ADMIN_EMAIL}}"
                    },
                    "GOTRUE_ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated gotrue admin password. Keep private and preserve with backups.",
                      "defaultValue": "{{GOTRUE_ADMIN_PASSWORD}}"
                    },
                    "GOTRUE_DISABLE_SIGNUP": {
                      "isOptional": false,
                      "description": "Gotrue disable signup for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "false"
                    },
                    "GOTRUE_URI_ALLOW_LIST": {
                      "isOptional": false,
                      "description": "Gotrue uri allow list resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "https://${{appflowy.RAILWAY_PUBLIC_DOMAIN}}/**,appflowy-flutter://**"
                    },
                    "GOTRUE_MAILER_AUTOCONFIRM": {
                      "isOptional": false,
                      "description": "No SMTP is configured. Email confirmation is bypassed until you configure delivery.",
                      "defaultValue": "true"
                    },
                    "GOTRUE_JWT_ADMIN_GROUP_NAME": {
                      "isOptional": false,
                      "description": "Gotrue jwt admin group name for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "supabase_admin"
                    },
                    "GOTRUE_MAILER_URLPATHS_RECOVERY": {
                      "isOptional": false,
                      "description": "Gotrue mailer urlpaths recovery for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "/gotrue/verify"
                    },
                    "GOTRUE_MAILER_URLPATHS_CONFIRMATION": {
                      "isOptional": false,
                      "description": "Gotrue mailer urlpaths confirmation for gotrue. The supplied value follows the pinned upstream deployment; change only with its configuration guide.",
                      "defaultValue": "/gotrue/verify"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "b4b440ec-d3b6-5d80-ae78-6704e367fb99": {
                  "name": "appflowy",
                  "build": {
                    "builder": "RAILPACK",
                    "dockerfilePath": "templates/appflowy/Gateway.Dockerfile"
                  },
                  "deploy": {
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "healthcheckTimeout": 600,
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "orenaksakal/railway-templates",
                    "branch": "codex/remaining-template-drafts"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP port inside this service. Keep the default to match its Railway public port and health check.",
                      "defaultValue": "8080"
                    },
                    "API_HOST": {
                      "isOptional": false,
                      "description": "Api host resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{cloud.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "WEB_HOST": {
                      "isOptional": false,
                      "description": "Web host resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{web.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "AUTH_HOST": {
                      "isOptional": false,
                      "description": "Auth host resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{gotrue.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "ADMIN_HOST": {
                      "isOptional": false,
                      "description": "Admin host resolved automatically from the linked service. Keep this reference when using the included topology.",
                      "defaultValue": "${{admin.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "RAILWAY_DOCKERFILE_PATH": {
                      "isOptional": false,
                      "description": "Repository-relative Dockerfile used to build this service. Keep the supplied path.",
                      "defaultValue": "templates/appflowy/Gateway.Dockerfile"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "storage",
      "method": "GET",
      "path": "/minio/health/live",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 9,
    "needs_volume": true
  },
  "generated_at": "2026-09-08T05:54:19.399Z",
  "generator_version": "0.1.0"
}
