version: "3.8"

services:

  revolt-database:
    image: mongo
    container_name: revolt-database
    restart: always
    volumes:
      - ${APP_DATA_DIR}/data/db:/data/db
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # Redis server
  revolt-redis:
    image: eqalpha/keydb
    container_name: revolt-redis
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # S3-compatible storage server
  revolt-minio:
    image: minio/minio
    container_name: revolt-minio
    command: server /data
    volumes:
      - ${APP_DATA_DIR}/data/minio:/data
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}
  # Web App (revite)
  revolt-web:
    image: ghcr.io/revoltchat/client:master
    container_name: revolt-web
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # API server (delta)
  revolt-api:
    image: ghcr.io/revoltchat/server:20230810-3
    container_name: revolt-api
    depends_on:
      - revolt-database
      - revolt-redis
      - revolt
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # Events service (quark)
  revolt-events:
    image: ghcr.io/revoltchat/bonfire:20230810-3
    container_name: revolt-events
    depends_on:
      - revolt-database
      - revolt-redis
      - revolt
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # File server (autumn)
  revolt-autumn:
    image: ghcr.io/revoltchat/autumn:1.1.10
    container_name: revolt-autumn
    depends_on:
      - revolt-database
      - revolt-createbuckets
      - revolt
    restart: always
    networks:
      - tipi_main_network
    environment:
      # Container Specific 
      - AUTUMN_MONGO_URI=mongodb://revolt-database
      # Below is Standard Config
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # Metadata and image proxy (january)
  revolt-january:
    image: ghcr.io/revoltchat/january:master
    container_name: revolt-january
    depends_on:
      - revolt
    restart: always
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  # Create buckets for minio.
  revolt-createbuckets:
    image: minio/mc
    container_name: revolt-createbuckets
    depends_on:
      - revolt-minio
    entrypoint: >
      /bin/sh -c "
      while ! curl -s --output /dev/null --connect-timeout 1 http://revolt-minio:9000; do echo 'Waiting minio...' && sleep 0.1; done;
      /usr/bin/mc alias set minio http://revolt-minio:9000 minioautumn ${REVOLT_MINIO_ROOT_PASSWORD};
      /usr/bin/mc mb minio/attachments;
      /usr/bin/mc mb minio/avatars;
      /usr/bin/mc mb minio/backgrounds;
      /usr/bin/mc mb minio/icons;
      /usr/bin/mc mb minio/banners;
      /usr/bin/mc mb minio/emojis;
      exit 0;
      "
    networks:
      - tipi_main_network
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}

  revolt:
    image: caddy
    container_name: revolt
    restart: always
    environment:
      - MONGODB=mongodb://revolt-database
      - REDIS_URI=redis://revolt-redis/
      - HOSTNAME=:80
      - REVOLT_APP_URL=https://${APP_DOMAIN}
      - REVOLT_PUBLIC_URL=https://${APP_DOMAIN}/api
      - VITE_API_URL=https://${APP_DOMAIN}/api
      - REVOLT_EXTERNAL_WS_URL=wss://${APP_DOMAIN}/ws
      - AUTUMN_PUBLIC_URL=https://${APP_DOMAIN}/autumn
      - JANUARY_PUBLIC_URL=https://${APP_DOMAIN}/january
      - REVOLT_UNSAFE_NO_CAPTCHA=1
      - REVOLT_SMTP_HOST=${REVOLT_SMTP_HOST}
      - REVOLT_SMTP_USERNAME=${REVOLT_SMTP_USERNAME}
      - REVOLT_SMTP_PASSWORD=${REVOLT_SMTP_PASSWORD}
      - REVOLT_SMTP_FROM=${REVOLT_SMTP_FROM}
      - REVOLT_INVITE_ONLY=${REVOLT_INVITE_ONLY}
      - REVOLT_MAX_GROUP_SIZE=150
      - REVOLT_VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
      - REVOLT_VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
      - AUTUMN_S3_REGION=minio
      - AUTUMN_S3_ENDPOINT=http://revolt-minio:9000
      - MINIO_ROOT_USER=minioautumn
      - MINIO_ROOT_PASSWORD=${REVOLT_MINIO_ROOT_PASSWORD}
      - AWS_ACCESS_KEY_ID=${REVOLT_AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${REVOLT_AWS_SECRET_ACCESS_KEY}
    ports:
      - "${APP_PORT}:80"
      - "8273:443"
    volumes:
      - ${APP_DATA_DIR}/data/CaddyFiles:/etc/caddy/
      - ${APP_DATA_DIR}/data/caddy-data:/data
      - ${APP_DATA_DIR}/data/caddy-config:/config
    networks:
      - tipi_main_network
    labels:
      traefik.enable: ${APP_EXPOSED}
      traefik.http.routers.revolt.rule: Host(`${APP_DOMAIN}`)
      traefik.http.routers.revolt.entrypoints: websecure
      traefik.http.routers.revolt.service: revolt
      traefik.http.routers.revolt.tls.certresolver: myresolver
      traefik.http.services.revolt.loadbalancer.server.port: 80