Skip to content

Instantly share code, notes, and snippets.

@exiguus
Created August 3, 2020 07:33
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save exiguus/41d96c990d7674984cbdd0b3962118db to your computer and use it in GitHub Desktop.
Save exiguus/41d96c990d7674984cbdd0b3962118db to your computer and use it in GitHub Desktop.
Docker Swarm with wiki.js and PgBouncer

Docker: Wiki.js and PostgreSQL

Docker Swarm

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]

Postgres Cluster

Pgbouncer and Postgres primary/replication Setup within docker swarm.

alpha.swarm$ docker node update --label-add type=primary alpha.swarm

docker stash/compose

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

Postgres Clients

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;

Postgres Cluster Client

Wiki.js Service

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

Extras

pgadmin

version: "3.3"
services:
  pgadmin:
    hostname: 'pg-admin'
    image: crunchydata/crunchy-pgadmin4:centos7-12.3-4.4.0
    environment:
      PGADMIN_SETUP_EMAIL: pgadmin@example.org
      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;

SMTP

version: "3.3"
services:
  postfix:
    hostname: smtp
    image: boky/postfix
    environment:
      RELAYHOST: mail.example.org
      ALLOWED_SENDER_DOMAINS: example.org
      RELAYHOST_USERNAME: webmail@example.org
      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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment