Docker+traefik을 이용하는 경우 docker-compose.yaml 내용이다.
사용자 아이디, 암호와 같은 민감한 정보는 .env파일에 분리 보관하는 것이 좋다.
wiki-db:
image: postgres:15-alpine
container_name: wiki-db
restart: always
environment:
POSTGRES_DB: wikiprojs # 디비 이름 지정
POSTGRES_PASSWORD: 'wiki_password_123' # 원하는 비밀번호로 변경하세요
POSTGRES_USER: wikiuser # 사용자 이름 지정
volumes:
- /home/ubuntu/docker/wiki-db:/var/lib/postgresql/data
networks:
- app-network
wiki:
image: requarks/wiki:2
container_name: wiki
restart: always
depends_on:
- wiki-db
environment:
DB_TYPE: postgres
DB_HOST: wiki-db
DB_PORT: 5432
DB_USER: wikiuser # 사용자 이름 지정
DB_PASS: 'wiki_password_123' # 위 wiki-db의 비밀번호와 일치해야 합니다
DB_NAME: wikiprojs # 디비 이름 지정
networks:
- app-network
labels:
- "traefik.enable=true"
- "traefik.http.routers.wiki.rule=Host(`도메인주소`)"
- "traefik.http.routers.wiki.entrypoints=websecure"
- "traefik.http.routers.wiki.tls.certresolver=myresolver"
# Wiki.js의 기본 포트는 3000입니다.
- "traefik.http.services.wiki.loadbalancer.server.port=3000"
docker-compose.yaml 파일에 network, traefik도 설정이 되어 있어야 한다.
network
networks:
app-network:
driver: bridge
traefik
# === Traefik: 역방향 프록시 및 SSL 자동 발급 ===
traefik:
image: traefik:v3.3
container_name: traefik
restart: always
environment:
- DOCKER_API_VERSION=1.44
ports:
- "80:80"
- "443:443"
command:
# - "--log.level=DEBUG" # 상세 디버그 로그가 필요한 경우
- "--api.dashboard=true" # [활성화] 대시보드 기능 켬
- "--api.insecure=false"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
# [Nginx 80->443 리다이렉션 대체]
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
# Let's Encrypt 자동 갱신
- "--certificatesresolvers.myresolver.acme.httpchallenge=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.myresolver.acme.email=메일주소" # 메일주소
- "--certificatesresolvers.myresolver.acme.storage=/letsecrypt/acme.json"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/acme.json:/letsecrypt/acme.json
networks:
- app-network
labels:
- "traefik.enable=true"
# === 대시보드 전용 라우팅 설정 ===
- "traefik.http.routers.traefik-dash.rule=Host(`대시보드 도메인`)" # 대시보드 도메인
- "traefik.http.routers.traefik-dash.entrypoints=websecure"
- "traefik.http.routers.traefik-dash.tls.certresolver=myresolver"
# [중요] 대시보드는 내부 api@internal 서비스를 사용합니다.
- "traefik.http.routers.traefik-dash.service=api@internal"
# [보안] 기존에 만들어둔 아이디/비밀번호 인증 미들웨어 재사용
- "traefik.http.routers.traefik-dash.middlewares=netdata-auth"
# [미들웨어 1] WWW 리다이렉트
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https?://www\\.(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://$${1}"
# [미들웨어 2] 용량 제한 (10MB)
- "traefik.http.middlewares.limit-size.buffering.maxRequestBodyBytes=10485760"
postgres의 데이터 파일이 저장되는 위치를 바인딩 할 폴더를 만든다.
mkdir -p /home/ubuntu/docker/wiki-db
컨테이너가 실행중이라면 중지하고 다시 실행한다.
docker compose down
docker compose up -d