部署

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
web:
container_name: ys
image: ubuntu:20.04
network_mode: "bridge"
ports:
- "81:81/tcp"
- "3306:3306/tcp"
- "8000:8000/tcp"
- "20071:20071/tcp"
- "20081:20081/tcp"
- "20011:20011/tcp"
- "4433:4433/tcp"
- "1001-1005:1001-1005/udp"
- "20041:20041/udp"
restart: unless-stopped
stdin_open: true
tty: true

准备工作

进入容器

1
docker exec -it ys bash

安装服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 避免安装过程弹窗问时区
export DEBIAN_FRONTEND=noninteractive

# 换源
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
apt-get update

# 安装全部软件
apt-get install -y \
nginx \
mysql-server \
redis-server \
php-fpm \
php-mysql \
php-redis \
python2 \
libpython2.7 \
libssl-dev \
libasan5 \
net-tools \
curl \
nano \
wget

# 创建 Python 软链接 (游戏可能调用 python 命令)
ln -s /usr/bin/python2 /usr/bin/python

首次启动服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
service redis-server start
service php7.4-fpm start
service nginx start

# 4. 启动 MySQL
# 先创建个目录防止报错
mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld
usermod -d /var/lib/mysql/ mysql
service mysql start

# 5. 【关键】修改 MySQL 密码为 12345678
# 等几秒让 mysql 启动好
sleep 5
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '12345678'; FLUSH PRIVILEGES;"

echo "环境安装完成,数据库密码已改为 12345678"

复制服务端到容器内

1
2
3
4
5
6
7
docker cp ys3.4.tar.gz ys:/
# 解压
cd /
tar -xvf ys3.4.tar.gz
# 设置权限
chmod -R 777 /home
chmod -R 777 /www/wwwroot/gm

修改ip

1
2
3
4
5
find /home -type f -name '*.yaml' | xargs sed -i 's/150.138.81.173/your-ip/g'
find /home -type f -name '*.json' | xargs sed -i 's/150.138.81.173/your-ip/g'
find /home -type f -name '*.html' | xargs sed -i 's/150.138.81.173/your-ip/g'
find /www/backup -type f -name '*.*' | xargs sed -i 's/150.138.81.173/your-ip/g'
find /www/wwwroot -type f -name '*.*' | xargs sed -i 's/150.138.81.173/your-ip/g'

数据库

修改root密码为:12345678
导入数据库

1
2
cd /home
./sk

添加站点

1
nano /etc/nginx/sites-available/default

将下面内容覆盖原文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 81;
server_name _;
root /www/wwwroot/gm;

index index.html index.htm index.php;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}

重载服务:

1
service nginx reload

启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/bash
# clear logs
find /home -name "*.0000" -exec rm -rf {} \;
find /home -name "*.log" -exec rm -rf {} \;
sleep 5

service mysql start
service redis-server start
service php7.4-fpm start
service nginx start
sleep 5

cd /home && ./cli stop_all
sleep 2
cd /home && ./cli start
sleep 5

cd /home/via && ./start
sleep 5

cd /home/sdk && nohup ./main &

tail -f /dev/null

防火墙配置

放行端口:

1
2
3
4
5
6
7
8
9
10
sudo ufw allow 81/tcp
sudo ufw allow 3306/tcp
sudo ufw allow 8000/tcp
sudo ufw allow 8888/tcp
sudo ufw allow 20071/tcp
sudo ufw allow 20081/tcp
sudo ufw allow 20011/tcp
sudo ufw allow 4433/tcp
sudo ufw allow 20041/udp
sudo ufw allow 1001:1005/udp

查看防火墙日志发现:

1
ubuntu-2204 kernel: [72227.397950] [UFW BLOCK] IN=docker0 OUT= MAC=xx:yy:37:9c:b1:dd:02:42:ac:11:00:02:08:00 SRC=172.17.0.2 DST=192.168.1.90 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=15690 DF PROTO=UDP SPT=34692 DPT=20041 LEN=28

这条日志的含义是,来自 Docker 容器(IP 地址为 172.17.0.2)的 UDP 数据包试图发送到本地网络(IP 地址为 192.168.1.90)的 20041 端口,但由于 UFW 的防火墙规则,这个连接被阻止了。

放行:

1
sudo ufw allow in on docker0 from 172.17.0.0/24

查看服务端启动情况

查看20071端口监听:

1
netstat -ap | grep 20071

若20071端口已监听,则说明服务端启动成功

数据库备份恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

# 数据库连接配置
HOSTNAME="localhost"
PORT="3306"
USERNAME="root"
PASSWORD="12345678"

# 需要备份的数据库列表
DB1="db_hk4e_config_gio"
DB2="db_hk4e_deploy_config_gio"
DB3="db_hk4e_order_gio"
DB4="db_hk4e_user_gio"
DB5="db_hk4e_gm"
DB6="hk4e_test"

# 备份文件存储路径(按需修改)
BACKUP_DIR="/www/backup/database"
# 备份文件名时间戳(格式示例:20231015_1530)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 创建备份目录(如果不存在)
mkdir -p ${BACKUP_DIR}

