운영 jeevtrap는 WOL 브로드캐스트 전송을 위해 Docker host network로 실행함.
운영 환경변수는 /sorc001/junkbox/env/.env.shared, /sorc001/junkbox/env/.env.jeevtrap, /sorc001/junkbox/env/.env.prod.jeevtrap를 함께 참조하고, 컨테이너 내부 ENV_FILE=/app/env/.env.prod.jeevtrap 기준으로 로딩함.
운영 Jeevtrap 공통 환경값은 .env.jeevtrap, 운영 전용 환경값은 .env.prod.jeevtrap에 두며, 공통 prod profile env인 .env.prod는 로드하지 않음.
host network로 실행되는 운영 jeevtrap은 Docker DNS 서비스명 junkbox-hub를 사용할 수 없으므로 HUB_INTERNAL_BASE_URL을 호스트 네트워크에서 접근 가능한 hub-api 주소로 설정함.
host network로 실행되는 운영 jeevtrap은 Docker DNS 서비스명 postgres, litellm-proxy도 사용할 수 없으므로 DATABASE_URL, JEEVTRAP_LINKDING_DATABASE_URL, LITELLM_BASE_URL을 호스트 네트워크에서 접근 가능한 주소로 설정함.
운영 jeevtrap의 DATABASE_URL과 JEEVTRAP_LINKDING_DATABASE_URL은 호스트에서 publish된 PostgreSQL 포트를 기준으로 127.0.0.1:5432 형태의 주소를 사용함.
운영 jeevtrap의 LITELLM_BASE_URL은 호스트에서 publish된 LiteLLM proxy 포트를 기준으로 하며, 현재 운영 기준 값은 http://127.0.0.1:8083/v1임.
운영 로그 볼륨은 /logs001/junkbox/jeevtrap 호스트 경로를 컨테이너 내부 /app/logs에 연결함.
공통 애플리케이션 로그 파일 경로는 /app/logs/app.log임.
운영 AI 라우팅 파일은 호스트 /sorc001/junkbox/master-data/ai-routing.yml를 컨테이너 내부 /app/var/master-data/ai-routing.yml로 마운트해서 사용함.
JEEVTRAP_DISCORD_TEST_GUILD_ID가 설정된 운영 profile은 해당 테스트 길드에서 발생한 slash command와 멘션 메시지를 처리하지 않음.
운영 종료 명령용 SSH 비밀키는 호스트 키 파일을 컨테이너 내부 /run/secrets/jeevtrap_desktop_main_ssh_key에 read-only로 마운트해서 사용함.
운영 이미지에는 bash, openssh-client, wakeonlan, PortAudio/ALSA/PulseAudio 연동 런타임 패키지를 포함함.
Docker Compose 서비스명은 junkbox-jeevtrap임.
운영 compose에서 jeevtrap는 hub-api가 호스트 네트워크에서 접근 가능한 내부 master-data API를 제공하는 전제를 가짐.
운영 compose는 voice runtime 활성화 시 사용할 수 있도록 PulseAudio/PipeWire socket과 cookie 마운트, PULSE_SERVER 설정을 포함함.
운영 voice runtime은 JEEVTRAP_VOICE_ENABLED=False가 기본값임.
Jeevtrap local env 파일은 .env.jeevtrap.template을 기준으로 작성함.
.env.local.jeevtrap과 .env.prod.jeevtrap는 .env.shared, .env.jeevtrap와 함께 로드되며 .env.local, .env.prod를 참조하지 않음.
.env.jeevtrap는 Discord, GitHub, 공통 명령 target, 내부 토큰처럼 local/prod에서 공유하는 Jeevtrap 값을 보관함.
.env.local.jeevtrap과 .env.prod.jeevtrap는 Jeevtrap 실행 위치에 맞는 APP_PROFILE, LOG_LEVEL, LOG_DIAGNOSE_TOGGLE, DATABASE_URL, HUB_INTERNAL_BASE_URL, LITELLM_BASE_URL, JEEVTRAP_PORT, JEEVTRAP_VOICE_ENABLED, profile별 JEEVTRAP_* 값을 보관함.
.env.shared에는 profile과 무관하고 민감하지 않은 공통 기본값만 둠.
JEEVTRAP_LINKDING_DATABASE_URL은 SQLAlchemy async URL 형식 postgresql+asyncpg://...를 사용함.
JEEVTRAP_LINKDING_OWNER_ID는 Linkding DB 사용자 PK 기준 값임.
GitHub 토큰은 contents API 읽기/쓰기 권한이 있어야 함.
Discord 봇이 테스트 길드 기준으로 slash command 동기화와 로컬/운영 실행 분리를 적용하려면 JEEVTRAP_DISCORD_TEST_GUILD_ID를 사용함.
local profile은 테스트 길드만 허용하고 prod profile은 테스트 길드를 차단하며, 차단된 환경은 다른 실행 환경의 응답을 방해하지 않기 위해 무응답으로 무시함.
Discord 봇이 일반 평문 메시지를 해석하려면 Discord Developer Portal의 Message Content Intent와 봇 런타임 intent가 함께 활성화되어야 함.
JEEVTRAP_DISCORD_COMMAND_INTENT_DEBUG_REPLY=true이면 멘션 메시지를 인식했지만 실행 가능한 명령을 찾지 못한 경우 디버그 안내 메시지를 전송함.
JEEVTRAP_TARGET_DESKTOP_MAIN_SSH_KEY_PATH는 Windows OpenSSH Server에 등록된 공개키와 짝이 되는 비밀키 경로임.
운영 JEEVTRAP_TARGET_DESKTOP_MAIN_SSH_KEY_PATH는 컨테이너 내부에서 접근 가능한 /run/secrets/jeevtrap_desktop_main_ssh_key 같은 마운트 경로를 사용함.
평문 명령 의도 판별은 JEEVTRAP_COMMAND_INTENT route key를 사용함.
현재 기본 라우팅은 JEEVTRAP_MD -> litellm:openrouter/deepseek/deepseek-v4-flash, JEEVTRAP_BOOKMARK -> litellm:openrouter/deepseek/deepseek-v4-flash, JEEVTRAP_COMMAND_INTENT -> litellm:openrouter/qwen/qwen-2.5-7b-instruct 구조를 사용함.
JEEVTRAP_COMMAND_INTENT는 짧은 명령 분류를 전제로 prompt_json structured output mode, 낮은 temperature, 낮은 top_p, 320 output token 예산을 사용함.
Jeevtrap AI 호출은 shared-ai의 공통 structured generation 경로를 사용하며, LiteLLM provider 어댑터가 response format 선택, JSON 파싱, Pydantic 검증, usage log 기록을 처리함.
GitHub Actions selective build/deploy 구성은 junkbox-jeevtrap 서비스를 독립적으로 감지함.
GitHub Actions 배포 단계는 apps/hub-api/var/master-data/ai-routing.yml를 서버 배포 디렉터리로 전송한 뒤 /sorc001/junkbox/master-data/ai-routing.yml로 동기화함.
운영 컨테이너는 host network에서 실행되므로 WOL 브로드캐스트는 호스트 네트워크 인터페이스 기준으로 전송됨.
운영 컨테이너는 junkbox-hub에 depends_on을 가지므로 master-data 조회와 내부 API 접근 기준이 함께 배포되는 전제를 가짐.
/북마크 기능을 사용하려면 Linkding DB 접속 문자열과 owner id가 모두 유효해야 함.
/명령의 WOL 기능은 host network에서 브로드캐스트 패킷 전송이 가능해야 정상 동작함.
/명령의 종료 기능은 대상 Windows PC의 OpenSSH Server, 관리자 authorized keys 정책, 컨테이너 내부 SSH 키 마운트, 방화벽 포트 22 접근성이 유효해야 정상 동작함.
Discord 봇 실사용 전에는 애플리케이션 명령 동기화와 토큰 권한을 함께 확인해야 함.
Discord 평문 멘션 명령을 사용하려면 Discord Message Content Intent가 활성화되어 있어야 함.
Discord UI 메시지와 slash command 설명은 앱 내부 MessageCatalog에 등록되어 있어야 함.
voice runtime을 활성화하려면 JEEVTRAP_VOICE_ENABLED=True, 유효한 JEEVTRAP_VOICE_CONFIG_YAML_PATH, PulseAudio/PipeWire socket 접근, 오디오 장치 권한, Supertonic 모델 다운로드 가능성이 함께 충족되어야 함.
운영 기본값은 JEEVTRAP_VOICE_ENABLED=False이며, 상시 STT 호출어 감지는 CPU와 메모리를 지속적으로 사용할 수 있음.