잠시만요, 달이 떠오르면 글도 환해질 거예요.
docker compose pull로 최신 이미지를 받아온 뒤, up -d로 컨테이너를 재생성한다. 과정은 세 단계다. 먼저 스크립트 라이브러리에 업데이트 스크립트를 만든다(패널 또는 명령줄에서 가져오기 가능). 다음으로 예약 작업을 만들고 Cron 표현식을 설정한다(매일 새벽 3시 권장). 마지막으로 수동 실행해 검증한다. 자주 묻는 질문도 다룬다. 컨테이너에 변화가 없어도 정상이며, ghcr.io는 사전 로그인과 read:packages 권한이 있는 PAT가 필요하다. 백엔드를 먼저, 프런트엔드를 나중에 업데이트하는 것이 좋고, 업데이트 중단은 몇 초에 불과하다. 실패 시 로그로 원인을 파악할 수 있다. 결국 스크립트 하나와 예약 작업 하나로 블로그를 항상 최신으로 유지해 수동 관리 부담을 줄인다.
이 글은 「Mix Space + Yohaku 배포 시리즈」의 세 번째 편으로, 자동 업데이트 설정에 대해 다룹니다. 앞선 두 편의 배포를 먼저 완료한 뒤 이 글을 읽으시길 권합니다.
블로그를 다 구축하고 나면, 진짜 운영 작업은 이제서야 시작됩니다.
프론트엔드 Yohaku는 버전이 올라가고, 백엔드 Core는 취약점을 고치며, 의존하는 이미지도 계속 갱신됩니다. 매번 서버에 직접 로그인해서 이미지를 당기고 재시작하는 것은 번거로울 뿐 아니라 쉽게 잊어버리기 마련입니다. 그러다 어느 날 블로그가 여전히 한 달 전의 낡은 버전으로 돌아가고 있는 걸 발견하고서야 '이제 업데이트할 때가 됐구나' 하고 떠올리게 되죠.
이 글에서는 1Panel의 예약 작업을 활용해 업데이트를 자동화 프로세스로 만드는 방법을 알려드립니다. 한 번 설정해 두면 서버가 여러분이 정한 주기에 맞춰 최신 이미지를 자동으로 확인하고 받아와 블로그 시스템을 항상 최신 상태로 유지해 줍니다. 여러분이 할 일은 아무것도 없습니다.
이 글이 적용되는 상황: · 백엔드 Core와 프론트엔드 Yohaku가 모두 1Panel 로컬 앱으로 배포된 경우 · 프론트엔드 이미지가 ghcr.io 프라이빗 레지스트리(또는 공식 innei/shiro:latest)에서 오는 경우 · 최소한의 인력으로 시스템을 최신 상태로 유지하고 싶은 경우
핵심 아이디어
1Panel의 예약 작업 기능은 사용자 정의 스크립트를 정기적으로 실행할 수 있게 해 줍니다. 필요한 것은 명령어 두 줄뿐입니다:
하나씩 풀어보면:
명령어 조각 역할 cd ... 앱이 있는 Compose 디렉터리로 이동 docker compose pull 최신 이미지 가져오기(재시작 없음) docker compose up -d 새 이미지로 컨테이너 재구축 및 시작
두 명령어는 각각 백엔드와 프론트엔드에 대응합니다. 예약 작업이 실행되면 1Panel이 차례로 실행해 프론트엔드와 백엔드를 한 번에 업데이트합니다.
1단계 · 스크립트 라이브러리 만들기
1Panel의 '스크립트 라이브러리' 기능은 자주 쓰는 스크립트 조각을 저장해 두고 예약 작업이나 수동 실행에 활용할 수 있게 해 줍니다. 업데이트 스크립트를 여기에 저장해 두면 나중에 예약 작업에서 참조할 수도 있고, 언제든 수동으로 실행할 수도 있습니다.
방법 1 · 1Panel 패널에서 만들기(권장)
사이드바에서 예약 작업 → 스크립트 라이브러리로 들어가 오른쪽 위의 생성 버튼을 누릅니다:
필드 입력 내용 이름 블로그 자동 업데이트(원하는 대로 변경 가능) 스크립트 내용 아래 코드 블록 참고
다음 스크립트를 입력하세요:
확인을 눌러 저장하면 스크립트 라이브러리가 만들어집니다.
방법 2 · 명령줄로 빠르게 작성하기
SSH 작업에 익숙하다면 서버에 직접 스크립트 파일을 만들어도 됩니다:
그런 다음 1Panel 스크립트 라이브러리에서 '파일에서 가져오기'를 선택하면 됩니다. 가져올 때는 스크립트 파일이 있는 디렉터리인 /opt/1panel/scripts/로 이동해야 하며, 경로가 설치 환경과 다르다면 서버에서 실제 위치를 확인한 뒤 가져오세요.
2단계 · 예약 작업 만들기
스크립트가 준비됐으니 이제 실행 계획을 세워 봅시다.
사이드바에서 예약 작업 → 예약 작업으로 들어가 오른쪽 위의 생성 버튼을 누릅니다:
필드 입력 내용 작업 이름 블로그 자동 업데이트(원하는 대로 변경 가능) 실행 주기 사용자 정의 Cron 표현식 스크립트 내용 '스크립트 라이브러리'를 선택해 이전 단계에서 만든 블로그 자동 업데이트 선택 실행 제한 시간 기본값 유지(10분) 오류 시 알림 선택 사항이지만 켜는 것을 권장
실행 주기는 어떻게 정할까?
필자의 추천은 하루에 한 번, 새벽에 서버 부하가 가장 낮은 시각에 실행하는 것입니다. Cron 표현식으로 쓰면 다음과 같습니다:
이것은 매일 새벽 3:00에 실행된다는 뜻입니다. 필요에 따라 조정할 수 있습니다:
빈도 Cron 표현식 설명 하루 한 번 0 3 * * * 권장, 새벽 저부하 시간대 6시간마다 0 */6 * * * 업데이트가 더 잦아 활발히 개발되는 프로젝트에 적합 일주일에 한 번 0 3 * * 0 일요일 새벽 수동 실행 비워 둠, 이후 '실행' 버튼 클릭 자동 실행되지 않으며 필요할 때만 수동 업데이트
1Panel 예약 작업 실행의 작은 세부 사항
예약 작업을 만들고 나면 1Panel은 기본적으로 서버 시간대의 해당 시각에 실행합니다. 서버 시간대가 Asia/Shanghai가 아니라면 다음을 확인해 보세요:
시간대가 맞지 않다면 베이징 시간으로 바꿔 주세요:
3단계 · 검증과 수동 실행
예약 작업을 만든 뒤 제대로 동작하는지 확인하는 방법은 두 가지입니다.
방법 1 · 수동 실행
예약 작업 목록에서 방금 만든 작업을 찾아 오른쪽의 실행 버튼을 클릭합니다. 1Panel이 스크립트를 즉시 실행하며, 몇 초 후 페이지를 새로고침해 '실행 기록'에서 출력 로그를 확인하면 됩니다.
이런 비슷한 출력이 보이면 성공한 것입니다:
방법 2 · 자동 실행을 기다리기
매일 새벽 3시로 설정했다면 다음 날 아침에 실행 기록만 확인하면 됩니다. 스크립트 실행에 실패하면 1Panel이 오류 로그를 남기므로, 실행 기록에서 구체적인 원인을 살펴볼 수 있습니다.
자주 묻는 질문
Q: 업데이트했는데 컨테이너가 그대로인데, 스크립트가 적용되지 않은 건가요?
꼭 그런 것은 아닙니다. docker compose pull은 이미지에 새 버전이 있는지 확인하고, 새 버전이 없다면 up -d가 컨테이너를 재구축하지 않으며 상태는 up-to-date로 표시됩니다. 정상적인 동작이므로 걱정하지 않으셔도 됩니다.
Q: ghcr.io 프라이빗 이미지를 사용할 때 가져오기가 실패하는 경우는?
예약 작업은 서버의 Docker 환경을 사용해 실행되므로, docker login ghcr.io로 로그인한 적이 있는지 확인해야 합니다. 1Panel의 컨테이너 레지스트리 인증은 Docker 로그인과 별개이니 서버에서 한 번 수동으로 실행해 두는 것을 권장합니다:
주의: ghcr.io 이미지를 가져오는 데 사용하는 Personal Access Token(PAT)에는 read:packages 권한을 부여해야 합니다. 그렇지 않으면 로그인 후 unauthorized 오류가 발생합니다. GitHub 개인 설정 → Developer settings → Personal access tokens에서 생성하거나 수정하면 됩니다.
Q: 백엔드와 프론트엔드 업데이트에 순서가 필요한가요?
백엔드 업데이트가 프론트엔드의 호환성을 깨뜨리는 일은 보통 없지만, 안전하게 가려면 백엔드를 먼저, 프론트엔드를 나중에 업데이트하는 순서가 더 안정적입니다. 스크립트에도 이미 이 순서로 작성되어 있습니다.
Q: 업데이트하는 동안 블로그를 사용할 수 없나요?
docker compose up -d는 컨테이너를 재구축하고 시작하는 작업이라 그동안의 다운타임은 매우 짧습니다(몇 초에서 십수 초). 블로그 트래픽이 많다면 새벽 저부하 시간대에 실행하는 것을 고려해 보세요.
Q: 스크립트 실행이 실패하면 어떻게 해결하나요?
Q: 백엔드만 또는 프론트엔드만 업데이트할 수 있나요?
가능합니다. 스크립트에서 해당 부분만 지우면 됩니다. 백엔드만 업데이트하고 싶다면 첫 번째 cd ... mxspace 부분은 남기고 두 번째 cd ... yohaku 부분을 삭제하세요.
정리
스크립트 하나 + 예약 작업 하나 = 자동 업데이트되는 Mix Space 블로그 시스템.
전체 과정을 다시 돌아보면:
이후의 모든 일은 1Panel에게 맡기면 됩니다. 1Panel은 정해진 주기에 맞춰 조용히 백그라운드에서 최신 이미지를 가져오고 컨테이너를 재시작해 블로그를 항상 최신 상태로 유지합니다. 여러분이 집중할 일은 단 하나, 차분히 풀어낼 가치가 있는 다음 글을 쓰는 것입니다.
운영의 본질은 아무도 지켜보지 않을 때도 시스템이 질서 있게 돌아가게 하는 것입니다.
참고 자료
· 1Panel 예약 작업 문서 · Docker Compose 명령줄 참고 자료 · Cron 표현식 생성기
오래될수록 새로워지는 비결은 꾸준함에 있습니다. 당신의 블로그가 소리 없는 업데이트 속에서도 날마다 자라나길 바랍니다 🌿