문제 해결
증상별 원인과 조치를 모았습니다. 대부분의 문제는 아래 3개 명령으로 원인이 좁혀집니다.
cd /opt/kopens/plantpulse-studio-docker
bash bin/status.sh # ① 컨테이너 상태 + 헬스 + 세션 수
curl -s localhost:5170/health # ② 서버가 살아 있는가
docker logs --tail 100 plantpulse-studio-server # ③ 무엇이 잘못됐는가
로그 보는 법
| 대상 | 명령 |
|---|---|
| 스튜디오 서버(가장 중요) | docker logs -f --tail 200 plantpulse-studio-server |
| 웹(nginx) | docker logs --tail 100 plantpulse-studio-web |
| 빌더 사이드카 | docker logs --tail 100 plantpulse-studio-agent-server |
| 스크립트로 팔로우 | bash bin/logs.sh (기본 서버) · bash bin/logs.sh studio-web |
| 자동 백업 | tail -50 dist/backup.log |
| 앱 세션 컨테이너 | docker ps --filter label=plantpulse-studio=1 로 이름 확인 후 docker logs <이름> |
docker logs --since 30m plantpulse-studio-server
docker logs --since "2026-07-28T09:00:00" plantpulse-studio-server
API 키·토큰은 로그에 기록되지 않습니다(감사 로그에도 값 대신 지문만). 로그를 지원팀에 전달할 때는 사이트명·설비명 같은 현장 정보만 확인하면 됩니다.
이 설치가 «할 수 있는지» 한 번에 확인하기
GET /api/v1/diagnostics (관리자 전용)
「화면은 뜨는데 PDF 가 안 나온다」 「앱이 안 열린다」 같은 문의에 먼저 눌러 보는 자리입니다.
{"ok": true,
"os": {"ok": true, "detail": "Debian GNU/Linux 13"},
"chromium": {"ok": true, "detail": "Chromium 153…"},
"pdf": {"ok": true, "detail": "26568 bytes"},
"fontsCjk": {"ok": true, "detail": "15 faces"},
"docker": {"ok": true, "detail": "server 29.8.1"}}
항목마다 {ok, detail} 이고, 맨 위 ok 는 전부 참일 때만 참입니다. pdf 는 설명이 아니라
실제로 한글 PDF 를 한 장 구워 본 결과이고, docker 는 세션 컨테이너를 띄울 수 있는지를 봅니다.
/health 와는 다른 질문입니다 — 화면에서 폴링하지 마십시오/health 는 「살아 있는가」를 싸게 자주 묻고, 진단은 「할 수 있는가」를 비싸게 가끔 묻습니다
(PDF 를 실제로 굽습니다). 대시보드에서 주기적으로 호출하면 그 자체가 부하가 됩니다.
증상 → 원인 빠른 대조
| 증상 | 흔한 원인 | 확인 | 조치 |
|---|---|---|---|
| 웹 화면이 아예 안 열림 | 스택이 내려가 있거나 80 포트 점유 | bash bin/status.shdocker logs plantpulse-studio-web | bash bin/up.sh · 80 포트 사용 중인 다른 서비스 정리 |
| 화면은 뜨는데 로그인 실패 | 부트스트랩 계정 미설정, 또는 플랫폼 도달 불가 | grep STUDIO_LOCAL_USERS .envcurl -s localhost:5170/health | .env 에 계정 지정 후 bash bin/restart.sh |
| 로그인이 갑자기 막힘(잠시 후 재시도) | 로그인 레이트리밋(IP당 10회/분) | docker logs --tail 50 plantpulse-studio-server | 1분 기다렸다 재시도 |
| 헬스가 계속 DOWN, 로그에 DB 인증 오류 | DATABASE_URL 의 비밀번호만 바꾸고 DB 안의 역할은 안 바꿈 | docker logs plantpulse-studio-server외부 PG 에서 psql 로 직접 접속 | 원래 비밀번호로 되돌리거나, PostgreSQL 안에서 계정 비밀번호를 먼저 변경 |
| 프로젝트 열기가 실패(500) | 세션 런타임 이미지 없음 | docker image inspect plantpulse-studio-runtime:latest | bash bin/up.sh 재실행(에어갭은 bin/load.sh 로 반입) |
| 프리뷰·배포앱이 빈 화면(IP 접속) | 방화벽에서 5171 차단 | curl -I http://<서버IP>:5171/ | 방화벽에서 5171 개방 |
프리뷰가 빈 화면 + 콘솔 Mixed Content | 스튜디오는 HTTPS 인데 앱 자산이 HTTP 로 요청됨 | 브라우저 개발자도구 콘솔 | 프록시에 X-Forwarded-Proto $scheme 추가 → 도메인 |
| 코드를 고쳐도 프리뷰가 그대로 | 프록시가 HMR 웹소켓을 업그레이드하지 않음 | 개발자도구 → 네트워크 → WS 요청이 101 인지 | 두 vhost 에 Upgrade/Connection 헤더 |
| 빌드 채팅이 오래 걸리면 "연결 오류: network error" | 프록시 무전송 타임아웃(기본 60초) | 프록시 vhost 설정 확인 | 두 vhost 에 proxy_read_timeout 3600s |
| 답변이 실시간이 아니라 뭉텅이로 뜸 | proxy_buffering 켜짐(기본값) | 〃 | proxy_buffering off |
| 아무 도메인으로 접속해도 엉뚱한 곳으로 빠짐 | web nginx 설정 로드 순서(첫 server 가 기본 서버) | docker exec plantpulse-studio-web ls /etc/nginx/conf.d | vhost 파일명을 zz- 로 시작하게 변경 |
| 배포앱에서 실데이터가 401 | ①도메인 분리 전에 로그인한 세션 ②플랫폼 키 미설정 | 로그아웃→재로그인 시도 환경설정 → 플랫폼 탭 | ①재로그인 1회 ②PLATFORM_API_KEY 설정 후 bin/restart.sh |
| 키를 바꿨는데 반영되지 않음 | .env 만 고쳤고 docker restart 는 .env 를 다시 읽지 않음 | 환경설정 화면의 배지가 환경변수 기본값 인지 | 빠른 길 — 환경설정 화면에 새 키를 입력(재기동 없이 즉시 적용). 환경변수 쪽을 바꿔야 한다면 bash bin/restart.sh (또는 docker compose up -d --force-recreate) |
| 앱 빌드가 "사이드카" 오류로 실패 | 빌더 사이드카 미기동 | docker ps --filter name=plantpulse-studio-agent-servercurl -s localhost:8000/health | bash bin/restart.sh · 급하면 환경설정 → 에이전트에서 빌더 엔진을 내장으로 전환 |
채팅에 「AI 프로바이더 <주소> 에 접속할 수 없습니다. 환경설정 → AI 탭에서 주소·키를 확인하세요.」 | AI 주소·키 오류, 게이트웨이 다운 | 환경설정 → AI 탭의 연결 테스트docker logs --tail 50 plantpulse-studio-server | 주소·키를 화면에서 수정 — 즉시 적용됩니다(재기동 불필요) |
| 채팅에 「AI 프로바이더가 설정되지 않았습니다(환경설정).」 | AI 프로바이더가 아예 비어 있음 | 환경설정 → AI 탭 | 주소·키 입력 후 [연결 테스트] |
| 3D·대형 앱 빌드가 중간에 죽음 | 메모리 부족(세션 컨테이너 상한 2 GB, 호스트 여유) | docker stats · free -h | 동시 열린 프로젝트 줄이기 · 호스트 메모리 증설 |
| 자동 백업이 돌지 않음 | cron 미설치 또는 DB 도달 실패 | cat /etc/cron.d/pp-studio-backuptail -50 dist/backup.log | sudo bash bin/install-backup-cron.sh 재설치 · DRYRUN=1 bash bin/restore.sh 로 DB 도달 확인 |
| 디스크가 가득 참 | 백업·빌드 산출물 누적 | df -hdu -sh dist /var/lib/pp-studio/* | 보존 개수 축소(BACKUP_KEEP) · 오래된 백업 정리 |
| 업데이트했는데 옛 화면이 그대로 | 브라우저 캐시 또는 이미지 pull 실패 | 브라우저 강력 새로고침(Ctrl+Shift+R)bash bin/update.sh 출력의 pull 결과 | 레지스트리 로그인 확인 후 bash bin/update.sh 재실행 |
자세한 진단
스택이 뜨지 않을 때
cd /opt/kopens/plantpulse-studio-docker
bash bin/status.sh
docker ps -a --filter name=pp-studio # Exited 인 컨테이너 찾기
docker logs --tail 200 plantpulse-studio-server
컨테이너가 계속 재시작(Restarting)한다면 로그 마지막 줄에 원인이 있습니다. 가장 흔한 것은
데이터베이스 접속 실패와 .env 값 오류입니다.
grep -E '^(DATABASE_URL|COMPOSE_PROFILES|PG_|DATA_ROOT|PLATFORM_API_TARGET)' .env
설치가 "제대로 된 상태"인지 한 번에 판정
bash bin/smoke-install.sh
헬스 · 무인증 설정 API · 웹 응답 · 실제 로그인 · 세션 런타임 이미지 · 컨테이너 상태를 순서대로 검사하고, 실패한 첫 항목을 알려 줍니다.
앱 세션(프로젝트 열기) 문제
docker ps --filter label=plantpulse-studio=1 # 지금 떠 있는 세션 컨테이너
docker image inspect plantpulse-studio-runtime:latest >/dev/null && echo "런타임 이미지 OK"
- 세션 컨테이너는 유휴 30분 후 자동 회수됩니다 — 목록에 없다고 오류가 아닙니다.
- 서버를 재시작하면 남아 있던 세션 컨테이너는 자동 정리됩니다.
- 여러 사용자가 동시에 열면 메모리를 그만큼 씁니다(
docker stats로 확인).
플랫폼(실데이터) 연결 문제
증상은 보통 "채팅 질의는 되는데 값이 안 나온다" 또는 "설비 목록이 비어 있다" 입니다.
- 환경설정 → 플랫폼 탭에서 연결 상태를 확인합니다.
.env의PLATFORM_API_TARGET주소가 맞는지 확인합니다.PLATFORM_API_KEY가 설정돼 있는지 확인합니다 → 비밀 관리- 서버 로그에서 플랫폼 호출 오류를 확인합니다.
docker logs --tail 200 plantpulse-studio-server | grep -i platform
플랫폼이 잠시 내려가면 와처 실행은 자동으로 건너뜁니다(재기동 후 자동 재개).
도메인·프록시 문제
증상이 여러 가지로 나타나지만 원인은 대개 4개 설정 중 하나가 빠진 것입니다. 도메인과 리버스 프록시의 체크리스트를 그대로 대조하세요.
복구 수단
| 상황 | 조치 |
|---|---|
| 설정을 잘못 만져 스택이 이상함 | .env 원복 후 bash bin/restart.sh |
| 데이터가 손상됨 | 백업과 복구 — bash bin/restore.sh |
| 업데이트 후 문제 발생 | .env 의 PP_IMAGE_TAG 를 직전 버전으로 고정 후 bash bin/update.sh |
| 배포한 앱에 문제 발생 | 스튜디오 화면의 배포 이력에서 이전 버전으로 롤백 |
지원 요청 시 함께 보내면 좋은 것
cd /opt/kopens/plantpulse-studio-docker
bash bin/status.sh > /tmp/pp-status.txt
docker logs --tail 500 plantpulse-studio-server &> /tmp/pp-server.log
grep -vE 'KEY|TOKEN|PASSWORD' .env > /tmp/pp-env-safe.txt # 비밀 제외본
- 언제부터, 어떤 조작에서 발생했는지
- 화면 캡처(브라우저 개발자도구 콘솔 포함이면 더 좋음)
- 설치 버전(
.env의PP_IMAGE_TAG, 비어 있으면VERSION의 칼버)과 접속 방식(IP / 도메인 / 프록시 유무)
.env 원본에는 API 키가 들어 있습니다. 위처럼 비밀을 제외한 사본을 만들어 보내세요.
관련 문서
- 설치 · 폐쇄망 설치
- 도메인과 리버스 프록시
- 백업과 복구 · 비밀 관리