#!/bin/sh set -eu # Public customer bootstrap. Auth is an external service; no Auth image or # private source is downloaded by this script. REGISTRY="${OVERCOOKED_REGISTRY:-git.leee.xin/overcooked}" VERSION="${OVERCOOKED_VERSION:-latest}" ROOT="${OVERCOOKED_ROOT:-/opt/overcooked}" SERVER_IP="${OVERCOOKED_SERVER_IP:-}" API_PORT="${OVERCOOKED_API_PORT:-8100}" WEB_PORT="${OVERCOOKED_WEB_PORT:-8111}" ACTIVATION_CODE="${OVERCOOKED_ACTIVATION_CODE:-}" # Central OverCooked Auth gateway. Override for private deployments. AUTH_URL="${OVERCOOKED_AUTH_URL:-http://148.135.97.10:18091}" AUTH_PUBLIC_KEYS="${OVERCOOKED_AUTH_PUBLIC_KEYS:-}" die() { echo "overcooked-install: $*" >&2; exit 1; } [ "$(id -u)" = 0 ] || die "请使用 sudo/root 执行" command -v docker >/dev/null 2>&1 || die "未找到 Docker Engine" docker compose version >/dev/null 2>&1 || die "未找到 Docker Compose v2" [ -n "$SERVER_IP" ] || SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{for (i=1;i<=NF;i++) if ($i=="src") {print $(i+1); exit}}') [ -n "$SERVER_IP" ] || SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}') [ -n "$SERVER_IP" ] || die "无法识别服务器 IP,请设置 OVERCOOKED_SERVER_IP" is_ipv4() { old_ifs=$IFS; IFS=.; set -- $1; IFS=$old_ifs [ "$#" = 4 ] || return 1 for octet in "$@"; do case "$octet" in ''|*[!0-9]*) return 1;; esac [ "$octet" -le 255 ] 2>/dev/null || return 1 done } is_ipv4 "$SERVER_IP" || die "仅支持有效 IPv4 地址:$SERVER_IP" [ -n "$AUTH_PUBLIC_KEYS" ] || die "请设置 OVERCOOKED_AUTH_PUBLIC_KEYS(Auth 公钥 JSON)" [ -n "$ACTIVATION_CODE" ] || printf '请输入授权码: '; [ -n "$ACTIVATION_CODE" ] || read -r ACTIVATION_CODE [ -n "$ACTIVATION_CODE" ] || die "授权码不能为空" install -d -m 700 "$ROOT" # This installer is intentionally source-free. It must never access the # private OverCooked-S or Overcooked-E repositories. install -d -m 700 "$ROOT/config" command -v openssl >/dev/null 2>&1 || die "未找到 openssl" secret() { openssl rand -hex 32; } s_db=$(secret); s_valkey=$(secret); internal=$(secret); access=$(secret); setup=$(secret) e_db=$(secret); ticket=$(secret); lease=$(secret); storage=$(secret); plugin=$(secret) cat >"$ROOT/production.env" <"$ROOT/config/e-server.production.yaml" <"$ROOT/config/e-public.override.yml" <<'EOF' services: e-server: ports: - "0.0.0.0:8096:8096" EOF docker network inspect overcooked-control >/dev/null 2>&1 || docker network create overcooked-control >/dev/null docker compose -p overcooked-e --env-file "$ROOT/production.env" -f "$ROOT/Overcooked-E/deploy/compose/production.yml" run --rm e-server migrate docker compose -p overcooked-e --env-file "$ROOT/production.env" -f "$ROOT/Overcooked-E/deploy/compose/production.yml" -f "$ROOT/Overcooked-E/deploy/compose/control-plane-network.yml" -f "$ROOT/config/e-public.override.yml" up -d --no-build docker compose -p overcooked-s --env-file "$ROOT/production.env" -f "$ROOT/OverCooked-S/deploy/s/docker-compose.production.yml" up -d --no-build echo "配置已写入 $ROOT/production.env" echo "WebUI: http://$SERVER_IP:$WEB_PORT/" echo "API: http://$SERVER_IP:$API_PORT/" echo "E: http://$SERVER_IP:8096/" echo "首次启动后打开 http://$SERVER_IP:$WEB_PORT/setup 输入授权码和页面显示的 Setup Token。" echo "镜像来源:$REGISTRY(不包含 Auth 镜像)"