Files
geo/deploy/scripts/load-and-start.sh
T
root b939cfa2fa
Deployment Config CI / Deployment Config (push) Successful in 27s
Backend CI / Backend (push) Successful in 15m4s
feat(auth): support per-deploy login password key override
Multi-replica deployments need every Pod/container to share one RSA private key, otherwise public keys handed to the browser may not match the key that decrypts the resulting ciphertext. Introduce a `*.local.yaml` override layer that ops-config and tenant-config both load on top of the base config, ship example overrides plus compose/k3s wiring, and tolerate PEM bodies that arrive folded or escaped from Secrets.
2026-05-14 11:54:40 +08:00

128 lines
4.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# load-and-start.sh — 在【离线目标服务器】上运行
# 加载镜像并使用 Docker Compose 或 k3s 启动服务
#
# 用法(解压部署包后):
# bash deploy.sh compose # 默认,Docker Compose 部署
# bash deploy.sh k3s # k3s / Kubernetes 部署
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MODE="${1:-compose}"
# 读取打包时记录的元数据
if [[ -f "${SCRIPT_DIR}/.package-meta" ]]; then
source "${SCRIPT_DIR}/.package-meta"
fi
IMAGE_TAG="${IMAGE_TAG:-latest}"
LOCAL_PREFIX="${LOCAL_PREFIX:-geo-rankly}"
# ─── 检查 .env ────────────────────────────────────────────────────────────────
if [[ ! -f "${SCRIPT_DIR}/.env" ]]; then
echo "==> 未找到 .env,已从 .env.example 自动创建。"
cp "${SCRIPT_DIR}/.env.example" "${SCRIPT_DIR}/.env"
echo " 如需填写真实 API Key 或修改端口,可编辑 ${SCRIPT_DIR}/.env 后再次执行 bash deploy.sh"
fi
ensure_local_config() {
local file="$1" example="$2"
if [[ -f "${SCRIPT_DIR}/${file}" ]]; then
return
fi
if [[ -f "${SCRIPT_DIR}/${example}" ]]; then
cp "${SCRIPT_DIR}/${example}" "${SCRIPT_DIR}/${file}"
echo "==> 已从 ${example} 创建 ${file}"
echo " 生产多副本部署前请把其中的 password_cipher.private_key_pem 替换为同一把 RSA 私钥。"
fi
}
env_value() {
local key="$1" default_value="$2" value
value="$(grep -E "^${key}=" "${SCRIPT_DIR}/.env" | tail -1 | cut -d= -f2- || true)"
value="${value%\"}"
value="${value#\"}"
printf '%s' "${value:-${default_value}}"
}
deploy_compose() {
ensure_local_config "config.local.yaml" "config.local.yaml.example"
ensure_local_config "ops-config.local.yaml" "ops-config.local.yaml.example"
# ─── Step 1: 加载镜像 ───────────────────────────────────────────────────────
echo "==> [1/3] 加载 Docker 镜像(可能需要几分钟)..."
docker load -i "${SCRIPT_DIR}/images.tar"
echo " 镜像加载完成"
docker images | grep -E "geo-rankly|postgres|rabbitmq|redis|qdrant|minio" | head -20
# ─── Step 2: 设置 IMAGE_REGISTRY 为本地前缀 ────────────────────────────────
echo "==> [2/3] 配置离线镜像引用..."
export IMAGE_REGISTRY="${LOCAL_PREFIX}"
export IMAGE_TAG="${IMAGE_TAG}"
# ─── Step 3: 启动服务 ───────────────────────────────────────────────────────
echo "==> [3/3] 启动所有服务..."
cd "${SCRIPT_DIR}"
docker compose \
-f docker-compose.yaml \
-f docker-compose.offline.yaml \
--env-file .env \
up -d
echo ""
echo "✅ Docker Compose 部署完成!"
echo ""
echo "服务状态:"
docker compose -f docker-compose.yaml -f docker-compose.offline.yaml ps
echo ""
echo "查看日志: docker compose -f docker-compose.yaml logs -f tenant-api"
echo "停止服务: docker compose -f docker-compose.yaml down"
echo "管理界面:"
echo " Tenant Web: http://<server-ip>:$(env_value FRONTEND_PORT 18080)"
echo " Ops Web: http://<server-ip>:$(env_value OPS_WEB_PORT 18082)"
echo " RabbitMQ: http://<server-ip>:$(env_value RABBITMQ_MGMT_PORT 15673) (geo / geo_dev)"
echo " MinIO: http://<server-ip>:$(env_value MINIO_CONSOLE_PORT 19001) ($(env_value MINIO_ROOT_USER minioadmin) / $(env_value MINIO_ROOT_PASSWORD minioadmin))"
}
deploy_k3s() {
local kubectl_cmd="kubectl"
if command -v k3s >/dev/null 2>&1; then
echo "==> [1/3] 导入镜像到 k3s containerd..."
sudo k3s ctr images import "${SCRIPT_DIR}/images.tar"
kubectl_cmd="sudo k3s kubectl"
elif command -v kubectl >/dev/null 2>&1 && command -v ctr >/dev/null 2>&1; then
echo "==> [1/3] 导入镜像到 containerd..."
sudo ctr -n k8s.io images import "${SCRIPT_DIR}/images.tar"
else
echo "❌ 未找到 k3s/kubectl/ctr。请先安装 k3s,或改用:bash deploy.sh compose"
exit 1
fi
echo "==> [2/3] 应用 k3s 清单..."
${kubectl_cmd} apply -k "${SCRIPT_DIR}/k3s"
echo "==> [3/3] 查看服务状态..."
${kubectl_cmd} -n geo-rankly get pods,svc
echo ""
echo "✅ k3s 部署命令已执行。等待 Pod 全部 Running"
echo " ${kubectl_cmd} -n geo-rankly get pods -w"
echo ""
echo "查看日志:"
echo " ${kubectl_cmd} -n geo-rankly logs deploy/tenant-api -f"
}
case "${MODE}" in
compose|docker-compose|docker)
deploy_compose
;;
k3s|kubernetes)
deploy_k3s
;;
*)
echo "用法:bash deploy.sh [compose|k3s]"
exit 1
;;
esac