# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: etcd5 (for PostgreSQL HA)
spec:
    description: |
        Add the 5th etcd node to expand your PostgreSQL HA cluster to 5 nodes for maximum fault tolerance.
    coverImage: https://raw.githubusercontent.com/canyugs/zeabur-template/refs/heads/main/postgresql-ha/etcd.webp
    icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/etcd/icon/color/etcd-icon-color.svg
    tags:
        - Database
        - etcd
        - Distributed System
        - High Availability
    readme: |
        # etcd5 (5th Node for PostgreSQL HA)

        ## Step 1: Register Node

        ```bash
        curl -X POST http://etcd1:2379/v3/cluster/member/add -d '{"peerURLs":["http://etcd5:2380"]}'
        ```

        ## Step 2: Deploy & Verify

        Deploy this template, then verify:

        ```bash
        curl -X POST http://etcd1:2379/v3/cluster/member/list
        ```

        ## Step 3: Update Patroni (Recommended)

        Update `ETCD3_HOSTS` in all Patroni services to include all nodes:

        ```
        etcd1:2379,etcd2:2379,etcd3:2379,etcd4:2379,etcd5:2379
        ```
    services:
        - name: etcd5
          icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/etcd/icon/color/etcd-icon-color.svg
          template: PREBUILT_V2
          spec:
            source:
                image: gcr.io/etcd-development/etcd:v3.6.6
            ports:
                - id: client
                  port: 2379
                  type: TCP
                - id: peer
                  port: 2380
                  type: TCP
                - id: metrics
                  port: 2381
                  type: HTTP
            volumes:
                - id: data
                  dir: /etcd-data
            instructions:
                - title: Client Endpoint
                  content: http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}
                - title: List Members
                  content: curl -X POST http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/v3/cluster/member/list
                - title: Add Member (replace service name)
                  content: curl -X POST http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/v3/cluster/member/add -d '{"peerURLs":["http://etcd6:2380"]}'
                - title: Delete Member (replace member-id)
                  content: curl -X POST http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/v3/cluster/member/remove -d '{"ID":"<member-id>"}'
                - title: Cluster Health
                  content: curl http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/health
                - title: Put Key (test=hello)
                  content: curl -X POST http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/v3/kv/put -d '{"key":"dGVzdA==","value":"aGVsbG8="}'
                - title: Get Key (test)
                  content: curl -X POST http://${PORT_FORWARDED_HOSTNAME}:${CLIENT_PORT_FORWARDED_PORT}/v3/kv/range -d '{"key":"dGVzdA=="}'
            env:
                ETCD_ADVERTISE_CLIENT_URLS:
                    default: http://etcd5:2379
                ETCD_DATA_DIR:
                    default: /etcd-data
                ETCD_INITIAL_ADVERTISE_PEER_URLS:
                    default: http://etcd5:2380
                ETCD_INITIAL_CLUSTER:
                    default: etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380,etcd4=http://etcd4:2380,etcd5=http://etcd5:2380
                ETCD_INITIAL_CLUSTER_STATE:
                    default: existing
                ETCD_INITIAL_CLUSTER_TOKEN:
                    default: etcd-cluster-pg-ha
                ETCD_LISTEN_CLIENT_URLS:
                    default: http://0.0.0.0:2379
                ETCD_LISTEN_METRICS_URLS:
                    default: http://0.0.0.0:2381
                ETCD_LISTEN_PEER_URLS:
                    default: http://0.0.0.0:2380
                ETCD_NAME:
                    default: etcd5
