本文属于「自托管 Docker 部署实战」系列(共 35 篇),第 17 篇。 示例中的 IP(192.0.2.10)、域名(example.com)、密码均为占位符,请按实际环境替换。

它是什么

Message-Nest 是一个「聚合推送」服务:把服务器上的事件按渠道(邮件、Webhook、聊天机器人等)分发出去,并保留发送记录。它没有公开镜像,需要自己编译成单二进制后打进镜像运行。

如果你只需要最简单的手机推送,用 PushMe 更省事;需要多渠道路由、失败重试、发送历史时再上 Message-Nest。

镜像地址

message-nest-dev:latest      # 自建镜像,无公开仓库

构建产物名与目录结构以你的仓库为准,下文假设二进制为 /app/Message-Nest。

前置条件

  • 一台 Linux 服务器(1C1G 足够,取决于并发推送量);
  • 已安装 Docker 与 Compose v2;
  • 已按项目文档编译出可执行文件(Go 项目通常是 go build -o Message-Nest ./...)。
# 安装 Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh

# 目录约定
mkdir -p /srv/docker/active/message-nest/app && cd /srv/docker/active/message-nest

构建镜像

# Dockerfile
FROM debian:12-slim
WORKDIR /app
COPY Message-Nest /app/Message-Nest
COPY config/ /app/config/
RUN chmod +x /app/Message-Nest
CMD ["/app/Message-Nest"]
# 把编译好的二进制和配置放进 app/
cp /path/to/Message-Nest ./app/
cp -r /path/to/config ./app/config/

docker build -t message-nest-dev:latest .

部署步骤

# docker-compose.yml
services:
  message-nest:
    image: message-nest-dev:latest
    container_name: message-nest
    restart: always
    network_mode: host        # 方便直接监听端口,也可改 bridge + ports
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./app:/app
    working_dir: /app
    command: ["/app/Message-Nest"]
docker compose up -d
docker compose logs -f --tail=100

关键配置

项 说明
network_mode: host 服务直接监听宿主机端口;改 bridge 时记得补 ports:
./app:/app 二进制、配置、SQLite/日志都在这里,唯一需要备份的目录
command 入口必须指向你的二进制路径
TZ 推送记录时间依赖它

注意事项

  • 自建镜像没有版本号,升级 = 替换二进制 + 重启,回滚就是把旧二进制拷回去;
  • 如果用 host 网络,注意端口别和宿主机已有服务冲突,先 ss -lntp | grep <端口>;
  • 配置文件里通常有各渠道的 Token/Webhook 密钥,.env 权限设 600,不要进 Git;
  • 推送渠道要能出网,服务器 DNS/代理异常时会出现「发送成功但没收到」;
  • 发送失败重试会产生重复消息,渠道侧做好去重。

备份与升级

# 备份(二进制 + 配置 + 数据)
tar czf "backup-$(date +%F).tar.gz" ./app

# 升级:替换二进制后重启
docker compose restart message-nest
docker compose logs --tail=100

# 回滚:拷回旧二进制,再 restart
  • 保留最近 1-2 个旧二进制,出问题能立刻切回;
  • 定期清理发送历史表,避免 SQLite 无限增长。