# 개발 일지 무엇을 왜 바꿨는지 날짜순으로 남긴다. 새 항목을 **위에** 추가한다. 결론과 배경은 각 문서가 단일 출처다 — 여기에는 요약과 링크만 둔다. --- ## 2026-09-01 — 설정을 `.env` 하나로 모았다 **한 일** - 백엔드 설정을 toml → `pydantic-settings`(FastAPI 공식 방식)로 옮겼다. - `config_loader.py` · `config.local.toml.example` · `config.test.toml.example` 삭제. - `server_configs.py` 107줄 → 26줄. `_apply_*_env_override` 함수 4개 제거. - 호출부 21개 파일은 안 건드렸다 — 같은 이름을 그대로 내보낸다. **왜** 키마다 `if os.environ.get(...)` 를 손으로 나열하는 구조였다. 하나 빠뜨리면 조용히 틀리는데, 실제로 `client_url` 이 빠져 있어 **배포 주소의 API 호출이 전부 CORS 로 막혔다**. `BaseSettings` 는 필드를 선언하면 환경변수가 자동으로 들어와 이 사고가 구조적으로 안 난다. **하는 김에 잡은 잠재 버그** - `.env` 경로가 세 단계라 `solution/.env`(없는 파일)를 보고 있었다. 백엔드를 `solution/` 아래로 옮길 때 안 고쳐진 자리다. toml 이 값을 들고 있어 로컬에서 안 드러났고, 도커는 compose 가 환경변수를 직접 넣어 역시 멀쩡했다. toml 을 없앤 지금은 유일한 공급원이라 치명적이었다. - 환경변수 이름을 `validation_alias` 로 못 박았다. 안 그러면 `port` 필드가 흔한 `PORT` 를 주워 먹어 엉뚱한 포트로 뜬다. **결과** — 백엔드 설정 파일은 최상위 `.env` 하나뿐이다. → [DECISIONS.md](DECISIONS.md) --- ## 2026-08-31 — 킹서버 최초 배포 **한 일** - `~/data2/o2o-web4ai` 에 배포. DB(`web4ai_db`) 생성 + `init.sql` 적용. - 컴포즈 포트를 전부 `.env` 변수로 뽑았다. 로컬 기본값은 그대로다. - `deploy.sh` · `log.sh` 추가. **왜 포트를 뽑았나** 킹서버는 `:80` 을 호스트 nginx 가 이미 물고 있다. 사내망에 열려 있는 건 30xxx 대역뿐이라 그 안에서 자리를 잡아야 했다. → [SERVERS.md](SERVERS.md) **밟은 함정** - `PUBLIC_API_BASE_URL` 은 **브라우저가** 부르는 주소다. `localhost` 로 두면 화면은 뜨고 API 만 죽는다 — 콘솔을 열기 전엔 안 보인다. - 내부 화면의 "빌더 열기" 가 `VITE_SOLUTION_URL` 미주입으로 죽은 링크였다. 로컬에서는 기본값이 맞는 주소라 서버에 올리기 전까지 드러나지 않았다. - `deploy.sh api` 는 worker·api-admin 도 함께 갈아끼운다. 셋이 이미지 한 벌을 나눠 쓰는데 하나만 바꾸면 옛 코드로 도는 컨테이너가 남고, `ps` 로는 셋 다 살아 있어 구분이 안 된다. **남은 것** — `w4ai.o2o.kr` DNS + 앞단(59.14.81.3) 포워딩. 서버에 sudo 가 없어 인프라 몫이다.