要点说明

1.astrbot机器人框架、微信侧wechatpadpro及2个数据库、QQ侧napcat,一共5个容器用docker compose统一编排

2.五个容器,在docker中共用一个网络桥接在宿主机网络,所以5个容器间的通信,可以通过【容器名称:容器端口号】来实现

3.微信侧容易风控,风险自行承担。详见通过 WeChatPadPro 接入微信 | AstrBot(一定要整页看完)

4.首次登入說明

  • 可能出现立刻掉线情況,重新扫码登入2次后即可稳定

  • 24小时内可能会再次掉线,使用原API key重新登入即可

  • 重新登入后一般可稳定使用3个月

  • 3天后基本稳定,7天后更稳定

⚠️ 注意: 一个授权码key仅限一个 WeChat 账号使用,多账号需生成多个授权码

5.关于astrbot的AI服务商配置,这篇文章不做讲解

前期准备

1.linux服务器系统一套(我的是ubuntu系统),并且可以正常通网,我这里用的是废弃电脑刷了ubuntu系统,作为可以连网的本地服务器使用。

2.安装好了docker 和docker compose(如果先安装1panel,在1panel的web端控制后台可以找到docker服务的安装按钮。

3.趁手工具:1panel

4.工具框架:Astrbot

5.消息平台适配器:

QQ个人号:Napcat

微信个人号:wechatpadpro

(ps.github搜索仓库显示too many request,是因为你没登陆github账号)

步骤1-镜像拉取(可跳过)

如果你的服务器支持科学代理网络环境,不会因为网络问题拉取失败,就可以无视这条,直接进行步骤2,因为docker compose up -d命令后,会自动拉取镜像。

1.安装好1panel(安装说明在官网有详细指引,不做展开)

2.拉取4个镜像(注意需要一些科学的环境才能保障网络畅通,可以自查是否能正常打开docker仓库

2-1.Astrbot镜像拉取

docker pull m.daocloud.io/docker.io/soulter/astrbot:latest    #此代码为拉取Astrbot镜像
docker pull soulter/astrbot:latest                    

#以上两个镜像都可以,选一个即可,只是镜像来源不同而已。

2-2.Napcat镜像拉取

docker pull mlikiowa/napcat-docker:latest                             #此代码为拉取Napcat镜像

2-3.SQL数据库镜像拉取

docker pull mysql:8.0              #此代码为拉取SQL8.0的镜像

2-4.Redis数据库镜像拉取

docker pull wechatpadpro/redis:6          #此代码为拉取Redis的alpine版本镜像

2-5.wechatpadpro镜像拉取

docker pull wechatpadpro/wechatpadpro:latest    #此代码为拉取wechatpadpro镜像

备注:如果安装了1panel,可以在应用商店安装SQL和Redis,但是需要在wechatpadpro的设置文件中去修改对应的数据库变量,并且,在对应数据库要创建新的,为了省事,我懒得做,所以就统一拉取镜像,最后通过docker compose一体化编排,搞定多个容器的创建和管理。

步骤2-docker compose 编排

1.如果1panel的版本有编排功能,则开始利用1panel的编排工具,进行编排内容编写:

#这是2025/07/19 wechatpad更新之后,我在这个日期按照wechatpadpro官方格式调整的compose内容

# docker-compose.yml
# NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose -f ./compose/astrbot.yml up -d
services:

#安装napcat容器
  napcat:
    environment:
      - NAPCAT_UID=${NAPCAT_UID:-1000}
      - NAPCAT_GID=${NAPCAT_GID:-1000}
      - MODE=astrbot
    ports:
      - 6099:6099
    container_name: as_napcat
    restart: unless-stopped
    image: mlikiowa/napcat-docker:latest
    volumes:
      - ./data:/AstrBot/data
      - ./ntqq:/app/.config/QQ
    networks:
      - astrbot_network
    mac_address: "02:42:ac:11:00:02"

#安装astrbot容器    
  astrbot:
    environment:
      - TZ=Asia/Shanghai
    image: soulter/astrbot:latest
    container_name: astrbot
    restart: unless-stopped
    ports:
      - "6185:6185"
      - "6195:6195"
      - "6199:6199"
    volumes:
      - ./data:/AstrBot/data
      - ./napcat/config:/app/napcat/config
      - ./ntqq:/app/.config/QQ
    networks:
      - astrbot_network

#安装wechatpadpro消息平台的数据库--mysql
  mysql:
    # 指定镜像和版本
    image: mysql:8.0
    # 指定容器的名称
    container_name: as_mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-weixin}
      MYSQL_USER: ${MYSQL_USER:-weixin}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-weixin123}
    ports:
      - "${MYSQL_PORT:-3306}:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123456}"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - astrbot_network

