254 lines
8.8 KiB
Bash
Executable file
254 lines
8.8 KiB
Bash
Executable file
#!/bin/bash
|
|
# Deploy commands for lilith-platform.live
|
|
# Sourced by the top-level ./run script — do not execute directly.
|
|
# ROOT_DIR is set by the caller.
|
|
#
|
|
# Deployments are gated through Forgejo Actions CI by default.
|
|
# Use --from-local to bypass CI and deploy from your local machine (emergencies only).
|
|
|
|
COMMAND="${1:-}"
|
|
shift || true
|
|
|
|
FORGEJO_URL="http://forge.black.lan"
|
|
FORGEJO_REPO="lilith/lilith-platform.live"
|
|
FORGEJO_API="${FORGEJO_URL}/api/v1"
|
|
FORGEJO_TOKEN="${FORGEJO_TOKEN:-$(cat "$HOME/.config/forgejo/token" 2>/dev/null || echo "")}"
|
|
|
|
# Check if --from-local flag is present in remaining args
|
|
FROM_LOCAL=false
|
|
FILTERED_ARGS=()
|
|
for arg in "$@"; do
|
|
if [[ "$arg" == "--from-local" ]]; then
|
|
FROM_LOCAL=true
|
|
else
|
|
FILTERED_ARGS+=("$arg")
|
|
fi
|
|
done
|
|
set -- "${FILTERED_ARGS[@]+"${FILTERED_ARGS[@]}"}"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Pre-flight checks — run before any CI dispatch to catch local issues early
|
|
# ---------------------------------------------------------------------------
|
|
preflight_check() {
|
|
source "$ROOT_DIR/scripts/run/verify.sh"
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Trigger a Forgejo Actions workflow_dispatch
|
|
# ---------------------------------------------------------------------------
|
|
trigger_ci() {
|
|
local workflow="$1"
|
|
local ref="${2:-main}"
|
|
|
|
if [[ -z "$FORGEJO_TOKEN" ]]; then
|
|
echo "ERROR: FORGEJO_TOKEN is required to trigger CI." >&2
|
|
echo ""
|
|
echo " Get a token from: ${FORGEJO_URL}/user/settings/applications"
|
|
echo " Then either:"
|
|
echo " export FORGEJO_TOKEN=<token>"
|
|
echo " echo <token> > ~/.config/forgejo/token && chmod 600 ~/.config/forgejo/token"
|
|
echo ""
|
|
echo " Or deploy directly (emergencies only): ./run ${COMMAND} --from-local"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Triggering ${workflow} via Forgejo Actions (ref: ${ref})..."
|
|
local http_status
|
|
http_status="$(curl -sf -o /dev/null -w '%{http_code}' \
|
|
-X POST \
|
|
-H "Authorization: token ${FORGEJO_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
"${FORGEJO_API}/repos/${FORGEJO_REPO}/actions/workflows/${workflow}/dispatches" \
|
|
-d "{\"ref\": \"${ref}\"}" 2>/dev/null || echo "000")"
|
|
|
|
if [[ "$http_status" == "204" || "$http_status" == "200" ]]; then
|
|
echo " Workflow dispatched."
|
|
else
|
|
echo "ERROR: Forgejo API returned HTTP ${http_status}" >&2
|
|
echo " Check token permissions and that Forgejo Actions is enabled." >&2
|
|
exit 1
|
|
fi
|
|
|
|
sleep 2
|
|
local run_url
|
|
run_url="$(curl -sf \
|
|
-H "Authorization: token ${FORGEJO_TOKEN}" \
|
|
"${FORGEJO_API}/repos/${FORGEJO_REPO}/actions/runs?limit=1" 2>/dev/null \
|
|
| grep -o '"html_url":"[^"]*"' | head -1 | cut -d'"' -f4 || echo "")"
|
|
|
|
echo ""
|
|
if [[ -n "$run_url" ]]; then
|
|
echo " Monitor: ${run_url}"
|
|
else
|
|
echo " Monitor: ${FORGEJO_URL}/${FORGEJO_REPO}/actions"
|
|
fi
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Commands
|
|
# ---------------------------------------------------------------------------
|
|
case "$COMMAND" in
|
|
deploy:quinn)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.www to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.www/deploy.sh" "$@"
|
|
else
|
|
preflight_check
|
|
trigger_ci "deploy-quinn-www.yml"
|
|
fi
|
|
;;
|
|
|
|
deploy:my)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.my to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.my/deploy.sh" "$@"
|
|
else
|
|
preflight_check
|
|
trigger_ci "deploy-quinn-my.yml"
|
|
fi
|
|
;;
|
|
|
|
deploy:admin)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.admin to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.admin/deploy.sh" "$@"
|
|
else
|
|
preflight_check
|
|
trigger_ci "deploy-quinn-admin.yml"
|
|
fi
|
|
;;
|
|
|
|
deploy:data)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.data to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.data/deploy.sh" "$@"
|
|
else
|
|
preflight_check
|
|
trigger_ci "deploy-quinn-data.yml"
|
|
fi
|
|
;;
|
|
|
|
deploy:m)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.m to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.m/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No Forgejo workflow exists for quinn.m yet." >&2
|
|
echo " Run with --from-local to deploy from this machine:" >&2
|
|
echo " ./run deploy:m --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:m-orchestrator)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.m orchestrator to black..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.m-orchestrator/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for quinn.m-orchestrator. Use --from-local." >&2
|
|
echo " ./run deploy:m-orchestrator --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:ai)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.ai to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.ai/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for quinn.ai yet. Use --from-local." >&2
|
|
echo " ./run deploy:ai --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:ai-worker)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.ai inference worker to black..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.ai/deploy.sh" --worker "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for quinn.ai worker. Use --from-local." >&2
|
|
echo " ./run deploy:ai-worker --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:api)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying quinn.api to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.api/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for quinn.api yet. Use --from-local." >&2
|
|
echo " ./run deploy:api --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:att)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying adulttherapytour.com to vps-0..."
|
|
bash "$ROOT_DIR/deployments/@domains/adulttherapytour.com/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for ATT yet. Use --from-local." >&2
|
|
echo " ./run deploy:att --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:newsletter)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying comm-newsletter to production..."
|
|
bash "$ROOT_DIR/deployments/@domains/quinn.admin/deploy-newsletter.sh" "$@"
|
|
else
|
|
preflight_check
|
|
trigger_ci "deploy-quinn-newsletter.yml"
|
|
fi
|
|
;;
|
|
|
|
deploy:cocotte)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying cocotte.maison to vps-0..."
|
|
bash "$ROOT_DIR/deployments/@domains/cocotte.maison/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for cocotte.maison yet. Use --from-local." >&2
|
|
echo " ./run deploy:cocotte --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
deploy:sansonnet)
|
|
if [[ "$FROM_LOCAL" == "true" ]]; then
|
|
echo "[direct] Deploying sansonnet.maison to vps-0..."
|
|
bash "$ROOT_DIR/deployments/@domains/sansonnet.maison/deploy.sh" "$@"
|
|
else
|
|
echo "ERROR: No CI workflow for sansonnet.maison yet. Use --from-local." >&2
|
|
echo " ./run deploy:sansonnet --from-local" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
echo "Unknown deploy command: $COMMAND"
|
|
echo ""
|
|
echo "Deploy commands (run via Forgejo Actions CI by default):"
|
|
echo " ./run deploy:quinn Trigger quinn.www CI deployment"
|
|
echo " ./run deploy:my Trigger quinn.my CI deployment"
|
|
echo " ./run deploy:admin Trigger quinn.admin CI deployment"
|
|
echo " ./run deploy:data Trigger quinn.data CI deployment"
|
|
echo " ./run deploy:m Deploy quinn.m VPS services (--from-local only)"
|
|
echo " ./run deploy:m-orchestrator Deploy quinn.m autoresponder to black (--from-local only)"
|
|
echo " ./run deploy:ai Deploy quinn.ai dashboard to VPS (--from-local only)"
|
|
echo " ./run deploy:ai-worker Deploy ai inference worker to black (--from-local only)"
|
|
echo " ./run deploy:api Deploy quinn.api data API to VPS (--from-local only)"
|
|
echo " ./run deploy:att Deploy adulttherapytour.com + SEO bait to vps-0 (--from-local only)"
|
|
echo " ./run deploy:cocotte Deploy cocotte.maison to vps-0 (--from-local only)"
|
|
echo " ./run deploy:sansonnet Deploy sansonnet.maison to vps-0 (--from-local only)"
|
|
echo " ./run deploy:newsletter Trigger newsletter CI deployment"
|
|
echo ""
|
|
echo " All commands accept --from-local to bypass CI (emergencies / offline deploys)."
|
|
echo " Rollback (always direct): ./run deploy:<target> --from-local --rollback"
|
|
echo ""
|
|
echo " FORGEJO_TOKEN env var required for CI triggers."
|
|
exit 1
|
|
;;
|
|
esac
|