요약
moss.land 홈페이지 좌하단의 거버넌스 플로팅 위젯(Algora / AO / Bridge)이 사실상 항상 Offline · 0/3 services 로 표시됩니다. 원인은 monitor.moss.land 쪽 2가지이며, 둘 다 monitor 서비스에서 고쳐야 합니다.
증상
- 위젯이 3개 서비스를 전부
Offline, 요약을 0/3 services로 표시.
- 위젯은 웹 페이지(브라우저)에서
fetch()로 아래 3개를 30초마다 호출하고, res.ok(2xx)일 때만 Online으로 판정합니다.
원인 1 — CORS Access-Control-Allow-Origin이 apex 하나로 고정
monitor.moss.land가 요청 Origin과 무관하게 항상 Access-Control-Allow-Origin: https://moss.land 만 내려줍니다. 그래서 페이지 오리진이 정확히 https://moss.land가 아니면(= www.moss.land, 프리뷰 URL, localhost 개발) 브라우저가 응답을 차단 → fetch가 throw → 위젯이 전부 Offline(0/3)으로 처리합니다.
실측 (서버에는 Origin: https://www.moss.land 를 보냈는데도 ACAO는 apex 고정):
algora /algora-api/stats HTTP 200 Access-Control-Allow-Origin: https://moss.land
ao /ao-api/status HTTP 500 Access-Control-Allow-Origin: https://moss.land
bridge /bridge-api/stats HTTP 200 Access-Control-Allow-Origin: https://moss.land
참고로 www.moss.land는 apex로 301 리다이렉트 없이 그대로 200을 서빙하므로, www로 들어온 사용자는 이 CORS 불일치에 그대로 걸립니다.
제안
- monitor의 CORS 허용 오리진을
https://moss.land + https://www.moss.land (+ 개발용 http://localhost:5173)로 확장하거나,
- 요청
Origin을 허용 목록과 대조해 그대로 반사(reflect)하도록 변경.
- (병행 권장) 웹 서버에서
www.moss.land → moss.land 301 리다이렉트를 두면 오리진이 하나로 통일되어 근본적으로 깔끔합니다.
원인 2 — ao-api/status가 HTTP 500
GET https://monitor.moss.land/ao-api/status 가 현재 500 Internal Server Error를 반환합니다. CORS를 고쳐도 이 서비스는 Offline으로 남아 최대 2/3까지만 됩니다.
제안
- AO(Debate & Plan) 서비스의
/ao-api/status 500 원인 확인 및 복구. 기대 응답 형식(웹이 소비하는 필드): { stats: { agents_active, ideas_generated, debates_today } }.
두 가지 다 고치면
어느 moss.land 도메인에서 접속하든 위젯이 3/3 online으로 정상 표시됩니다.
재현
# CORS 고정 확인 (www Origin으로 요청해도 ACAO가 apex로 고정)
curl -s -D - -o /dev/null -H 'Origin: https://www.moss.land' https://monitor.moss.land/algora-api/stats | grep -i access-control-allow-origin
# ao 500 확인
curl -s -o /dev/null -w '%{http_code}\n' https://monitor.moss.land/ao-api/status
웹(소비 측) 참고
- 위젯 코드:
mossland-website-2026 / mossland-web/src/components/MosslandFloatingGovernance.jsx
- 소비 엔드포인트:
/algora-api/stats, /ao-api/status, /bridge-api/stats (base: https://monitor.moss.land)
- 웹 쪽은 monitor 수정과 별개로, 오해를 주던
agents active 하드코딩 baseline(+5)을 실측값만 쓰도록 이미 정리했습니다. mossland-disclosure-web에도 유사한 ?? 34 baseline이 남아 있어 추후 정리 예정.
요약
moss.land 홈페이지 좌하단의 거버넌스 플로팅 위젯(Algora / AO / Bridge)이 사실상 항상 Offline ·
0/3 services로 표시됩니다. 원인은monitor.moss.land쪽 2가지이며, 둘 다 monitor 서비스에서 고쳐야 합니다.증상
Offline, 요약을0/3 services로 표시.fetch()로 아래 3개를 30초마다 호출하고,res.ok(2xx)일 때만 Online으로 판정합니다.원인 1 — CORS
Access-Control-Allow-Origin이 apex 하나로 고정monitor.moss.land가 요청Origin과 무관하게 항상Access-Control-Allow-Origin: https://moss.land만 내려줍니다. 그래서 페이지 오리진이 정확히https://moss.land가 아니면(=www.moss.land, 프리뷰 URL,localhost개발) 브라우저가 응답을 차단 →fetch가 throw → 위젯이 전부 Offline(0/3)으로 처리합니다.실측 (서버에는
Origin: https://www.moss.land를 보냈는데도 ACAO는 apex 고정):참고로
www.moss.land는 apex로 301 리다이렉트 없이 그대로 200을 서빙하므로, www로 들어온 사용자는 이 CORS 불일치에 그대로 걸립니다.제안
https://moss.land+https://www.moss.land(+ 개발용http://localhost:5173)로 확장하거나,Origin을 허용 목록과 대조해 그대로 반사(reflect)하도록 변경.www.moss.land → moss.land301 리다이렉트를 두면 오리진이 하나로 통일되어 근본적으로 깔끔합니다.원인 2 —
ao-api/status가 HTTP 500GET https://monitor.moss.land/ao-api/status가 현재500 Internal Server Error를 반환합니다. CORS를 고쳐도 이 서비스는 Offline으로 남아 최대 2/3까지만 됩니다.제안
/ao-api/status500 원인 확인 및 복구. 기대 응답 형식(웹이 소비하는 필드):{ stats: { agents_active, ideas_generated, debates_today } }.두 가지 다 고치면
어느 moss.land 도메인에서 접속하든 위젯이
3/3 online으로 정상 표시됩니다.재현
웹(소비 측) 참고
mossland-website-2026/mossland-web/src/components/MosslandFloatingGovernance.jsx/algora-api/stats,/ao-api/status,/bridge-api/stats(base:https://monitor.moss.land)agents active하드코딩 baseline(+5)을 실측값만 쓰도록 이미 정리했습니다.mossland-disclosure-web에도 유사한?? 34baseline이 남아 있어 추후 정리 예정.