Repository navigation
Expand file tree
/
Copy pathcompose.dev.yml
More file actions
130 lines (122 loc) · 3.4 KB
/
Copy pathcompose.dev.yml
File metadata and controls
130 lines (122 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# PgCloud - single host demo cluster
#
# db0 (primary) ──► db1, db2 (streaming replicas)
# ▲
# pgpool (load balancing, :5434)
# ▲
# pgbouncer (connection pooling, :6432)
#
# Quick start:
# cp .env.example .env # set real passwords
# docker compose up -d --build
# psql -h localhost -p 6432 -U u_pgcloud db_pgcloud # through pgbouncer -> pgpool
#
# Two-tier only (no pgbouncer): docker compose up -d db0 db1 db2 pgpool
#
# NOTE: this file runs every node on ONE machine, useful for development and
# evaluation. Automatic failover recovery (promote/redirect over SSH) is meant
# for multi-host deployments and is not wired up here.
x-db-common: &db-common
build:
context: .
dockerfile: docker/db/Dockerfile
image: pgcloud/db:dev
env_file: docker/db/.env.example # defaults, overridden below
stop_grace_period: 60s
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432 -U $${POSTGRES_USER}"]
interval: 5s
timeout: 3s
retries: 30
start_period: 30s
x-secrets: &secrets
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env (cp .env.example .env)}
REPLICA_PASS: ${REPLICA_PASS:?Set REPLICA_PASS in .env}
services:
db0:
<<: *db-common
environment:
<<: *secrets
NODE_ROLE: primary
BACKEND_NAME: node0
volumes:
- db0-data:/opt/pgdata
db1:
<<: *db-common
environment:
<<: *secrets
NODE_ROLE: replica
BACKEND_NAME: node1
PRIMARY_HOST: db0
PRIMARY_PORT: 5432
volumes:
- db1-data:/opt/pgdata
depends_on:
db0:
condition: service_healthy
db2:
<<: *db-common
environment:
<<: *secrets
NODE_ROLE: replica
BACKEND_NAME: node2
PRIMARY_HOST: db0
PRIMARY_PORT: 5432
volumes:
- db2-data:/opt/pgdata
depends_on:
db0:
condition: service_healthy
pgpool:
build:
context: .
dockerfile: docker/pgpool/Dockerfile
image: pgcloud/pgpool:dev
env_file: docker/pgpool/.env.example
environment:
<<: *secrets
PCP_PASS: ${PCP_PASS:?Set PCP_PASS in .env}
PGPOOL_HOST: pgpool
PGPOOL_NUM: 1 # single pgpool -> watchdog disabled
ENABLE_LOGFILE: "off" # log to stdout (docker compose logs pgpool)
volumes:
- ./compose/pgpool/postgres:/opt/pgcloud/conf/postgres:ro
- ./compose/pgpool/pgpool:/opt/pgcloud/conf/pgpool:ro
ports:
- "5434:5434"
healthcheck:
test: ["CMD-SHELL", "PGPASSWORD=$${POSTGRES_PASSWORD} psql -h 127.0.0.1 -p 5434 -U $${POSTGRES_USER} -d $${POSTGRES_DB} -Atc 'select 1'"]
interval: 5s
timeout: 3s
retries: 30
depends_on:
db0:
condition: service_healthy
db1:
condition: service_healthy
db2:
condition: service_healthy
pgbouncer:
build:
context: .
dockerfile: docker/pgbouncer/Dockerfile
image: pgcloud/pgbouncer:dev
env_file: docker/pgbouncer/.env.example
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
BACKEND_HOST: pgpool
BACKEND_PORT: 5434
ports:
- "6432:6432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 6432"]
interval: 5s
timeout: 3s
retries: 30
depends_on:
pgpool:
condition: service_healthy
volumes:
db0-data:
db1-data:
db2-data: