Files
workphone-sdk/sdk/scripts/deploy_nas_rsync.sh

91 lines
3.9 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
# 从本机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 NOPASSWDSynology 默认 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 命令前需 sudoSynology 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 防火墙是否放行 8899DSM「登录门户」勿占用同端口。"