Unify NAS operations on tracked docker-compose.yaml

This commit is contained in:
2026-10-14 11:08:42 +09:00
parent 46ad429cc7
commit ff89daac8c
10 changed files with 118 additions and 104 deletions

159
deploy.md
View File

@@ -1,12 +1,12 @@
# hop. 유그린 NAS 배포 순서
**SSH에서는 소스와 설정만 준비합니다. 시작·중지·재빌드는 NAS의 Docker 앱에서 합니다.**
**운영 설정은 Git에서 관리하는 `docker-compose.yaml` 하나를 사용합니다. UGREEN Docker 앱과 NAS 터미널 모두 같은 파일을 사용합니다.**
접속 경로: `https://hop.noname.company → 기존 Cloudflare Tunnel → NPM(기존 8080) → NAS 내부 IP:50189 → hop.`
아래 코드 블록을 하나씩 복사하고 Enter를 누르세요. 오류가 나오면 다음 단계로 넘어가지 마세요.
파일은 hop 폴더 안의 `uploads`에 저장합니다. 이 폴더로 전환한 설치는 **7. 다음 버전으로 업데이트**만 진행합니다. 이전 `hop_hop_uploads` 볼륨을 사용하는 설치의 최초 전환은 **7-1. 업로드 폴더 전환과 테스트 자료 초기화**를 따릅니다. 사용자가 삭제를 허용한 기존 테스트 자료의 초기화는 최초 전환 때 한 번만 하며 `.env`, 도메인·포트·메일 설정은 유지합니다.
파일은 hop 폴더 안의 `uploads`, DB는 기존 `hop_hop_database` 볼륨에 저장합니다. 현재 정상 운영 중인 설치에서 Compose 파일만 통합할 때는 **7-0. 기존 파일을 단일 운영 파일로 전환**을 한 번 진행합니다. 이후에는 **7. 다음 버전으로 업데이트**만 진행하며 계정·파일·DB를 초기화하지 않습니다.
**‘허용되지 않은 접속 경로’가 나오면:** 주소창을 `https://hop.noname.company`로 바꾸세요. `http://`는 운영 `APP_URL`과 달라 차단됩니다. 5-1단계에서 HTTP를 HTTPS로 자동 이동시킵니다.
@@ -60,25 +60,26 @@ sudo sh scripts/configure-nas.sh
`SESSION_SECRET`과 `DISCOVERY_SECRET`은 자동 생성됩니다. NAS 포트와 컨테이너 포트는 모두 **50189**를 사용합니다.
마지막에 표시된 `compose.nas.yaml` 경로를 복사해 둡니다. `.env`는 NAS에만 남고 Git에 올라가지 않습니다. 기존 `.env`가 있으면 덮어쓰지 않습니다.
마지막에 표시된 `docker-compose.yaml` 경로를 복사해 둡니다. `.env`는 NAS에만 남고 Git에 올라가지 않습니다. 기존 `.env`의 비밀값은 유지합니다. 이 스크립트는 `.env`와 저장 권한을 준비하고 Compose 문법을 검사하며, Git에서 관리하는 Compose 파일을 생성하거나 덮어쓰지 않습니다.
`compose.yaml`은 Git에서 관리하는 설정 원본이고, `compose.nas.yaml`은 NAS의 절대 경로와 설정을 채워 만든 가져오기용 파일입니다. 유그린 Docker 앱에 내용을 옮겨 저장하면 실제 프로젝트 구성은 hop 폴더의 **`docker-compose.yaml`**에 저장됩니다. 앱에서 수정한 최종 설정을 기준으로 업데이트하려면 이 파일을 사용합니다. 가져오기용 파일만 다시 생성해도 앱의 최종 설정은 자동으로 바뀌지 않습니다.
## 3. Docker 앱과 터미널에서 같은 파일로 배포
## 3. Docker 앱에서 배포
1. NAS의 **Docker 앱 → 프로젝트 → 생성** 누르기.
2. 프로젝트 이름은 **hop**, 프로젝트 폴더는 `/volume1/docker/projects/apps/hop`으로 지정.
3. **`docker-compose.yaml`** 선택. 앱 상단의 구성 파일 경로가 hop 폴더의 이 파일인지 확인.
4. 앱에서 **배포** 누르기. 기존 프로젝트의 시작·중지·로그 확인도 계속 이 프로젝트에서 진행합니다.
1. NAS의 **Docker 앱** 열기.
2. **프로젝트 → 생성** 누르기.
3. 프로젝트 이름에 **hop** 입력.
4. 프로젝트 저장 경로는 방금 `git clone`한 **hop 폴더** 선택.
5. YAML 가져오기에서 **compose.nas.yaml** 선택. 파일 가져오기가 없으면 해당 파일 내용을 Compose 편집기에 붙여넣습니다.
6. 앱에서 **배포** 누르기. 로그에 Dockerfile을 이용하는 빌드 단계가 나오는지 확인하고 완료될 때까지 기다립니다.
7. 프로젝트의 hop 컨테이너가 **실행 중**, 상태가 **healthy**인지 확인.
터미널에서 빌드·배포할 때도 hop 폴더에서 같은 파일을 사용합니다:
`hop.noname.company:latest`는 NAS에서 소스로 빌드하는 로컬 이미지입니다. Docker Hub에 등록된 이미지가 아니며 `docker login`은 필요하지 않습니다. 설정의 **`pull_policy: build`**는 기존 로컬 이미지가 있어도 소스로 다시 빌드하도록 지정합니다. `never`는 기존 로컬 이미지를 사용하는 방식이므로 새 소스의 자동 빌드를 지시하지 않습니다. [Docker 공식 문서](https://docs.docker.com/reference/compose-file/services/#pull_policy).
```sh
sudo docker compose -f docker-compose.yaml up -d --build
```
버전별로 버튼 이름이 다를 수 있습니다. 앱에서 **최신 이미지 다운로드**를 별도로 선택하면 외부에서 hop. 이미지를 찾다가 실패할 수 있습니다. 배포가 실제 빌드를 실행하는지는 로그에서 `Dockerfile`, `COPY`, `RUN`, `exporting` 등 빌드 단계를 확인하세요. `Running 0.0s`만으로 새 코드 적용을 확인할 수 없습니다. 유그린 앱에서 빌드를 생략하거나 설정을 덮어쓰면 아래 설정만으로는 해결되지 않으므로 사용 중인 배포 화면과 로그를 확인해야 합니다.
`name: hop`은 기존 프로젝트를 지정합니다. 컨테이너는 `hop`, 네트워크는 `hop_hop_network`, DB 볼륨은 `hop_hop_database`를 그대로 사용합니다. 포트·주소·UID/GID는 기존 `.env` 값을 읽으며, 현재 NAS의 값은 `192.168.50.146:50189:50189`와 `1000:10`입니다. `build.context: .`, `env_file: .env`, `./uploads`는 Compose 파일이 있는 hop 폴더를 기준으로 해석하므로 NAS의 기존 절대 경로와 같습니다.
생성한 YAML은 소스와 `.env`의 절대 경로를 사용합니다. 별도의 빈 폴더로 소스를 옮기지 마세요. 프로젝트 관리 방식은 [UGREEN 프로젝트 공식 안내](https://support.ugnas.com/detail/article/en-US/411)를 참고했습니다.
`hop.noname.company:latest`는 소스로 빌드하는 로컬 이미지이며 Docker Hub에 등록된 이미지가 아닙니다. **`pull_policy: build`**와 `--build`로 소스를 빌드합니다. 앱의 **최신 이미지 다운로드**는 다른 동작이므로 외부에서 이미지를 찾다가 실패할 수 있습니다. [Docker 공식 문서](https://docs.docker.com/reference/compose-file/services/#pull_policy).
Git으로 받은 파일을 운영 기준으로 사용합니다. 앱 편집기가 YAML을 저장하면서 형식을 바꾼 경우 `git diff -- docker-compose.yaml`로 변경 내용을 확인하세요. 필요한 운영 변경은 이 파일에 반영해 Git에도 함께 기록합니다. 프로젝트 관리 방식은 [UGREEN 프로젝트 공식 안내](https://support.ugnas.com/detail/article/en-US/411)를 참고했습니다.
## 4. Nginx Proxy Manager 설정
@@ -155,12 +156,15 @@ sh scripts/enable-nas-discovery.sh
이 명령은 **현재 운영 주소를 통한 실제 요청**으로 인접 프록시와 Cloudflare 원본 IP 전달을 확인하고, 그 프록시 IP만 `.env`에 지정합니다. 운영 진단 토큰은 설정 스크립트가 생성하며 화면이나 Git에 공개하지 않습니다.
1. 명령이 성공하면 Docker 앱 → **프로젝트 → hop → 편집**.
2. **compose.nas.yaml** 다시 불러오기 → 저장.
3. **재배포**하여 컨테이너를 새 환경설정으로 다시 생성. 단순 재시작은 환경값을 다시 읽지 않습니다.
4. PC와 휴대폰을 같은 Wi-Fi에 연결하고 `https://hop.noname.company`를 열기.
5. QR 없이 상대 기기가 표시되는지 확인.
6. 휴대폰 Wi-Fi를 끄고 모바일 데이터로 전환 → 다른 네트워크 기기가 목록에서 사라지는지 확인.
1. 명령이 성공하면 같은 파일로 새 `.env` 설정을 적용합니다:
```sh
sudo docker compose -f docker-compose.yaml up -d --build
```
2. PC와 휴대폰을 같은 Wi-Fi에 연결하고 `https://hop.noname.company`를 열기.
3. QR 없이 상대 기기가 표시되는지 확인.
4. 휴대폰 Wi-Fi를 끄고 모바일 데이터로 전환 → 다른 네트워크 기기가 목록에서 사라지는지 확인.
확인 중 오류가 나면 자동 발견 설정을 임의로 넓히지 마세요. 오류와 Docker 로그를 알려주세요. 주변 목록은 같은 **공인 IP** 기준이며 Bluetooth 탐색은 아닙니다. IPv6 주소가 서로 다르거나 VPN을 사용하면 같은 Wi-Fi에서도 자동 목록이 다를 수 있습니다.
@@ -230,108 +234,111 @@ NAS 파일 관리자에서 **공유 폴더 → docker → projects → apps →
## 7. 다음 버전으로 업데이트
**일반적인 코드·UI 업데이트는 아래 순서만 진행하세요. 기존 YAML·환경변수·볼륨은 그대로 사용합니다.**
**소스 코드와 운영 Compose 설정을 Git에서 함께 받습니다. 같은 파일로 빌드·재배포하며 기존 DB·업로드는 유지합니다.**
1. SSH에서 hop 폴더로 이동:
1. hop 폴더로 이동:
```sh
cd /volume1/docker/projects/apps/hop
```
2. 최신 코드 받기:
2. 최신 코드와 설정 받기:
```sh
git pull --ff-only origin main
```
3. Docker 앱 → **프로젝트 → hop → 재배포**. 앱에 저장된 최종 `docker-compose.yaml`에서 `pull_policy: build`인지 확인합니다. 이전 `never` 설정을 쓰고 있다면 이번에 한 번 `build`로 변경합니다.
4. 실제 빌드 단계가 로그에 나오는지 확인하고 완료될 때까지 기다립니다. **최신 이미지 다운로드**는 소스 빌드와 다른 동작입니다.
5. `healthy` 확인 → 브라우저 새로고침. PWA는 앱을 닫고 다시 열기.
이 프로젝트의 작업 순서는 코드·설정 수정 및 Git 업로드 → Compose 변경이 있으면 `compose.nas.yaml` 내용 안내 → 사용자가 앱의 `docker-compose.yaml`에 옮겨 빌드·재배포입니다. 앱 버전에 따라 빌드가 생략되거나 다운로드 옵션이 설정을 덮어쓸 수 있으므로 실제 로그로 확인합니다.
앱에서 소스 빌드를 사용할 수 없거나 이전 코드가 계속 실행되는 경우에만, SSH에서 최종 설정으로 빌드와 컨테이너 교체를 함께 실행할 수 있습니다:
3. 빌드·재배포. 완료될 때까지 기다립니다:
```sh
sudo docker compose --project-name hop -f docker-compose.yaml up -d --build --force-recreate --wait --wait-timeout 90 hop
sudo docker compose -f docker-compose.yaml up -d --build
```
현재 인증 코드 적용 여부는 아래 명령으로 확인합니다. `8`이면 비밀번호 최소 8자 변경이 반영됐고, `12`이면 이전 코드입니다:
4. 상태 확인:
```sh
sudo docker exec hop node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/api/auth/me').then(r=>r.json()).then(v=>console.log(v.passwordMinLength))"
sudo docker compose -f docker-compose.yaml ps
```
**저장소 전환을 완료한 뒤의 코드·UI 업데이트는 이 순서만 진행합니다.** 설정 스크립트를 다시 실행하거나 YAML을 다시 불러올 필요가 없습니다. NPM·Cloudflare Tunnel 설정도 그대로 유지합니다. 위치 검색은 양쪽 브라우저에서 위치 권한을 허용하면 자동으로 동작합니다.
5. 브라우저 새로고침. PWA는 앱을 닫고 다시 열기.
DB는 `hop_hop_database` 볼륨, 파일은 hop 폴더의 `uploads`에 있습니다. `uploads`, `.env`, 생성된 `compose.nas.yaml`, 앱이 저장한 `docker-compose.yaml`은 Git에서 제외하므로 일반 코드 업데이트로 덮어쓰지 않습니다. 같은 저장 경로를 사용하는 재배포에서 데이터는 유지됩니다.
일반 업데이트에는 설정 스크립트 실행·YAML 재생성·수동 복사가 필요 없습니다. UGREEN 앱도 같은 `docker-compose.yaml`을 사용하며 프로젝트 관리 기능은 계속 사용할 수 있습니다. NPM·Cloudflare Tunnel 설정은 그대로 유지합니다.
### 7-1. 업로드 폴더 전환과 테스트 자료 초기화
Git pull이 로컬 Compose 변경 때문에 중단되면 `git diff -- docker-compose.yaml`로 차이를 먼저 확인합니다. 앱에서 필요한 운영 설정을 바꾼 경우 그 변경을 Git 설정과 함께 정리하며, 자료나 설정을 강제로 초기화하지 않습니다.
**이번에 한 번만 실행합니다. 기존 테스트 계정·기기 이름·방·전송 기록·보관 파일은 모두 삭제합니다. `.env`와 소스는 유지합니다.** 다음 업데이트에서 반복하지 마세요.
### 7-0. 기존 파일을 단일 운영 파일로 전환
1. Docker 앱 → 프로젝트 → hop → **중지**.
2. SSH에서 hop 폴더로 이동:
**이번에 한 번만 진행합니다. 기존 컨테이너·네트워크·DB 볼륨·업로드·계정을 삭제하지 않습니다. `.env`도 그대로 사용합니다.**
1. hop 폴더로 이동:
```sh
cd /volume1/docker/projects/apps/hop
```
3. 최신 코드 받기:
2. 현재 앱이 만든 파일이 Git 미추적 파일인 경우에만 `/tmp`에 옮겨 둡니다. 현재 실행 중인 컨테이너의 데이터는 변경하지 않습니다:
```sh
if [ -f docker-compose.yaml ] && ! git ls-files --error-unmatch docker-compose.yaml >/dev/null 2>&1; then
sudo mv docker-compose.yaml /tmp/hop-compose.before-unify.yaml
fi
```
3. Git에서 단일 운영 파일 받기:
```sh
git pull --ff-only origin main
```
4. 중지된 hop 컨테이너 제거. 프로젝트 소스 폴더는 남습니다:
4. 기존 `.env` 값이 현재 운영 설정과 맞는지 확인합니다. 아래 명령은 비밀값을 출력하지 않습니다:
```sh
sudo docker rm hop
grep -E '^(APP_URL|HOP_BIND_IP|HOP_HOST_PORT|HOP_CONTAINER_PORT|HOP_RUN_UID|HOP_RUN_GID)=' .env
```
5. 기존 테스트 DB와 업로드 볼륨 삭제:
현재 NAS에서는 `APP_URL=https://hop.noname.company`, `HOP_BIND_IP=192.168.50.146`, 두 포트는 `50189`, UID/GID는 `1000`과 `10`을 사용합니다. 값이 비어 있거나 다르면 기존 운영 값에 맞춰 `.env`를 정리한 뒤 진행합니다. 이 전환에서는 `configure-nas.sh`나 저장소 초기화를 다시 실행하지 않습니다.
5. Compose 문법 검사. 정상일 때는 출력 없이 끝납니다:
```sh
sudo docker volume rm hop_hop_database hop_hop_uploads
sudo docker compose -f docker-compose.yaml config --quiet
```
6. 새 업로드 폴더·권한·YAML 준비. 기존 `.env`의 비밀값은 재발급하지 않습니다:
6. 같은 파일로 빌드·재배포:
```sh
sudo sh scripts/configure-nas.sh
sudo docker compose -f docker-compose.yaml up -d --build
```
7. Docker 앱 → 기존 hop 프로젝트의 **편집 / Compose 설정**에서 새 `compose.nas.yaml`을 다시 불러옵니다. 파일 가져오기가 없으면 아래 내용을 Compose 편집기에 붙여넣습니다:
7. UGREEN 앱 상단의 구성 파일 경로가 `/volume1/docker/projects/apps/hop/docker-compose.yaml`인지 확인합니다. 이후에는 파일 내용을 다른 Compose 파일로 옮기지 않습니다.
8. 더 이상 사용하지 않는 NAS 생성 파일만 정리합니다. 기존 `compose.yaml`은 Git 업데이트에서 제거됩니다:
```sh
cat compose.nas.yaml
rm -f compose.nas.yaml
```
8. **이미지 재빌드 → 재배포 / 시작**. `healthy` 확인.
9. SSH에서 실제 파일 연결 경로 확인:
이후에는 위 7장의 일반 업데이트 명령만 사용합니다. `/tmp`에 옮긴 이전 설정은 전환 확인용이며, 운영에는 Git의 `docker-compose.yaml`만 사용합니다.
### 7-1. 저장 데이터 유지
DB는 기존 `hop_hop_database` 볼륨을 `/data/database`에 연결하며 `nocopy: true`를 유지합니다. 업로드는 같은 hop 폴더의 `uploads`를 `/data/uploads`에 연결합니다. 컨테이너 교체 시 같은 저장소를 사용합니다. `.env`, `uploads`, DB, 백업 파일은 Git에서 제외하고, **`docker-compose.yaml`은 Git에서 관리**합니다.
실제 업로드 연결 경로는 다음 명령으로 확인할 수 있습니다:
```sh
sudo docker inspect --format '{{range .Mounts}}{{if eq .Destination "/data/uploads"}}{{.Type}} → {{.Source}}{{end}}{{end}}' hop
```
다음처럼 나오면 완료입니다:
```text
bind → /volume1/docker/projects/apps/hop/uploads
```
10. 브라우저/PWA 새로고침 → 필요하면 다시 회원가입 → 작은 파일 전송 → NAS 파일 관리자에서 **hop → uploads → originals** 확인.
이후에는 Git pull → 이미지 재빌드 → 재배포만 진행합니다. `uploads` 폴더와 DB는 그대로 유지합니다.
현재 NAS에서는 `bind → /volume1/docker/projects/apps/hop/uploads`가 나와야 합니다. 이전 업로드 볼륨을 아직 사용 중인 다른 설치는 파일 보존 방법부터 확인한 뒤 전환합니다. 이번 Compose 정리는 기존 자료 초기화 작업이 아닙니다.
### 추가 작업이 필요한 업데이트
| 변경 내용 | 필요한 작업 |
| ------------------------------- | ------------------------------------------------------------------------------------------------------ |
| 코드·화면·CSS 변경 | Git pull → 이미지 재빌드 → 재배포 |
| Docker 구성·포트·볼륨 경로 변경 | Git pull → 설정/YAML 다시 생성 → Docker 앱에 새 YAML 불러오기 → 재빌드 → 재배포 |
| 환경변수 변경 | 필요한 값 수정 → 설정/YAML 다시 생성 → Docker 앱에 새 YAML 불러오기 → 재배포. 코드도 바뀌었다면 재빌드 |
| DB 구조·기존 데이터 변경 | 해당 버전의 변경 안내 확인 → 필요 시 아래 데이터 백업 → Git pull → 재빌드 → 재배포 |
| 변경 내용 | 필요한 작업 |
| ------------------------------- | --------------------------------------------------------------------------------------------- |
| 코드·화면·CSS 변경 | Git pull → 이미지 재빌드 → 재배포 |
| Docker 구성·포트·볼륨 경로 변경 | Git pull → 같은 `docker-compose.yaml`로 빌드·재배포. 저장 경로 변경은 기존 자료 연결부터 확인 |
| 환경변수 변경 | NAS의 `.env` 값 수정 → 같은 `docker-compose.yaml`로 재배포 |
| DB 구조·기존 데이터 변경 | 해당 버전의 변경 안내 확인 → 필요 시 아래 데이터 백업 → Git pull → 재빌드 → 재배포 |
YAML이나 DB 변경이 필요한 버전은 업데이트 안내에서 별도로 표시합니다. 코드·CSS 수정 때마다 데이터 백업이나 YAML 재생성을 반복할 필요는 없습니다.
@@ -372,12 +379,12 @@ DB 구조가 바뀐 뒤 이전 상태로 복구하려면 같은 시점의 코드
## 8. 시작 / 중지 / 로그
| 할 일 | 누를 위치 |
| -------------- | ----------------------------------------------------------------------- |
| 시작 | Docker → 프로젝트 → hop → 시작 |
| 중지 | Docker → 프로젝트 → hop → 중지 |
| 설정 변경 적용 | `.env` 수정 → YAML 재생성 → 프로젝트 편집 → YAML 다시 불러오기 → 재배포 |
| 오류 확인 | Docker → 컨테이너 → hop 컨테이너 → 로그 |
| 할 일 | 누를 위치 |
| -------------- | ----------------------------------------------------------------- |
| 시작 | Docker → 프로젝트 → hop → 시작 |
| 중지 | Docker → 프로젝트 → hop → 중지 |
| 설정 변경 적용 | `.env` 또는 Git의 `docker-compose.yaml` 수정 → 같은 파일로 재배포 |
| 오류 확인 | Docker → 컨테이너 → hop 컨테이너 → 로그 |
SSH에서 실제 설정 중 비밀값 없이 주소·포트만 확인하려면:
@@ -394,7 +401,7 @@ curl -fsS "http://${HOP_NAS_IP}:50189/api/health"
HTTP 주소는 상태 확인에만 씁니다. 실제 접속·QR·로그인은 `https://hop.noname.company`를 사용하세요.
환경파일을 YAML에 포함하지 않는 생성 방식은 [Docker Compose 공식 문서](https://docs.docker.com/reference/cli/docker/compose/config/)의 `--no-env-resolution`을 사용합니다. `.env`, 생성된 `compose.nas.yaml`, 앱이 저장한 `docker-compose.yaml`, `backups`는 Git과 Docker 빌드에서 제외됩니다.
`docker-compose.yaml`에는 `.env`의 경로와 환경변수 참조만 기록합니다. 비밀값을 YAML에 펼쳐 저장하지 않습니다. 설정 스크립트는 [Docker Compose 공식 문서](https://docs.docker.com/reference/cli/docker/compose/config/)의 `--no-env-resolution --quiet`로 문법만 검사합니다. `.env`, `uploads`, `backups`는 Git과 Docker 빌드에서 제외됩니다.
## 이미지 다운로드 오류가 나올 때
@@ -408,13 +415,13 @@ pull_policy: build
이전 `never` 설정이면 `build`로 변경하고 재배포합니다. `build` 경로는 `/volume1/docker/projects/apps/hop`, Dockerfile은 `Dockerfile`을 그대로 사용합니다. 기존 DB·업로드 저장 경로도 그대로 유지합니다. 새 코드가 NAS 폴더에 반영돼 있어야 합니다.
다시 실행해도 `Running 0.0s`와 다운로드 오류만 나오면 실제 소스 빌드가 확인되지 않은 상태입니다. 7장의 SSH 명령은 앱에서 빌드를 사용할 수 없는 경우의 대안입니다. 먼저 배포 화면과 전체 로그를 확인하세요. `docker login`이나 볼륨 삭제는 필요 없습니다.
다시 실행해도 `Running 0.0s`와 다운로드 오류만 나오면 실제 소스 빌드가 확인되지 않은 상태입니다. 7장의 `sudo docker compose -f docker-compose.yaml up -d --build`는 같은 운영 파일로 소스를 빌드·배포하는 명령입니다. 먼저 배포 화면과 전체 로그를 확인하세요. `docker login`이나 볼륨 삭제는 필요 없습니다.
## 초대 코드와 모바일 화면
새 초대 코드는 기본 4자리입니다. 기존 `.env`를 수정하지 않아도 새 이미지에서 적용됩니다. 업데이트 전에 발급한 8자리 코드와 QR은 원래 만료 시간까지 유효합니다.
나중에 초대 코드를 6자리로 바꾸려면 `.env`에 `SPACE_INVITE_CODE_LENGTH=6`을 넣고 YAML 다시 생성 → 프로젝트 편집 → YAML 다시 불러오기 → 재배포합니다. DB나 업로드 볼륨은 그대로 사용합니다.
나중에 초대 코드를 6자리로 바꾸려면 `.env`에 `SPACE_INVITE_CODE_LENGTH=6`을 넣고 같은 `docker-compose.yaml`로 재배포합니다. DB나 업로드 볼륨은 그대로 사용합니다.
모바일 기기 설정은 하단 시트로 열리고 입력창을 자동으로 선택하지 않습니다. 사용자가 입력창을 누르면 키보드가 열린 가시 영역에 맞춰 시트 높이를 조정합니다. 로그인·기기명·URL 등 입력 글자는 16px 이상으로 적용하며 화면 확대 기능 자체를 차단하지 않습니다. 파일 전송 중에는 선택한 파일명 아래에 진행률을 표시합니다.
@@ -434,4 +441,4 @@ pull_policy: build
가입 비밀번호는 최소 8자입니다. 인증 메일의 링크를 열고 **이메일 인증 완료하기**를 누르면 해당 계정으로 자동 로그인하며 보관함의 받은 항목을 표시합니다. 다른 계정으로 로그인한 브라우저에서는 이전 세션을 종료하고 인증한 계정으로 전환합니다. 다른 기기의 로그인은 유지합니다. 만료·재사용된 링크로는 현재 로그인을 변경하지 않습니다.
이번 인증 변경은 **Git pull → 이미지 재빌드 → 재배포**로 적용합니다. 기존 계정·파일은 유지하고 YAML·환경변수·DB 구조는 변경하지 않습니다. 업로드 폴더 전환을 완료했다면 7-1의 초기화를 반복하지 마세요.
이번 인증 변경은 **Git pull → 이미지 재빌드 → 재배포**로 적용합니다. 기존 계정·파일은 유지하고 YAML·환경변수·DB 구조는 변경하지 않습니다. 기존 DB·업로드를 초기화하지 않습니다.