#安装wechatpadpro消息平台的数据库--redis:
  redis:
    # 指定镜像和版本
    image: wechatpadpro/redis:6
    # 指定容器的名称
    container_name: as_redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    ports:
      - "${REDIS_PORT:-6379}:6379"
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 20
    networks:
      - astrbot_network

#安装微信消息平台wechatpadpro
  wechatpadpro:
    image: wechatpadpro/wechatpadpro:${WECHAT_TAG:-latest}
    # 指定容器的名称
    container_name: as_wechatpadpro
    # 指定镜像和版本
    restart: unless-stopped
    ports:
      - "${WECHAT_PORT:-8080}:8080"
      - "${PORT:-1238}:1238"
    env_file:
      - 1panel.env
  #sql连接格式是:sql用户:sql数据库密码
    environment:
      - DB_HOST=mysql
      - REDIS_HOST=redis
    volumes:
      - ./1panel.env:/app/.env
    depends_on:
      mysql: 
        condition: service_healthy
      redis: 
        condition: service_healthy
    networks:
      - astrbot_network
    # === 日志配置 ===
    logging:
      driver: "json-file" # 指定使用 json-file 日志驱动 (默认,但明确写出更清晰)
      options:
        max-size: "10m"   # 每个日志文件最大 10 MB
        max-file: "3"     # 最多保留 3 个日志文件

networks:
  astrbot_network:
    driver: bridge
    name: astrbot_network

volumes:
  mysql_data:
  redis_data:

2.如果没有编排功能,可以手动在以下路径,创建一个新的文件夹astrbot_all,名字自定义,算是为了这个小项目的容器编排进行命名,同时创建一个docker-compose.yml文件,文件具体代码,在步骤①附上了。

3.注意:docker-compose.yml中注意区分:【数据库用户名】【数据库密码】【数据库名称】【sql数据库root密码】,图中标注的很清楚了。

另外:如果你不是用1panel的编排,那么需要自己创建.env文件,并且把docker-compose.yml内容中所有1panel.env更改成.env ,比如:

步骤3-创建env文件

左边是最小部署环境变量,右边是其他的环境变量,根据情况自己配置

#留意【自己修改】的部分,需要设置

# 基础配置
WECHAT_PORT=8080
PORT=1238
TZ=Asia/Shanghai
GH_WXID=
ADMIN_KEY=自己修改

# Worker配置
WORKER_POOL_SIZE=500
MAX_WORKER_TASK_LEN=1000

# Web配置
WEB_DOMAIN=localhost:1238
WEB_TASK_NAME=
WEB_TASK_APP_NUMBER=
NEWS_SYN_WXID=true
DT=true

# 消息队列配置
TOPIC=wx_sync_msg_topic
ROCKET_MQ_ENABLED=false
ROCKET_MQ_HOST=127.0.0.1:9876
ROCKET_ACCESS_KEY=
ROCKET_SECRET_KEY=
RABBIT_MQ_ENABLED=false
RABBIT_MQ_URL=
KAFKA_ENABLED=false
KAFKA_URL=
KAFKA_USERNAME=
KAFKA_PASSWORD=

# MySQL配置
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=自己修改
MYSQL_DATABASE=weixin
MYSQL_USER=wechatpadpro
MYSQL_PASSWORD=自己修改(下行的sql密码自己修改)
MYSQL_CONNECT_STR=wechatpadpro:sqlpassword@tcp(mysql:3306)/weixin?charset=utf8mb4&parseTime=true&loc=Local

# 任务配置
TASK_RETRY_COUNT=3
TASK_RETRY_INTERVAL=5
HEARTBEAT_INTERVAL=25
AUTO_AUTH_INTERVAL=30
AUTO_SYNC_INTERVAL_MINUTES=30
TASK_EXEC_WAIT_TIMES=500
QUEUE_EXPIRE_TIME=86400

# WebSocket配置
WS_HANDSHAKE_TIMEOUT=10
WS_READ_BUFFER_SIZE=4096
WS_WRITE_BUFFER_SIZE=4096
WS_READ_DEADLINE=120
WS_WRITE_DEADLINE=60
WS_PING_INTERVAL=25
WS_CONNECTION_CHECK_INTERVAL=45
WS_MAX_MESSAGE_SIZE=8192

# 集群
CLUSTER_NAME=
ZK_ADDR=
ETCD_ADDR=

# 禁用命令
DISABLED_CMD_LIST=

#如果数据库第一次设置没设置对,导致wechatpadpro和sql数据库连接不上,调整好后,可以用 docker compose down -v 的命令,删除挂载卷(但是会清空数据库容器在挂载卷下的可持久化数据)
#其他的环境变量

# 是否开启调试模式(true: 开启,false: 关闭)
DEBUG=false
# 服务监听地址(0.0.0.0表示监听所有网卡)
HOST=0.0.0.0
# 服务端口号
PORT=1238
# API版本前缀(如 /v1, /v2)
API_VERSION=
# MCP服务端口(用于AI大模型集成服务)
MCP_PORT=8099
# 推广公众号微信ID(用于新用户首次登录时推广)
GH_WXID=

# ==========================================
# Redis配置
# ==========================================

# Redis服务器地址
REDIS_HOST=redis
# Redis端口
REDIS_PORT=6379
# Redis数据库编号
REDIS_DB=1
# Redis密码
REDIS_PASSWORD=123456
# Redis最大空闲连接数
REDIS_MAX_IDLE=30
# Redis最大活动连接数
REDIS_MAX_ACTIVE=100
# Redis空闲连接超时时间(毫秒)
REDIS_IDLE_TIMEOUT=5000
# Redis连接最大生命周期(秒)
REDIS_MAX_CONN_LIFETIME=3600
# Redis连接超时时间(毫秒)
REDIS_CONNECT_TIMEOUT=5000
# Redis读取超时时间(毫秒)
REDIS_READ_TIMEOUT=10000
# Redis写入超时时间(毫秒)
REDIS_WRITE_TIMEOUT=10000

# ==========================================
# 应用配置
# ==========================================

# 时区设置
TZ=Asia/Shanghai
# 工作池大小(并发处理任务的goroutine数量)
WORKER_POOL_SIZE=500
# 工作池最大任务队列长度
MAX_WORKER_TASK_LEN=1000
# Web域名(设置为localhost:1238表示使用本地服务器,留空则不上报状态)
WEB_DOMAIN=localhost:1238
# Web任务名称
WEB_TASK_NAME=
# Web任务应用编号
WEB_TASK_APP_NUMBER=
# 是否按微信ID同步消息
NEWS_SYN_WXID=true
# 是否启用DT
DT=true

# ==========================================
# 消息队列配置
# ==========================================

# 消息主题
TOPIC=wx_sync_msg_topic
# 是否启用RocketMQ
ROCKET_MQ_ENABLED=false
# RocketMQ服务器地址
ROCKET_MQ_HOST=
# RocketMQ访问密钥
ROCKET_ACCESS_KEY=123
# RocketMQ密钥
ROCKET_SECRET_KEY=123!#@13$
# 是否启用RabbitMQ
RABBIT_MQ_ENABLED=false
# RabbitMQ连接URL(格式:amqp://用户名:密码@主机:端口/,例如:amqp://yunkong:123456@127.0.0.1:5672/)
RABBIT_MQ_URL=
# 是否启用Kafka
KAFKA_ENABLED=false
# Kafka服务器地址列表
KAFKA_URL=
# Kafka用户名
KAFKA_USERNAME=
# Kafka密码
KAFKA_PASSWORD=

