Files
integral-shop/deploy/docker/scripts/remote-up.sh

93 lines
2.5 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# =============================================================
# 远端执行 docker compose 命令
# 用法:
# ./remote-up.sh up # build + up -d
# ./remote-up.sh build # 仅 build
# ./remote-up.sh restart svc # 重启某服务
# ./remote-up.sh logs [svc] # 跟日志
# ./remote-up.sh ps # 服务状态
# ./remote-up.sh ssh # 登录到远端
# =============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/server.env" ]; then
# shellcheck disable=SC1091
set -a
. "$SCRIPT_DIR/server.env"
set +a
fi
SERVER_HOST="${SERVER_HOST:?SERVER_HOST 未配置,请先 cp server.env.example server.env}"
SERVER_USER="${SERVER_USER:-root}"
SERVER_PORT="${SERVER_PORT:-22}"
REMOTE_DIR="${REMOTE_DIR:-/root/integral-shop}"
if [ -n "${SSHPASS:-}" ]; then
command -v sshpass >/dev/null 2>&1 || { echo "需要 sshpass"; exit 1; }
export SSHPASS
SSH=(sshpass -e ssh -p "$SERVER_PORT" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -t)
else
SSH=(ssh -p "$SERVER_PORT" -o StrictHostKeyChecking=no -t)
fi
run_remote() {
"${SSH[@]}" "${SERVER_USER}@${SERVER_HOST}" "cd ${REMOTE_DIR}/deploy/docker && $*"
}
cmd="${1:-up}"
shift || true
case "$cmd" in
up)
# 预检:必须存在 .env
run_remote "test -f .env && test -f integral-resell/.env" || {
cat <<EOF
[!] 远端缺少 .env 文件,请在远端执行:
ssh ${SERVER_USER}@${SERVER_HOST}
cd ${REMOTE_DIR}/deploy/docker
cp .env.example .env
vim .env
cp integral-resell/.env.template integral-resell/.env
vim integral-resell/.env
EOF
exit 1
}
run_remote "docker compose build && docker compose up -d && docker compose ps"
;;
build)
run_remote "docker compose build $*"
;;
restart)
run_remote "docker compose restart $*"
;;
logs)
run_remote "docker compose logs --tail 200 -f $*"
;;
ps|status)
run_remote "docker compose ps"
;;
down)
run_remote "docker compose down"
;;
pull)
run_remote "docker compose pull"
;;
ssh)
"${SSH[@]}" "${SERVER_USER}@${SERVER_HOST}"
;;
exec)
run_remote "docker compose exec $*"
;;
*)
echo "未知子命令: $cmd"
echo "支持: up | build | restart | logs | ps | down | pull | ssh | exec"
exit 2
;;
esac