https://docs.docker.com/engine/swarm/swarm-tutorial/
swarm
-----
| - manager (alpha) [8GB HDD1/, 32GB HDD2/data, 4 Cores, 6GB RAM]
| - worker (beta) [80GB HDD, 4 Cores, 8GB RAM]
| - worker (gamma) [80GB HDD, 4 Cores, 8GB RAM]
| - worker (delta) [80GB HDD, 4 Cores, 8GB RAM]
Pgbouncer and Postgres primary/replication Setup within docker swarm.
alpha.swarm$ docker node update --label-add type=primary alpha.swarm
version: "3.3"
services:
pgbouncer-primary:
hostname: 'pgbouncer-primary'
image: crunchydata/crunchy-pgbouncer:centos7-12.3-4.4.0
environment:
- PGBOUNCER_PASSWORD=passwd
- PG_SERVICE=pg-primary
ports:
- "6432:6432"
networks:
- pgnet
deploy:
placement:
constraints:
- node.labels.type == primary
- node.role == manager
pgbouncer-replica:
hostname: 'pgbouncer-replica'
image: crunchydata/crunchy-pgbouncer:centos7-12.3-4.4.0
environment:
- PGBOUNCER_PASSWORD=passwd
- PG_SERVICE=pg-replica
ports:
- "6433:6432"
networks:
- pgnet
deploy:
placement:
constraints:
- node.labels.type != primary
- node.role == worker
pg-primary:
hostname: 'pg-primary'
image: crunchydata/crunchy-postgres:centos7-12.3-4.4.0
environment:
- PGHOST=/tmp
- MAX_CONNECTIONS=100
- MAX_WAL_SENDERS=1
- TEMP_BUFFERS=9MB
- SHARED_BUFFERS=128MB
- WORK_MEM=5MB
- PG_MODE=primary
- PG_PRIMARY_USER=primaryuser
- PG_PRIMARY_PASSWORD=passwd
- PG_DATABASE=testdb
- PG_USER=testuser
- PG_PASSWORD=passwd
- PG_ROOT_PASSWORD=passwd
- PG_PRIMARY_PORT=5432
- PGBOUNCER_PASSWORD=passwd
volumes:
- pg-primary-vol:/pgdata
- ./configs:/pgconf
ports:
- "5432:5432"
networks:
- pgnet
deploy:
placement:
constraints:
- node.labels.type == primary
- node.role == manager
pg-replica:
hostname: 'pg-replica'
image: crunchydata/crunchy-postgres:centos7-12.3-4.4.0
environment:
- PGHOST=/tmp
- MAX_CONNECTIONS=100
- MAX_WAL_SENDERS=1
- TEMP_BUFFERS=9MB
- SHARED_BUFFERS=128MB
- WORK_MEM=5MB
- PG_MODE=replica
- PG_PRIMARY_HOST=pg-primary
- PG_PRIMARY_PORT=5432
- PG_PRIMARY_USER=primaryuser
- PG_PRIMARY_PASSWORD=passwd
- PG_DATABASE=testdb
- PG_USER=testuser
- PG_PASSWORD=passwd
- PG_ROOT_PASSWORD=passwd
- PG_BOUNCER_PASSWORD=passwd
volumes:
- pg-replica-vol:/pgdata
ports:
- "5433:5432"
networks:
- pgnet
deploy:
placement:
constraints:
- node.labels.type != master
- node.role == worker
networks:
pgnet:
volumes:
pg-primary-vol:
pg-replica-vol:
alpha.swarm$ docker stack deploy --compose-file ./docker-compose.yml pg-stack
alpha.swarm$ docker exec -it [pg-primary] psql -U postgres -x -c 'table pg_stat_replication' postgres
alpha.swarm$ docker exec -it [pg-primary] bash
[pg-primary]$ psql
[pg-primary]$ postgres=# create user wikijs_user with encrypted password 'wikijs_user_passwd';
[pg-primary]$ postgres=# create database wikijs with owner wikijs_user;
[pg-primary]$ postgres=# grant all privileges on database wikijs to wikijs_user;
version: "3.3"
services:
wiki:
image: requarks/wiki:2
environment:
DB_TYPE: postgres
DB_HOST: pgbouncer-primary
DB_PORT: 6432
DB_USER: wikijs_user
DB_PASS: wikijs_user_passwd
DB_NAME: wikijs
restart: unless-stopped
ports:
- "8081:3000"
networks:
default:
external:
name: pg-stack_pgnet
alpha.swarm$ docker stack deploy --compose-file ./docker-compose.yml wikijs
alpha.swarm$ docker service scale wikijs_wiki=2
version: "3.3"
services:
pgadmin:
hostname: 'pg-admin'
image: crunchydata/crunchy-pgadmin4:centos7-12.3-4.4.0
environment:
PGADMIN_SETUP_EMAIL: [email protected]
PGADMIN_SETUP_PASSWORD: passwd
SERVER_PORT: 5050
restart: unless-stopped
ports:
- "5050:5050"
volumes:
- pg-admin-data:/var/lib/pgadmin:z
deploy:
replicas: 4
volumes:
pg-admin-data:
driver: local
networks:
default:
external:
name: pg-stack_pgnet
alpha.swarm$ docker stack deploy --compose-file ./docker-compose.yml pg-service
[pg-primary]$ create user pgadmin with encrypted password 'passwd'
[pg-primary]$ alter user pgadmin with superuser;
[pg-primary]$ alter user pgadmin with createdb;
version: "3.3"
services:
postfix:
hostname: smtp
image: boky/postfix
environment:
RELAYHOST: mail.example.org
ALLOWED_SENDER_DOMAINS: example.org
RELAYHOST_USERNAME: [email protected]
RELAYHOST_PASSWORD: passwd
MYNETWORKS: 127.0.0.0/8, 172.0.0.0/8, 10.0.0.0/8
restart: unless-stopped
ports:
- "1587:587"
deploy:
placement:
constraints:
- node.labels.type == primary
- node.role == manager
networks:
default:
external:
name: pg-stack_pgnet
alpha.swarm$ docker stack deploy --compose-file ./docker-compose.yml pg-service
NOTE: wiki.js mail will not work with the hostname (smtp). Instead use the container public IP (e.g. 10.0.7.12).