#
# Docker service definitions for the aurweb project.
#
# Notable services:
#   - `sharness` - Run sharness test suites
#   - `pytest-mysql` - Run pytest suites with MariaDB
#   - `pytest-sqlite` - Run pytest suites with SQLite
#   - `test` - Run sharness, pytest-mysql and pytest-sqlite
#   - `mariadb` - `port 13306` - MariaDB server for docker
#   - `ca` - Certificate Authority generation
#   - `git` - `port 2222` - Git over SSH server
#   - `fastapi` - hypercorn service for aurweb's FastAPI app
#   - `nginx` - `port 8444 (FastAPI)
#     - You can reach `nginx` via FastAPI at `https://localhost:8444/`.
#       CGit can be reached via the `/cgit/` request uri on either server.
#
# Copyright (C) 2021 aurweb Development
# All Rights Reserved.
version: "3.8"

services:
  aurweb-image:
    build: .
    image: aurweb:latest

  ca:
    image: aurweb:latest
    init: true
    entrypoint: /docker/ca-entrypoint.sh
    command: /docker/scripts/run-ca.sh
    healthcheck:
      test: "bash /docker/health/ca.sh"
      interval: 3s
    volumes:
      - step:/root/.step

  redis:
    image: aurweb:latest
    init: true
    entrypoint: /docker/redis-entrypoint.sh
    command: /docker/scripts/run-redis.sh
    healthcheck:
      test: "bash /docker/health/redis.sh"
      interval: 3s
    ports:
      - "127.0.0.1:16379:6379"

  mariadb:
    image: aurweb:latest
    init: true
    entrypoint: /docker/mariadb-entrypoint.sh
    command: /usr/bin/mysqld_safe --datadir=/var/lib/mysql
    ports:
      # This will expose mariadbd on 127.0.0.1:13306 in the host.
      # Ex: `mysql -uaur -paur -h 127.0.0.1 -P 13306 aurweb`
      - "127.0.0.1:13306:3306"
    volumes:
      - mariadb_run:/var/run/mysqld # Bind socket in this volume.
      - mariadb_data:/var/lib/mysql
    healthcheck:
      test: "bash /docker/health/mariadb.sh"
      interval: 3s

  mariadb_init:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG_IMMUTABLE=${AUR_CONFIG_IMMUTABLE:-0}
    entrypoint: /docker/mariadb-init-entrypoint.sh
    command: echo "MariaDB tables initialized."
    volumes:
      - mariadb_run:/var/run/mysqld
    depends_on:
      mariadb:
        condition: service_healthy

  mariadb_test:
    # Test database.
    image: aurweb:latest
    init: true
    environment:
      - MARIADB_PRIVILEGED=1
    entrypoint: /docker/mariadb-entrypoint.sh
    command: /usr/bin/mysqld_safe --datadir=/var/lib/mysql
    ports:
      # This will expose mariadbd on 127.0.0.1:13307 in the host.
      # Ex: `mysql -uaur -paur -h 127.0.0.1 -P 13306 aurweb`
      - "127.0.0.1:13307:3306"
    volumes:
      - mariadb_test_run:/var/run/mysqld # Bind socket in this volume.
    healthcheck:
      test: "bash /docker/health/mariadb.sh"
      interval: 3s

  git:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=/aurweb/conf/config
      - SSH_CMDLINE=${SSH_CMDLINE:-ssh ssh://aur@localhost:2222}
      - AUR_CONFIG_IMMUTABLE=${AUR_CONFIG_IMMUTABLE:-0}
    entrypoint: /docker/git-entrypoint.sh
    command: /docker/scripts/run-sshd.sh
    ports:
      - "2222:2222"
    healthcheck:
      test: "bash /docker/health/sshd.sh"
      interval: 3s
    depends_on:
      mariadb_init:
        condition: service_started
    volumes:
      - mariadb_run:/var/run/mysqld

  smartgit:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=/aurweb/conf/config
    entrypoint: /docker/smartgit-entrypoint.sh
    command: /docker/scripts/run-smartgit.sh
    healthcheck:
      test: "bash /docker/health/smartgit.sh"
      interval: 3s

  cgit-fastapi:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=/aurweb/conf/config
      - CGIT_CLONE_PREFIX=${AURWEB_FASTAPI_PREFIX}
      - CGIT_CSS=/static/css/cgit.css
    entrypoint: /docker/cgit-entrypoint.sh
    command: /docker/scripts/run-cgit.sh 3000
    healthcheck:
      test: "bash /docker/health/cgit.sh 3000"
      interval: 3s
    depends_on:
      git:
        condition: service_healthy
    ports:
      - "127.0.0.1:13001:3000"
    volumes:
      - git_data:/aurweb/aur.git

  cron:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=/aurweb/conf/config
      - AUR_CONFIG_IMMUTABLE=${AUR_CONFIG_IMMUTABLE:-0}
    entrypoint: /docker/cron-entrypoint.sh
    command: /docker/scripts/run-cron.sh
    depends_on:
      mariadb_init:
        condition: service_started
    volumes:
      - ./aurweb:/aurweb/aurweb
      - mariadb_run:/var/run/mysqld
      - archives:/var/lib/aurweb/archives

  fastapi:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=conf/config
      - FASTAPI_BACKEND=${FASTAPI_BACKEND}
      - FASTAPI_WORKERS=${FASTAPI_WORKERS}
      - AURWEB_FASTAPI_PREFIX=${AURWEB_FASTAPI_PREFIX}
      - AURWEB_SSHD_PREFIX=${AURWEB_SSHD_PREFIX}
      - PROMETHEUS_MULTIPROC_DIR=/tmp_prometheus
      - AUR_CONFIG_IMMUTABLE=${AUR_CONFIG_IMMUTABLE:-0}
    entrypoint: /docker/fastapi-entrypoint.sh
    command: /docker/scripts/run-fastapi.sh "${FASTAPI_BACKEND}"
    healthcheck:
      test: "bash /docker/health/fastapi.sh ${FASTAPI_BACKEND}"
      interval: 3s
    depends_on:
      git:
        condition: service_healthy
      redis:
        condition: service_healthy
      cron:
        condition: service_started
    volumes:
      - archives:/var/lib/aurweb/archives
      - mariadb_run:/var/run/mysqld
    ports:
      - "127.0.0.1:18000:8000"

  nginx:
    image: aurweb:latest
    init: true
    environment:
      - AUR_CONFIG=conf/config
    entrypoint: /docker/nginx-entrypoint.sh
    command: /docker/scripts/run-nginx.sh
    ports:
      - "127.0.0.1:8444:8444" # FastAPI
    healthcheck:
      test: "bash /docker/health/nginx.sh"
      interval: 3s
    depends_on:
      ca:
        condition: service_healthy
      cgit-fastapi:
        condition: service_healthy
      smartgit:
        condition: service_healthy
      fastapi:
        condition: service_healthy

  sharness:
    image: aurweb:latest
    profiles: ["dev"]
    init: true
    environment:
      - AUR_CONFIG=conf/config.sqlite
      - LOG_CONFIG=logging.test.conf
    entrypoint: /docker/sharness-entrypoint.sh
    command: /docker/scripts/run-sharness.sh
    stdin_open: true
    tty: true
    depends_on:
      mariadb_test:
        condition: service_healthy
    volumes:
      - ./data:/data
      - ./aurweb:/aurweb/aurweb
      - ./migrations:/aurweb/migrations
      - ./test:/aurweb/test
      - ./templates:/aurweb/templates

  pytest-mysql:
    image: aurweb:latest
    profiles: ["dev"]
    init: true
    environment:
      - AUR_CONFIG=conf/config
      - TEST_RECURSION_LIMIT=${TEST_RECURSION_LIMIT}
      - PROMETHEUS_MULTIPROC_DIR=/tmp_prometheus
      - LOG_CONFIG=logging.test.conf
    entrypoint: /docker/test-mysql-entrypoint.sh
    command: /docker/scripts/run-pytests.sh clean
    stdin_open: true
    tty: true
    depends_on:
      mariadb_test:
        condition: service_healthy
    tmpfs:
      - /tmp
    volumes:
      - mariadb_test_run:/var/run/mysqld
      - ./data:/data
      - ./aurweb:/aurweb/aurweb
      - ./migrations:/aurweb/migrations
      - ./test:/aurweb/test
      - ./templates:/aurweb/templates

  test:
    image: aurweb:latest
    profiles: ["dev"]
    init: true
    environment:
      - AUR_CONFIG=conf/config
      - TEST_RECURSION_LIMIT=${TEST_RECURSION_LIMIT}
      - PROMETHEUS_MULTIPROC_DIR=/tmp_prometheus
      - LOG_CONFIG=logging.test.conf
    entrypoint: /docker/test-mysql-entrypoint.sh
    command: /docker/scripts/run-tests.sh
    stdin_open: true
    tty: true
    depends_on:
      mariadb_test:
        condition: service_healthy
    volumes:
      - mariadb_test_run:/var/run/mysqld
      - ./data:/data
      - ./aurweb:/aurweb/aurweb
      - ./migrations:/aurweb/migrations
      - ./test:/aurweb/test
      - ./templates:/aurweb/templates

volumes:
  mariadb_test_run: {}
  mariadb_run: {} # Share /var/run/mysqld/mysqld.sock
  mariadb_data: {} # Share /var/lib/mysql
  git_data: {} # Share aurweb/aur.git
  smartgit_run: {}
  archives: {}
  step: {}
