机器人部署与运维

机器人部署与运维全流程指南

本文基于实际操作场景,整合机器人(以LAIN_BOT为例)在云服务器上的部署、常见问题解决及日常运维(启停、更新、数据库修改)全流程,适配Supervisor进程守护、Git代码管理等核心操作,适合新手快速上手,规避常见踩坑点。

一、机器人部署全流程(基于Supervisor)

部署核心目标是通过Supervisor实现机器人进程守护,确保机器人后台稳定运行,重启服务器后可自动启动,步骤如下:

1. 环境清理与依赖安装

若此前部署过Supervisor且出现异常,需先彻底清理残留,再重新安装,避免冲突:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 停止所有Supervisor相关进程
sudo pkill -9 supervisord

# 卸载旧版本Supervisor并清理残留
sudo apt remove --purge supervisor -y
sudo rm -rf /etc/supervisor
sudo rm -rf /var/log/supervisor
sudo rm -f /tmp/supervisor.sock
sudo rm -f /etc/systemd/system/supervisord.service

# 清理开机自启配置(若此前配置过)
sudo sed -i '/supervisord/d' /etc/rc.local

# 重新安装Supervisor
sudo apt install supervisor -y
# 验证安装成功
supervisord --version

2. 配置Supervisor(极简版,避免端口冲突)

核心是禁用不必要的HTTP服务,仅保留本地进程通信,避免端口占用问题,配置步骤如下:

1
2
3
4
5
# 创建Supervisor配置目录
sudo mkdir -p /etc/supervisor/conf.d

# 编辑主配置文件
sudo nano /etc/supervisor/supervisord.conf

在配置文件中粘贴以下内容(仅保留核心功能,无HTTP服务):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock # 本地通信,不占用网络端口

