매일 새벽 4시에 컨테이너 이미지를 확인해 갱신하고 텔레그램으로 보고한다.
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Seoul
- WATCHTOWER_SCHEDULE=0 0 4 * * *
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATIONS_LEVEL=info
- WATCHTOWER_NOTIFICATION_URL=telegram://<봇토큰>@telegram?chats=<채팅ID>
- WATCHTOWER_DISABLE_CONTAINERS=vaultwarden adguardhome nginx-proxy-manager nginx-proxy-manager-db memos memo-notify portainer homepage uptime-kuma jellyfin paperless paperless-redis beszel beszel-agent wikijs wikijs-db
① 데이터를 마이그레이션하는가 — DB 스키마가 바뀌면 롤백해도 원복되지 않는다
② 죽으면 다른 게 같이 죽는가 — AdGuard(집 인터넷), NPM(모든 외부 접속)
③ 잃으면 복구가 불가능한가 — Vaultwarden(비밀번호)
| 자동 업데이트 | 대상 |
|---|---|
| ❌ 절대 금지 | vaultwarden, adguardhome, nginx-proxy-manager(+db), memos, paperless(+redis), wikijs(+db) |
| ⚠️ 수동 권장 | portainer, homepage, uptime-kuma, jellyfin |
| ✅ 허용 | it-tools, scrutiny, navidrome, memo-notify, beszel(+agent) |
처음 제외 목록을 만들 때 nginx-proxy-manager 만 넣고
nginx-proxy-manager-db 를 빠뜨렸다. MariaDB 메이저 버전이 자동으로 올라가면
데이터 디렉터리를 읽지 못해 서비스가 통째로 죽는다.
*-db, *-redis, *-postgres 로 끝나는 컨테이너는 반드시 함께 넣는다.
WATCHTOWER_DISABLE_CONTAINERS 는 이름이 정확히 일치해야 제외된다.
오타가 있으면 에러 없이 조용히 감시 대상에 포함된다.
sudo docker ps --format "{{.Names}}" # 실제 이름과 한 글자씩 대조
sudo docker logs watchtower --tail 30 # 감시 대상 개수 확인
전체 개수에서 제외한 만큼 줄었는지 확인할 것.
true 면 옛 이미지를 지워 디스크를 아끼지만 업데이트가 잘못돼도 되돌릴 이미지가 없다.
백업이 갖춰지기 전에는 false 를 고려할 것. 디스크는 1.9TB 남아 있어 부담이 없다.
정리는 필요할 때 수동으로:
sudo docker image prune -af
지금은 블랙리스트(막을 것을 나열)라, 새 컨테이너를 추가하면 기본이 "자동 업데이트"다.
화이트리스트로 바꾸면 실수가 원천 차단된다.
- WATCHTOWER_LABEL_ENABLE=true
그리고 허용할 컨테이너에만:
labels:
com.centurylinklabs.watchtower.enable: "true"
업데이트를 자동으로 하지 않고 알림만 받는 방식. 마이그레이션이 있는 앱이 많으면
이쪽이 안전하다. RAM 20MB.