91 lines
3.9 KiB
Bash
Executable File
91 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 从本机(Mac)将 sdk 同步到公司 NAS 并执行 docker compose 部署
|
||
#
|
||
# 【铁律 · 必守】workphone.mdc §零.十 / 机擎 §〇.十
|
||
# 连接顺序:① NAS 局域网 :8899 → ② 本机 Docker → ③ NAS 外网 open.quwanzhi.com:8899
|
||
# 部署路径:/volume1/docker/workphone-sdk · DSM 05-业务网站-工作手机
|
||
# 部署后:bash sdk/scripts/nas_primary_agent_setup.sh
|
||
#
|
||
# 使用前请安装 OpenSSH 服务端于 NAS,并开启 Docker/Container Manager。
|
||
#
|
||
# 用法:
|
||
# export NAS_USER=fnvtk # 可选,默认 fnvtk
|
||
# export NAS_HOST=192.168.110.101 # 可选,默认公司 NAS 局域网
|
||
# export NAS_DIR=/volume1/docker/workphone-sdk # 可选
|
||
# # fnvtk 用户无直接 docker 权限,但 sudo docker NOPASSWD(Synology 默认 sudoers)
|
||
# # 若 sudo docker 也无权限,用 NAS_SUDO_PASSWORD 授权 docker.sock:
|
||
# export NAS_SUDO_PASSWORD='你的DSM密码'
|
||
# bash sdk/scripts/deploy_nas_rsync.sh
|
||
#
|
||
# 可选:同步「开发文档」到 NAS 知识库挂载目录(需先在 docker-compose.nas.yml 取消注释挂载)
|
||
# export SYNC_DEV_DOCS=1
|
||
# export NAS_DOCS_DIR=/volume1/docker/workphone-docs
|
||
|
||
set -euo pipefail
|
||
|
||
NAS_HOST="${NAS_HOST:-192.168.110.101}"
|
||
NAS_USER="${NAS_USER:-fnvtk}"
|
||
NAS_DIR="${NAS_DIR:-/volume1/docker/workphone-sdk}"
|
||
# fnvtk 无直接 docker 权限,compose 命令前需 sudo(Synology sudoers NOPASSWD for docker)
|
||
DOCKER_CMD="${DOCKER_CMD:-sudo docker}"
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
SDK_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
REPO_ROOT="$(cd "$SDK_ROOT/.." && pwd)"
|
||
|
||
if [[ -n "${NAS_SUDO_PASSWORD:-}" ]]; then
|
||
echo ">>> 修正 docker.sock 权限(sudo,与 DSM 登录密码一致)…"
|
||
if ! ssh -o StrictHostKeyChecking=no "${NAS_USER}@${NAS_HOST}" \
|
||
"sudo -S sh -c 'chgrp administrators /var/run/docker.sock && chmod g+rw /var/run/docker.sock && ls -la /var/run/docker.sock'" \
|
||
<<< "$NAS_SUDO_PASSWORD"; then
|
||
echo "sudo 失败:请确认 NAS_SUDO_PASSWORD 为 ${NAS_USER} 的 DSM 登录密码。"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo ">>> rsync sdk/ -> ${NAS_USER}@${NAS_HOST}:${NAS_DIR}/"
|
||
ssh "${NAS_USER}@${NAS_HOST}" "mkdir -p '${NAS_DIR}'"
|
||
# 严格排除非镜像构建所需目录(.runtime 含 46w+ 缓存文件,android-app/typescript-sdk/php-sdk 不进镜像)
|
||
rsync -avz \
|
||
--exclude '.git' \
|
||
--exclude '.env' \
|
||
--exclude '.env.*' \
|
||
--exclude '*secret*' \
|
||
--exclude '*credential*' \
|
||
--exclude '__pycache__' \
|
||
--exclude '*.pyc' \
|
||
--exclude 'node_modules' \
|
||
--exclude '.runtime' \
|
||
--exclude '.pytest_cache' \
|
||
--exclude '.gradle' \
|
||
--exclude 'android-app' \
|
||
--exclude 'typescript-sdk' \
|
||
--exclude 'php-sdk' \
|
||
--exclude 'tests' \
|
||
--exclude 'data/operation_logs' \
|
||
--exclude 'data/e2e_report.json' \
|
||
--exclude 'logs/*.log' \
|
||
"${SDK_ROOT}/" "${NAS_USER}@${NAS_HOST}:${NAS_DIR}/"
|
||
|
||
if [[ "${SYNC_DEV_DOCS:-0}" == "1" ]]; then
|
||
NAS_DOCS_DIR="${NAS_DOCS_DIR:-/volume1/docker/workphone-docs}"
|
||
echo ">>> rsync 开发文档/ -> ${NAS_USER}@${NAS_HOST}:${NAS_DOCS_DIR}/开发文档/"
|
||
if [[ ! -d "${REPO_ROOT}/开发文档" ]]; then
|
||
echo "未找到 ${REPO_ROOT}/开发文档,跳过。"
|
||
else
|
||
ssh "${NAS_USER}@${NAS_HOST}" "mkdir -p '${NAS_DOCS_DIR}'"
|
||
rsync -avz "${REPO_ROOT}/开发文档/" "${NAS_USER}@${NAS_HOST}:${NAS_DOCS_DIR}/开发文档/"
|
||
fi
|
||
fi
|
||
|
||
echo ">>> 远程构建并启动容器…"
|
||
# /usr/syno/bin 在 PATH 前部(Synology docker binary 位置);sudo 前置(fnvtk 无直接 docker 权限)
|
||
ssh -o StrictHostKeyChecking=no "${NAS_USER}@${NAS_HOST}" \
|
||
"export PATH=\"/usr/local/bin:/usr/syno/bin:\$PATH\" && cd '${NAS_DIR}' && ${DOCKER_CMD} compose -f docker-compose.nas.yml up -d --build"
|
||
|
||
echo ""
|
||
echo "部署命令已下发。内网访问地址(将 NAS_HOST 换成实际 IP):"
|
||
echo " 控制台: http://${NAS_HOST}:8899/hub"
|
||
echo " SDK API: http://${NAS_HOST}:8899"
|
||
echo ""
|
||
echo "若页面打不开:检查 NAS 防火墙是否放行 8899;DSM「登录门户」勿占用同端口。"
|