解压密码:
您所在的用户组暂无权查看,请登录后查看。
# 寻道大千 Ubuntu 服务端部署与安卓 APK 修改流程
压缩包里面还有一份架设教程,这个是自己部署的全流程以及踩坑点,你可以直接让ai帮你部署,结合文档即可
本文记录一次完整部署流程,目标是让别人拿到同样的目录后可以复现部署。
本次示例服务器公网 IP:
```text
122.51.27.223
```
本次本地目录结构:
```text
服务端/xddq.zip
服务端/架设教程.txt
客户端/安卓.apk
客户端/苹果.ipa
```
> iOS 本次未处理。
## 1. 准备服务器
系统建议:
```text
Ubuntu Server 22.04 LTS 64 位
```
确认本机 SSH 公钥已经添加到服务器,可以直接免密登录:
```bash
ssh root@122.51.27.223
```
如果首次连接,需要接受 host key。
## 2. 安装基础环境
原教程使用宝塔,指定环境为:
```text
Nginx 1.26
MySQL 5.7
PHP 7.2
Redis 7.4
Node.js 18.19.1
```
本次实际部署没有安装宝塔,而是在干净 Ubuntu 上安装系统包与 Node 18:
```bash
apt-get update
apt-get install -y unzip curl wget build-essential nginx mysql-server redis-server php-fpm php-mysql php-cli php8.1-curl net-tools lsof nodejs npm
```
安装 Node 18.19.1 和 PM2:
```bash
npm config set registry https://registry.npmmirror.com
npm install -g n pm2
n 18.19.1
hash -r
node -v
npm -v
pm2 -v
```
期望 Node 版本:
```text
v18.19.1
```
启动并设置基础服务自启:
```bash
systemctl enable --now mysql redis-server nginx php8.1-fpm
```
确认 PHP curl 扩展已经启用。GM 后台发送邮件会调用区服 `/sendMail` 接口,如果没有 curl 扩展,页面会看起来没有反应,Nginx 错误日志里会出现 `Call to undefined function curl_init()`:
```bash
php -m | grep -i curl
systemctl restart php8.1-fpm
```
关闭系统防火墙:
```bash
ufw disable
```
## 3. 上传并解压服务端
服务器创建目录:
```bash
mkdir -p /home/ubuntu
```
本地上传服务端压缩包:
```bash
scp 服务端/xddq.zip root@122.51.27.223:/home/ubuntu/xddq.zip
```
服务器移动并解压:
```bash
mv /home/ubuntu/xddq.zip /xddq.zip
cd /
unzip -o -q /xddq.zip
chmod 777 -R /data /www/wwwroot/game
```
解压后关键目录:
```text
/data
/data/server/d_acc
/data/server/zone1
/data/server/zone2
/www/wwwroot/game
```
## 4. 设置 MySQL root 密码
原脚本 `/data/sk` 默认 MySQL root 密码是 `123123`。
Ubuntu 22.04 默认 MySQL 8 使用 socket 登录,需要先改 root 密码:
```bash
mysql -uroot <<'SQL'
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123123';
FLUSH PRIVILEGES;
SQL
```
验证:
```bash
mysql -uroot -p123123 -e "SHOW DATABASES;"
```
## 5. 替换服务端公网 IP
原教程建议使用类似命令:
```bash
sed -i "s/122.51.27.223/你的IP/g" `grep 122.51.27.223 -rl /data`
```
这里有大坑:不要对整个 `/data` 目录无差别替换。
原因:
```text
/data/server/zone1/server1
/data/server/zone2/server2
```
这两个是 Go 编译后的二进制文件。无差别 grep/sed 可能会把二进制文件里的 IP 字符串也替换掉。如果新 IP 长度不同,会破坏二进制,启动时可能直接 core dump,表现为:
```text
segfault at 8 ip ... in ld-linux-x86-64.so.2
timeout: the monitored command dumped core
```
正确做法是只改教程列出的文本配置文件:
```bash
sed -i "s/122.51.27.223/122.51.27.223/g" \
/data/server/d_acc/config/config.ddg.js \
/data/server/zone1/configs/app.ini \
/data/server/zone2/configs/app.ini \
/www/wwwroot/game/crazy_android/resource/v110/project.manifest \
/www/wwwroot/game/crazy_android/resource/v110/version.manifest \
/www/wwwroot/game/crazy_ios/resource/v110/project.manifest \
/www/wwwroot/game/crazy_ios/resource/v110/version.manifest
```
如果已经误替换了二进制,恢复方式:
```bash
cd /
unzip -o -q /xddq.zip data/server/zone1/server1 data/server/zone2/server2
chmod 777 /data/server/zone1/server1 /data/server/zone2/server2
```
## 6. 导入数据库
执行服务端自带脚本:
```bash
cd /data
./sk
```
导入后应该看到这些库:
```bash
mysql -uroot -p123123 -e "SHOW DATABASES;"
```
应包含:
```text
cps_account
ddg_1
ddg_2
x_account
```
## 7. 安装运行环境
执行:
```bash
cd /data
./install
```
这个脚本会做几件事:
```text
安装编译依赖
编译 Python 3.10.9
解压并 npm install 注册服依赖
安装 pkg
安装 Go 1.22.2
```
注意:
```text
Python 编译开启了 --enable-optimizations,会跑 PGO 测试和二次编译,耗时较长。
中间出现大量 gcc、npm warning 属正常现象,只要最终出现“运行环境安装成功”即可。
```
## 8. 配置 Nginx 81 端口
原教程后台与资源地址都走 `http://IP:81`。如果不用宝塔,需要自己加 Nginx 站点:
```bash
cat > /etc/nginx/sites-available/xddq-game.conf <<'EOF'
server {
listen 81 default_server;
listen [::]:81 default_server;
server_name _;
root /www/wwwroot/game;
index index.php index.html index.htm;
client_max_body_size 100m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
EOF
ln -sf /etc/nginx/sites-available/xddq-game.conf /etc/nginx/sites-enabled/xddq-game.conf
nginx -t
systemctl reload nginx
```
验证:
```bash
curl -I http://127.0.0.1:81/reg.php
curl -I http://127.0.0.1:81/crazy_android/resource/v110/project.manifest
```
应返回 `200 OK`。
## 9. 启动注册服 d_acc
首次启动:
```bash
cd /data/server/d_acc
pm2 start npm --name "d_acc" -- run dev
```
保存 PM2 状态并设置自启:
```bash
pm2 save
pm2 startup systemd -u root --hp /root
pm2 save
```
验证:
```bash
pm2 status
curl -s http://127.0.0.1:7001/
```
正常返回:
```text
hi, egg
```
## 10. 处理区服内置地址坑
恢复区服二进制后,直接启动一区可能出现:
```text
listen tcp 103.192.209.71:56000: bind: cannot assign requested address
```
这个地址不在普通配置文件里,而是在区服二进制内部:
```bash
strings /data/server/zone1/server1 | grep "103.192.209.71:56000"
```
由于这是二进制,不建议把它直接替换成长度不同的公网 IP。
本次处理方式:
1. 用等长 hostname 替换二进制里的 `103.192.209.71:56000`
2. 在 `/etc/hosts` 把 hostname 映射到本地地址
3. 一区和二区用不同 loopback IP,避免两个区服同时绑定 `56000` 冲突
原字符串长度:
```text
103.192.209.71:56000
```
替换为同长度:
```text
zone1.localhos:56000
zone2.localhos:56000
```
注意 `localhos` 少一个 `t`,这是为了严格保持长度一致。
执行:
```bash
cat >> /etc/hosts <<'EOF'
127.0.0.1 zone1.localhos
127.0.0.2 zone2.localhos
EOF
perl -0pi -e "s/103\.192\.209\.71:56000/zone1.localhos:56000/g" /data/server/zone1/server1
perl -0pi -e "s/103\.192\.209\.71:56000/zone2.localhos:56000/g" /data/server/zone2/server2
```
二区还有一个端口坑:
```text
zone1 和 zone2 的 [webserver] addr 默认都是 :8001
```
如果两个区服都开,会冲突。把二区改成 `8002`:
```bash
sed -i "s/addr = :8001/addr = :8002/" /data/server/zone2/configs/app.ini
```
## 11. 使用 systemd 管理一区和二区
比 `nohup ./server1 &` 更稳定,也方便开机自启。
一区服务:
```bash
cat > /etc/systemd/system/xddq-zone1.service <<'EOF'
[Unit]
Description=XDDQ Zone 1
After=network.target mysql.service redis-server.service
[Service]
Type=simple
WorkingDirectory=/data/server/zone1
ExecStart=/data/server/zone1/server1
Restart=on-failure
RestartSec=5
StandardOutput=append:/data/server/zone1/server1.log
StandardError=append:/data/server/zone1/server1.log
[Install]
WantedBy=multi-user.target
EOF
```
二区服务:
```bash
cat > /etc/systemd/system/xddq-zone2.service <<'EOF'
[Unit]
Description=XDDQ Zone 2
After=network.target mysql.service redis-server.service
[Service]
Type=simple
WorkingDirectory=/data/server/zone2
ExecStart=/data/server/zone2/server2
Restart=on-failure
RestartSec=5
StandardOutput=append:/data/server/zone2/server2.log
StandardError=append:/data/server/zone2/server2.log
[Install]
WantedBy=multi-user.target
EOF
```
启动:
```bash
systemctl daemon-reload
systemctl enable --now xddq-zone1 xddq-zone2
```
查看状态:
```bash
systemctl status xddq-zone1 xddq-zone2 --no-pager
```
正常监听端口:
```bash
ss -lntp | grep -E ":(3250|3251|3252|3253|56000|7001|81)"
```
应看到:
```text
127.0.0.1:56000 server1
127.0.0.2:56000 server2
*:3250 server1
*:3251 server1
*:3252 server2
*:3253 server2
0.0.0.0:7001 node
0.0.0.0:81 nginx
```
## 12. 公网访问验证
在本机执行:
```bash
curl -I http://122.51.27.223:81/reg.php
curl -I http://122.51.27.223:81/gm/gmadmin.php
curl -I http://122.51.27.223:81/crazy_android/resource/v110/project.manifest
curl -s http://122.51.27.223:7001/
```
端口连通性:
```bash
for p in 3250 3251 3252 3253 7001 81; do
nc -vz -G 5 122.51.27.223 "$p"
done
```
## 13. 常用地址
注册地址:
```text
http://122.51.27.223:81/reg.php
```
GM 后台:
```text
http://122.51.27.223:81/gm/gmadmin.php
```
GM 密码:
```text
123123
```
物品后台:
```text
http://122.51.27.223:81/gm/wupin.php
```
CDK 自助后台:
```text
http://122.51.27.223:81/gm/index.php
```
### 后台授权和发送邮件用法
GM 后台的“授权系统”不是游戏内 VIP,而是给网页后台写授权文件:
```text
/www/wwwroot/game/gm/user/xundao-10001.json
```
按钮含义:
```text
无限:写入 level=0,只是普通授权
物品:写入 level=1,物品后台发邮件需要这个权限
取消:删除授权
修改:修改授权密码
```
给账号开物品权限:
```text
GM 后台:http://122.51.27.223:81/gm/gmadmin.php
GM 校验码:123123
区服:魔道1区
账号:填写登录账号或 UID,不要填角色昵称
授权密码:自定义,例如 123123
点击:物品
```
物品后台发送邮件:
```text
物品后台:http://122.51.27.223:81/gm/wupin.php
授权密码:上一步填写的授权密码,例如 123123
区服:魔道1区
账号:填写登录账号或 UID,不要填角色昵称
选择物品
填写数量
点击:发送邮件
```
账号填写规则很容易踩坑:
```text
可以填登录账号,例如 zhajx1
也可以填 UID,例如 10787880961
不要填角色昵称,例如 冷鱼黑2世
```
如果点击“发送邮件”没有反应,先看 Nginx 错误日志:
```bash
tail -n 120 /var/log/nginx/error.log
```
如果看到:
```text
Call to undefined function curl_init()
```
说明 PHP curl 扩展没装或 PHP-FPM 没重启,执行:
```bash
apt-get update
apt-get install -y php8.1-curl
systemctl restart php8.1-fpm
php -m | grep -i curl
```
可用 curl 直接验证邮件接口:
```bash
curl -sS -X POST http://127.0.0.1:81/gm/user/wupin.php \
--data-urlencode "type=mail" \
--data-urlencode "uid=10787880961" \
--data-urlencode "qu=10001" \
--data-urlencode "pwd=123123" \
--data-urlencode "item=1" \
--data-urlencode "num=1000"
```
正常返回:
```text
成功
```
区服日志里应能看到类似:
```text
do test mail 10787880961 1#1#1000
```
查看日志:
```bash
tail -n 40 /data/server/zone1/server1.log
```
物品后台默认前端数量上限只有 `99`,后端允许更大。本次已改成 `1-999999999`。如果新部署也要放开限制,修改:
```bash
perl -0pi -e "s/mailnum>99/mailnum>999999999/g; s/道具数量范围:1-99/道具数量范围:1-999999999/g" \
/www/wwwroot/game/gm/js/wupin.js
perl -0pi -e "s/max=\"99999999\"/max=\"999999999\"/g" \
/www/wwwroot/game/gm/wupin.php
```
如果页面仍提示旧上限,浏览器强制刷新缓存:
```text
Windows:Ctrl + F5
macOS:Command + Shift + R
```
## 14. 修改安卓 APK
教程中安卓客户端要改三处:
```text
assets/assets/main/index.js
assets/remote/resources/native/0b/0bfa8219-158a-4ed5-b555-de82bce41c62.manifest
assets/remote/resources/native/97/97d3205d-b982-4e32-aafd-20abb172514a.manifest
```
原始 APK:
```text
客户端/安卓.apk
```
建议生成新 APK,不覆盖原文件:
```text
客户端/安卓_122.51.27.223.apk
```
示例流程:
```bash
WORK="$(mktemp -d)"
APK="/Users/jensenzz/Downloads/寻道大千/客户端/安卓.apk"
OUT="/Users/jensenzz/Downloads/寻道大千/客户端/安卓_122.51.27.223.apk"
UNSIGNED="$WORK/安卓_unsigned.apk"
cp "$APK" "$UNSIGNED"
cd "$WORK"
unzip -q "$UNSIGNED" \
assets/assets/main/index.js \
assets/remote/resources/native/0b/0bfa8219-158a-4ed5-b555-de82bce41c62.manifest \
assets/remote/resources/native/97/97d3205d-b982-4e32-aafd-20abb172514a.manifest
perl -0pi -e 's/122\.51\.27\.223/122.51.27.223/g; s/103\.192\.209\.71/122.51.27.223/g' \
assets/assets/main/index.js \
assets/remote/resources/native/0b/0bfa8219-158a-4ed5-b555-de82bce41c62.manifest \
assets/remote/resources/native/97/97d3205d-b982-4e32-aafd-20abb172514a.manifest
zip -q -d "$UNSIGNED" 'META-INF/*' || true
zip -q -u "$UNSIGNED" \
assets/assets/main/index.js \
assets/remote/resources/native/0b/0bfa8219-158a-4ed5-b555-de82bce41c62.manifest \
assets/remote/resources/native/97/97d3205d-b982-4e32-aafd-20abb172514a.manifest
```
生成签名证书:
```bash
KEYSTORE="/Users/jensenzz/Downloads/寻道大千/客户端/android-deploy.keystore"
keytool -genkeypair -v \
-keystore "$KEYSTORE" \
-storepass 123456 \
-keypass 123456 \
-alias xddq \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-dname "CN=xddq, OU=Codex, O=Local, L=Shanghai, ST=Shanghai, C=CN"
```
重新签名:
```bash
cp "$UNSIGNED" "$OUT"
jarsigner \
-keystore "$KEYSTORE" \
-storepass 123456 \
-keypass 123456 \
-signedjar "$OUT.signed" \
"$OUT" \
xddq
mv "$OUT.signed" "$OUT"
jarsigner -verify -certs "$OUT"
```
验证 APK 内地址:
```bash
for p in \
'assets/assets/main/index.js' \
'assets/remote/resources/native/0b/0bfa8219-158a-4ed5-b555-de82bce41c62.manifest' \
'assets/remote/resources/native/97/97d3205d-b982-4e32-aafd-20abb172514a.manifest'
do
echo "== $p =="
unzip -p "$OUT" "$p" | strings | grep -E '121\.41\.207\.4|122\.51\.27\.223|103\.192\.209\.71' | head
done
```
注意:
```text
重新签名后,手机如果已安装原包,可能需要先卸载旧包再安装新包。
```
## 15. 上传 APK 到服务器提供下载
服务器创建下载目录:
```bash
ssh root@122.51.27.223 'mkdir -p /www/wwwroot/game/download'
```
上传:
```bash
scp 客户端/安卓_122.51.27.223.apk \
root@122.51.27.223:/www/wwwroot/game/download/xddq_android_122.51.27.223.apk
```
设置权限:
```bash
ssh root@122.51.27.223 'chmod 644 /www/wwwroot/game/download/xddq_android_122.51.27.223.apk'
```
下载地址:
```text
http://122.51.27.223:81/download/xddq_android_122.51.27.223.apk
```
验证:
```bash
curl -I http://122.51.27.223:81/download/xddq_android_122.51.27.223.apk
```
应返回:
```text
HTTP/1.1 200 OK
Content-Length: ...
Accept-Ranges: bytes
```
## 16. 常用运维命令
查看注册服:
```bash
pm2 status
pm2 logs d_acc
```
重启注册服:
```bash
pm2 restart d_acc
```
查看区服:
```bash
systemctl status xddq-zone1 xddq-zone2 --no-pager
```
重启区服:
```bash
systemctl restart xddq-zone1
systemctl restart xddq-zone2
```
看区服日志:
```bash
tail -f /data/server/zone1/server1.log
tail -f /data/server/zone2/server2.log
```
查看端口:
```bash
ss -lntp | grep -E ":(81|7001|3250|3251|3252|3253|56000)"
```
查看 Nginx:
```bash
nginx -t
systemctl status nginx --no-pager
```
查看数据库:
```bash
mysql -uroot -p123123 -e "SHOW DATABASES;"
```
## 17. 本次关键坑点总结
1. 不要对 `/data` 全目录执行无差别 `sed` 替换 IP,否则会破坏区服二进制。
2. 区服二进制内置 `103.192.209.71:56000`,不能直接替换成不同长度字符串。
3. 一区和二区都要用 `56000`,需要映射到不同 loopback IP,避免绑定冲突。
4. 二区默认 `[webserver] addr = :8001`,需要改成 `:8002`,避免和一区冲突。
5. `/data/install` 编译 Python 很慢,看到大量 gcc 和 npm warning 不代表失败。
6. 不用宝塔时,需要自己配置 Nginx 81 端口和 PHP-FPM。
7. APK 修改后需要移除旧 `META-INF` 签名并重新签名。
8. 新签名 APK 如果和旧包签名不同,安卓设备可能要先卸载旧包。
9. GM/物品后台发送邮件依赖 PHP curl 扩展,缺少时会 500,页面可能表现为点击没有反应。
10. 物品后台账号栏要填登录账号或 UID,不要填角色昵称。
11. 物品后台默认 JS 把邮件数量限制为 `1-99`,需要按需求改大。
|
|