평화로운 하루가 될 예정이었으나 메모용으로 사용하던 MatterMost가 갑자기 작동이 안됩니다!?
사유는 간단한데 Docker image를 쉽게 업데이트하겠다고 WatchTower을 설치했는데 바로 이 놈 이 옛날 DB 컨테이너를 업데이트해버리는 기염을 토해버리고 그 다음에는 postgres 버전이 15 -> 17로 바뀌게 되었는데 문제는 마이그레이션이 안됩니다???
아니 당연히 되야하는거아닌가 라고 생각했지만 뭐 어쩌겠습니까 사고가 발생했는데
결론적으로는 쉽게 해결하는 방법이 있습니다.
굳이 NAS에서 해결하려고 하지말고 그냥 Simple하게 windows에서 작업하면 됩니다.
postgres 15을 windows에 설치하고 backup.sql를 만들어주면 됩니다.
이 과정에서 가장 중요한 것은 Userid / PW를 알으셔야하는데 Docker DB 컨테이너 환경 Path 보시면 알 수 있습니다.
또한 기존 DB를 windows postgres로 붙여 넣으실 텐데 이때 postgresql.conf에서 Posix?로 된 부분을 windows로 바꿔줘야합니다 이점은 윈도우 이벤트 뷰어를 확인하시면 됩니다.
이후 17을 설치하고 backup.sql를 불러와 복구해주면 마이그레이션은 됬지만 중요한 핵심이 있는데 바로 pg_hba.conf와 postgresql.conf 파일은 다시 기존파일로 덮어주셔야합니다 이유는 복구하였을때 작동 기준이 windows 설정되어 있기에 NAS에 맞게 바꿔줘야하는 작업입니다.
아래는 해결 과정중 사용한 Gemini의 가이드입니다.
Synology Docker PostgreSQL 버전 충돌, 윈도우 PC로 해결한 후기
안녕하세요! 오늘은 Synology NAS의 Docker 환경에서 Mattermost와 같은 서비스를 운영하다가 발생할 수 있는 치명적인 PostgreSQL 버전 충돌 문제를 해결한 경험을 공유하고자 합니다.
어느 날 갑자기 잘 사용하던 Mattermost 컨테이너가 업데이트 후 실행되지 않았습니다. 로그를 확인하니 아래와 같은 메시지가 반복되고 있었습니다.
FATAL: database files are incompatible with server The data directory was initialized by PostgreSQL version 15, which is not compatible with this server, version 17
원인은 간단했습니다. Docker 이미지의 :latest 태그를 사용하다 보니, 최신 버전의 이미지가 PostgreSQL 17을 사용하도록 업데이트되었고, 기존의 PostgreSQL 15 데이터와 호환되지 않게 된 것입니다.
Docker 환경에서 pg_upgrade를 실행하는 것은 매우 복잡하고 위험 부담이 컸기에, 저는 데이터를 Windows PC로 가져와 안전하게 업그레이드한 후 다시 Synology로 옮기는 방법을 선택했습니다.
🚀 문제 해결 여정: 5단계 요약
1단계: 데이터 구조 및 Windows로 환경 이전
가장 먼저 Synology File Station을 이용해 문제가 발생한 PostgreSQL 데이터 폴더 전체를 Windows PC의 특정 폴더(예: C:\pg_temp\data15)로 복사했습니다.
2단계: Windows에 구버전(PostgreSQL 15) 환경 구축
데이터를 업그레이드하려면 먼저 기존 데이터를 읽을 수 있는 환경이 필요합니다.
- Windows용 PostgreSQL 15를 공식 홈페이지에서 다운로드하여 설치했습니다.
- 설치 후 postgresql-15 서비스를 중지하고, C:\Program Files\PostgreSQL\15\data 폴더의 내용을 Synology에서 가져온 데이터로 완전히 교체했습니다.
3단계: Windows에서 마주한 난관들 (핵심!)
데이터를 교체하고 서비스를 시작하자 예상치 못한 문제들이 발생했습니다.
💥 난관 1: 서비스가 시작되자마자 중지되는 현상
원인: Linux와 Windows의 파일 권한 체계가 달라 발생한 문제였습니다. 해결: C:\Program Files\PostgreSQL\15\data 폴더의 [속성] > [보안] 탭에서 NETWORK SERVICE 사용자에게 **'모든 권한'**을 부여하여 해결했습니다.
💥 난관 2: FATAL: role "postgres" does not exist
원인: 서비스는 시작되었지만, Windows 이벤트 뷰어에 postgres 사용자가 없다는 치명적인 오류가 기록되었습니다. Mattermost 패키지가 기본 관리자(postgres) 없이 자체 사용자(mattermostuser)만 생성하여 사용하고 있었기 때문입니다. 해결: **'단일 사용자 모드'**라는 복구 모드를 사용해 postgres 사용자를 강제로 생성했습니다.
# 관리자 권한으로 cmd 실행 후
cd "C:\Program Files\PostgreSQL\15\bin"
postgres.exe --single -D "C:\Program Files\PostgreSQL\15\data"
# 커서가 깜빡이면 아래 명령어 입력
CREATE ROLE postgres WITH SUPERUSER LOGIN PASSWORD '임시비밀번호';
4단계: 데이터 백업 및 신버전(PostgreSQL 17)으로 복원
이제 데이터에 접근할 수 있게 되었으니, 본격적인 업그레이드를 진행했습니다.
- SQL Shell (psql)에 접속하여 실제 관리자 ID가 mattermostuser임을 확인했습니다.
- pg_dumpall 명령어를 이용해 모든 데이터를 하나의 .sql 파일로 백업했습니다.
- pg_dumpall.exe -U mattermostuser > "C:\pg_temp\backup.sql"
- 기존 PostgreSQL 15를 완전히 삭제하고, PostgreSQL 17을 새로 설치했습니다.
- 새로 설치된 PostgreSQL 17의 psql을 통해 백업해둔 backup.sql 파일을 복원했습니다.
5단계: 업그레이드된 데이터를 Synology로 복귀
Windows에서 성공적으로 업그레이드된 PostgreSQL 17의 data 폴더 내용 전체를 다시 Synology의 원래 위치로 복사했습니다.
🔧 후속 조치: Mattermost 연결 문제 해결
데이터를 옮긴 후 Mattermost 컨테이너를 실행하자 이번엔 데이터베이스 접속 오류 로그가 나타났습니다.
no pg_hba.conf entry for host "172.29.0.3"
원인: 데이터베이스 보안 설정 파일(pg_hba.conf)에 Mattermost 컨테이너의 내부 IP 접속을 허용하는 규칙이 없었기 때문입니다. 해결: Synology의 데이터 폴더에서 pg_hba.conf 파일을 열어 맨 아래에 아래 규칙을 추가하고 DB 컨테이너를 재시작하여 해결했습니다.
host mattermost mattermostuser 172.29.0.0/16 scram-sha-256
✨ 결론
Docker 환경에서 데이터베이스 메이저 버전 업그레이드는 항상 예기치 못한 문제를 동반할 수 있습니다. 이번 경험을 통해 몇 가지 중요한 교훈을 얻었습니다.
- :latest 태그의 위험성: 안정적인 운영을 위해서는 postgres:15-alpine과 같이 버전을 명확히 지정하는 것이 중요합니다.
- pg_dumpall의 강력함: pg_dumpall을 이용한 백업/복원은 가장 확실하고 안전한 메이저 버전 업그레이드 방법입니다.
- 로그 확인의 중요성: 서비스가 실행되지 않을 때는 반드시 이벤트 뷰어나 컨테이너 로그를 확인하여 정확한 원인을 파악해야 합니다.
조금 복잡한 여정이었지만, 이 글이 저와 비슷한 문제를 겪는 분들께 도움이 되기를 바랍니다.