forked from bai/curriculum-project-hub
77 lines
2.4 KiB
Bash
Executable File
77 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Install the cph-hub systemd service on a host. Idempotent.
|
|
#
|
|
# Prerequisites already on the host: Node.js, npm, PostgreSQL, systemd.
|
|
# The Hub repo is expected at HUB_DIR (default /srv/curriculum-project-hub/hub)
|
|
# with `npm ci` + `npm run build` already run by deploy_platform.sh.
|
|
#
|
|
# Usage:
|
|
# sudo BASE=/srv/curriculum-project-hub bash deploy/install_service.sh
|
|
set -euo pipefail
|
|
|
|
BASE="${BASE:-/srv/curriculum-project-hub}"
|
|
HUB_DIR="${HUB_DIR:-$BASE/hub}"
|
|
SERVICE_USER="${SERVICE_USER:-cph-hub}"
|
|
HOST="${HOST:-127.0.0.1}"
|
|
PORT="${PORT:-8788}"
|
|
ENV_FILE="${ENV_FILE:-$BASE/.secrets/platform.env}"
|
|
NODE_BIN="${NODE_BIN:-$(command -v node || true)}"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
if [ -z "$NODE_BIN" ]; then
|
|
echo "node must be on PATH, or set NODE_BIN." >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -d "$HUB_DIR" ]; then
|
|
echo "HUB_DIR not found: $HUB_DIR (set HUB_DIR or clone the repo there)." >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -f "$HUB_DIR/dist/server.js" ]; then
|
|
echo "build missing: run 'npm ci && npm run build' in $HUB_DIR first." >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -f "$SCRIPT_DIR/cph-hub.service" ]; then
|
|
echo "service template missing: $SCRIPT_DIR/cph-hub.service" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Seed the env file if absent. Secrets stay on the server, never in the repo.
|
|
if [ ! -f "$ENV_FILE" ]; then
|
|
install -d -m 0700 "$(dirname "$ENV_FILE")"
|
|
cat >"$ENV_FILE" <<EOF
|
|
NODE_ENV=production
|
|
DATABASE_URL=postgresql://paradigm:change-me@127.0.0.1:5432/paradigm
|
|
# Claude Code SDK auth via OpenRouter's Anthropic Skin (ADR-0017).
|
|
# ANTHROPIC_AUTH_TOKEN = your OpenRouter API key; ANTHROPIC_API_KEY must be empty.
|
|
ANTHROPIC_BASE_URL=https://openrouter.ai/api
|
|
ANTHROPIC_AUTH_TOKEN=
|
|
ANTHROPIC_API_KEY=
|
|
FEISHU_APP_ID=
|
|
FEISHU_APP_SECRET=
|
|
FEISHU_BOT_OPEN_ID=
|
|
PORT=$PORT
|
|
HOST=$HOST
|
|
EOF
|
|
chmod 0600 "$ENV_FILE"
|
|
echo "Seeded $ENV_FILE — edit it to fill in ANTHROPIC_AUTH_TOKEN and Feishu creds, then re-run."
|
|
exit 0
|
|
fi
|
|
|
|
# Render the unit with concrete paths.
|
|
UNIT=/etc/systemd/system/cph-hub.service
|
|
TMP_UNIT="$(mktemp)"
|
|
sed \
|
|
-e "s|__SERVICE_USER__|$SERVICE_USER|g" \
|
|
-e "s|__HUB_DIR__|$HUB_DIR|g" \
|
|
-e "s|__BASE_DIR__|$BASE|g" \
|
|
-e "s|__ENV_FILE__|$ENV_FILE|g" \
|
|
-e "s|__NODE_BIN__|$NODE_BIN|g" \
|
|
"$SCRIPT_DIR/cph-hub.service" >"$TMP_UNIT"
|
|
install -m 0644 "$TMP_UNIT" "$UNIT"
|
|
rm -f "$TMP_UNIT"
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable cph-hub.service
|
|
echo "Installed cph-hub.service. Start with: systemctl start cph-hub"
|
|
echo "Check health: curl http://127.0.0.1:$PORT/api/healthz"
|