"이미지 태그만 바꾸면 되는가" 에 대한 답은 "아니다" 다. Redmine 은 Rails 애플리케이션이라 버전이 올라가면 데이터베이스 스키마가 바뀐다. 마이그레이션 없이 새 이미지를 띄우면 화면이 500 오류를 내거나, 더 나쁘게는 일부 기능만 조용히 어긋난 상태로 돈다.
되돌릴 수 없는 단계가 뒤에 오므로 백업 없이 시작하지 않는다.
docker compose exec db pg_dump -U redmine redmine > redmine-$(date +%F).sql
tar czf redmine-files-$(date +%F).tar.gz ./files ./plugins
files 디렉터리(첨부파일)와 plugins 디렉터리는 데이터베이스에 들어 있지 않으므로 따로 받는다.
services:
redmine:
image: redmine:6.1
메이저 버전을 건너뛰지 않는다. 4.x 에서 6.x 로 한 번에 가면 Ruby 버전과 스키마가 모두 달라져 실패 지점을 특정하기 어려워진다. 한 단계씩 올리고 각 단계에서 화면이 뜨는지 확인한다.
공식 redmine 이미지의 entrypoint 는 기동할 때 db:migrate 를 수행한다. 그래도 로그에서 실제로 돌았는지 확인하고, 자동 실행을 끄는 구성이라면 직접 돌린다.
docker compose run --rm redmine bundle exec rake db:migrate RAILS_ENV=production
업그레이드에서 문제가 나는 지점은 거의 플러그인이다. 새 Redmine 버전을 지원하는 플러그인 버전으로 먼저 교체한 뒤 플러그인 마이그레이션을 돌린다.
docker compose run --rm redmine bundle exec rake redmine:plugins:migrate RAILS_ENV=production
지원되지 않는 플러그인은 올리기 전에 제거한다. 플러그인을 제거할 때는 rake redmine:plugins:migrate NAME=<플러그인> VERSION=0 으로 그 플러그인이 만든 테이블을 먼저 되돌린다. 디렉터리만 지우면 테이블이 남아 다음 업그레이드에서 걸린다.
docker compose up -d
docker compose logs -f redmine
관리 화면의 정보 페이지에서 버전과 플러그인 목록을 확인한다.
데이터베이스 종류를 바꾸는 것(MySQL 에서 PostgreSQL 등)은 업그레이드가 아니라 이관이다. 같은 작업에 섞지 않는다.
이미지 태그를 latest 로 두면 컨테이너를 다시 만들 때 의도치 않게 메이저 버전이 올라간다. 운영 환경에서는 버전을 고정한다.