# 备份函数
backup_database() {
local db_name=$1
local backup_file="${BACKUP_DIR}/${db_name}_${TIMESTAMP}.sql"

echo "正在备份数据库: ${db_name}..."
mysqldump -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} \
--single-transaction --routines --triggers --hex-blob ${db_name} > ${backup_file}

# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库 ${db_name} 备份成功 → ${backup_file}"
else
echo "错误:数据库 ${db_name} 备份失败!"
exit 1
fi
}

# 逐个备份数据库
backup_database ${DB1}
backup_database ${DB2}
backup_database ${DB3}
backup_database ${DB4}
backup_database ${DB5}
backup_database ${DB6}

# 打包所有备份文件为一个压缩包
echo "正在打包备份文件..."
tar -czvf "${BACKUP_DIR}/all_databases_${TIMESTAMP}.tar.gz" -C "${BACKUP_DIR}" $(ls ${BACKUP_DIR}/*_${TIMESTAMP}.sql)

# 检查打包是否成功
if [ $? -eq 0 ]; then
echo "备份文件打包完成 → ${BACKUP_DIR}/all_databases_${TIMESTAMP}.tar.gz"
else
echo "错误:打包失败!"
exit 1
fi

echo "所有数据库备份及打包完成!"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash

# 数据库连接配置
HOSTNAME="localhost"
PORT="3306"
USERNAME="root"
PASSWORD="12345678"

# 需要恢复的数据库列表(与备份顺序一致)
DB_NAMES=(
"db_hk4e_config_gio"
"db_hk4e_deploy_config_gio"
"db_hk4e_order_gio"
"db_hk4e_user_gio"
"db_hk4e_gm"
"hk4e_test"
)

# 备份文件存储路径
BACKUP_DIR="/www/backup/database"

# 自动获取最新备份时间戳(根据文件修改时间)
LATEST_SQL=$(ls -t ${BACKUP_DIR}/*.sql | head -1)
TIMESTAMP=$(basename "$LATEST_SQL" | awk -F_ '{print $(NF-1)"_"$NF}' | sed 's/\.sql//')

echo "检测到最新备份时间戳:$TIMESTAMP"
read -p "是否恢复该备份?[y/N] " CONFIRM

if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
echo "已取消恢复操作。"
exit 0
fi

# 恢复函数
restore_database() {
local db_name=$1
local backup_file="${BACKUP_DIR}/${db_name}_${TIMESTAMP}.sql"

if [ ! -f "$backup_file" ]; then
echo "错误:备份文件 $backup_file 不存在!"
exit 1
fi

echo "正在恢复数据库: $db_name..."
mysql -h$HOSTNAME -P$PORT -u$USERNAME -p$PASSWORD $db_name < $backup_file

if [ $? -eq 0 ]; then
echo "数据库 $db_name 恢复成功 ✔️"
else
echo "错误:数据库 $db_name 恢复失败 ❌"
exit 1
fi
}

# 逐个恢复数据库
for db in "${DB_NAMES[@]}"; do
restore_database "$db"
done

echo "所有数据库恢复完成!🎉"

安卓ios客户端

服务器ip需要和127.0.0.11111位数一致(13位,.也计数)

比如192.168.1.101符合,192.168.1.2不符合

因为需要通过十六进制编辑器修改客户端

gm工具

错误:响应:{"data":null,"msg":"region not match","retcode":1010,"ticket":"juliy@1747116358"}

Region留空

mysql 设置允许外部访问:

编辑配置文件: 通常在 /etc/mysql/mysql.conf.d/mysqld.cnf (MySQL 8.0/Ubuntu)。

1
nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address: 找到这一行: bind-address = 127.0.0.1

修改它: 改成 0.0.0.0 (允许所有 IP 连接),或者直接在前面加 # 注释掉。

TOML
1
bind-address = 0.0.0.0

(同时检查有没有 skip-networking,如果有,注释掉它)

保存并重启 MySQL: (Ctrl+O 保存,Ctrl+X 退出)

1
service mysql restart

执行 SQL 授权:

内网:

1
2
3
4
5
6
7
8
9
mysql -u root -p

SELECT host, user FROM mysql.user;

CREATE USER 'root'@'192.168.1.%' IDENTIFIED BY '12345678';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%' WITH GRANT OPTION; #授予权限

FLUSH PRIVILEGES;
1
2
3
4
5
6
7
8
9
mysql -u root -p

SELECT host, user FROM mysql.user;

CREATE USER 'root'@'%' IDENTIFIED BY '12345678';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; #授予权限

FLUSH PRIVILEGES;

日志:

nano /etc/mysql/mysql.conf.d/mysqld.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
# --- Extreme Space-Saving Configuration (Append to the end of the file) ---

# Completely disable binary logging (Enabled by default in MySQL 8.0, must be explicitly disabled)
skip-log-bin

# Cap temporary tablespace at 500M (Prevents runaway temporary files)
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:500M

# Limit InnoDB redo log capacity to 64M (Maintains minimal crash recovery capabilities)
innodb_redo_log_capacity = 64M

# Enable file-per-table tablespaces (Releases disk space immediately to the OS when a table is dropped)
innodb_file_per_table = 1

Docker

1
docker pull krmeng/ys:3.4

容器内默认ip192.168.1.101

如果要修改ip记得数据库hk4e_test的表gate_servers的ip也要改