# Caddy 서비스 현황 > 점검: 2026-09-16 KST (2026-09-15 GCP VM 이전 반영) > 실행 중인 Caddy의 관리 API(`127.0.0.1:2019/config/`), Windows 서비스, 로컬 포트, 공개 HTTPS를 확인한 시점별 기록입니다. 자동 갱신되는 상태판은 아닙니다. ## 한눈에 보기 Caddy는 내용을 제공하는 7개 호스트와, 내용을 따로 내지 않고 apex로 넘기는 5개 별칭을 처리합니다. 관리 API의 TLS 호스트는 모두 12개입니다. | 도메인 | 주요 서비스 | Caddy 뒤의 대상 | |--------|-------------|------------------| | [dev.tictechtoeai.com](https://dev.tictechtoeai.com/) | 홈페이지 및 파일 공유 | `homepage/dist`, 포트 8090 | | [meet.dev.tictechtoeai.com](https://meet.dev.tictechtoeai.com/) | Meet 화상통화 및 LiveKit | 포트 3000, 7880 | | [api.dev.tictechtoeai.com](https://api.dev.tictechtoeai.com/) | API 프록시 및 법무 문서 | 포트 8081, 8080, `legal/` | | [overlord.dev.tictechtoeai.com](https://overlord.dev.tictechtoeai.com/) | Operation Overlord | 포트 3001 | | [docs.dev.tictechtoeai.com](https://docs.dev.tictechtoeai.com/) | 프로젝트 문서 사이트 | `docs-site/dist` | | [tictechtoeai.com](https://tictechtoeai.com/) | 회사 사이트(bearnie 정적 빌드) | `C:/Developments/tictechtoeai/dist` | | [visionivy.sparklabsacademy.dev](https://visionivy.sparklabsacademy.dev/) | VisionIvy Reflex 앱 | 정적 프런트 + 포트 6000 | 별칭은 모두 `https://tictechtoeai.com{uri}`로 301 이동합니다. `www.tictechtoeai.com`, `sparklabsacademy.dev`, `www.sparklabsacademy.dev`, `sparklabsacademy.com`, `www.sparklabsacademy.com`. API 도메인의 루트 `/`는 홈페이지가 아니라 404 응답으로 설정되어 있습니다. 아래의 실제 경로로 접근합니다. 문서 사이트의 공개 주소는 Caddy가 정적 빌드(`docs-site/dist`)를 제공하는 경로입니다. 로컬 Astro 개발 서버(`localhost:4321`)와는 별개입니다. 2026-09-15에 GCP VM(`sparklabsacademy`, 34.47.127.124)에서 회사 사이트와 VisionIvy를 이 머신으로 옮겼습니다. `dev.tictechtoeai.com` 홈페이지와 apex `tictechtoeai.com`은 다른 빌드입니다. 섞지 않습니다. 아직 GCP VM에 남아 있는 호스트: `mbti`, `saju`, `visionivy2` (백엔드가 없어 502, 소스도 VM에 없음). ## 홈페이지와 파일 공유 도메인: `dev.tictechtoeai.com`, HTTPS 443. | 요청 경로 | 처리 방식 | 연결 대상 | |-----------|-----------|-----------| | `/share/api/*` | 리버스 프록시 | `127.0.0.1:8090` | | 그 외 경로 | 정적 파일 제공 | `C:/Developments/LivekitDev/homepage/dist` | | 정적 파일 404 | `/index.html`로 재작성 | 홈페이지의 index.html | 주요 화면: [홈페이지](https://dev.tictechtoeai.com/), [파일 업로드](https://dev.tictechtoeai.com/share), [공개 다운로드](https://dev.tictechtoeai.com/download). 파일 API에는 `/share/api/` 접두사가 유지되어 전달됩니다. 업로드와 다운로드의 권한 처리는 파일 공유 서비스가 담당합니다. 상세 내용은 [파일 공유 가이드](/guides/fileshare/)를 참고합니다. ## Meet와 LiveKit 도메인: `meet.dev.tictechtoeai.com`. | 외부 포트 | 요청 경로 | 연결 대상 | |-----------|-----------|-----------| | HTTPS 443 | `/rtc*`, `/twirp/*` | LiveKit `127.0.0.1:7880` | | HTTPS 443 | 그 외 경로 | Meet `127.0.0.1:3000` | | HTTPS 8443 | `/rtc*`, `/twirp/*` | LiveKit `127.0.0.1:7880` | | HTTPS 8443 | 그 외 경로 | Meet `127.0.0.1:3000` | | HTTPS/WSS 7443 | 모든 경로 | LiveKit `127.0.0.1:7880` | - 일반 화상통화 화면: [Meet](https://meet.dev.tictechtoeai.com/) - 호환 포트 화면: [Meet 8443](https://meet.dev.tictechtoeai.com:8443/) - LiveKit 시그널링 주소: `wss://meet.dev.tictechtoeai.com:7443` 7443은 화상통화 UI가 아니라 LiveKit 연결용입니다. LiveKit의 미디어 포트는 이 HTTP 프록시 표와 별도로 관리합니다. 현재 활성 설정에는 Flutter `/videocall/*` 전용 정적 파일 경로가 없습니다. 이 주소도 Meet의 기본 프록시로 전달됩니다. 초기 데모 문서의 Flutter 배포 설명과 현재 설정을 구분해야 합니다. ## API와 법무 문서 도메인: `api.dev.tictechtoeai.com`, HTTPS 443. | 요청 경로 | 연결 대상 | 설명 | |-----------|-----------|------| | `/v1/*` | `127.0.0.1:8081` | CelloTutor 프록시 | | `/healthz` | `127.0.0.1:8081` | CelloTutor 헬스 확인 | | `/api/*` | `127.0.0.1:8080` | Caddy 주석상 KHEngine 경로. 실제 수신 프로세스는 Audiveris Web | | `/legal/*` | `C:/Developments/LivekitDev/legal` | 접두사를 제거한 뒤 정적 파일 제공 | | 그 외 경로 | Caddy가 직접 응답 | `404 Not Found` | 법무 문서는 `handle_path`를 사용하므로 `/legal` 접두사가 제거됩니다. ```text /legal/cellotutor/privacy.html -> C:/Developments/LivekitDev/legal/cellotutor/privacy.html ``` [CelloTutor 개인정보처리방침](https://api.dev.tictechtoeai.com/legal/cellotutor/privacy.html)은 홈페이지 빌드 폴더와 분리되어 있습니다. `:8080`은 LivekitDev Windows 서비스가 아닙니다. 이 포트의 Java 프로세스는 다른 프로젝트의 Audiveris Web(악보 OMR)입니다. Caddy의 `/api/*` 라우팅은 살아 있으나, Audiveris는 `/api`를 제공하지 않아 해당 경로는 404입니다. Audiveris 서비스 자체는 [Windows 서비스 가이드](/guides/stack-windows-services/)를 참고합니다. API 접근 로그: `C:/Developments/LivekitDev/logs/api-proxy.log`. 설정된 로그 회전 크기는 10 MiB, 보존 파일 수는 5개입니다. ## Operation Overlord [overlord.dev.tictechtoeai.com](https://overlord.dev.tictechtoeai.com/)의 모든 요청은 `127.0.0.1:3001`로 전달됩니다. 설정 주석에는 Vite 개발 서버로 기록되어 있습니다. 로컬 `:3001` 응답 제목은 `Operation Overlord: The Turning Point`입니다. ## 문서 사이트 도메인: `docs.dev.tictechtoeai.com`, HTTPS 443. | 요청 경로 | 처리 방식 | 연결 대상 | |-----------|-----------|-----------| | 모든 경로 | 정적 파일 제공 | `C:/Developments/LivekitDev/docs-site/dist` | - 공개 화면: [문서 홈](https://docs.dev.tictechtoeai.com/), [Caddy 서비스 현황](https://docs.dev.tictechtoeai.com/guides/caddy-services/) - DNS A 레코드: `docs.dev.tictechtoeai.com` → `125.131.238.28` - 설정 파일: `proxyserver/docs.dev.tictechtoeai.com.caddy` (루트 `Caddyfile`의 `proxyserver/*.caddy` import로 활성) - 접근 로그: `C:/Developments/LivekitDev/logs/docs-site.log` (회전 10 MiB, 보존 5개) - 헤더: `X-Content-Type-Options: nosniff`, `Referrer-Policy: strict-origin-when-cross-origin` 공개 사이트는 `npm run build`로 만든 정적 산출물입니다. 로컬에서 문서를 고친 뒤에는 `docs-site`에서 다시 빌드해야 이 도메인에 반영됩니다. 로컬 Astro 개발 서버는 Windows 서비스가 아닙니다. 이 세션 기준으로 `localhost:4321`(IPv6 `::1`)에서 동작하며, `127.0.0.1:4321`에는 바인딩되지 않습니다. ## 회사 사이트 tictechtoeai.com 도메인: `tictechtoeai.com`, HTTPS 443. 2026-09-15에 GCP VM에서 이전. VM에서는 `astro dev`로 서비스하고 있었습니다. 이 머신에서는 정적 빌드만 제공합니다. 운영에 Astro 개발 서버를 다시 두지 않습니다. 개발 서버는 모든 응답에 Vite 클라이언트를 실어 404 하나가 약 130 KB였고, `/@fs/`로 프로젝트 소스가 인터넷에서 읽혔습니다. | 요청 경로 | 처리 방식 | 연결 대상 | |-----------|-----------|-----------| | 모든 경로 | 정적 파일 제공 | `C:/Developments/tictechtoeai/dist` | | 없는 경로 | `handle_errors`로 `/404.html` | 빌드에 포함된 404 페이지 | - 공개 화면: [ticTechtoeAI](https://tictechtoeai.com/). 응답 제목은 `ticTechtoeAI`. canonical은 `https://tictechtoeai.com`. - `www.tictechtoeai.com`은 내용을 내지 않고 apex로 301 이동합니다. 빌드 canonical·sitemap이 apex 하나이기 때문입니다. - DNS (Google Cloud DNS, zone `tictechtoeai-com`): apex A `125.131.238.28` TTL 300. `www`는 CNAME `tictechtoeai.com.` TTL 300. A가 아니라 CNAME인 이유는 회선 IP가 DHCP(임대 2시간)라 IP가 바뀌면 apex만 고치면 따라오게 하기 위함입니다. - `dev.tictechtoeai.com` A 레코드는 건드리지 않습니다. 루트 `Caddyfile`이 따로 서빙합니다. - 설정 파일: `proxyserver/tictechtoeai.com.caddy` - 접근 로그: `C:/Developments/LivekitDev/logs/tictechtoeai.log` (회전 10 MiB, 보존 5개). VM에서 로그가 2.4 GB까지 늘어난 적이 있어 회전을 겁니다. - 헤더: `X-Content-Type-Options: nosniff`, `Referrer-Policy: strict-origin-when-cross-origin` 소스와 재배포: ```text 소스 : WSL Ubuntu /home/administrator/sites/bearnie 빌드 : wsl -d Ubuntu --cd /home/administrator/sites/bearnie -e npx astro build 배포 : wsl -d Ubuntu -e rsync -a --delete \ /home/administrator/sites/bearnie/dist/ /mnt/c/Developments/tictechtoeai/dist/ ``` Caddy `root`가 같으면 재배포 후 reload는 필요 없습니다. ## sparklabsacademy 별칭 `sparklabsacademy.dev`, `sparklabsacademy.com`과 각각의 `www`는 내용을 내지 않고 `https://tictechtoeai.com{uri}`로 301 이동합니다. HTTP도 같은 목적지입니다. GCP VM에서는 한 벌의 Astro 빌드(bearnie)로 세 도메인을 동시에 서비스하고 있었습니다. Astro `site`는 하나뿐이라 canonical·sitemap이 한 주소로만 박힙니다. 같은 문서를 여러 주소로 그대로 내보내면 검색엔진에 중복으로 잡히므로, 내용은 apex 한 곳에서만 냅니다. VM의 Caddyfile도 `sparklabsacademy.com`을 `tictechtoeai.com`으로 넘기고 있었습니다. | DNS 이름 | 레코드 | 대상 | |----------|--------|------| | `sparklabsacademy.dev` | A | `125.131.238.28` TTL 300 | | `www.sparklabsacademy.dev` | CNAME | `sparklabsacademy.dev.` | | `sparklabsacademy.com` | A | `125.131.238.28` TTL 300 | | `www.sparklabsacademy.com` | CNAME | `sparklabsacademy.com.` | `www.sparklabsacademy.com`은 원래 자기 자신을 가리키는 CNAME 루프였고, 2026-09-15에 고쳤습니다. 설정 파일: `proxyserver/sparklabsacademy.caddy`. VisionIvy 서브도메인은 이 파일에 넣지 않습니다. ## VisionIvy 도메인: `visionivy.sparklabsacademy.dev`, HTTPS 443. 2026-09-15에 GCP VM에서 이전. WSL이 아니라 Windows에서 직접 실행합니다. Reflex는 프런트와 백엔드가 분리되어 있습니다. VM에서는 프런트도 `react-router dev`로 띄워 3000을 프록시했습니다. 이 머신의 3000은 LiveKit Meet이 쓰고, 운영에 개발 서버를 둘 이유도 없습니다. 정적 프런트를 Caddy가 직접 줍니다. | 요청 경로 | 처리 방식 | 연결 대상 | |-----------|-----------|-----------| | `/_event/*` | 리버스 프록시 (WebSocket 포함) | `127.0.0.1:6000` | | `/ping` | 리버스 프록시 | `127.0.0.1:6000` | | `/_upload/*` | 리버스 프록시 | `127.0.0.1:6000` | | 그 외 경로 | 정적 파일 | `C:/Developments/VisionIvy/.web/build/client` | `localhost`가 아니라 `127.0.0.1`로 적습니다. Windows에서 `localhost`는 `::1`로 먼저 풀리는데, 백엔드(uvicorn/granian)는 IPv4에만 바인딩합니다. 정적 쪽은 Reflex export 관례를 따릅니다. 라우트마다 `.html`이 있으므로 `try_files {path} {path}.html {path}/index.html /404.html`입니다. - 공개 화면: [VisionIvy](https://visionivy.sparklabsacademy.dev/) - 헬스: [ /ping ](https://visionivy.sparklabsacademy.dev/ping) → JSON `"pong"`. 응답 서버 헤더는 `granian`, `Via: 1.1 Caddy`. - DNS A: `visionivy.sparklabsacademy.dev` → `125.131.238.28` TTL 300 - 설정 파일: `proxyserver/visionivy.sparklabsacademy.dev.caddy` - 접근 로그: `C:/Developments/LivekitDev/logs/visionivy.log` (회전 10 MiB, 보존 5개) - 헤더: `X-Content-Type-Options: nosniff`, `Referrer-Policy: strict-origin-when-cross-origin` 백엔드 상시 구동은 LivekitDev Windows 서비스가 아닙니다. 작업 스케줄러 `VisionIvy-Ensure`가 `C:\Developments\VisionIvy\scripts\ensure_visionivy.ps1`을 부팅 시와 5분 주기로 실행합니다. 백엔드가 꺼지면 `/ping`과 `/_event/*`는 502가 되고, 정적 화면은 그대로 열립니다. 프런트 다시 빌드: ```bat cd /d C:\Developments\VisionIvy .venv\Scripts\reflex.exe export --frontend-only --no-zip ``` ## 공통 연결 흐름 ```text 외부 사용자 -> Caddy :80 -> 같은 도메인의 HTTPS로 301 이동 (sparklabsacademy 별칭은 HTTPS apex로 바로 301) -> Caddy :443 +-- dev -> homepage/dist 또는 :8090 +-- meet -> :3000 또는 :7880 +-- api -> :8081, :8080 또는 legal/ +-- overlord -> :3001 +-- docs -> docs-site/dist +-- tictechtoeai.com -> C:/Developments/tictechtoeai/dist +-- www / sparklabsacademy* -> https://tictechtoeai.com{uri} +-- visionivy -> 정적 프런트 또는 :6000 -> Caddy :7443 -> LiveKit :7880 -> Caddy :8443 -> Meet :3000 또는 LiveKit :7880 ``` 내용을 제공하는 호스트는 HTTP 80 요청을 같은 이름의 HTTPS로 영구 리다이렉트합니다. TLS는 Caddy가 처리합니다. 홈페이지, API, 문서, 회사 사이트, VisionIvy에는 nosniff 및 strict-origin-when-cross-origin 헤더 설정이 있습니다. ## 이번 점검 결과 | 점검 대상 | 확인 결과 | |-----------|-----------| | Caddy 관리 API `127.0.0.1:2019/config/` | 활성 설정 조회 성공. TLS 호스트 12개 | | 활성 HTTP 서버 수신 설정 | 80, 443, 7443, 8443 | | Windows 서비스 | LivekitDevCaddy, LivekitDevMeet, LivekitDevServer, LivekitDevFileShare 모두 Running / Automatic. 문서 사이트·VisionIvy 전용 Windows 서비스는 없음 | | 작업 스케줄러 `VisionIvy-Ensure` | Ready/Running. 스크립트 `C:\Developments\VisionIvy\scripts\ensure_visionivy.ps1` | | Meet `127.0.0.1:3000/` | HTTP 200 | | Overlord `127.0.0.1:3001/` | HTTP 200 | | LiveKit `127.0.0.1:7880/` | HTTP 200 | | CelloTutor `127.0.0.1:8081/healthz` | GET HTTP 200. HEAD는 405 | | FileShare `127.0.0.1:8090/share/api/health` | HTTP 200 | | Audiveris `127.0.0.1:8080/` | HTTP 200 (악보 OMR 웹). `/api/*`는 404 | | VisionIvy 백엔드 `127.0.0.1:6000/ping` | `"pong"` | | 공개 `https://docs.dev.tictechtoeai.com/` | HTTP 200, `docs-site/dist` 정적 파일 | | 공개 `https://tictechtoeai.com/` | HTTP 200, 제목 `ticTechtoeAI`, Last-Modified 2026-09-15 | | 공개 `https://www.tictechtoeai.com/` | HTTP 301 → `https://tictechtoeai.com/` | | 공개 `https://sparklabsacademy.dev/` 및 `.com`, 각각의 `www` | HTTP 301 → `https://tictechtoeai.com/` | | 공개 `https://visionivy.sparklabsacademy.dev/` | HTTP 200, 정적 프런트, Last-Modified 2026-09-15 | | 공개 `https://visionivy.sparklabsacademy.dev/ping` | HTTP 200 `"pong"`, `Server: granian` | | 로컬 Astro `http://localhost:4321/` | 이 세션에서 HTTP 200 (`::1` listen) | | 내용 제공 호스트 HTTP :80 | 모두 HTTPS로 301 | 위 결과는 이 머신에서 확인한 기록입니다. 외부 인터넷에서의 방화벽·영상 통화 성공을 보장하는 점검은 아닙니다. 위 DNS A 레코드는 모두 `125.131.238.28`로 확인했습니다. ## 설정 파일과 문서 사이트 위치 | 경로 | 역할 | |------|------| | `Caddyfile` | 홈페이지, Meet, LiveKit, Overlord 및 `proxyserver/*.caddy` import | | `proxyserver/api.dev.tictechtoeai.com.caddy` | API 도메인의 경로별 프록시 및 법무 문서 | | `proxyserver/docs.dev.tictechtoeai.com.caddy` | 문서 사이트 정적 파일 제공 | | `proxyserver/tictechtoeai.com.caddy` | 회사 사이트 정적 파일. www는 apex로 301 | | `proxyserver/sparklabsacademy.caddy` | sparklabsacademy.dev/.com 및 www → apex 301 | | `proxyserver/visionivy.sparklabsacademy.dev.caddy` | VisionIvy 정적 프런트 + `:6000` | | `homepage/dist/` | Caddy가 제공하는 정적 홈페이지 (`dev.`) | | `docs-site/dist/` | Caddy가 제공하는 정적 문서 사이트 | | `C:/Developments/tictechtoeai/dist/` | Caddy가 제공하는 회사 사이트 정적 빌드 | | `C:/Developments/VisionIvy/.web/build/client/` | VisionIvy 정적 프런트 | | `legal/` | API 도메인에서 제공하는 법무 문서 | | `docs-site/` | Astro 문서 소스. 공개 반영은 `npm run build` | | `logs/api-proxy.log` | API 도메인 접근 로그 | | `logs/docs-site.log` | 문서 도메인 접근 로그 | | `logs/tictechtoeai.log` | 회사 사이트 접근 로그 | | `logs/visionivy.log` | VisionIvy 접근 로그 | 설정이 바뀌면 이 문서의 원본 `docs-site/public/downloads/caddy-services.md`를 갱신하고 PDF와 Astro 페이지에도 반영합니다. 관련 운영 절차는 [Windows 서비스 가이드](/guides/stack-windows-services/)와 [Caddy 웹 서비스 등록](/guides/caddy-publishing-guide/)을 참고합니다.