# ==========================================
# 任务配置
# ==========================================

# 任务重试次数
TASK_RETRY_COUNT=3
# 任务重试间隔(秒)
TASK_RETRY_INTERVAL=5
# 心跳包间隔(秒)
HEARTBEAT_INTERVAL=25
# 自动认证间隔(分钟)
AUTO_AUTH_INTERVAL=30
# 自动同步间隔(分钟)
AUTO_SYNC_INTERVAL_MINUTES=30
# 任务执行等待时间(毫秒)
TASK_EXEC_WAIT_TIMES=500
# 队列过期时间(秒)
QUEUE_EXPIRE_TIME=86400

# ==========================================
# WebSocket配置
# ==========================================

# WebSocket握手超时时间(秒)
WS_HANDSHAKE_TIMEOUT=10
# WebSocket读缓冲区大小(字节)
WS_READ_BUFFER_SIZE=4096
# WebSocket写缓冲区大小(字节)
WS_WRITE_BUFFER_SIZE=4096
# WebSocket读取超时时间(秒)
WS_READ_DEADLINE=120
# WebSocket写入超时时间(秒)
WS_WRITE_DEADLINE=60
# WebSocket心跳间隔(秒)
WS_PING_INTERVAL=25
# WebSocket连接检查间隔(秒)
WS_CONNECTION_CHECK_INTERVAL=45
# WebSocket最大消息大小(字节)
WS_MAX_MESSAGE_SIZE=8192

# ==========================================
# 集群配置
# ==========================================

# 集群名称
CLUSTER_NAME=
# ZooKeeper地址
ZK_ADDR=
# ETCD地址
ETCD_ADDR=

# ==========================================
# 禁用命令配置
# ==========================================

# 禁用命令列表(逗号分隔)
DISABLED_CMD_LIST=

然后保存好,跟docker-compose.yml要在同一个路径下。

步骤4-运行docker compose编排,创建容器并且观察容器日志是否正常

1.利用1panel创建的编排,设置编辑好docker-compose.yml的内容后,就会开始运行了。

2.或者在终端输入

cd /opt/1panel/docker/compose/astrbot_all      #先进入到我们创建的这个astrbot_all的文件夹内,这也是刚刚编辑好的docker-compose.yml文件所在位置
docker compose up -d                           #根据这个编排文件进行容器创建,其中-d是为了不在终端直接显示容器日志

3.容器全部创建好之后,应该有5个:

4.检查关键容器日志和容器状态

as_wechatpadpro容器日志:

astrbot容器日志:

as_napcat容器日志:

这3个容器日志检查都没问题,安装部分就大功告成。接下来是配置。

步骤5-astrbot+napcat配置QQ

在浏览器打开astrbot的web端后台,登录初始用户名和密码都是astrbot(登陆后会强制你改密码,然后重新用新账号密码登录即可)

登录地址:localhost:6185,如果你是在另一台局域网中的电脑浏览器打开,那么就是你的服务器内网ip:6185的形式,

比如我打开就是用192.168.5.122:6185 ,登录进入后看图配置即可:

astrbot容器日志出现aiocqhttp适配器已连接就ok了

接下来就登录napcat的web控制后台,扫码登录QQ即可

步骤6-astrbot+wechatpadpro配置微信

在浏览器打开astrbot的web端后台,登录初始token是napcat(登陆后会提示你改token,然后重新用新账号密码登录即可)

来到消息平台适配器-新增适配器

选择WeChatPadPro

保存即可

查看astrbot容器日志,这样的状态,就是随时可以微信扫码登录了

如果登录时间超过180秒,就在astrbot的web管理后台,消息平台开关一下即可。

扫码登录成功后,astrbot容器日志会提示

扫码成功后,wechatpadpro容器日志会提示