MagicPush:Docker 部署前后端分离的推送平台
本文属于「自托管 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 个旧版本代码目录,回滚更快。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果