Skip to main content

Running with Docker, Caddy and Traefik

This guide will hopefully serve as a starting point in helping you set up chibisafe using Docker Compose with Caddy and Traefik for HTTPS support.

Prerequisites​

You need to have Docker and Docker Compose installed on your system before proceeding any further, as this guide already assumes they are.

Directory Structure​

Ensure you have the following directory structure:

/path/to/chibisafe
├── Caddyfile
└── docker-compose.yml
/path/to/traefik
└── docker-compose.yml
chibisafe/docker-compose.yml
services:
chibisafe:
image: chibisafe/chibisafe:latest
environment:
- BASE_API_URL=http://chibisafe_server:8000
expose:
- 8001
restart: unless-stopped
networks:
- internal
chibisafe_server:
image: chibisafe/chibisafe-server:latest
volumes:
- ./database:/app/database:rw
- ./uploads:/app/uploads:rw
- ./logs:/app/logs:rw
expose:
- 8000
restart: unless-stopped
networks:
- internal
caddy:
image: caddy:2-alpine
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./uploads:/app/uploads:ro
expose:
- 80
environment:
- BASE_URL=":80"
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.caddy.rule=Host(`your-domain-name.com`)"
- "traefik.http.routers.caddy.entrypoints=https"
- "traefik.http.routers.caddy.tls.certresolver=le"
networks:
- traefik_web
- internal
networks:
traefik_web:
external: true
internal:
external: false
chibisafe/Caddyfile
{$BASE_URL} {
route {
file_server * {
root /app/uploads
pass_thru
}
@api path /api/*
reverse_proxy @api http://chibisafe_server:8000 {
header_up Host {http.reverse_proxy.upstream.hostport}
header_up X-Real-IP {http.request.header.X-Real-IP}
}
@docs path /docs*
reverse_proxy @docs http://chibisafe_server:8000 {
header_up Host {http.reverse_proxy.upstream.hostport}
header_up X-Real-IP {http.request.header.X-Real-IP}
}
reverse_proxy http://chibisafe:8001 {
header_up Host {http.reverse_proxy.upstream.hostport}
header_up X-Real-IP {http.request.header.X-Real-IP}
}
}
}
/path/to/traefik/docker-compose.yml
services:
traefik:
image: traefik:v2.11
container_name: "traefik"
restart: always
command:

- "--api.insecure=true"
- "--providers.docker"
- "--providers.docker.exposedByDefault=false"
- "--providers.docker.network=traefik_web"
- "--entrypoints.http.address=:80"
- "--entrypoints.http.http.redirections.entrypoint.to=https"
- "--entrypoints.http.http.redirections.entrypoint.scheme=https"
- "--entrypoints.https.address=:443"
- "--entrypoints.https.http.tls.certResolver=le"
- "--certificatesresolvers.le.acme.tlschallenge=true"
- "[email protected]"
- "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- traefik_web
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.your-domain-name.com`)"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.tls.certResolver=le"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik.loadbalancer.server.port=8080"

networks:
traefik_web:
external: true

Run​

docker network create traefik_web
cd /path/to/traefik
docker-compose up -d
cd /path/to/chibisafe
docker-compose up -d