{
  "manifest_version": "1.0.0",
  "template": {
    "id": "2dafbeb4-6f24-4454-b7df-654aee328caa",
    "slug": "postiz-w-admin-login",
    "name": "Postiz (w/ admin login)",
    "description": "Postiz 2.25 social scheduler, patched, with admin login and closed sign-up.",
    "url": "https://railway.com/deploy/postiz-w-admin-login",
    "upstream": {
      "image": "ghcr.io/gitroomhq/postiz-app:v2.25.3"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "Temporal",
      "source": {
        "image": "temporalio/server:1.32.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ssl:18"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Postiz",
      "source": {
        "image": "ghcr.io/gitroomhq/postiz-app:v2.25.3"
      },
      "needs_volume": true,
      "volume_mount_path": "/uploads",
      "http": true
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.2"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Temporal Setup",
      "source": {
        "image": "temporalio/admin-tools:1.32.1"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "DB",
      "service": "Temporal",
      "description": "Temporal keeps its state in the project's Postgres (databases temporal and temporal_visibility). No Elasticsearch.",
      "secret": false,
      "strategy": "default",
      "default": "postgres12"
    },
    {
      "key": "PORT",
      "service": "Temporal",
      "description": "Temporal's HTTP API port, used for the health check.",
      "secret": false,
      "strategy": "default",
      "default": "7243"
    },
    {
      "key": "DB_PORT",
      "service": "Temporal",
      "description": "Postgres port.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "LOG_LEVEL",
      "service": "Temporal",
      "description": "warn keeps the log to problems; set info to see everything.",
      "secret": false,
      "strategy": "default",
      "default": "warn"
    },
    {
      "key": "BIND_ON_IP",
      "service": "Temporal",
      "description": "Listen on every address of the private network (IPv4 and IPv6).",
      "secret": false,
      "strategy": "default",
      "default": "::"
    },
    {
      "key": "POSTGRES_PWD",
      "service": "Temporal",
      "description": "Postgres password.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Temporal",
      "description": "Postgres user.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQL_MAX_CONNS",
      "service": "Temporal",
      "description": "Database connections per pool, kept small to save Postgres memory.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "POSTGRES_SEEDS",
      "service": "Temporal",
      "description": "Postgres host (private network).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SQL_VIS_MAX_CONNS",
      "service": "Temporal",
      "description": "Database connections for workflow search.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "NUM_HISTORY_SHARDS",
      "service": "Temporal",
      "description": "Fixed when the database is first created; 4 suits a single Postiz.",
      "secret": false,
      "strategy": "default",
      "default": "4"
    },
    {
      "key": "SQL_MAX_IDLE_CONNS",
      "service": "Temporal",
      "description": "Idle database connections kept open per pool.",
      "secret": false,
      "strategy": "default",
      "default": "4"
    },
    {
      "key": "SQL_VIS_MAX_IDLE_CONNS",
      "service": "Temporal",
      "description": "Idle connections for workflow search.",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "TEMPORAL_ALLOW_NO_AUTH",
      "service": "Temporal",
      "description": "Temporal is reachable only on the private network, so it runs without an authorizer.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "TEMPORAL_BROADCAST_ADDRESS",
      "service": "Temporal",
      "description": "Single-node cluster: members find each other on loopback.",
      "secret": false,
      "strategy": "default",
      "default": "127.0.0.1"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres",
      "description": "Provide a value for SSL_CERT_DAYS.",
      "secret": false,
      "strategy": "default",
      "default": "820"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres",
      "description": "Provide a value for RAILWAY_DEPLOYMENT_DRAINING_SECONDS.",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PORT",
      "service": "Postiz",
      "description": "Port of Postiz's built-in web server (nginx), which serves the app, the API and uploads.",
      "secret": false,
      "strategy": "default",
      "default": "5000"
    },
    {
      "key": "MAIN_URL",
      "service": "Postiz",
      "description": "Public URL of Postiz. For a custom domain, set MAIN_URL and FRONTEND_URL to it and NEXT_PUBLIC_BACKEND_URL to it plus /api.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "RUN_CRON",
      "service": "Postiz",
      "description": "Runs Postiz's background check for posts that missed their time.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "REDIS_URL",
      "service": "Postiz",
      "description": "Private Redis (cache and sign-in state for channel connections). family=0 lets it connect over IPv4 or IPv6.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "IS_GENERAL",
      "service": "Postiz",
      "description": "Postiz's standard self-hosted mode.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "JWT_SECRET",
      "service": "Postiz",
      "description": "Signs sign-in sessions and encrypts stored channel credentials. Generated per deploy; changing it signs everyone out and breaks connected channels.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ADMIN_EMAIL",
      "service": "Postiz",
      "description": "Your email address. It becomes your Postiz login (the first and only account; sign-up stays closed).",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "COMPANY_NAME",
      "service": "Postiz",
      "description": "Name of your Postiz workspace (Postiz calls it your company).",
      "secret": false,
      "strategy": "default",
      "default": "My Company"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postiz",
      "description": "Private Postgres holding posts, channels and accounts.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FRONTEND_URL",
      "service": "Postiz",
      "description": "Public URL of Postiz; redirect URIs for social networks are FRONTEND_URL/integrations/social/<network>.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ADMIN_PASSWORD",
      "service": "Postiz",
      "description": "Choose your Postiz password: up to 64 characters (a Postiz limit). Use a long one; anyone can reach the sign-in page.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "STORAGE_PROVIDER",
      "service": "Postiz",
      "description": "local: uploads are kept on the volume at /uploads and served from your Postiz URL, so social networks can fetch them.",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "TEMPORAL_ADDRESS",
      "service": "Postiz",
      "description": "Private Temporal server that schedules and publishes posts. Postiz starts only when it is ready.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "UPLOAD_DIRECTORY",
      "service": "Postiz",
      "description": "Where uploads are stored (the volume).",
      "secret": false,
      "strategy": "default",
      "default": "/uploads"
    },
    {
      "key": "BACKEND_INTERNAL_URL",
      "service": "Postiz",
      "description": "The API inside the container.",
      "secret": false,
      "strategy": "default",
      "default": "http://localhost:3000"
    },
    {
      "key": "DISABLE_REGISTRATION",
      "service": "Postiz",
      "description": "true: only the first account (from ADMIN_EMAIL) can be created. Set to false only if anyone with the URL may sign up.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "NEXT_PUBLIC_BACKEND_URL",
      "service": "Postiz",
      "description": "Public URL of the Postiz API (the same domain, path /api).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_UPLOAD_DIRECTORY",
      "service": "Postiz",
      "description": "URL path that serves uploads.",
      "secret": false,
      "strategy": "default",
      "default": "/uploads"
    },
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Provide a value for REDISHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Provide a value for REDISPORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Provide a value for REDISUSER.",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Provide a value for REDISPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DB_PORT",
      "service": "Temporal Setup",
      "description": "Postgres port.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "POSTGRES_PWD",
      "service": "Temporal Setup",
      "description": "Postgres password.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Temporal Setup",
      "description": "Postgres user.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_SEEDS",
      "service": "Temporal Setup",
      "description": "Postgres host (private network).",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "postiz-w-admin-login"
      }
    },
    "cli": "railway deploy --template postiz-w-admin-login",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "2dafbeb4-6f24-4454-b7df-654aee328caa",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "175fbb50-b2fd-48f1-b25b-8a029236085b": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@075731e770cb61fcdba1009a3a70510b58fd5cd8/service-icons/temporal.svg",
                  "name": "Temporal",
                  "deploy": {
                    "startCommand": "sh -c \"echo IyEvYmluL3NoCiMgU3RhcnQgY29tbWFuZCBvZiB0aGUgVGVtcG9yYWwgc2VydmljZSAob2ZmaWNpYWwgdGVtcG9yYWxpby9zZXJ2ZXIgaW1hZ2UsIHdoaWNoIGhhcyBubyBzY2hlbWEgdG9vbCkuCiMgVGVtcG9yYWwgU2V0dXAgY3JlYXRlcyBhbmQgbWlncmF0ZXMgdGhlIGRhdGFiYXNlIHNjaGVtYTsgdW50aWwgaXQgaGFzLCB0ZW1wb3JhbC1zZXJ2ZXIgZXhpdHMgYXQgb25jZQojIHdpdGggYSBzY2hlbWEgZXJyb3IsIHNvIHdlIHJldHJ5IGhlcmUgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBjb250YWluZXIgY3Jhc2gtbG9vcC4gT25jZSB0aGUgc2VydmVyCiMgYW5zd2VycywgdGhlICJkZWZhdWx0IiBuYW1lc3BhY2UgaXMgY3JlYXRlZCB0aHJvdWdoIFRlbXBvcmFsJ3Mgb3duIEhUVFAgQVBJIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiMgTm90aGluZyBoZXJlIHJlZmVyZW5jZXMgYW5vdGhlciBzZXJ2aWNlLCBzbyBhIHRlbXBsYXRlIGRlcGxveSBzdGFydHMgVGVtcG9yYWwsIFRlbXBvcmFsIFNldHVwIGFuZAojIFBvc3RncmVzIHRvZ2V0aGVyIChSYWlsd2F5IHN0YXJ0cyBhIHNlcnZpY2Ugb25seSBhZnRlciB0aGUgc2VydmljZXMgaXQgcmVmZXJlbmNlcyBoYXZlIGRlcGxveWVkKS4KIyBTaGlwcGVkIGJhc2U2NCBpbiB0aGUgc3RhcnQgY29tbWFuZDogc2ggLWMgImVjaG8gPGJhc2U2ND4gfCBiYXNlNjQgLWQgPiAvdG1wL3N0YXJ0LnNoICYmIGV4ZWMgc2ggL3RtcC9zdGFydC5zaCIKCiMgVGhlIHNlcnZlciByZWZ1c2VzIHRvIHN0YXJ0IHdpdGhvdXQgYSBkeW5hbWljIGNvbmZpZyBmaWxlOyBhbiBlbXB0eSBvbmUgbWVhbnMgVGVtcG9yYWwncyBkZWZhdWx0cy4KbWtkaXIgLXAgL3RtcC90ZW1wb3JhbCAmJiB0b3VjaCAvdG1wL3RlbXBvcmFsL2R5bmFtaWNjb25maWcueWFtbApleHBvcnQgRFlOQU1JQ19DT05GSUdfRklMRV9QQVRIPS90bXAvdGVtcG9yYWwvZHluYW1pY2NvbmZpZy55YW1sCk5TPSR7REVGQVVMVF9OQU1FU1BBQ0U6LWRlZmF1bHR9CkFQST1odHRwOi8vMTI3LjAuMC4xOiR7RlJPTlRFTkRfSFRUUF9QT1JUOi03MjQzfS9hcGkvdjEKCmVuc3VyZV9uYW1lc3BhY2UoKSB7CiAgaT0wCiAgdW50aWwgd2dldCAtcSAtTyAvZGV2L251bGwgIiRBUEkvbmFtZXNwYWNlcyI7IGRvCiAgICBpPSQoKGkgKyAxKSk7IFsgIiRpIiAtZ2UgMjAwIF0gJiYgcmV0dXJuIDEKICAgIHNsZWVwIDMKICBkb25lCiAgaT0wCiAgdW50aWwgd2dldCAtcSAtTyAvZGV2L251bGwgIiRBUEkvbmFtZXNwYWNlcy8kTlMiOyBkbwogICAgaT0kKChpICsgMSkpOyBbICIkaSIgLWdlIDQwIF0gJiYgeyBlY2hvICJUZW1wb3JhbDogY291bGQgbm90IGNyZWF0ZSBuYW1lc3BhY2UgJE5TIjsgcmV0dXJuIDE7IH0KICAgICMgQ2xvc2VkIHdvcmtmbG93cyBhcmUga2VwdCAyNCBob3VycywgYXMgaW4gUG9zdGl6J3Mgb3duIHNldHVwLgogICAgd2dldCAtcSAtTyAvZGV2L251bGwgLS1oZWFkZXIgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogICAgICAtLXBvc3QtZGF0YSAie1wibmFtZXNwYWNlXCI6XCIkTlNcIixcIndvcmtmbG93RXhlY3V0aW9uUmV0ZW50aW9uUGVyaW9kXCI6XCI4NjQwMHNcIn0iICIkQVBJL25hbWVzcGFjZXMiIFwKICAgICAgJiYgZWNobyAiVGVtcG9yYWw6IGNyZWF0ZWQgbmFtZXNwYWNlICROUyIKICAgIHNsZWVwIDMKICBkb25lCiAgZWNobyAiVGVtcG9yYWw6IG5hbWVzcGFjZSAkTlMgaXMgcmVhZHkiCn0KCnBpZD0KdHJhcCAnaWYgWyAtbiAiJHBpZCIgXTsgdGhlbiBraWxsIC1URVJNICIkcGlkIiAyPi9kZXYvbnVsbDsgd2FpdCAiJHBpZCI7IGZpOyBleGl0IDAnIFRFUk0gSU5UCmVuc3VyZV9uYW1lc3BhY2UgJgp3aGlsZSB0cnVlOyBkbwogIGVjaG8gIlRlbXBvcmFsOiBzdGFydGluZyB0aGUgc2VydmVyIgogIHRlbXBvcmFsLXNlcnZlciBzdGFydCAmCiAgcGlkPSQhCiAgaWYgd2FpdCAiJHBpZCI7IHRoZW4gZXhpdCAwOyBmaQogIHBpZD0KICBlY2hvICJUZW1wb3JhbDogdGhlIGRhdGFiYXNlIHNjaGVtYSBpc24ndCByZWFkeSB5ZXQgKFRlbXBvcmFsIFNldHVwIGNyZWF0ZXMgaXQpOyByZXRyeWluZyBpbiA1IHNlY29uZHMiCiAgc2xlZXAgNQpkb25lCg== | base64 -d > /tmp/start.sh && exec sh /tmp/start.sh\"",
                    "healthcheckPath": "/api/v1/namespaces",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "temporalio/server:1.32.1"
                  },
                  "variables": {
                    "DB": {
                      "isOptional": false,
                      "description": "Temporal keeps its state in the project's Postgres (databases temporal and temporal_visibility). No Elasticsearch.",
                      "defaultValue": "postgres12"
                    },
                    "PORT": {
                      "isOptional": false,
                      "description": "Temporal's HTTP API port, used for the health check.",
                      "defaultValue": "7243"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Postgres port.",
                      "defaultValue": "5432"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "warn keeps the log to problems; set info to see everything.",
                      "defaultValue": "warn"
                    },
                    "BIND_ON_IP": {
                      "isOptional": false,
                      "description": "Listen on every address of the private network (IPv4 and IPv6).",
                      "defaultValue": "::"
                    },
                    "POSTGRES_PWD": {
                      "isOptional": false,
                      "description": "Postgres password.",
                      "defaultValue": "${{Postgres.PGPASSWORD}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Postgres user.",
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "SQL_MAX_CONNS": {
                      "isOptional": false,
                      "description": "Database connections per pool, kept small to save Postgres memory.",
                      "defaultValue": "10"
                    },
                    "POSTGRES_SEEDS": {
                      "isOptional": false,
                      "description": "Postgres host (private network).",
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "SQL_VIS_MAX_CONNS": {
                      "isOptional": false,
                      "description": "Database connections for workflow search.",
                      "defaultValue": "5"
                    },
                    "NUM_HISTORY_SHARDS": {
                      "isOptional": false,
                      "description": "Fixed when the database is first created; 4 suits a single Postiz.",
                      "defaultValue": "4"
                    },
                    "SQL_MAX_IDLE_CONNS": {
                      "isOptional": false,
                      "description": "Idle database connections kept open per pool.",
                      "defaultValue": "4"
                    },
                    "SQL_VIS_MAX_IDLE_CONNS": {
                      "isOptional": false,
                      "description": "Idle connections for workflow search.",
                      "defaultValue": "2"
                    },
                    "TEMPORAL_ALLOW_NO_AUTH": {
                      "isOptional": false,
                      "description": "Temporal is reachable only on the private network, so it runs without an authorizer.",
                      "defaultValue": "true"
                    },
                    "TEMPORAL_BROADCAST_ADDRESS": {
                      "isOptional": false,
                      "description": "Single-node cluster: members find each other on loopback.",
                      "defaultValue": "127.0.0.1"
                    }
                  }
                },
                "9658a7e7-8939-4bb0-bfea-7956adb0ee31": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@075731e770cb61fcdba1009a3a70510b58fd5cd8/service-icons/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:18"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "isOptional": false,
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "defaultValue": "railway"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "defaultValue": "postgres"
                    },
                    "SSL_CERT_DAYS": {
                      "isOptional": false,
                      "defaultValue": "820"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "defaultValue": "60"
                    }
                  },
                  "volumeMounts": {
                    "9658a7e7-8939-4bb0-bfea-7956adb0ee31": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "a0e3249a-a47f-48be-b472-f8ba6a3375f9": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@075731e770cb61fcdba1009a3a70510b58fd5cd8/service-icons/postiz.svg",
                  "name": "Postiz",
                  "deploy": {
                    "startCommand": "sh -c \"echo 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 | base64 -d | gunzip > /tmp/railway-start.js && exec node /tmp/railway-start.js\"",
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/gitroomhq/postiz-app:v2.25.3"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port of Postiz's built-in web server (nginx), which serves the app, the API and uploads.",
                      "defaultValue": "5000"
                    },
                    "MAIN_URL": {
                      "isOptional": false,
                      "description": "Public URL of Postiz. For a custom domain, set MAIN_URL and FRONTEND_URL to it and NEXT_PUBLIC_BACKEND_URL to it plus /api.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "RUN_CRON": {
                      "isOptional": false,
                      "description": "Runs Postiz's background check for posts that missed their time.",
                      "defaultValue": "true"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Private Redis (cache and sign-in state for channel connections). family=0 lets it connect over IPv4 or IPv6.",
                      "defaultValue": "${{Redis.REDIS_URL}}?family=0"
                    },
                    "IS_GENERAL": {
                      "isOptional": false,
                      "description": "Postiz's standard self-hosted mode.",
                      "defaultValue": "true"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "Signs sign-in sessions and encrypts stored channel credentials. Generated per deploy; changing it signs everyone out and breaks connected channels.",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "ADMIN_EMAIL": {
                      "isOptional": false,
                      "description": "Your email address. It becomes your Postiz login (the first and only account; sign-up stays closed).",
                      "defaultValue": "{{ADMIN_EMAIL}}"
                    },
                    "COMPANY_NAME": {
                      "isOptional": true,
                      "description": "Name of your Postiz workspace (Postiz calls it your company).",
                      "defaultValue": "My Company"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Private Postgres holding posts, channels and accounts.",
                      "defaultValue": "${{Postgres.DATABASE_URL}}"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Public URL of Postiz; redirect URIs for social networks are FRONTEND_URL/integrations/social/<network>.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Choose your Postiz password: up to 64 characters (a Postiz limit). Use a long one; anyone can reach the sign-in page.",
                      "defaultValue": "{{ADMIN_PASSWORD}}"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": true,
                      "description": "Optional. OpenAI API key for the AI writer, image generation and the agent. Leave empty to turn them off.",
                      "defaultValue": ""
                    },
                    "STORAGE_PROVIDER": {
                      "isOptional": false,
                      "description": "local: uploads are kept on the volume at /uploads and served from your Postiz URL, so social networks can fetch them.",
                      "defaultValue": "local"
                    },
                    "TEMPORAL_ADDRESS": {
                      "isOptional": false,
                      "description": "Private Temporal server that schedules and publishes posts. Postiz starts only when it is ready.",
                      "defaultValue": "${{Temporal.RAILWAY_PRIVATE_DOMAIN}}:7233"
                    },
                    "UPLOAD_DIRECTORY": {
                      "isOptional": false,
                      "description": "Where uploads are stored (the volume).",
                      "defaultValue": "/uploads"
                    },
                    "BACKEND_INTERNAL_URL": {
                      "isOptional": false,
                      "description": "The API inside the container.",
                      "defaultValue": "http://localhost:3000"
                    },
                    "DISABLE_REGISTRATION": {
                      "isOptional": false,
                      "description": "true: only the first account (from ADMIN_EMAIL) can be created. Set to false only if anyone with the URL may sign up.",
                      "defaultValue": "true"
                    },
                    "NEXT_PUBLIC_BACKEND_URL": {
                      "isOptional": false,
                      "description": "Public URL of the Postiz API (the same domain, path /api).",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}/api"
                    },
                    "NEXT_PUBLIC_UPLOAD_DIRECTORY": {
                      "isOptional": false,
                      "description": "URL path that serves uploads.",
                      "defaultValue": "/uploads"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:5000": {
                        "port": 5000
                      }
                    }
                  },
                  "volumeMounts": {
                    "a0e3249a-a47f-48be-b472-f8ba6a3375f9": {
                      "mountPath": "/uploads"
                    }
                  }
                },
                "b364a458-19ff-49d6-a406-8f35cd76506f": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@075731e770cb61fcdba1009a3a70510b58fd5cd8/service-icons/redis.svg",
                  "name": "Redis",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:8.2"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{REDISUSER}}:${{REDIS_PASSWORD}}@${{REDISHOST}}:${{REDISPORT}}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "b364a458-19ff-49d6-a406-8f35cd76506f": {
                      "mountPath": "/data"
                    }
                  }
                },
                "fb759286-0ed4-4c7b-ab5b-8185cc0ef8c9": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@075731e770cb61fcdba1009a3a70510b58fd5cd8/service-icons/setup.svg",
                  "name": "Temporal Setup",
                  "deploy": {
                    "startCommand": "sh -c \"echo IyEvYmluL3NoCiMgT25lLXRpbWUgam9iIG9mIHRoZSBUZW1wb3JhbCBTZXR1cCBzZXJ2aWNlIChvZmZpY2lhbCB0ZW1wb3JhbGlvL2FkbWluLXRvb2xzIGltYWdlLCByZXN0YXJ0IHBvbGljeSBORVZFUikuCiMgQ3JlYXRlcyBUZW1wb3JhbCdzIHR3byBkYXRhYmFzZXMgaW4gdGhlIHByb2plY3QncyBQb3N0Z3JlcyBhbmQgbWlncmF0ZXMgdGhlaXIgc2NoZW1hLiBTYWZlIG9uIGV2ZXJ5IHJ1biwKIyBzbyByZWRlcGxveWluZyB0aGlzIHNlcnZpY2Ugd2l0aCBhIG5ld2VyIGFkbWluLXRvb2xzIHRhZyBtaWdyYXRlcyB0aGUgc2NoZW1hIGZvciBhIFRlbXBvcmFsIHVwZ3JhZGUuCiMgSXQgcmVmZXJlbmNlcyBvbmx5IFBvc3RncmVzOiBSYWlsd2F5IHN0YXJ0cyBhIHNlcnZpY2UgYWZ0ZXIgdGhlIHNlcnZpY2VzIGl0IHJlZmVyZW5jZXMgaGF2ZSBkZXBsb3llZCwKIyBhbmQgVGVtcG9yYWwgY2FuJ3QgYmVjb21lIGhlYWx0aHkgYmVmb3JlIHRoaXMgaGFzIHJ1bi4KIyBTaGlwcGVkIGJhc2U2NCBpbiB0aGUgc3RhcnQgY29tbWFuZDogc2ggLWMgImVjaG8gPGJhc2U2ND4gfCBiYXNlNjQgLWQgPiAvdG1wL3NldHVwLnNoICYmIGV4ZWMgc2ggL3RtcC9zZXR1cC5zaCIKc2V0IC11IC1vIHBpcGVmYWlsClNDSEVNQT0vZXRjL3RlbXBvcmFsL3NjaGVtYS9wb3N0Z3Jlc3FsL3YxMgpsb2coKSB7IGVjaG8gIlt0ZW1wb3JhbC1zZXR1cF0gJCoiOyB9CgpzcWwoKSB7CiAgZGI9JDE7IHNoaWZ0CiAgdGVtcG9yYWwtc3FsLXRvb2wgLS1wbHVnaW4gcG9zdGdyZXMxMiAtLWVwICIkUE9TVEdSRVNfU0VFRFMiIC1wICIke0RCX1BPUlQ6LTU0MzJ9IiBcCiAgICAtdSAiJFBPU1RHUkVTX1VTRVIiIC0tcHcgIiRQT1NUR1JFU19QV0QiIC0tZGIgIiRkYiIgIiRAIgp9CgptaWdyYXRlKCkgewogIGZvciBwYWlyIGluIHRlbXBvcmFsOnRlbXBvcmFsIHRlbXBvcmFsX3Zpc2liaWxpdHk6dmlzaWJpbGl0eTsgZG8KICAgIGRiPSR7cGFpciUlOip9OyBkaXI9JHtwYWlyIyo6fQogICAgc3FsICIkZGIiIGNyZWF0ZS1kYXRhYmFzZSA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZSAjIGZhaWxzIHdoZW4gaXQgYWxyZWFkeSBleGlzdHMKICAgIHNxbCAiJGRiIiBzZXR1cC1zY2hlbWEgLXYgMC4wID4vZGV2L251bGwgMj4mMSB8fCB0cnVlICMgdmVyc2lvbiB0YWJsZXMgb25seTsgZmFpbHMgd2hlbiB0aGV5IGV4aXN0CiAgICAjIFRoZSB0b29sIGxvZ3MgZXZlcnkgU1FMIHN0YXRlbWVudCBhdCBERUJVRzsga2VlcCB0aGUgcmVzdC4KICAgIHNxbCAiJGRiIiB1cGRhdGUtc2NoZW1hIC1kICIkU0NIRU1BLyRkaXIvdmVyc2lvbmVkIiAyPiYxIHwgeyBncmVwIC12ICJERUJVRyIgfHwgdHJ1ZTsgfSB8fCByZXR1cm4gMQogIGRvbmUKfQoKaT0wCnVudGlsIG1pZ3JhdGU7IGRvCiAgaT0kKChpICsgMSkpCiAgaWYgWyAiJGkiIC1nZSA2MCBdOyB0aGVuIGxvZyAiY291bGQgbm90IG1pZ3JhdGUgVGVtcG9yYWwncyBkYXRhYmFzZXM7IGNoZWNrIHRoZSBQb3N0Z3JlcyBzZXJ2aWNlIjsgZXhpdCAxOyBmaQogIGxvZyAid2FpdGluZyBmb3IgUG9zdGdyZXMgKCRpKSIKICBzbGVlcCA1CmRvbmUKbG9nICJkYXRhYmFzZXMgdGVtcG9yYWwgYW5kIHRlbXBvcmFsX3Zpc2liaWxpdHkgYXJlIG1pZ3JhdGVkLiBEb25lLiIKZXhpdCAwCg== | base64 -d > /tmp/setup.sh && exec sh /tmp/setup.sh\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "NEVER",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "temporalio/admin-tools:1.32.1"
                  },
                  "variables": {
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Postgres port.",
                      "defaultValue": "5432"
                    },
                    "POSTGRES_PWD": {
                      "isOptional": false,
                      "description": "Postgres password.",
                      "defaultValue": "${{Postgres.PGPASSWORD}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Postgres user.",
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "POSTGRES_SEEDS": {
                      "isOptional": false,
                      "description": "Postgres host (private network).",
                      "defaultValue": "${{Postgres.PGHOST}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Postiz",
      "method": "GET",
      "path": "/healthz",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-10-30T22:14:57.013Z",
  "generator_version": "0.1.0"
}
