diff --git a/compose.yaml b/compose.yaml index c27a396..af0bc13 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,8 +1,8 @@ services: hop: image: hop.noname.company:latest - # This image is built on the NAS; it is not published in a registry. - pull_policy: never + # Rebuild from source on deployment, even when the local image already exists. + pull_policy: build build: context: . dockerfile: Dockerfile diff --git a/deploy.md b/deploy.md index 45971bf..2bf5e2f 100644 --- a/deploy.md +++ b/deploy.md @@ -71,18 +71,14 @@ sudo sh scripts/configure-nas.sh 3. 프로젝트 이름에 **hop** 입력. 4. 프로젝트 저장 경로는 방금 `git clone`한 **hop 폴더** 선택. 5. YAML 가져오기에서 **compose.nas.yaml** 선택. 파일 가져오기가 없으면 해당 파일 내용을 Compose 편집기에 붙여넣습니다. -6. 아래 SSH 명령으로 이미지를 빌드한 뒤 앱에서 **배포** 누르기. +6. 앱에서 **배포** 누르기. 로그에 Dockerfile을 이용하는 빌드 단계가 나오는지 확인하고 완료될 때까지 기다립니다. 7. 프로젝트의 hop 컨테이너가 **실행 중**, 상태가 **healthy**인지 확인. -`hop.noname.company:latest`는 NAS에서 소스로 빌드하는 로컬 이미지입니다. Docker Hub에 등록된 이미지가 아니며 `docker login`은 필요하지 않습니다. YAML의 `pull_policy: never`는 Compose가 기존 로컬 이미지를 사용하도록 지정합니다. 앱에서 별도로 선택하는 **최신 이미지** 업데이트는 외부 다운로드를 시도할 수 있으므로 선택하지 않습니다. 처음 배포와 코드 업데이트에는 **이미지 빌드**가 필요합니다. +`hop.noname.company:latest`는 NAS에서 소스로 빌드하는 로컬 이미지입니다. Docker Hub에 등록된 이미지가 아니며 `docker login`은 필요하지 않습니다. 설정의 **`pull_policy: build`**는 기존 로컬 이미지가 있어도 소스로 다시 빌드하도록 지정합니다. `never`는 기존 로컬 이미지를 사용하는 방식이므로 새 소스의 자동 빌드를 지시하지 않습니다. [Docker 공식 문서](https://docs.docker.com/reference/compose-file/services/#pull_policy). -처음 프로젝트를 배포하기 전에는 SSH에서 hop 폴더에 들어간 상태로 아래 명령을 실행하고 완료될 때까지 기다립니다. 이미지 빌드만 실행하며 컨테이너를 시작하거나 데이터를 삭제하지 않습니다. 이후 앱에 프로젝트를 저장한 뒤의 업데이트는 7장처럼 최종 `docker-compose.yaml`을 사용합니다. +버전별로 버튼 이름이 다를 수 있습니다. 앱에서 **최신 이미지 다운로드**를 별도로 선택하면 외부에서 hop. 이미지를 찾다가 실패할 수 있습니다. 배포가 실제 빌드를 실행하는지는 로그에서 `Dockerfile`, `COPY`, `RUN`, `exporting` 등 빌드 단계를 확인하세요. `Running 0.0s`만으로 새 코드 적용을 확인할 수 없습니다. 유그린 앱에서 빌드를 생략하거나 설정을 덮어쓰면 아래 설정만으로는 해결되지 않으므로 사용 중인 배포 화면과 로그를 확인해야 합니다. -```sh -sudo docker compose --project-name hop -f compose.nas.yaml build hop -``` - -버전별로 버튼 이름이 다를 수 있습니다. 재배포 시 **로컬 / 기존 이미지 사용**에 해당하는 옵션을 선택합니다. 생성한 YAML은 소스와 `.env`의 절대 경로를 사용합니다. 별도의 빈 폴더로 소스를 옮기지 마세요. 이미지 다운로드와 프로젝트 관리 방식은 [UGREEN 프로젝트 공식 안내](https://support.ugnas.com/detail/article/en-US/411)를 참고했습니다. +생성한 YAML은 소스와 `.env`의 절대 경로를 사용합니다. 별도의 빈 폴더로 소스를 옮기지 마세요. 프로젝트 관리 방식은 [UGREEN 프로젝트 공식 안내](https://support.ugnas.com/detail/article/en-US/411)를 참고했습니다. ## 4. Nginx Proxy Manager 설정 @@ -248,21 +244,16 @@ cd /volume1/docker/projects/apps/hop git pull --ff-only origin main ``` -3. SSH에서 새 이미지 빌드. 완료될 때까지 기다립니다: - -```sh -sudo docker compose --project-name hop -f docker-compose.yaml build hop -``` - -4. Docker 앱 → **프로젝트 → hop → 재배포**. **로컬 / 기존 이미지 사용**에 해당하는 옵션을 선택합니다. **최신 이미지**는 외부 다운로드이므로 선택하지 않습니다. +3. Docker 앱 → **프로젝트 → hop → 재배포**. 앱에 저장된 최종 `docker-compose.yaml`에서 `pull_policy: build`인지 확인합니다. 이전 `never` 설정을 쓰고 있다면 이번에 한 번 `build`로 변경합니다. +4. 실제 빌드 단계가 로그에 나오는지 확인하고 완료될 때까지 기다립니다. **최신 이미지 다운로드**는 소스 빌드와 다른 동작입니다. 5. `healthy` 확인 → 브라우저 새로고침. PWA는 앱을 닫고 다시 열기. -유그린의 **최신 이미지** 업데이트는 Git 소스를 빌드하는 기능이 아닙니다. `pull access denied` 뒤에 `Running 0.0s`만 나오면 새 이미지 빌드·컨테이너 교체가 확인되지 않은 상태입니다. 기존 컨테이너를 단순 재시작해도 새 코드는 반영되지 않습니다. +이 프로젝트의 작업 순서는 코드·설정 수정 및 Git 업로드 → Compose 변경이 있으면 `compose.nas.yaml` 내용 안내 → 사용자가 앱의 `docker-compose.yaml`에 옮겨 빌드·재배포입니다. 앱 버전에 따라 빌드가 생략되거나 다운로드 옵션이 설정을 덮어쓸 수 있으므로 실제 로그로 확인합니다. -앱 재배포 이후에도 이전 코드가 실행되면, SSH에서 아래 명령으로 이미 빌드한 이미지에 컨테이너를 맞춥니다. 기존 DB와 업로드 저장 경로는 유지하며, 이후 시작·중지·로그 확인은 Docker 앱에서 계속 진행할 수 있습니다: +앱에서 소스 빌드를 사용할 수 없거나 이전 코드가 계속 실행되는 경우에만, SSH에서 최종 설정으로 빌드와 컨테이너 교체를 함께 실행할 수 있습니다: ```sh -sudo docker compose --project-name hop -f docker-compose.yaml up -d --no-build --pull never --force-recreate --wait --wait-timeout 90 hop +sudo docker compose --project-name hop -f docker-compose.yaml up -d --build --force-recreate --wait --wait-timeout 90 hop ``` 현재 인증 코드 적용 여부는 아래 명령으로 확인합니다. `8`이면 비밀번호 최소 8자 변경이 반영됐고, `12`이면 이전 코드입니다: @@ -409,23 +400,15 @@ HTTP 주소는 상태 확인에만 씁니다. 실제 접속·QR·로그인은 `h `pull access denied for hop.noname.company`는 소스 빌드용 로컬 이미지를 외부 레지스트리에서 찾았다는 뜻입니다. 앱의 **재배포 → 최신 이미지**는 외부 다운로드 기능입니다. `Running`은 실행 상태만 나타내며 최신 Git 코드가 반영됐다는 뜻은 아닙니다. -SSH에서 순서대로 실행하세요. +Docker 앱에서 **hop 프로젝트 → Compose 구성**을 열어 다음 설정인지 확인하세요: -```sh -cd /volume1/docker/projects/apps/hop +```yaml +pull_policy: build ``` -```sh -git pull --ff-only origin main -``` +이전 `never` 설정이면 `build`로 변경하고 재배포합니다. `build` 경로는 `/volume1/docker/projects/apps/hop`, Dockerfile은 `Dockerfile`을 그대로 사용합니다. 기존 DB·업로드 저장 경로도 그대로 유지합니다. 새 코드가 NAS 폴더에 반영돼 있어야 합니다. -```sh -sudo docker compose --project-name hop -f docker-compose.yaml build --no-cache hop -``` - -빌드 완료 후 Docker 앱에서 **재배포 → 로컬 / 기존 이미지 사용**에 해당하는 옵션을 선택합니다. 앱에서 컨테이너가 교체되지 않으면 7장의 `up ... --force-recreate` 명령을 사용합니다. 기존 YAML이 이미 `pull_policy: never`이고 `/data/uploads`가 hop 폴더의 `uploads`에 연결됐다면 설정 스크립트 실행이나 YAML 교체는 필요 없습니다. - -`docker login`이나 볼륨 삭제는 필요 없습니다. `never`의 로컬 이미지 사용 방식은 [Docker 공식 문서](https://docs.docker.com/reference/compose-file/services/#pull_policy)를 참고했습니다. +다시 실행해도 `Running 0.0s`와 다운로드 오류만 나오면 실제 소스 빌드가 확인되지 않은 상태입니다. 7장의 SSH 명령은 앱에서 빌드를 사용할 수 없는 경우의 대안입니다. 먼저 배포 화면과 전체 로그를 확인하세요. `docker login`이나 볼륨 삭제는 필요 없습니다. ## 초대 코드와 모바일 화면 diff --git a/tests/docker/nas-config.mjs b/tests/docker/nas-config.mjs index c3ba63b..64f4445 100644 --- a/tests/docker/nas-config.mjs +++ b/tests/docker/nas-config.mjs @@ -143,6 +143,8 @@ esac config.volumes.hop_database.name = checkedVolume; Object.assign(config.services.hop, { image: process.env.HOP_CHECK_IMAGE, + // This fixture checks mounts with a prebuilt image, without source builds. + pull_policy: 'never', container_name: checkedContainer, ports: [], network_mode: 'none',