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

它是什么

MagicPush 是一套前后端分离的消息推送平台:server 提供 API 与推送通道,web 是管理界面。它的定位比「单机推送」重一些,适合给多个项目共用一套推送入口:创建应用、生成密钥、查看发送记录。

提供的 Compose 里两个服务都从源码构建,没有官方镜像。

镜像地址

无公开镜像:由 server/ 与 web/ 两个目录分别 docker build 生成

前置条件

  • 一台 Linux 服务器(1C2G 起);
  • 已安装 Docker 与 Compose v2;
  • 已拉取项目源码(包含 server/、web/、docker-compose.yml)。
# 安装 Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh

# 目录约定
git clone <项目地址> /srv/docker/active/magicpush
cd /srv/docker/active/magicpush

部署步骤

# docker-compose.yml
services:
  server:
    build:
      context: ./server
      dockerfile: Dockerfile
    container_name: magicpush-server
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - server-data:/app/server/data   # SQLite 数据库
      - server-logs:/app/server/logs   # 日志
    environment:
      - NODE_ENV=production
      - JWT_ACCESS_EXPIRES_IN=15m
      - JWT_REFRESH_EXPIRES_IN=7d
      - TZ=Asia/Shanghai
    networks:
      - magicpush-network

  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: magicpush-web
    restart: unless-stopped
    ports:
      - "8080:80"
    depends_on:
      - server
    networks:
      - magicpush-network

networks:
  magicpush-network:
    driver: bridge

volumes:
  server-data:
  server-logs:
docker compose up -d --build
docker compose ps

打开 http://<SERVER_IP>:8080 进入管理界面;API 在 http://<SERVER_IP>:3000。

关键配置

项 说明
3000 后端 API 端口,客户端/脚本推送到这里
8080:80 Web 管理界面(容器内 80)
server-data 卷 SQLite 数据库,必须持久化
server-logs 卷 日志卷,注意磁盘增长
JWT_* Token 有效期,按安全要求调整

注意事项

  • 前后端两个容器在同一个自定义网络里,Web 通过服务名访问后端;
  • 正式环境把 NODE_ENV 固定为 production,不要用开发模式跑;
  • 后端密钥(JWT Secret)务必换成随机值并放进 .env;
  • Web 端如果配了 API 地址,注意要写浏览器能访问到的地址,不是容器内部地址;
  • 每次升级都要 --build,否则用的还是旧镜像。

备份与升级

# 备份数据库与日志卷
docker run --rm -v magicpush_server-data:/data -v "$PWD":/backup alpine \
  tar czf /backup/magicpush-data-$(date +%F).tar.gz -C /data .

# 升级:拉代码 → 重新构建 → 起新容器
git pull
docker compose up -d --build

# 回滚:git checkout 旧版本后重新 build
  • 有状态服务(SQLite)升级前必须备份;
  • 保留 1-2 个旧版本代码目录,回滚更快。