Add Apple container deployment for daemon + dashboard
install-apple-container.sh builds and (re)starts both containers (dashboard mounts reports/ read-only, port 8090); --boot installs a LaunchAgent since Apple container has no restart policy. README covers the new deploy path, SearXNG settings, and the dashboard. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<!-- 로그인 시 Apple container 런타임과 us2kr 컨테이너를 기동하는 one-shot 에이전트.
|
||||
__CONTAINER__/__ROOT__ 는 install-apple-container.sh --boot 가 치환한다. -->
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key><string>com.us2kr.container</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/bin/bash</string>
|
||||
<string>-c</string>
|
||||
<string>__CONTAINER__ system start && __CONTAINER__ start us2kr; __CONTAINER__ start us2kr-dashboard</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key><true/>
|
||||
<key>StandardOutPath</key><string>__ROOT__/logs/container-boot.log</string>
|
||||
<key>StandardErrorPath</key><string>__ROOT__/logs/container-boot.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
# macOS: Apple container(https://github.com/apple/container)로 빌드·상주 실행.
|
||||
# 실행: bash deploy/install-apple-container.sh # 이미지 빌드 + 컨테이너 (재)기동
|
||||
# bash deploy/install-apple-container.sh --boot # + 로그인 시 자동 기동(LaunchAgent) 등록
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
NAME=us2kr
|
||||
|
||||
CONTAINER_BIN="$(command -v container || true)"
|
||||
if [ -z "$CONTAINER_BIN" ]; then
|
||||
echo "Apple container CLI가 없습니다: brew install container (macOS 15+, Apple Silicon)" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "$ROOT/.env" ]; then
|
||||
echo "$ROOT/.env 가 없습니다: cp .env.example .env 후 MINIMAX_API_KEY를 넣으세요" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DASHBOARD=us2kr-dashboard
|
||||
DASHBOARD_PORT="${US2KR_DASHBOARD_PORT:-8090}"
|
||||
|
||||
mkdir -p "$ROOT/data" "$ROOT/reports" "$ROOT/logs"
|
||||
container system start
|
||||
container build -t "$NAME" -f "$ROOT/deploy/Dockerfile" "$ROOT"
|
||||
container build -t "$DASHBOARD" -f "$ROOT/dashboard/Dockerfile" "$ROOT/dashboard"
|
||||
|
||||
# 기존 컨테이너는 갈아끼운다 (이미지 갱신 반영). container에는 restart 정책이 없어
|
||||
# 자동 기동은 --boot 의 LaunchAgent가 담당한다.
|
||||
container stop "$NAME" "$DASHBOARD" >/dev/null 2>&1 || true
|
||||
container delete "$NAME" "$DASHBOARD" >/dev/null 2>&1 || true
|
||||
container run --detach --name "$NAME" \
|
||||
--env-file "$ROOT/.env" \
|
||||
--env US2KR_DATA_DIR=/app/data \
|
||||
--env US2KR_REPORTS_DIR=/app/reports \
|
||||
--env US2KR_LOG_DIR=/app/logs \
|
||||
--volume "$ROOT/data:/app/data" \
|
||||
--volume "$ROOT/reports:/app/reports" \
|
||||
--volume "$ROOT/logs:/app/logs" \
|
||||
"$NAME"
|
||||
container run --detach --name "$DASHBOARD" \
|
||||
--volume "$ROOT/reports:/data/reports:ro" \
|
||||
--publish "$DASHBOARD_PORT:8090" \
|
||||
"$DASHBOARD"
|
||||
|
||||
if [ "${1:-}" = "--boot" ]; then
|
||||
PLIST_SRC="$ROOT/deploy/com.us2kr.container.plist"
|
||||
PLIST_DST="$HOME/Library/LaunchAgents/com.us2kr.container.plist"
|
||||
mkdir -p "$HOME/Library/LaunchAgents"
|
||||
sed -e "s#__CONTAINER__#$CONTAINER_BIN#g" -e "s#__ROOT__#$ROOT#g" "$PLIST_SRC" > "$PLIST_DST"
|
||||
launchctl bootout "gui/$(id -u)/com.us2kr.container" 2>/dev/null || true
|
||||
launchctl bootstrap "gui/$(id -u)" "$PLIST_DST"
|
||||
echo "boot agent: $PLIST_DST (로그인 시 container system start + container start $NAME $DASHBOARD)"
|
||||
fi
|
||||
|
||||
echo "dashboard: http://localhost:$DASHBOARD_PORT"
|
||||
echo "status: container list --all"
|
||||
echo "logs: container logs --follow $NAME (파일: tail -f $ROOT/logs/us2kr.log)"
|
||||
echo "stop: container stop $NAME $DASHBOARD"
|
||||
echo "remove: container stop $NAME $DASHBOARD && container delete $NAME $DASHBOARD"
|
||||
Reference in New Issue
Block a user