Uptime Kuma Kubernetes 환경 운영 및 SQLite → MariaDB 마이그레이션
- Kubernetes 환경에서 Uptime Kuma를 운영하려면 외부 DB(MariaDB/MySQL) 연결이 필요합니다.
- SQLite → MariaDB 마이그레이션 절차를 정리합니다.
- Kubernetes에서 외부 DB 자동 연결은
.env파일로 관리합니다.
문제/상황
Uptime Kuma(이하 Kuma)는 기본적으로 SQLite를 저장소로 사용합니다. SQLite는 로컬 디스크(컨테이너 내부)에 파일로 저장되기 때문에, Kubernetes 환경에서는 파드 재생성 시 데이터 유실 위험이 있습니다.
기존 Docker/Compose 또는 직접 실행 방식에서 Kubernetes로 이전할 때 이 부분을 어떻게 처리할지가 핵심 이슈였습니다.
해결 방법 / 개요
이 글에서는 아래 내용을 정리합니다.
- SQLite 백업(노드 마운트) 방식의 한계와 포기 이유
- SQLite → MariaDB/MySQL 마이그레이션 절차
- Kubernetes 환경에서 외부 DB 연결 구성
Kuma DB 비교
| 항목 | SQLite | MariaDB/MySQL |
|---|---|---|
| 설치/운영 | 간단 (무설치) | 별도 서버/컨테이너 필요 |
| 확장성 | 단일 인스턴스 중심 | 다중 인스턴스/수평 확장 유리 |
| 내구성 | 로컬 파일 의존 | 외부 DB로 내구성 확보 |
| 백업 | 파일 백업 (잠금 주의) | mysqldump/스냅샷 등 다양 |
| 장애 복구 | 파일 복원 | RPO/RTO 설계 용이 |
1. SQLite 백업 (노드 마운트) 시도 → 보류
1-1) 전략
파드 삭제 시 {path}/data/kuma.db가 유실되므로, 저장 수준을 파드가 아닌 노드 디스크 또는 외부 스토리지로 올리는 방안을 검토했습니다.
1-2) 한계
노드 마운트 방식
- 워커 노드가 여러 개인 경우, 어떤 노드에 마운트할지 매 배포마다 수동 지정이 필요
- 특정 노드로만 배포되도록 고정하거나, 환경(prd/dev/stg)별 분기 설정이 추가로 필요
- 표준 CI/CD 흐름을 너무 많이 벗어나야 하는 구조
외부 스토리지(S3 등) 방식
- 네트워크 트래픽 및 Data transfer 비용 발생 가능
- cron 스케줄 백업이라면 파드 종료 시점과 맞지 않아 유실 구간 존재
1-3) 결론
Kubernetes 환경에서 Kuma를 안정적으로 운영하려면, SQLite 대신 외부 DB에 연동하는 방식이 가장 현실적입니다.
2. SQLite → MariaDB/MySQL 마이그레이션
2-1) 전략
기존 SQLite에 저장된 Kuma 데이터를 MariaDB/MySQL로 이관합니다.
2-2) SQLite 데이터 백업
cd ${uptime-kuma-path}
cp -r ./data ./backup-data
2-3) 무결성 검증
docker run --rm -v ./data:/data nouchka/sqlite3 \
sh -lc 'sqlite3 /data/kuma.db "PRAGMA integrity_check; PRAGMA wal_checkpoint(TRUNCATE); VACUUM;"'
2-4) MariaDB 연결 정보 구성
UPTIME_KUMA_DB_TYPE=mariadb
UPTIME_KUMA_DB_HOSTNAME=<DB_HOST>
UPTIME_KUMA_DB_PORT=<DB_PORT>
UPTIME_KUMA_DB_NAME=<DB_NAME>
UPTIME_KUMA_DB_USERNAME=<DB_USER>
UPTIME_KUMA_DB_PASSWORD=<DB_PASSWORD>
2-5) DB 최초 연결 (schema 자동 생성)
Kuma를 위 환경변수로 실행하면 최초 연결 시 schema가 자동 생성됩니다. (UI에서 진행해도 동일한 결과)
최초 연결 후 Kuma를 종료(ctrl + c)합니다.
2-6) 데이터 이관 (sqlite3-to-mysql)
Python sqlite3-to-mysql 라이브러리를 사용합니다.
# SQLite 파일 위치 이동
cd {path}/data
ls -l ./kuma.db
# 가상환경 구성 및 라이브러리 설치
python3 -m venv .venv && source .venv/bin/activate
pip install -U pip sqlite3-to-mysql
부모 테이블 먼저 이관
sqlite3mysql \
--sqlite-file ./kuma.db \
--mysql-host <DB_HOST> --mysql-port <DB_PORT> \
--mysql-database <DB_NAME> --mysql-user <DB_USER> --mysql-password '<DB_PASSWORD>' \
--mysql-skip-create-tables --ignore-duplicate-keys -W \
--sqlite-tables user,notification,monitor,tag,proxy,docker_host,"group",group_monitor,maintenance,incident,maintenance_notification
전체 테이블 이관
sqlite3mysql \
--sqlite-file ./kuma.db \
--mysql-host <DB_HOST> --mysql-port <DB_PORT> \
--mysql-database <DB_NAME> --mysql-user <DB_USER> --mysql-password '<DB_PASSWORD>' \
--mysql-skip-create-tables --without-foreign-keys --ignore-duplicate-keys -W
참고:
- 데이터를 1줄씩 insert하는 방식이므로 네트워크가 다르면 매우 느림
- 같은 네트워크 환경에서 진행 후 업로드하는 것이 현실적
- 예시: 60만 rows 기준 → 외부 네트워크 17시간 vs 동일 네트워크 3분
--chunk 10000옵션을 추가하면 속도가 개선될 수 있음
3. Kubernetes 환경에서 외부 DB 연결 구성
파드가 재시작되더라도 항상 외부 DB에 연결될 수 있도록, 프로젝트 루트 디렉토리에 .env 파일을 구성합니다.
UPTIME_KUMA_DB_TYPE=mariadb
UPTIME_KUMA_DB_HOSTNAME=<DB_HOST>
UPTIME_KUMA_DB_PORT=<DB_PORT>
UPTIME_KUMA_DB_NAME=<DB_NAME>
UPTIME_KUMA_DB_USERNAME=<DB_USER>
UPTIME_KUMA_DB_PASSWORD=<DB_PASSWORD>
UPTIME_KUMA_DATA_PATH=<DATA_PATH>
이 .env 파일이 있으면 파드 재생성 시에도 자동으로 외부 DB에 연결됩니다.
정리
| 항목 | 내용 |
|---|---|
| SQLite 유지 | Kubernetes 환경에서 권장하지 않음 |
| 노드 마운트 | CI/CD 흐름 복잡도 증가로 비효율 |
| 외부 DB 전환 | 가장 안정적인 운영 구조 |
| 마이그레이션 | sqlite3-to-mysql 사용, 동일 네트워크 환경 권장 |
| Kubernetes 구성 | 루트 .env 파일로 외부 DB 자동 연결 |