[include]
files = /etc/supervisor/conf.d/*.conf

保存退出(Ctrl+O → 回车 → Ctrl+X)。

3. 配置机器人进程

创建机器人专属配置文件,指定机器人启动命令、目录、日志路径等:

1
2
# 创建机器人配置文件
sudo nano /etc/supervisor/conf.d/lain_bot.conf

粘贴以下配置(需根据实际路径修改):

1
2
3
4
5
6
7
8
[program:lain_bot]
command=/root/LAIN_BOT/venv/bin/python /root/LAIN_BOT/BAbot_Lain/main.py # 机器人启动命令(虚拟环境路径)
directory=/root/LAIN_BOT/BAbot_Lain # 机器人代码目录
user=root
autostart=true # 随Supervisor自动启动
autorestart=true # 机器人崩溃后自动重启
stdout_logfile=/root/LAIN_BOT/bot.log # 正常运行日志
stderr_logfile=/root/LAIN_BOT/error.log # 错误日志

保存退出。

4. 启动Supervisor与机器人

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动Supervisor(指定配置文件)
sudo supervisord -c /etc/supervisor/supervisord.conf

# 验证Supervisor是否启动成功(需显示1个进程)
ps -ef | grep supervisord

# 加载机器人配置
sudo supervisorctl -c /etc/supervisor/supervisord.conf update

# 启动机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf start lain_bot

# 查看机器人状态(显示RUNNING即为成功)
sudo supervisorctl -c /etc/supervisor/supervisord.conf status lain_bot

5. 设置开机自启

若/etc/rc.local为空,手动创建并配置自启命令,确保服务器重启后机器人自动运行:

1
2
# 编辑rc.local文件
sudo nano /etc/rc.local

粘贴以下完整内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# 启动Supervisor(机器人随Supervisor自动启动)
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

exit 0

保存后赋予执行权限:

1
sudo chmod +x /etc/rc.local

二、常见部署问题解决

1. 端口占用错误(Error: Another program is already listening on a port)

核心原因:Supervisor的HTTP服务占用端口,或残留进程、socket文件冲突,解决步骤:

1
2
3
4
5
6
7
8
9
# 1. 彻底终止所有Supervisor进程
sudo pkill -9 supervisord

# 2. 删除残留的socket文件(关键)
sudo rm -f /var/run/supervisor.sock # 对应配置文件中的socket路径

# 3. 确认配置文件中已禁用inet_http_server(无未注释的[inet_http_server]段落)
# 4. 重新启动Supervisor
sudo supervisord -c /etc/supervisor/supervisord.conf

注意:无需调整云服务器防火墙,该问题是服务器内部进程冲突,与防火墙无关。

2. Supervisor启动失败(systemctl status supervisord显示failed)

核心原因:systemd服务与手动启动的Supervisor进程冲突,解决方法:

无需关注systemctl的失败信息,只要通过ps -ef | grep supervisord能看到Supervisor进程,且机器人状态为RUNNING,即视为正常(我们采用手动启动Supervisor,无需依赖systemd服务)。

3. Git拉取代码报错(fatal: not a git repository)

核心原因:当前目录不是Git仓库(.git目录被误删),解决步骤:

1
2
3
4
5
6
7
8
# 进入机器人代码目录上级
cd /root/LAIN_BOT/
# 删除当前代码目录(确保已备份重要修改)
sudo rm -rf BAbot_Lain/
# 重新克隆远程仓库(替换为你的仓库地址)
git clone https://github.com/Zggggg123/BAbot_Lain.git BAbot_Lain
# 进入代码目录
cd BAbot_Lain/

4. Git拉取要求输入账号密码(HTTPS协议)

核心原因:GitHub不再支持账号密码直接验证,需使用Personal Access Token(PAT),步骤:

  1. 登录GitHub,进入https://github.com/settings/tokens,创建经典令牌(Generate new token (classic));

  2. 设置令牌名称,勾选repo权限(全选子项),生成后复制保存(仅显示一次);

  3. 拉取代码时,用户名填GitHub账号/邮箱,密码粘贴生成的PAT(终端不显示粘贴内容,正常)。

可选:配置凭证缓存,避免每次拉取输入:

1
git config --global credential.helper store

5. Git拉取冲突(Your local changes to the following files would be overwritten by merge)

核心原因:本地文件(如botpy.log日志)有修改,与远程代码冲突,解决方法(以botpy.log为例):

1
2
3
4
5
6
7
8
9
10
11
# 1. 暂存本地修改(保留日志内容)
git stash push -m "暂存botpy.log日志"

# 2. 拉取远程代码
git pull origin master # 替换为你的分支名

# 3. 恢复本地日志(可选)
git stash pop

# 4. 永久解决:创建.gitignore排除日志文件
nano .gitignore

在.gitignore中添加以下内容,排除日志、缓存等无需版本管理的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 日志文件
*.log
botpy.log

# Python缓存文件
__pycache__/
*.pyc
*.pyo
*.pyd

# 虚拟环境
venv/
env/

# 数据库文件
*.db
*.sqlite3

保存后提交.gitignore(可选,同步到远程仓库):

1
2
3
git add .gitignore
git commit -m "添加.gitignore,排除日志和缓存文件"
git push origin master

三、机器人日常运维操作

1. 机器人启停与状态查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看机器人状态
sudo supervisorctl -c /etc/supervisor/supervisord.conf status lain_bot

# 停止机器人(保留Supervisor运行)
sudo supervisorctl -c /etc/supervisor/supervisord.conf stop lain_bot

# 启动机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf start lain_bot

# 重启机器人(更新代码后常用)
sudo supervisorctl -c /etc/supervisor/supervisord.conf restart lain_bot

# 彻底停止Supervisor(包括所有管理的进程)
sudo pkill -9 supervisord
# 确认停止(无输出即为成功)
ps -ef | grep supervisord

2. 机器人代码更新(分两种场景)

场景1:使用Git管理代码(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 进入代码目录
cd /root/LAIN_BOT/BAbot_Lain/

# 2. 停止机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf stop lain_bot

# 3. 拉取远程最新代码(解决冲突后)
git pull origin master

# 4. 若更新了依赖,进入虚拟环境安装
source /root/LAIN_BOT/venv/bin/activate
pip install -r requirements.txt --upgrade
deactivate

# 5. 重启机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf start lain_bot

# 6. 查看状态,确认正常运行
sudo supervisorctl -c /etc/supervisor/supervisord.conf status lain_bot

场景2:手动上传代码(未使用Git)

1
2
3
4
5
6
7
8
9
10
11
# 1. 停止机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf stop lain_bot

# 2. 用新文件覆盖旧文件(通过rz、FTP等方式上传)
# 3. 若更新依赖,进入虚拟环境安装
source /root/LAIN_BOT/venv/bin/activate
pip install -r requirements.txt --upgrade
deactivate

# 4. 重启机器人
sudo supervisorctl -c /etc/supervisor/supervisord.conf start lain_bot

3. 数据库文件修改(以SQLite为例,最常见)

机器人常用SQLite数据库(单一.db文件),修改步骤如下:

1
2
3
4
5
6
7
8
9
# 1. 进入代码目录,找到数据库文件(如data.db)
cd /root/LAIN_BOT/BAbot_Lain/
ls *.db # 查看数据库文件

# 2. 安装sqlite3工具(若未安装)
sudo apt install sqlite3 -y

# 3. 连接数据库
sqlite3 data.db # 替换为你的数据库文件名

进入SQLite交互模式后,执行以下命令修改数据(按需调整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 查看所有表
.tables

-- 查看表结构(如users表)
.schema users

-- 查询数据(确认要修改的内容)
SELECT * FROM users WHERE id = 1;

-- 修改数据(如更新用户名)
UPDATE users SET name = '新名称' WHERE id = 1;

-- 删除数据(谨慎操作!)
DELETE FROM users WHERE id = 1;

-- 退出交互模式
.quit

修改后重启机器人,使新数据生效:

1
sudo supervisorctl -c /etc/supervisor/supervisord.conf restart lain_bot

注意:修改前建议备份数据库文件(如cp data.db data_backup.db),避免误操作导致数据丢失。

四、运维注意事项

  1. 日志查看:若机器人运行异常,可通过日志排查问题(tail -f /root/LAIN_BOT/error.log);

  2. 依赖管理:更新代码后,若涉及新依赖,必须重新安装,否则会报错;

  3. 备份习惯:数据库文件、重要配置文件定期备份,避免数据丢失;

  4. 进程管理:避免同时启动多个Supervisor进程,否则会导致冲突,启动前需用pkill -9 supervisord清理残留。

    (注:文档部分内容可能由 AI 生成)