This commit is contained in:
Your Name
2026-04-17 01:04:11 +08:00
parent 25d36c9d4b
commit e9c0a75b8f
6 changed files with 100 additions and 210 deletions

View File

@@ -63,6 +63,7 @@ NODE_NVM_DIR=
最少必须先替换这 5 个:
- `DB_PASSWORD`
- `REDIS_PASSWORD`
- `SYNC_SHARED_TOKEN`
- `API_DOMAIN`
- `ADMIN_DOMAIN`
@@ -256,6 +257,49 @@ nvm use 20
- `/usr/local/nvm`
- 最后再尝试系统全局 `node``npm`
### 6.2 国内机器已经装了宝塔怎么办
结论:
- 不需要为了接入 `controller` / `worker` 专门重装系统
- 机器上已经有宝塔,不等于这台机器不能继续用
- 关键不是“有没有宝塔”,而是“不要让宝塔深度接管项目服务”
推荐做法:
- 保留宝塔本身
- 如果你已经习惯用宝塔管理:
- `PostgreSQL`
- `Redis`
- 防火墙 / 端口
- 证书
这些可以继续保留
- 但项目服务仍然统一交给 `systemd`
- `domaincheck-worker`
- `domaincheck-sync-agent`
- 不要把这些项目服务交给宝塔的守护进程或计划任务反复接管
对于国内 `controller`
- 已装宝塔可以继续用
- Redis / PostgreSQL 可以继续由宝塔安装和管理
-`domaincheck-worker` / `domaincheck-sync-agent` 仍建议走 `systemd`
对于国内 `worker`
- 已装宝塔也不用重装
- 但尽量不要再给它额外配置站点、反代、复杂 PHP/Node 面板功能
- 把它当普通 Linux 节点使用即可
- 核心目标就是稳定运行 `domaincheck-worker`
只有在下面这些情况,才建议考虑重装:
- 机器上历史站点和旧服务太多,端口冲突严重
- Redis / PostgreSQL / Nginx 已经被旧项目改得很乱
- 系统里残留环境过多,你自己也不再信任这台机器的稳定性
如果只是“已经装了宝塔”,但系统仍然清晰可控,就不建议为了这个项目重装。
### 7. 你实际应该怎么选
- 如果国外主控机已经是宝塔机:
@@ -404,92 +448,38 @@ bash /www/wwwroot/getDomain/domain-api/deploy/multi-region/install_overseas_quic
- 这条脚本不会执行 `git pull`
- 你要先自己把 `/www/wwwroot/getDomain` 更新到目标版本,再跑脚本
- 这条脚本会自动过滤 Windows-only Python 依赖
- 这条脚本会自动把 `CORS_ORIGINS` 写成 systemd 可用的安全格式
- 这条脚本结束时会自动执行:`chown -R www:www /www/wwwroot/getDomain`
```bash
cd /www/wwwroot/getDomain
git fetch --all
git checkout GIT_BRANCH
git pull --ff-only origin GIT_BRANCH
mkdir -p /opt/domaincheck
ln -sfn /www/wwwroot/getDomain/domain-api /opt/domaincheck/domain-api
ln -sfn /www/wwwroot/getDomain/domain-web /opt/domaincheck/domain-web
ln -sfn /www/wwwroot/getDomain/domainCheck /opt/domaincheck/domainCheck
cd /opt/domaincheck/domainCheck
python3.11 -m venv .venv || true
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
/opt/domaincheck/domainCheck/.venv/bin/pip install fastapi uvicorn pydantic-settings psycopg2-binary redis openpyxl python-multipart
cat >/opt/domaincheck/domainCheck/.env <<EOF
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=domain
DB_USER=domainuser
DB_PASSWORD=DB_PASSWORD
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
EOF
/opt/domaincheck/domainCheck/.venv/bin/python /opt/domaincheck/domainCheck/init_database.py
cat >/opt/domaincheck/domain-web/.env.production <<EOF
VITE_API_BASE_URL=https://API_DOMAIN/api/v1
EOF
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm install NODE_VERSION
nvm use NODE_VERSION
cd /opt/domaincheck/domain-web
npm install
npm run build
cp /opt/domaincheck/domain-api/deploy/multi-region/templates/domaincheck-api.env.example /etc/default/domaincheck-api
sed -i 's#^DOMAIN_ROOT=.*#DOMAIN_ROOT=/opt/domaincheck/domainCheck#' /etc/default/domaincheck-api
sed -i 's#^API_HOST=.*#API_HOST=0.0.0.0#' /etc/default/domaincheck-api
sed -i 's#^API_PORT=.*#API_PORT=8100#' /etc/default/domaincheck-api
sed -i 's#^NODE_CODE=.*#NODE_CODE=OVERSEAS_NODE_CODE#' /etc/default/domaincheck-api
sed -i 's#^NODE_REGION=.*#NODE_REGION=overseas#' /etc/default/domaincheck-api
sed -i 's#^NODE_ROLE=.*#NODE_ROLE=control#' /etc/default/domaincheck-api
sed -i 's#^SYNC_PUSH_ENABLED=.*#SYNC_PUSH_ENABLED=false#' /etc/default/domaincheck-api
sed -i 's#^CORS_ORIGINS=.*#CORS_ORIGINS=https://ADMIN_DOMAIN,http://127.0.0.1:3201,http://localhost:3201#' /etc/default/domaincheck-api
cp /opt/domaincheck/domain-api/deploy/systemd/domain-api.service /etc/systemd/system/domaincheck-api.service
cp /opt/domaincheck/domain-api/deploy/systemd/domain-worker.service /etc/systemd/system/domaincheck-worker.service
mkdir -p /opt/domaincheck/domain-api/runtime
touch /opt/domaincheck/domainCheck/detect_worker.log
chown -R www:www /opt/domaincheck/domain-api/runtime
chown www:www /opt/domaincheck/domainCheck/detect_worker.log
chmod 664 /opt/domaincheck/domainCheck/detect_worker.log
systemctl daemon-reload
systemctl enable domaincheck-api
systemctl enable domaincheck-worker
systemctl restart domaincheck-api
systemctl restart domaincheck-worker
hostname
systemctl status domaincheck-api --no-pager -l
systemctl status domaincheck-worker --no-pager -l
curl http://127.0.0.1:8100/health
curl http://127.0.0.1:8100/api/v1/runtime/preflight
curl http://127.0.0.1:8100/api/v1/runtime/readiness
```
判断标准:
- `health.status=ok`
- `runtime/preflight.data.ok=true`
- 如果此时还没有接入大陆 `controller` / `worker``runtime/readiness.data.status=attention` 是正常现象
- 只有国外机自己的 PostgreSQL、Redis、API、systemd 报错时,才算国外主控机没部署好
### 2. 国内 controller 最短复制块
先把下面 3 个值替换掉再执行:
先把下面 5 个值替换掉再执行:
```text
DB_NAME
DB_USER
DB_PASSWORD
REDIS_PASSWORD
SYNC_SHARED_TOKEN
MAINLAND_CONTROLLER_NODE_CODE
TARGET_API_BASE_URL
```
也可以直接改脚本头部变量后执行:
@@ -511,72 +501,9 @@ bash /www/wwwroot/getDomain/domain-api/deploy/multi-region/install_mainland_cont
- 这条脚本结束时会自动执行:`chown -R www:www /www/wwwroot/getDomain`
```bash
cd /www/wwwroot/getDomain
git fetch --all
git checkout GIT_BRANCH
git pull --ff-only origin GIT_BRANCH
mkdir -p /opt/domaincheck
ln -sfn /www/wwwroot/getDomain/domain-api /opt/domaincheck/domain-api
ln -sfn /www/wwwroot/getDomain/domain-web /opt/domaincheck/domain-web
ln -sfn /www/wwwroot/getDomain/domainCheck /opt/domaincheck/domainCheck
cd /opt/domaincheck/domainCheck
python3.11 -m venv .venv || true
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
/opt/domaincheck/domainCheck/.venv/bin/pip install fastapi uvicorn pydantic-settings psycopg2-binary redis openpyxl python-multipart
cat >/opt/domaincheck/domainCheck/.env <<EOF
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=domain
DB_USER=domainuser
DB_PASSWORD=DB_PASSWORD
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
EOF
cd /opt/domaincheck/domain-api
bash deploy/multi-region/bootstrap_mainland.sh /opt/domaincheck controller
cat >/etc/default/domaincheck-worker <<EOF
WORKER_MODE=linux-systemd
QT_QPA_PLATFORM=offscreen
NODE_CODE=MAINLAND_CONTROLLER_NODE_CODE
NODE_REGION=mainland
NODE_ROLE=control
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=domain
DB_USER=domainuser
DB_PASSWORD=DB_PASSWORD
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
SYNC_PUSH_ENABLED=true
SYNC_SOURCE_REGION=mainland
SYNC_TARGET_REGION=overseas
SYNC_TARGET_API_BASE_URL=https://api.domain.com/api/v1
SYNC_SHARED_TOKEN=SYNC_SHARED_TOKEN
SYNC_BATCH_SIZE=200
SYNC_POLL_INTERVAL_SECONDS=30
EOF
systemctl daemon-reload
systemctl enable domaincheck-worker
systemctl enable domaincheck-sync-agent
systemctl restart domaincheck-worker
systemctl restart domaincheck-sync-agent
hostname
systemctl status domaincheck-worker --no-pager -l
systemctl status domaincheck-sync-agent --no-pager -l
cd /opt/domaincheck/domain-api
bash deploy/multi-region/check_mainland_controller.sh
```
@@ -584,12 +511,17 @@ bash deploy/multi-region/check_mainland_controller.sh
### 3. 国内 worker 最短复制块
先把下面 4 个值替换掉再执行:
先把下面 7 个值替换掉再执行:
```text
DB_NAME
DB_USER
DB_PASSWORD
REDIS_PASSWORD
SYNC_SHARED_TOKEN
MAINLAND_WORKER_NODE_CODE
MAINLAND_CONTROLLER_IP
TARGET_API_BASE_URL
```
也可以直接改脚本头部变量后执行:
@@ -611,69 +543,8 @@ bash /www/wwwroot/getDomain/domain-api/deploy/multi-region/install_mainland_work
- 这条脚本结束时会自动执行:`chown -R www:www /www/wwwroot/getDomain`
```bash
cd /www/wwwroot/getDomain
git fetch --all
git checkout GIT_BRANCH
git pull --ff-only origin GIT_BRANCH
mkdir -p /opt/domaincheck
ln -sfn /www/wwwroot/getDomain/domain-api /opt/domaincheck/domain-api
ln -sfn /www/wwwroot/getDomain/domain-web /opt/domaincheck/domain-web
ln -sfn /www/wwwroot/getDomain/domainCheck /opt/domaincheck/domainCheck
cd /opt/domaincheck/domainCheck
python3.11 -m venv .venv || true
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
/opt/domaincheck/domainCheck/.venv/bin/pip install fastapi uvicorn pydantic-settings psycopg2-binary redis openpyxl python-multipart
cat >/opt/domaincheck/domainCheck/.env <<EOF
DB_HOST=MAINLAND_CONTROLLER_IP
DB_PORT=5432
DB_DATABASE=domain
DB_USER=domainuser
DB_PASSWORD=DB_PASSWORD
REDIS_HOST=MAINLAND_CONTROLLER_IP
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
EOF
cd /opt/domaincheck/domain-api
bash deploy/multi-region/bootstrap_mainland.sh /opt/domaincheck worker
cat >/etc/default/domaincheck-worker <<EOF
WORKER_MODE=linux-systemd
QT_QPA_PLATFORM=offscreen
NODE_CODE=MAINLAND_WORKER_NODE_CODE
NODE_REGION=mainland
NODE_ROLE=worker
DB_HOST=MAINLAND_CONTROLLER_IP
DB_PORT=5432
DB_DATABASE=domain
DB_USER=domainuser
DB_PASSWORD=DB_PASSWORD
REDIS_HOST=MAINLAND_CONTROLLER_IP
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
SYNC_PUSH_ENABLED=true
SYNC_SOURCE_REGION=mainland
SYNC_TARGET_REGION=overseas
SYNC_TARGET_API_BASE_URL=https://api.domain.com/api/v1
SYNC_SHARED_TOKEN=SYNC_SHARED_TOKEN
SYNC_BATCH_SIZE=200
SYNC_POLL_INTERVAL_SECONDS=30
EOF
systemctl daemon-reload
systemctl enable domaincheck-worker
systemctl restart domaincheck-worker
hostname
systemctl status domaincheck-worker --no-pager -l
```
## 五、所有机器先执行一次
@@ -877,7 +748,7 @@ sed -i 's#^NODE_CODE=.*#NODE_CODE=overseas-control-01#' /etc/default/domaincheck
sed -i 's#^NODE_REGION=.*#NODE_REGION=overseas#' /etc/default/domaincheck-api
sed -i 's#^NODE_ROLE=.*#NODE_ROLE=control#' /etc/default/domaincheck-api
sed -i 's#^SYNC_PUSH_ENABLED=.*#SYNC_PUSH_ENABLED=false#' /etc/default/domaincheck-api
sed -i 's#^CORS_ORIGINS=.*#CORS_ORIGINS=https://admin.domain,http://127.0.0.1:3201,http://localhost:3201#' /etc/default/domaincheck-api
sed -i 's#^CORS_ORIGINS=.*#CORS_ORIGINS='\''["https://admin.domain","http://127.0.0.1:3201","http://localhost:3201"]'\''#' /etc/default/domaincheck-api
```
### 9. 安装 systemd
@@ -976,6 +847,13 @@ cd /opt/domaincheck/domain-api/deploy/linux
python3 smoke_test.py --base-url http://127.0.0.1:8100
```
结果解释:
- `runtime/preflight.data.ok=true` 说明国外主控机自身部署已经通过
- 如果此时 `runtime/readiness.data.status=attention`,而提示内容是“尚未观察到在线的大陆 controller / worker 节点”,这是正常现象
- `RedisBloom` 出现降级告警不算阻塞项,只是性能优化项
- 只有国外机自己的 PostgreSQL、Redis、systemd、DOMAIN_ROOT、API 启动失败时,才算国外主控机没收口
## 七、国内 controller 一键部署
这一节默认你是:
@@ -1185,6 +1063,14 @@ systemctl restart domaincheck-worker
systemctl restart nginx
```
如果国外机 Redis 只做本机运行态使用,并且当前 Redis 没有密码,记得保持:
```bash
sed -i 's#^REDIS_PASSWORD=.*#REDIS_PASSWORD=#' /opt/domaincheck/domainCheck/.env
systemctl restart domaincheck-api
systemctl restart domaincheck-worker
```
### 国内 controller
```bash