version: "3.9"

# based on an example found here: https://jonnev.se/matrix-homeserver-with-docker/

services:
  nginx:
    image: nginx:1.15-alpine
    restart: unless-stopped
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/www:/etc/www:ro
    ports:
      - "80:80"
      - "443:443"
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
  # the certbot container won't start unless asked (like if we're renewing a cert)
  certbot:
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    profiles:
      - cert_renew  # don't start this container unless explicitly asked

  postgres:
    image: arm32v7/postgres:12.5  # postgres:12.5 on x86_64
    user: 1000:1000
    restart: unless-stopped
    networks:
      - synapse
    volumes:
     - ./data/postgres:/var/lib/postgresql/data
    environment:
     - POSTGRES_PASSWORD=some password
     - POSTGRES_USER=synapse
     - POSTGRES_INITDB_ARGS=--locale C --encoding UTF8
  synapse:
    image: matrixdotorg/synapse:v1.26.0  # later tags are recommended for x86_64
    restart: unless-stopped
    depends_on:
     - postgres
    networks:
      - default
      - synapse
    volumes:
     - ./data/synapse:/data
    environment:
     - UID=1000
     - GID=1000

  maubot:
    image: kylrth/maubot:latest  # dock.mau.dev/maubot/maubot:latest on x86_64
    restart: unless-stopped
    depends_on:
      - synapse
    volumes:
     - ./data/maubot:/data:z
    environment:
     - UID=1000
     - GID=1000

  registration:
    image: kylrth/matrix-registration  # zeratax/matrix-registration:v0.9.1 on x86_64
    restart: unless-stopped
    depends_on:
      - synapse
    volumes:
     - ./data/registration:/data
    user: 1000:1000
    command: serve

networks:
  synapse: