OPERATIONS - zero1ne-26/doc GitHub Wiki

μ „μ‹œ 운영 맀뉴얼

일상 μš΄μ˜μžκ°€ μ „μ‹œ 운영 쀑 맀일 따라야 ν•  절차. 기술 λ°°κ²½ 없이 따라할 수 μžˆλ„λ‘ ꡬ체 λͺ…령·확인 ν•­λͺ© μœ„μ£Όλ‘œ.


1. 일일 운영 흐름

1.1 μ „μ‹œ μ˜€ν”ˆ (κ°œμ‹œ 30λΆ„ μ „)

μˆœμ„œ μž‘μ—… 검증
1 UPS(Uninterruptible Power Supply, 무정전 전원곡급μž₯치)·전원 확인 μ „λ©΄ LED 정상
2 메인 μ›Œν¬μŠ€ν…Œμ΄μ…˜ λΆ€νŒ… OS λ‘œκ·ΈμΈκΉŒμ§€ 정상
3 docker μžλ™ μ‹œμž‘ 확인 docker compose ps β€” λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ healthy
4 HA λŒ€μ‹œλ³΄λ“œ μ—΄κΈ° (http://localhost:8123) λͺ¨λ“  λ‘œλ΄‡ entity online, λͺ¨λ“  카메라 entity available
5 Frigate UI μ—΄κΈ° (http://localhost:5000) λͺ¨λ“  카메라 라이브 μ˜μƒ ν‘œμ‹œ
6 λ‘œλ΄‡ 전원 켜기 + λ„ν¬μ—μ„œ stand 확인 SPOT: 정상 μžμ„Έ, 배터리 > 80%
7 νƒœλΈ”λ¦Ώ 3λŒ€ μΆ©μ „ λ„ν¬μ—μ„œ 뢄리 + νŽ˜μ–΄λ§ 카메라 μ•ž ν…ŒμŠ€νŠΈ 각 νƒœλΈ”λ¦Ώμ΄ QR β†’ ν™˜μ˜ λ©”μ‹œμ§€κΉŒμ§€ OK
8 μ‹œμž‘ μ‹œλ‚˜λ¦¬μ˜€ dry-run 1회 카페 β†’ 곡원 β†’ μ°¨λŸ‰ β†’ μ‹€λ‚΄ 1인 쒅단
9 운영 일지에 점검 κ²°κ³Ό 기둝 (체크리슀트 양식 μ°Έμ‘°)

1.2 운영 쀑 (μ‹œμ—° μ§„ν–‰)

μ£ΌκΈ° μž‘μ—…
λ§€ μ„Έμ…˜ μ‹œμž‘ νŽ˜μ–΄λ§ 카메라 μ•ž μ•ˆλ‚΄ ("QR 인식 μ€‘μž…λ‹ˆλ‹€")
λ§€ μ„Έμ…˜ μ’…λ£Œ νƒœλΈ”λ¦Ώ 회수 β†’ 도크 μΆ©μ „ + μ‹œκ°Β·μŒμ„± μ•ˆλ‚΄λ‘œ λ‹€μŒ μ²΄ν—˜μž 호좜
λ§€ 30λΆ„ λ‘œλ΄‡ 배터리 확인 β€” 25% 미만 μ‹œ μžλ™ 도크 볡귀 (λ˜λŠ” μˆ˜λ™ κ΅λŒ€)
λ§€ 1μ‹œκ°„ 운영 일지 μ—…λ°μ΄νŠΈ (μ²΄ν—˜μž 수, 이상 이벀트 유무)

1.3 μ „μ‹œ μ’…λ£Œ

μˆœμ„œ μž‘μ—…
1 λͺ¨λ“  ν™œμ„± μ„Έμ…˜ μ’…λ£Œ (HAμ—μ„œ "force end" λ²„νŠΌ)
2 λ‘œλ΄‡μ„ λ„ν¬λ‘œ 볡귀 (robot_command capability=goto + dock_position)
3 νƒœλΈ”λ¦Ώ λͺ¨λ‘ 도크 좩전기에 거치
4 μ»¨ν…Œμ΄λ„ˆ 정상 μ’…λ£Œ: docker compose stop (ν•„μš” μ‹œ) β€” restart: always라 λΆ€νŒ… μ‹œ μžλ™ μž¬μ‹œμž‘
5 운영 일지 마감 + λ‹€μŒ λ‚  μΈμˆ˜μΈκ³„ λ©”λͺ¨

2. 비상 λŒ€μ‘

2.1 e-stop λ°œλ™ (μ‚¬μš©μž μœ„ν—˜ 감지)

물리 e-stop(emergency stop, κΈ΄κΈ‰ μ •μ§€) λ²„νŠΌ λˆ„λ₯΄κΈ° (운영자 μ½˜μ†” + μ „μ‹œμž₯ μž…κ΅¬ λΉ„μΉ˜).

이후 μžλ™μœΌλ‘œ μΌμ–΄λ‚˜λŠ” 일:

  • safety/estop active=true MQTT(Message Queuing Telemetry Transport, λ©”μ‹œμ§€ 큐 ν…”λ ˆλ©”νŠΈλ¦¬ 전솑 ν”„λ‘œν† μ½œ) publish (retain).
  • λͺ¨λ“  λ‘œλ΄‡ μ¦‰μ‹œ μ •μ§€ (mcp-robot-adapter Watchdog 인터둝).
  • λͺ¨λ“  ν™œμ„± νƒœλΈ”λ¦Ώμ— "μž μ‹œ μ‹œμ—°μ„ λ©ˆμΆ”μ—ˆμŠ΅λ‹ˆλ‹€" ν‘œμ‹œ (HA μžλ™ν™”).

ν•΄μ œ 절차:

  1. μœ„ν—˜ μš”μΈ 제거 ν›„ μš΄μ˜μžκ°€ e-stop λ²„νŠΌ release.
  2. HA λŒ€μ‹œλ³΄λ“œμ—μ„œ "E-Stop Reset" λ²„νŠΌ 클릭 β€” safety/estop active=false publish.
  3. λ‘œλ΄‡μ΄ μžλ™ stand β†’ μš΄μ˜μžκ°€ 정상 λ™μž‘ 1회 확인.

2.2 λ‘œλ΄‡ fault

증상 운영자 μ•‘μ…˜
HAμ—μ„œ binary_sensor.spot_01_online = off λ‘œλ΄‡ 전원·Wi-Fi 확인 β†’ μ•ˆ 되면 λ‹€λ₯Έ λ‘œλ΄‡μœΌλ‘œ μ‹œλ‚˜λ¦¬μ˜€ λŒ€μ²΄
sensor.spot_01_battery < 20% λ„ν¬λ‘œ 볡귀 λͺ…λ Ή β†’ μΆ©μ „ 30λΆ„ β†’ μž¬νˆ¬μž…
robot.fault μ•Œλ¦Ό (severity: critical) λ‘œλ΄‡ μ¦‰μ‹œ μ •μ§€ (μˆ˜λ™ e-stop) β†’ μ œμ‘°μ‚¬ 지원 콜

2.3 LLM λ‹¨μ ˆ (Anthropic API μž₯μ• )

  • HA μžλ™ν™”μ˜ 폴백 μ‹œλ‚˜λ¦¬μ˜€ μžλ™ λ°œλ™ (SERVICES.md Β§3 폴백 μΉ΄νƒˆλ‘œκ·Έ μ°Έμ‘°).
  • 운영자 μ•‘μ…˜:
    • 운영 일지에 μ‹œμž‘ μ‹œκ° 기둝.
    • HA λŒ€μ‹œλ³΄λ“œ 상단 λ…Έλž€ λ°°λ„ˆ ("폴백 λͺ¨λ“œ 운영 쀑") 확인.
    • 30λΆ„ 이상 지속 μ‹œ: μš΄μ˜μžκ°€ μ²΄ν—˜μžμ—κ²Œ 사전 μ–‘ν•΄ + μ‹œμ—° 페이슀 μ‘°μ •.
    • 볡ꡬ되면 μžλ™ 정상 λͺ¨λ“œ β€” μΆ”κ°€ μ•‘μ…˜ λΆˆν•„μš”.

2.4 νƒœλΈ”λ¦Ώ λΆ„μ‹€Β·κ³ μž₯

  • μ¦‰μ‹œ νŽ˜μ–΄λ§ 토큰 λ¬΄νš¨ν™”: HA λŒ€μ‹œλ³΄λ“œ β†’ "Active Sessions" β†’ ν•΄λ‹Ή μ„Έμ…˜ "Force End".
  • μ˜ˆλΉ„ νƒœλΈ”λ¦Ώ 1λŒ€λ₯Ό νŽ˜μ–΄λ§ 카메라 μ•žμ—μ„œ μ‹ κ·œ νŽ˜μ–΄λ§.

2.5 카메라 λ‹¨μ ˆ

  • HAμ—μ„œ binary_sensor.<camera>_available = off.
  • 인접 카메라가 cross-camera ReID둜 일뢀 보완 β€” zone 좔적 신뒰도 μ €ν•˜ μ•Œλ¦Ό λ°œλ™.
  • 30λΆ„ 이상 λ‹¨μ ˆ μ‹œ μ‹œμ—° μΌμ‹œ 쀑단 β†’ 카메라 μž¬κΈ°λ™ λ˜λŠ” 케이블 ꡐ체.

2.6 μ •μ „

  • UPSκ°€ 5λΆ„ λ°±μ—… β†’ μš΄μ˜μžκ°€ μˆ˜λ™μœΌλ‘œ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ ν›„ μ‹œμŠ€ν…œ μ…§λ‹€μš΄.
  • 전원 볡ꡬ ν›„ Β§1.1 λΆ€νŒ… 절차둜 μž¬μ‹œμž‘.

3. 운영 일지 양식

맀일 운영 μ‹œμž‘Β·μ’…λ£Œ μ‹œ λ‹€μŒμ„ 기둝 (μŠ€ν”„λ ˆλ“œμ‹œνŠΈ λ˜λŠ” 운영 일지 μ±…μž):

일자: 2026-XX-XX
운영자: <이름>

[μ‹œμž‘ 점검 β€” 09:30]
β–‘ UPS 정상
β–‘ docker compose ps: λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ healthy
β–‘ HA λͺ¨λ“  entity online
β–‘ Frigate λͺ¨λ“  카메라 라이브
β–‘ λ‘œλ΄‡ 배터리 SPOT 01: ___%, SPOT 02: ___%
β–‘ νƒœλΈ”λ¦Ώ 3λŒ€ 정상
β–‘ Dry-run μ‹œλ‚˜λ¦¬μ˜€ 톡과

[운영 쀑 이벀트]
μ‹œκ° / 이벀트 / 쑰치
- 10:15 / SPOT-01 fault: low_battery / 도크 볡귀, 30λΆ„ μΆ©μ „ ν›„ μž¬νˆ¬μž…
- 11:30 / νƒœλΈ”λ¦Ώ t02 νŽ˜μ–΄λ§ μ‹€νŒ¨ / μž¬μ‹œμž‘ ν›„ 정상

[μ’…λ£Œ β€” 18:30]
β–‘ λͺ¨λ“  μ„Έμ…˜ μ’…λ£Œ
β–‘ λ‘œλ΄‡ 도크 볡귀
β–‘ νƒœλΈ”λ¦Ώ μΆ©μ „ 도크 거치
β–‘ 운영 일지 마감

였늘 μ²΄ν—˜μž 수: ___
이상 이벀트: ___
λ‹€μŒ μš΄μ˜μžμ—κ²Œ μΈμˆ˜μΈκ³„: ___

3.5 λ‘œλ΄‡ 배터리·좩전 운영

3.5.1 SPOT 운영 사이클

  • 운영 μ‹œκ°„: 1회 μΆ©μ „ μ•½ 90λΆ„ 운용 (μ‹œμ—° 강도에 따라 60~120λΆ„).
  • μΆ©μ „ μ‹œκ°„: 0% β†’ 100% μ•½ 90λΆ„, 50% β†’ 100% μ•½ 45λΆ„ (μ œμ‘°μ‚¬ 사양 κΈ°μ€€).
  • ꢌμž₯ 운영 사이클: 60λΆ„ μ‹œμ—° β†’ 3045λΆ„ μΆ©μ „ (battery 3080% μœˆλ„ ν™œμš©).

3.5.2 μžλ™ 도크 볡귀

HA μžλ™ν™”λ‘œ μž„κ³„κ°’ 도달 μ‹œ μžλ™:

automation:
  - alias: "SPOT-01 low battery β†’ dock"
    trigger:
      - platform: numeric_state
        entity_id: sensor.spot_01_battery
        below: 25
    condition:
      - condition: state
        entity_id: binary_sensor.orchestrator_alive
        state: 'on'
    action:
      - service: mqtt.publish
        data:
          topic: "robot/spot-01/command"
          payload_template: >
            {
              "command_id": "auto-dock-{{ now().timestamp() | int }}",
              "robot_id": "spot-01",
              "capability": "goto",
              "params": {"x": <DOCK_X>, "y": <DOCK_Y>, "yaw": <DOCK_YAW>},
              "priority": "operator",
              "source": {"service": "home-assistant", "trace_id": "auto-dock"},
              "expires_at": null
            }

3.5.3 운영자 μˆ˜λ™ κ΅λŒ€

2λŒ€ λ‘œλ΄‡ 보유 μ‹œ ν•œ λŒ€ μΆ©μ „ 쀑 λ‹€λ₯Έ λŒ€κ°€ μ‹œμ—° β€” orchestrator의 μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈμ— κ°€μš© λ‘œλ΄‡ 풀이 μžλ™ 반영(Β§7.3 λ™μ‹œμ„± μ •μ±…).

운영자 μ•‘μ…˜:

  1. HA λŒ€μ‹œλ³΄λ“œμ—μ„œ "Battery" μΉ΄λ“œ 확인 β€” μ–΄λŠ λ‘œλ΄‡μ΄ μΆ©μ „ 쀑인지 μ‹œκ°.
  2. μ‹œμ—° 도쀑 κ΅λŒ€ ν•„μš” μ‹œ "Manual Dock" λ²„νŠΌ β†’ λ‹€λ₯Έ λ‘œλ΄‡μ΄ 인계.
  3. orchestrator의 attached_session이 μžλ™μœΌλ‘œ κ°±μ‹ λ˜μ–΄ μ‹ κ·œ μ‚¬μš©μžλŠ” κ°€μš© λ‘œλ΄‡μœΌλ‘œ λΌμš°νŒ….

3.5.4 μΆ©μ „ 도크 μœ„μΉ˜

  • λ„ν¬λŠ” zone polygon μ™ΈλΆ€ λ˜λŠ” 별도 zone(dock_zone)으둜 μ •μ˜ β€” guardrail이 dock_zone을 일반 zone으둜 μ˜€μΈν•˜μ§€ μ•Šλ„λ‘.
  • 도크 μ’Œν‘œλŠ” config/calibration/robots.yaml의 dock_position에 λͺ…μ‹œ (μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜κ³Ό ν•¨κ»˜ κ°±μ‹ ).

3.5.5 비상 μΆ©μ „

  • μ‹œμ—° 쀑 λͺ¨λ“  λ‘œλ΄‡μ΄ λ™μ‹œ 저배터리 β†’ 일뢀 zone μ‹œλ‚˜λ¦¬μ˜€λ₯Ό "νƒœλΈ”λ¦Ώ 단독" λͺ¨λ“œλ‘œ μ „ν™˜ (§폴백 μΉ΄νƒˆλ‘œκ·Έ vehicle zoneκ³Ό 동일 νŒ¨ν„΄).
  • μš΄μ˜μžμ—κ²Œ μ•Œλ¦Ό: HA μžλ™ν™”λ‘œ "All robots low battery" μΉ΄λ“œ 빨간색 ν‘œμ‹œ.

4. μ •κΈ° μœ μ§€λ³΄μˆ˜

μ£ΌκΈ° μž‘μ—…
맀일 운영 μ‹œμž‘Β·μ’…λ£Œ 점검 (μœ„ Β§1)
λ§€μ£Ό μ»¨ν…Œμ΄λ„ˆ 둜그 size 확인 (docker compose logs --tail=100 <svc>)
λ§€μ£Ό Frigate 카메라 ν™”κ°Β·μ΄ˆμ  점검, zone polygon μ‹œκ° 확인
λ§€μ›” docker image λ³΄μ•ˆ 패치 κ²€ν†  (Trivy μŠ€μΊ” κ²°κ³Ό)
λ§€μ›” UPS 배터리 μžκ°€μ§„λ‹¨
λΆ„κΈ° λΉ„λ°€λ²ˆν˜ΈΒ·ν† ν° νšŒμ „ (DEPLOYMENT.md Β§9.2)
λΆ„κΈ° λ°±μ—… β†’ 볡ꡬ dry-run (DEPLOYMENT.md Β§12.5)
λΆ„κΈ° μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜ 검증 β€” 카메라가 μ˜λ„ν•œ μ’Œν‘œλ₯Ό μ •ν™•νžˆ μΈμ‹ν•˜λ‚˜
6κ°œμ›” SPOT μΆ©μ „ 케이블·도크 점검, λ‘œλ΄‡ OS μ—…λ°μ΄νŠΈ κ²€ν† 

5. μ—°λ½μ²˜ / μ—μŠ€μ»¬λ ˆμ΄μ…˜

상황 λ‹΄λ‹Ή
μ‹œμŠ€ν…œ SW 이상 (μ»¨ν…Œμ΄λ„ˆΒ·LLM(Large Language Model, λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈ)Β·MQTT) κ°œλ°œνŒ€ β€” Slack #zerone-dev
λ‘œλ΄‡ HW 이상 Boston Dynamics 지원 λ˜λŠ” ν•΄λ‹Ή λ‘œλ΄‡ 벀더
μΉ΄λ©”λΌΒ·λ„€νŠΈμ›Œν¬ μ‹œμ„€νŒ€
μ „μ‹œ 운영 μ˜μ‚¬κ²°μ • (μ‹œμ—° 쀑단·연μž₯) μ „μ‹œ μ±…μž„μž

(μ‹€μ œ 운영 μ‹œ λ‹΄λ‹Ήμž μ΄λ¦„Β·μ „ν™”λ²ˆν˜Έλ‘œ μ±„μšΈ 것)


6. 자주 λ¬»λŠ” 질문

Q: μ»¨ν…Œμ΄λ„ˆ 1κ°œκ°€ unhealthy둜 λ–΄μ–΄μš”. A: docker compose restart <name> β€” 자체 볡ꡬ μ•ˆ 되면 docker compose logs --tail=200 <name>둜 원인 확인 ν›„ κ°œλ°œνŒ€ 호좜.

Q: μ²΄ν—˜μžκ°€ "λ‘œλ΄‡μ΄ λ°˜μ‘ μ•ˆ ν•΄μš”"라고 ν•©λ‹ˆλ‹€. A: β‘  HA λŒ€μ‹œλ³΄λ“œμ—μ„œ ν•΄λ‹Ή λ‘œλ΄‡ fault 확인 β‘‘ 정상이면 e-stop ν™œμ„± μ—¬λΆ€ 확인 β‘’ κ·Έλž˜λ„ μ•ˆ 되면 μš΄μ˜μžκ°€ μˆ˜λ™ λͺ…λ Ή(HA "Manual Command" μΉ΄λ“œ).

Q: νƒœλΈ”λ¦Ώμ΄ νŽ˜μ–΄λ§ ν™”λ©΄μ—μ„œ λ©ˆμΆ°μš”. A: 60초 ν›„ μžλ™ μž¬μ‹œμž‘ β€” κ·Έλž˜λ„ μ•ˆ 되면 νƒœλΈ”λ¦Ώ μž¬λΆ€νŒ…. κ·Έλž˜λ„ μ•ˆ 되면 토큰 만료 μ˜μ‹¬ β†’ mcp-tablet-gateway μ»¨ν…Œμ΄λ„ˆ μž¬μ‹œμž‘.

Q: LLM이 μ΄μƒν•œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λ°œλ™μ‹œμΌ°μ–΄μš”. A: e-stop으둜 μ¦‰μ‹œ 쀑단 β†’ 운영 일지에 μ‹œκ°Β·λ©”μ‹œμ§€ 기둝 β†’ κ°œλ°œνŒ€μ— trace_id 곡유 (Loki λ‘œκ·Έμ—μ„œ μΆ”μΆœ).

⚠️ **GitHub.com Fallback** ⚠️