# 배포 가이드 ## 현재 버전 - `v0.0.9` NAS에 SSH로 올리는 **전체 순서**는 `docs/nas-deploy-guide.md`에 따로 정리했다. ## 로컬 개발 1. `cp .env.example .env` 후 **`.env`만** 실제 주소로 맞춘다. (Compose·Vite는 `.env.example`을 자동으로 읽지 않는다.) - `VITE_PUBLIC_APP_URL`: 브라우저에서 웹앱을 여는 URL(로컬이면 `http://127.0.0.1:5173` 등). - `VITE_POCKETBASE_URL`: PocketBase URL(로컬이면 `http://127.0.0.1:8090` 등). 2. `npm install` 3. `npm run dev` 운영 예시는 `.env.example`에 `https://todo.sori.studio` / `https://api.todo.sori.studio` 로 적어 두었다. ## 운영 도메인(todo.sori.studio) 요약 - 웹앱: `https://todo.sori.studio` → 리버스 프록시에서 정적 웹 컨테이너(또는 빌드 산출물)로 연결. - API(PocketBase): `https://api.todo.sori.studio` → 같은 프록시 또는 별도 가상 호스트로 PocketBase에 연결. - 빌드 시 `VITE_POCKETBASE_URL=https://api.todo.sori.studio`, `VITE_PUBLIC_APP_URL=https://todo.sori.studio` 를 넣는다. (`docker compose`는 프로젝트 루트의 `.env`를 읽어 `todo-web` 빌드 인자로 전달할 수 있다.) - PocketBase **CORS** 허용 출처에 `https://todo.sori.studio` 를 추가한다. PocketBase는 Docker로 띄우려면 `docker compose up pocketbase`만 실행해도 된다. 컨테이너 **내부**에서는 PocketBase가 `8090`을 쓰고, **호스트에 노출되는 포트**는 `docker-compose.yaml`의 `ports`를 따른다(기본값: 웹 `42881`→컨테이너 `80`, API `42917`→컨테이너 `8090`). ## Docker Compose(웹 + PocketBase) 프로젝트 루트에서(LAN IP 예시): ```bash export VITE_PUBLIC_APP_URL="http://<이_기기_IP>:42881" export VITE_POCKETBASE_URL="http://<이_기기_IP>:42917" docker compose up -d --build ``` - 웹: `http://<이_기기_IP>:42881` - PocketBase 관리자: `http://<이_기기_IP>:42917/_/` **중요:** `VITE_POCKETBASE_URL`은 **컨테이너가 아니라 브라우저**에서 접근한다. 같은 PC에서만 쓸 때는 `http://127.0.0.1:42917`(compose 기본 호스트 포트)이 가능하지만, 휴대폰 등 다른 기기에서는 NAS LAN IP 또는 공인 도메인을 사용해야 한다. 외부에는 리버스 프록시 **80/443**만 열고 내부 포트는 NAS 안에서만 쓰는 구성도 가능하다. ### PocketBase 초기 설정 요약 1. `users`(auth) 컬렉션으로 사용자 계정을 만든다. 2. 컬렉션 `categories`, `todos`를 `docs/spec.md`의 스키마대로 만든다. 3. API 규칙은 “본인 데이터만 접근”을 기본으로 적용한다. (예시는 `docs/spec.md` 참고) 4. CORS 허용 출처에 웹 앱 출처를 추가한다. (LAN이면 `http://:42881`, 도메인이면 `https://todo.sori.studio` 등 **주소창과 동일**하게.) ### 선택: 관리자 자동 생성 `docker-compose.yaml`의 `pocketbase` 서비스에 `PB_ADMIN_EMAIL`, `PB_ADMIN_PASSWORD` 환경 변수를 추가할 수 있다. 값은 저장소에 넣지 말고 NAS 비밀 관리 방식으로 주입한다. ## 단일 이미지(웹만) `Dockerfile`은 정적 빌드 결과를 nginx로 제공한다. 빌드 시점에 `VITE_POCKETBASE_URL`, `VITE_PUBLIC_APP_URL`이 번들·매니페스트에 반영된다. ```bash docker build \ --build-arg VITE_POCKETBASE_URL="https://api.todo.sori.studio" \ --build-arg VITE_PUBLIC_APP_URL="https://todo.sori.studio" \ -t todo-web . ``` ## PWA·HTTPS 홈 화면 추가·서비스 워커 동작은 브라우저마다 다르며, **HTTPS**를 쓰는 것이 안정적이다. NAS 리버스 프록시에서 TLS를 종료하는 구성을 권장한다. ### API 도메인에서 `ERR_SSL_VERSION_OR_CIPHER_MISMATCH`가 날 때 PocketBase는 **자체 TLS 없이 HTTP**로 뜨는 경우가 많다. `https://api.todo.sori.studio`는 **프록시가 TLS를 처리**해야 한다. 443에 인증서가 없거나, 백엔드를 잘못된 프로토콜/포트로 넘기면 위 오류가 난다. 절차는 `docs/nas-deploy-guide.md` **11-1**을 본다. **Cloudflare Tunnel + NPM + SSL `Full`** 조합은 **11-2**를 본다.