{
  "manifest_version": "1.0.0",
  "template": {
    "id": "eacd8e8f-c010-48f6-bdd5-a05cb2470b88",
    "slug": "postgres-ha",
    "name": "Postgres HA",
    "description": "A Patroni based High Availability Postgres using etcd",
    "url": "https://railway.com/deploy/postgres-ha"
  },
  "services": [
    {
      "name": "etcd-2",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/etcd",
      "http": false
    },
    {
      "name": "Postgres-3",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Postgres-1",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Postgres HA",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/haproxy:3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "etcd-3",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/etcd",
      "http": false
    },
    {
      "name": "etcd-1",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/etcd",
      "http": false
    },
    {
      "name": "Postgres-2",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "ETCD_NAME",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "etcd-2"
    },
    {
      "key": "ETCD_DATA_DIR",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_DATA_DIR.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_ROOT_PASSWORD",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_LISTEN_PEER_URLS",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_LISTEN_PEER_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_LISTEN_CLIENT_URLS",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_LISTEN_CLIENT_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_ADVERTISE_CLIENT_URLS",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_ADVERTISE_CLIENT_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER_TOKEN",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER_TOKEN.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_INITIAL_ADVERTISE_PEER_URLS",
      "service": "etcd-2",
      "description": "Provide a value for ETCD_INITIAL_ADVERTISE_PEER_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGDATA",
      "service": "Postgres-3",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGHOST",
      "service": "Postgres-3",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres-3",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGUSER",
      "service": "Postgres-3",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres-3",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres-3",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_TTL",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_TTL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres-3",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres-3",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PATRONI_NAME",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres-3"
    },
    {
      "key": "PATRONI_SCOPE",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_SCOPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres-3",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres-3",
      "description": "Provide a value for SSL_CERT_DAYS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_ENABLED",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_ENABLED.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_API_PORT",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_API_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_LOOP_WAIT",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_LOOP_WAIT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres-3",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_ETCD3_HOSTS",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_ETCD3_HOSTS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WATCHDOG_CURL_TIMEOUT",
      "service": "Postgres-3",
      "description": "Provide a value for WATCHDOG_CURL_TIMEOUT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_WAIT_FOR_LEADER",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_WAIT_FOR_LEADER.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PATRONI_RESTAPI_PASSWORD",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_RESTAPI_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_PASSWORD",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_SUPERUSER_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_USERNAME",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_SUPERUSER_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_REPLICATION_PASSWORD",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_REPLICATION_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_REPLICATION_USERNAME",
      "service": "Postgres-3",
      "description": "Provide a value for PATRONI_REPLICATION_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WATCHDOG_CURL_CONNECT_TIMEOUT",
      "service": "Postgres-3",
      "description": "Provide a value for WATCHDOG_CURL_CONNECT_TIMEOUT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres-3",
      "description": "Provide a value for RAILWAY_DEPLOYMENT_DRAINING_SECONDS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATA",
      "service": "Postgres-1",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres-1",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres-1",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres-1",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres-1",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres-1",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_TTL",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_TTL.",
      "secret": false,
      "strategy": "default",
      "default": "45"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres-1",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres-1",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PATRONI_NAME",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres-1"
    },
    {
      "key": "PATRONI_SCOPE",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_SCOPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres-1",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres-1",
      "description": "Provide a value for SSL_CERT_DAYS.",
      "secret": false,
      "strategy": "default",
      "default": "820"
    },
    {
      "key": "PATRONI_ENABLED",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PATRONI_API_PORT",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_API_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8008"
    },
    {
      "key": "PATRONI_LOOP_WAIT",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_LOOP_WAIT.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres-1",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PATRONI_ETCD3_HOSTS",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_ETCD3_HOSTS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WATCHDOG_CURL_TIMEOUT",
      "service": "Postgres-1",
      "description": "Provide a value for WATCHDOG_CURL_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "PATRONI_RESTAPI_PASSWORD",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_RESTAPI_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_PASSWORD",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_SUPERUSER_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_USERNAME",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_SUPERUSER_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_ADOPT_EXISTING_DATA",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_ADOPT_EXISTING_DATA.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PATRONI_REPLICATION_PASSWORD",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_REPLICATION_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_REPLICATION_USERNAME",
      "service": "Postgres-1",
      "description": "Provide a value for PATRONI_REPLICATION_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WATCHDOG_CURL_CONNECT_TIMEOUT",
      "service": "Postgres-1",
      "description": "Provide a value for WATCHDOG_CURL_CONNECT_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres-1",
      "description": "Provide a value for RAILWAY_DEPLOYMENT_DRAINING_SECONDS.",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PGHOST",
      "service": "Postgres HA",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres HA",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGUSER",
      "service": "Postgres HA",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres HA",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres HA",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres HA",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres HA",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres HA",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_NODES",
      "service": "Postgres HA",
      "description": "Provide a value for POSTGRES_NODES.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "HAPROXY_MAX_CONN",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_MAX_CONN.",
      "secret": false,
      "strategy": "default",
      "default": "10000"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres HA",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HAPROXY_HEALTH_PORT",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_HEALTH_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8009"
    },
    {
      "key": "HAPROXY_TIMEOUT_CHECK",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_TIMEOUT_CHECK.",
      "secret": false,
      "strategy": "default",
      "default": "3s"
    },
    {
      "key": "HAPROXY_CHECK_INTERVAL",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_CHECK_INTERVAL.",
      "secret": false,
      "strategy": "default",
      "default": "3s"
    },
    {
      "key": "HAPROXY_TIMEOUT_CLIENT",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_TIMEOUT_CLIENT.",
      "secret": false,
      "strategy": "default",
      "default": "30m"
    },
    {
      "key": "HAPROXY_TIMEOUT_SERVER",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_TIMEOUT_SERVER.",
      "secret": false,
      "strategy": "default",
      "default": "30m"
    },
    {
      "key": "HAPROXY_CHECK_DOWNINTER",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_CHECK_DOWNINTER.",
      "secret": false,
      "strategy": "default",
      "default": "500ms"
    },
    {
      "key": "HAPROXY_CHECK_FASTINTER",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_CHECK_FASTINTER.",
      "secret": false,
      "strategy": "default",
      "default": "500ms"
    },
    {
      "key": "HAPROXY_TIMEOUT_CONNECT",
      "service": "Postgres HA",
      "description": "Provide a value for HAPROXY_TIMEOUT_CONNECT.",
      "secret": false,
      "strategy": "default",
      "default": "10s"
    },
    {
      "key": "ETCD_NAME",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "etcd-3"
    },
    {
      "key": "ETCD_DATA_DIR",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_DATA_DIR.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_ROOT_PASSWORD",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_LISTEN_PEER_URLS",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_LISTEN_PEER_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_LISTEN_CLIENT_URLS",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_LISTEN_CLIENT_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_ADVERTISE_CLIENT_URLS",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_ADVERTISE_CLIENT_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER_TOKEN",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER_TOKEN.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_INITIAL_ADVERTISE_PEER_URLS",
      "service": "etcd-3",
      "description": "Provide a value for ETCD_INITIAL_ADVERTISE_PEER_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ETCD_NAME",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "etcd-1"
    },
    {
      "key": "ETCD_DATA_DIR",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_DATA_DIR.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/etcd"
    },
    {
      "key": "ETCD_ROOT_PASSWORD",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ETCD_LISTEN_PEER_URLS",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_LISTEN_PEER_URLS.",
      "secret": false,
      "strategy": "default",
      "default": "http://0.0.0.0:2380"
    },
    {
      "key": "ETCD_LISTEN_CLIENT_URLS",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_LISTEN_CLIENT_URLS.",
      "secret": false,
      "strategy": "default",
      "default": "http://0.0.0.0:2379"
    },
    {
      "key": "ETCD_ADVERTISE_CLIENT_URLS",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_ADVERTISE_CLIENT_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ETCD_INITIAL_CLUSTER_TOKEN",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_INITIAL_CLUSTER_TOKEN.",
      "secret": true,
      "strategy": "default",
      "default": "postgres-ha"
    },
    {
      "key": "ETCD_INITIAL_ADVERTISE_PEER_URLS",
      "service": "etcd-1",
      "description": "Provide a value for ETCD_INITIAL_ADVERTISE_PEER_URLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGDATA",
      "service": "Postgres-2",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGHOST",
      "service": "Postgres-2",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres-2",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGUSER",
      "service": "Postgres-2",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres-2",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres-2",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_TTL",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_TTL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres-2",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres-2",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PATRONI_NAME",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres-2"
    },
    {
      "key": "PATRONI_SCOPE",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_SCOPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres-2",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres-2",
      "description": "Provide a value for SSL_CERT_DAYS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_ENABLED",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_ENABLED.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_API_PORT",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_API_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_LOOP_WAIT",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_LOOP_WAIT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres-2",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_ETCD3_HOSTS",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_ETCD3_HOSTS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WATCHDOG_CURL_TIMEOUT",
      "service": "Postgres-2",
      "description": "Provide a value for WATCHDOG_CURL_TIMEOUT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_WAIT_FOR_LEADER",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_WAIT_FOR_LEADER.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PATRONI_RESTAPI_PASSWORD",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_RESTAPI_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_PASSWORD",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_SUPERUSER_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_SUPERUSER_USERNAME",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_SUPERUSER_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_REPLICATION_PASSWORD",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_REPLICATION_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PATRONI_REPLICATION_USERNAME",
      "service": "Postgres-2",
      "description": "Provide a value for PATRONI_REPLICATION_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WATCHDOG_CURL_CONNECT_TIMEOUT",
      "service": "Postgres-2",
      "description": "Provide a value for WATCHDOG_CURL_CONNECT_TIMEOUT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres-2",
      "description": "Provide a value for RAILWAY_DEPLOYMENT_DRAINING_SECONDS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "postgres-ha"
      }
    },
    "cli": "railway deploy --template postgres-ha",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "eacd8e8f-c010-48f6-bdd5-a05cb2470b88",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "6587b566-0703-4716-abaf-8b9fd34d9c1a": {
                  "icon": "https://upload.wikimedia.org/wikipedia/labs/5/53/Etcd_logo.png",
                  "name": "etcd-2",
                  "deploy": {
                    "requiredMountPath": "/var/lib/etcd",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3",
                    "autoUpdates": {
                      "type": "minor",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 1,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 2,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 3,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 4,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 5,
                          "endHour": 4,
                          "startHour": 2
                        },
                        {
                          "day": 6,
                          "endHour": 4,
                          "startHour": 2
                        }
                      ]
                    }
                  },
                  "variables": {
                    "ETCD_NAME": {
                      "defaultValue": "etcd-2"
                    },
                    "ETCD_DATA_DIR": {
                      "defaultValue": "${{etcd-1.ETCD_DATA_DIR}}"
                    },
                    "ETCD_ROOT_PASSWORD": {
                      "defaultValue": "${{etcd-1.ETCD_ROOT_PASSWORD}}"
                    },
                    "ETCD_INITIAL_CLUSTER": {
                      "defaultValue": "${{etcd-1.ETCD_INITIAL_CLUSTER}}"
                    },
                    "ETCD_LISTEN_PEER_URLS": {
                      "defaultValue": "${{etcd-1.ETCD_LISTEN_PEER_URLS}}"
                    },
                    "ETCD_LISTEN_CLIENT_URLS": {
                      "defaultValue": "${{etcd-1.ETCD_LISTEN_CLIENT_URLS}}"
                    },
                    "ETCD_ADVERTISE_CLIENT_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2379"
                    },
                    "ETCD_INITIAL_CLUSTER_TOKEN": {
                      "defaultValue": "${{etcd-1.ETCD_INITIAL_CLUSTER_TOKEN}}"
                    },
                    "ETCD_INITIAL_ADVERTISE_PEER_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2380"
                    }
                  },
                  "clusterRole": "internal",
                  "volumeMounts": {
                    "6587b566-0703-4716-abaf-8b9fd34d9c1a": {
                      "mountPath": "/var/lib/etcd",
                      "backupSchedules": null
                    }
                  },
                  "replicaConfig": {
                    "step": 2,
                    "scalable": true,
                    "maxReplicas": 7,
                    "minReplicas": 3
                  },
                  "clusterDisplay": {
                    "badge": "etcd",
                    "badgeVariant": "muted"
                  },
                  "parentServiceId": "Postgres-1"
                },
                "6ef0f82d-22e9-45c7-98a3-242d258194e7": {
                  "icon": "https://devicons.railway.app/postgres",
                  "name": "Postgres-3",
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18",
                    "autoUpdates": {
                      "type": "vuln",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 6,
                          "endHour": 24,
                          "startHour": 10
                        }
                      ]
                    }
                  },
                  "exposure": {
                    "5432": {
                      "variables": {
                        "DATABASE_PUBLIC_URL": {
                          "value": "postgres://${{Postgres-1.PGUSER}}:${{Postgres-1.PGPASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{Postgres-1.PGDATABASE}}"
                        }
                      }
                    }
                  },
                  "variables": {
                    "PGDATA": {
                      "defaultValue": "${{Postgres-1.PGDATA}}"
                    },
                    "PGHOST": {
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "defaultValue": "${{Postgres-1.PGPORT}}"
                    },
                    "PGUSER": {
                      "defaultValue": "${{Postgres-1.PGUSER}}"
                    },
                    "PGDATABASE": {
                      "defaultValue": "${{Postgres-1.PGDATABASE}}"
                    },
                    "PGPASSWORD": {
                      "defaultValue": "${{Postgres-1.PGPASSWORD}}"
                    },
                    "PATRONI_TTL": {
                      "defaultValue": "${{Postgres-1.PATRONI_TTL}}"
                    },
                    "POSTGRES_DB": {
                      "defaultValue": "${{Postgres-1.POSTGRES_DB}}"
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "PATRONI_NAME": {
                      "defaultValue": "postgres-3"
                    },
                    "PATRONI_SCOPE": {
                      "defaultValue": "${{Postgres-1.PATRONI_SCOPE}}"
                    },
                    "POSTGRES_USER": {
                      "defaultValue": "${{Postgres-1.POSTGRES_USER}}"
                    },
                    "SSL_CERT_DAYS": {
                      "defaultValue": "${{Postgres-1.SSL_CERT_DAYS}}"
                    },
                    "PATRONI_ENABLED": {
                      "defaultValue": "${{Postgres-1.PATRONI_ENABLED}}"
                    },
                    "PATRONI_API_PORT": {
                      "defaultValue": "${{Postgres-1.PATRONI_API_PORT}}"
                    },
                    "PATRONI_LOOP_WAIT": {
                      "defaultValue": "${{Postgres-1.PATRONI_LOOP_WAIT}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "defaultValue": "${{Postgres-1.POSTGRES_PASSWORD}}"
                    },
                    "PATRONI_ETCD3_HOSTS": {
                      "defaultValue": "${{Postgres-1.PATRONI_ETCD3_HOSTS}}"
                    },
                    "WATCHDOG_CURL_TIMEOUT": {
                      "defaultValue": "${{Postgres-1.WATCHDOG_CURL_TIMEOUT}}"
                    },
                    "PATRONI_WAIT_FOR_LEADER": {
                      "defaultValue": "true"
                    },
                    "PATRONI_RESTAPI_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_RESTAPI_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_SUPERUSER_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_USERNAME": {
                      "defaultValue": "${{Postgres-1.PATRONI_SUPERUSER_USERNAME}}"
                    },
                    "PATRONI_REPLICATION_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_REPLICATION_PASSWORD}}"
                    },
                    "PATRONI_REPLICATION_USERNAME": {
                      "defaultValue": "${{Postgres-1.PATRONI_REPLICATION_USERNAME}}"
                    },
                    "WATCHDOG_CURL_CONNECT_TIMEOUT": {
                      "defaultValue": "${{Postgres-1.WATCHDOG_CURL_CONNECT_TIMEOUT}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "defaultValue": "${{Postgres-1.RAILWAY_DEPLOYMENT_DRAINING_SECONDS}}"
                    }
                  },
                  "clusterRole": "replica",
                  "volumeMounts": {
                    "6ef0f82d-22e9-45c7-98a3-242d258194e7": {
                      "mountPath": "/var/lib/postgresql/data",
                      "backupSchedules": [
                        "MONTHLY",
                        "WEEKLY",
                        "DAILY"
                      ]
                    }
                  },
                  "replicaConfig": {
                    "scalable": true,
                    "maxReplicas": 5,
                    "minReplicas": 2
                  },
                  "clusterDisplay": {
                    "badge": "Replica",
                    "badgeVariant": "secondary"
                  },
                  "parentServiceId": "Postgres-1"
                },
                "91c1f305-eae3-4f7b-9e83-21f852f2a63b": {
                  "icon": "https://devicons.railway.app/postgres",
                  "name": "Postgres-1",
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18",
                    "autoUpdates": {
                      "type": "vuln",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 18,
                          "startHour": 0
                        }
                      ],
                      "preserveExisting": true
                    }
                  },
                  "variables": {
                    "PGDATA": {
                      "defaultValue": "/var/lib/postgresql/data/pgdata",
                      "preserveExisting": true
                    },
                    "PGHOST": {
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "defaultValue": "${{POSTGRES_USER}}",
                      "preserveExisting": true
                    },
                    "PGDATABASE": {
                      "defaultValue": "${{POSTGRES_DB}}",
                      "preserveExisting": true
                    },
                    "PGPASSWORD": {
                      "defaultValue": "${{POSTGRES_PASSWORD}}",
                      "preserveExisting": true
                    },
                    "PATRONI_TTL": {
                      "defaultValue": "45"
                    },
                    "POSTGRES_DB": {
                      "defaultValue": "railway",
                      "preserveExisting": true
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}",
                      "preserveExisting": true
                    },
                    "PATRONI_NAME": {
                      "defaultValue": "postgres-1"
                    },
                    "PATRONI_SCOPE": {
                      "defaultValue": "${{etcd-1.ETCD_INITIAL_CLUSTER_TOKEN}}"
                    },
                    "POSTGRES_USER": {
                      "defaultValue": "postgres",
                      "preserveExisting": true
                    },
                    "SSL_CERT_DAYS": {
                      "defaultValue": "820"
                    },
                    "PATRONI_ENABLED": {
                      "defaultValue": "true"
                    },
                    "PATRONI_API_PORT": {
                      "defaultValue": "8008"
                    },
                    "PATRONI_LOOP_WAIT": {
                      "defaultValue": "10"
                    },
                    "POSTGRES_PASSWORD": {
                      "defaultValue": "{{POSTGRES_PASSWORD}}",
                      "preserveExisting": true
                    },
                    "PATRONI_ETCD3_HOSTS": {
                      "defaultValue": "${{etcd-1.RAILWAY_PRIVATE_DOMAIN}}:2379,${{etcd-2.RAILWAY_PRIVATE_DOMAIN}}:2379,${{etcd-3.RAILWAY_PRIVATE_DOMAIN}}:2379"
                    },
                    "WATCHDOG_CURL_TIMEOUT": {
                      "defaultValue": "5"
                    },
                    "PATRONI_RESTAPI_PASSWORD": {
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_PASSWORD": {
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_USERNAME": {
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PATRONI_ADOPT_EXISTING_DATA": {
                      "defaultValue": "true"
                    },
                    "PATRONI_REPLICATION_PASSWORD": {
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "PATRONI_REPLICATION_USERNAME": {
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "WATCHDOG_CURL_CONNECT_TIMEOUT": {
                      "defaultValue": "5"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "defaultValue": "60"
                    }
                  },
                  "clusterRole": "root",
                  "volumeMounts": {
                    "91c1f305-eae3-4f7b-9e83-21f852f2a63b": {
                      "mountPath": "/var/lib/postgresql/data",
                      "backupSchedules": [
                        "MONTHLY",
                        "WEEKLY",
                        "DAILY"
                      ]
                    }
                  },
                  "clusterWiring": {
                    "coordinatorPort": 2379,
                    "edgeHealthCheck": {
                      "path": "/stats",
                      "port": 8404
                    },
                    "memberStatusApi": {
                      "port": 8008,
                      "protocol": "patroni"
                    },
                    "dataNodeRoleCheck": {
                      "path": "/primary",
                      "port": 8008
                    },
                    "dataNodesVariable": "POSTGRES_NODES",
                    "dataNodeHealthCheck": {
                      "path": "/health",
                      "port": 8008
                    },
                    "dataNodesEntryFormat": "{host}:${{{rootName}.PGPORT}}:8008",
                    "internalNodeHealthCheck": {
                      "path": "/health",
                      "port": 2379
                    },
                    "replicaNodeNameVariable": "PATRONI_NAME",
                    "coordinatorHostsVariable": "PATRONI_ETCD3_HOSTS",
                    "internalNodeNameVariable": "ETCD_NAME"
                  },
                  "replicaConfig": {
                    "scalable": true,
                    "maxReplicas": 5,
                    "minReplicas": 2
                  },
                  "clusterDisplay": {
                    "badge": "Primary",
                    "badgeVariant": "primary"
                  },
                  "haTemplateCode": "postgres-ha",
                  "haActiveVariable": "PATRONI_ENABLED",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxy",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "Routes traffic to the primary",
                      "defaultValue": 3
                    },
                    "replica": {
                      "label": "Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5,
                        6,
                        7
                      ],
                      "nodeLabel": "Postgres",
                      "description": "Streaming replicas for automatic failover",
                      "defaultValue": 2
                    },
                    "internal": {
                      "label": "Coordinator Nodes",
                      "options": [
                        3,
                        5,
                        7,
                        9
                      ],
                      "nodeLabel": "etcd",
                      "defaultValue": 3
                    },
                    "description": "This will convert your Postgres database to an HA cluster with Patroni failover and etcd consensus.",
                    "supportedImageMajorVersions": [
                      14,
                      15,
                      16,
                      17,
                      18
                    ]
                  },
                  "revertsToTemplateCode": "postgres",
                  "adoptionImageEligibility": {
                    "label": "High availability conversion",
                    "repositories": [
                      "ghcr.io/railwayapp-templates/postgres-ssl",
                      "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni"
                    ]
                  }
                },
                "bdc97c9f-8d42-41dc-8ec3-9091a015dea8": {
                  "icon": "https://cms.railway.com/media/haproxy-icon.svg",
                  "name": "Postgres HA",
                  "deploy": {
                    "numReplicas": 3,
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/haproxy:3",
                    "autoUpdates": {
                      "type": "minor",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 1,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 2,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 3,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 4,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 5,
                          "endHour": 24,
                          "startHour": 0
                        },
                        {
                          "day": 6,
                          "endHour": 24,
                          "startHour": 0
                        }
                      ]
                    }
                  },
                  "exposure": {
                    "5432": {
                      "variables": {
                        "DATABASE_PUBLIC_URL": {
                          "value": "postgres://${{Postgres-1.PGUSER}}:${{Postgres-1.PGPASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{Postgres-1.PGDATABASE}}"
                        }
                      }
                    }
                  },
                  "variables": {
                    "PGHOST": {
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "defaultValue": "${{Postgres-1.PGPORT}}"
                    },
                    "PGUSER": {
                      "defaultValue": "${{Postgres-1.PGUSER}}"
                    },
                    "PGDATABASE": {
                      "defaultValue": "${{Postgres-1.PGDATABASE}}"
                    },
                    "PGPASSWORD": {
                      "defaultValue": "${{Postgres-1.PGPASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "defaultValue": "${{Postgres-1.POSTGRES_DB}}"
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://${{Postgres-1.PGUSER}}:${{Postgres-1.PGPASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{Postgres-1.PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "defaultValue": "${{Postgres-1.POSTGRES_USER}}"
                    },
                    "POSTGRES_NODES": {
                      "defaultValue": "${{Postgres-1.RAILWAY_PRIVATE_DOMAIN}}:${{Postgres-1.PGPORT}}:8008,${{Postgres-2.RAILWAY_PRIVATE_DOMAIN}}:${{Postgres-2.PGPORT}}:8008,${{Postgres-3.RAILWAY_PRIVATE_DOMAIN}}:${{Postgres-3.PGPORT}}:8008"
                    },
                    "HAPROXY_MAX_CONN": {
                      "defaultValue": "10000"
                    },
                    "POSTGRES_PASSWORD": {
                      "defaultValue": "${{Postgres-1.POSTGRES_PASSWORD}}"
                    },
                    "HAPROXY_HEALTH_PORT": {
                      "defaultValue": "8009"
                    },
                    "HAPROXY_TIMEOUT_CHECK": {
                      "defaultValue": "3s"
                    },
                    "HAPROXY_CHECK_INTERVAL": {
                      "defaultValue": "3s"
                    },
                    "HAPROXY_TIMEOUT_CLIENT": {
                      "defaultValue": "30m"
                    },
                    "HAPROXY_TIMEOUT_SERVER": {
                      "defaultValue": "30m"
                    },
                    "HAPROXY_CHECK_DOWNINTER": {
                      "defaultValue": "500ms"
                    },
                    "HAPROXY_CHECK_FASTINTER": {
                      "defaultValue": "500ms"
                    },
                    "HAPROXY_TIMEOUT_CONNECT": {
                      "defaultValue": "10s"
                    }
                  },
                  "clusterRole": "edge",
                  "replicaConfig": {
                    "scalable": false
                  },
                  "clusterDisplay": {
                    "badge": "HAProxy",
                    "badgeVariant": "secondary"
                  },
                  "parentServiceId": "Postgres-1"
                },
                "e04f6eca-2ed6-4e3a-b089-8a37d128aa59": {
                  "icon": "https://upload.wikimedia.org/wikipedia/labs/5/53/Etcd_logo.png",
                  "name": "etcd-3",
                  "deploy": {
                    "requiredMountPath": "/var/lib/etcd",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3",
                    "autoUpdates": {
                      "type": "minor",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 1,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 2,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 3,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 4,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 5,
                          "endHour": 6,
                          "startHour": 4
                        },
                        {
                          "day": 6,
                          "endHour": 6,
                          "startHour": 4
                        }
                      ]
                    }
                  },
                  "variables": {
                    "ETCD_NAME": {
                      "defaultValue": "etcd-3"
                    },
                    "ETCD_DATA_DIR": {
                      "defaultValue": "${{etcd-1.ETCD_DATA_DIR}}"
                    },
                    "ETCD_ROOT_PASSWORD": {
                      "defaultValue": "${{etcd-1.ETCD_ROOT_PASSWORD}}"
                    },
                    "ETCD_INITIAL_CLUSTER": {
                      "defaultValue": "${{etcd-1.ETCD_INITIAL_CLUSTER}}"
                    },
                    "ETCD_LISTEN_PEER_URLS": {
                      "defaultValue": "${{etcd-1.ETCD_LISTEN_PEER_URLS}}"
                    },
                    "ETCD_LISTEN_CLIENT_URLS": {
                      "defaultValue": "${{etcd-1.ETCD_LISTEN_CLIENT_URLS}}"
                    },
                    "ETCD_ADVERTISE_CLIENT_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2379"
                    },
                    "ETCD_INITIAL_CLUSTER_TOKEN": {
                      "defaultValue": "${{etcd-1.ETCD_INITIAL_CLUSTER_TOKEN}}"
                    },
                    "ETCD_INITIAL_ADVERTISE_PEER_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2380"
                    }
                  },
                  "clusterRole": "internal",
                  "volumeMounts": {
                    "e04f6eca-2ed6-4e3a-b089-8a37d128aa59": {
                      "mountPath": "/var/lib/etcd",
                      "backupSchedules": null
                    }
                  },
                  "replicaConfig": {
                    "step": 2,
                    "scalable": true,
                    "maxReplicas": 7,
                    "minReplicas": 3
                  },
                  "clusterDisplay": {
                    "badge": "etcd",
                    "badgeVariant": "muted"
                  },
                  "parentServiceId": "Postgres-1"
                },
                "f68ad14b-e8db-412e-88dc-19236194cd4c": {
                  "icon": "https://upload.wikimedia.org/wikipedia/labs/5/53/Etcd_logo.png",
                  "name": "etcd-1",
                  "deploy": {
                    "requiredMountPath": "/var/lib/etcd",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/etcd:3",
                    "autoUpdates": {
                      "type": "minor",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 1,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 2,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 3,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 4,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 5,
                          "endHour": 2,
                          "startHour": 0
                        },
                        {
                          "day": 6,
                          "endHour": 2,
                          "startHour": 0
                        }
                      ]
                    }
                  },
                  "variables": {
                    "ETCD_NAME": {
                      "defaultValue": "etcd-1"
                    },
                    "ETCD_DATA_DIR": {
                      "defaultValue": "/var/lib/etcd"
                    },
                    "ETCD_ROOT_PASSWORD": {
                      "defaultValue": "${{Postgres-1.POSTGRES_PASSWORD}}"
                    },
                    "ETCD_INITIAL_CLUSTER": {
                      "defaultValue": "etcd-1=http://${{RAILWAY_PRIVATE_DOMAIN}}:2380"
                    },
                    "ETCD_LISTEN_PEER_URLS": {
                      "defaultValue": "http://0.0.0.0:2380"
                    },
                    "ETCD_LISTEN_CLIENT_URLS": {
                      "defaultValue": "http://0.0.0.0:2379"
                    },
                    "ETCD_ADVERTISE_CLIENT_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2379"
                    },
                    "ETCD_INITIAL_CLUSTER_TOKEN": {
                      "defaultValue": "postgres-ha"
                    },
                    "ETCD_INITIAL_ADVERTISE_PEER_URLS": {
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:2380"
                    }
                  },
                  "clusterRole": "internal",
                  "volumeMounts": {
                    "f68ad14b-e8db-412e-88dc-19236194cd4c": {
                      "mountPath": "/var/lib/etcd",
                      "backupSchedules": null
                    }
                  },
                  "replicaConfig": {
                    "step": 2,
                    "scalable": true,
                    "maxReplicas": 7,
                    "minReplicas": 3
                  },
                  "clusterDisplay": {
                    "badge": "etcd",
                    "badgeVariant": "muted"
                  },
                  "parentServiceId": "Postgres-1"
                },
                "f7289e4d-7064-4b9b-be84-106f3d99bdda": {
                  "icon": "https://devicons.railway.app/postgres",
                  "name": "Postgres-2",
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ha/postgres-patroni:18",
                    "autoUpdates": {
                      "type": "vuln",
                      "tagMode": "sha",
                      "schedule": [
                        {
                          "day": 6,
                          "endHour": 24,
                          "startHour": 10
                        }
                      ]
                    }
                  },
                  "exposure": {
                    "5432": {
                      "variables": {
                        "DATABASE_PUBLIC_URL": {
                          "value": "postgres://${{Postgres-1.PGUSER}}:${{Postgres-1.PGPASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{Postgres-1.PGDATABASE}}"
                        }
                      }
                    }
                  },
                  "variables": {
                    "PGDATA": {
                      "defaultValue": "${{Postgres-1.PGDATA}}"
                    },
                    "PGHOST": {
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "defaultValue": "${{Postgres-1.PGPORT}}"
                    },
                    "PGUSER": {
                      "defaultValue": "${{Postgres-1.PGUSER}}"
                    },
                    "PGDATABASE": {
                      "defaultValue": "${{Postgres-1.PGDATABASE}}"
                    },
                    "PGPASSWORD": {
                      "defaultValue": "${{Postgres-1.PGPASSWORD}}"
                    },
                    "PATRONI_TTL": {
                      "defaultValue": "${{Postgres-1.PATRONI_TTL}}"
                    },
                    "POSTGRES_DB": {
                      "defaultValue": "${{Postgres-1.POSTGRES_DB}}"
                    },
                    "DATABASE_URL": {
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "PATRONI_NAME": {
                      "defaultValue": "postgres-2"
                    },
                    "PATRONI_SCOPE": {
                      "defaultValue": "${{Postgres-1.PATRONI_SCOPE}}"
                    },
                    "POSTGRES_USER": {
                      "defaultValue": "${{Postgres-1.POSTGRES_USER}}"
                    },
                    "SSL_CERT_DAYS": {
                      "defaultValue": "${{Postgres-1.SSL_CERT_DAYS}}"
                    },
                    "PATRONI_ENABLED": {
                      "defaultValue": "${{Postgres-1.PATRONI_ENABLED}}"
                    },
                    "PATRONI_API_PORT": {
                      "defaultValue": "${{Postgres-1.PATRONI_API_PORT}}"
                    },
                    "PATRONI_LOOP_WAIT": {
                      "defaultValue": "${{Postgres-1.PATRONI_LOOP_WAIT}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "defaultValue": "${{Postgres-1.POSTGRES_PASSWORD}}"
                    },
                    "PATRONI_ETCD3_HOSTS": {
                      "defaultValue": "${{Postgres-1.PATRONI_ETCD3_HOSTS}}"
                    },
                    "WATCHDOG_CURL_TIMEOUT": {
                      "defaultValue": "${{Postgres-1.WATCHDOG_CURL_TIMEOUT}}"
                    },
                    "PATRONI_WAIT_FOR_LEADER": {
                      "defaultValue": "true"
                    },
                    "PATRONI_RESTAPI_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_RESTAPI_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_SUPERUSER_PASSWORD}}"
                    },
                    "PATRONI_SUPERUSER_USERNAME": {
                      "defaultValue": "${{Postgres-1.PATRONI_SUPERUSER_USERNAME}}"
                    },
                    "PATRONI_REPLICATION_PASSWORD": {
                      "defaultValue": "${{Postgres-1.PATRONI_REPLICATION_PASSWORD}}"
                    },
                    "PATRONI_REPLICATION_USERNAME": {
                      "defaultValue": "${{Postgres-1.PATRONI_REPLICATION_USERNAME}}"
                    },
                    "WATCHDOG_CURL_CONNECT_TIMEOUT": {
                      "defaultValue": "${{Postgres-1.WATCHDOG_CURL_CONNECT_TIMEOUT}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "defaultValue": "${{Postgres-1.RAILWAY_DEPLOYMENT_DRAINING_SECONDS}}"
                    }
                  },
                  "clusterRole": "replica",
                  "volumeMounts": {
                    "f7289e4d-7064-4b9b-be84-106f3d99bdda": {
                      "mountPath": "/var/lib/postgresql/data",
                      "backupSchedules": [
                        "MONTHLY",
                        "WEEKLY",
                        "DAILY"
                      ]
                    }
                  },
                  "replicaConfig": {
                    "scalable": true,
                    "maxReplicas": 5,
                    "minReplicas": 2
                  },
                  "clusterDisplay": {
                    "badge": "Replica",
                    "badgeVariant": "secondary"
                  },
                  "parentServiceId": "Postgres-1"
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 7,
    "needs_volume": true
  },
  "generated_at": "2026-09-12T22:14:39.841Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-11T22:26:05.769Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_a4baffe2755e461a9441",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 91,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "Postgres HA"
  }
}
