概述
Quark ERP / Quan ERP 以基础栈加版本化插件方式部署。新服务器上先用 ./install.sh 安装 Docker / Nginx 并启动 compose。
- installation/ — ./install.sh(install | start | stop)
- docker-compose.yaml — 平台服务
- quan-erp CLI → available-plugins/
- UI 安装 → installed-plugins/
- 切勿在 UAT / 生产对 module 表做 SQL seed
1. 主机引导(./install.sh)
在 installation/ 下以普通用户运行(不要用 root)。install 安装 Docker、Compose 插件与 Nginx;start / stop 启停 compose 服务。
- 命令:install | start | stop(见 ./install.sh --help)
- 不要用 root 运行 — 仅在需要时使用 sudo
- install — 在 Ubuntu/Debian 或 RHEL 系安装 Docker + Compose + Nginx
- start — docker compose up -d
- stop — docker compose stop
- 支持系统:Ubuntu、Debian、RHEL、CentOS、Fedora、Rocky、AlmaLinux
- install 后可能需要重新登录以使 docker 组生效
1cd installation
2chmod +x ./install.sh # or ./installation.sh
3
4# One-time host setup (Docker + Compose + Nginx)
5./install.sh install
6
7# Start compose services
8./install.sh start
9
10# Stop compose services
11./install.sh stop2. 基础栈(Docker Compose)
本地模板用 cd base && docker compose up -d;服务器优先用 ./install.sh start。服务:db、redis、backend、frontend(app-network)。
- 容器内主机名是服务名(db、redis),不要用 localhost
- 常见卷:./data、./available-plugins、./backend/installed-plugins、./backend/logs
- BASE_VERSION / 镜像标签需与插件 @quan-erp/* 版本一致
- 模板密钥仅用于本地/开发 — 共享环境前务必更换
cd base
docker compose up -d
docker compose pscd installation
./install.sh start
./install.sh stop2b. 示例 docker-compose.yaml
复制下方本地/开发模板,替换所有 change-me,将 VITE_BACKEND_API 设为浏览器可达地址。Backend 直连 db:5432。
- DATABASE_HOST / DB_HOST=db,DB_PORT=5432 — 本模板无连接池中间件
- OPENAI_* / FIREBASE_CONFIG — 仅在需要时配置;切勿提交私钥
1services:
2 db:
3 image: postgres:17
4 container_name: postgres
5 restart: always
6 environment:
7 POSTGRES_USER: postgres
8 POSTGRES_PASSWORD: change-me
9 POSTGRES_DB: quan-erp
10 ports:
11 - "5432:5432"
12 volumes:
13 - ./data/db-data:/var/lib/postgresql/data
14 networks:
15 - app-network
16
17 redis:
18 image: redis:7
19 container_name: quanerp-redis
20 restart: unless-stopped
21 ports:
22 - "6379:6379"
23 command: >
24 redis-server
25 --requirepass "change-me"
26 --appendonly yes
27 volumes:
28 - ./data/redis:/data
29 networks:
30 - app-network
31 healthcheck:
32 test: ["CMD", "redis-cli", "ping", "-a", "change-me"]
33 interval: 5s
34 timeout: 2s
35 retries: 5
36
37 backend:
38 build:
39 context: ./backend
40 dockerfile: Dockerfile
41 image: theparadance/quan-erp-base-backend:1.0.0
42 restart: unless-stopped
43 platform: linux/amd64
44 container_name: backend
45 ports:
46 - "8080:8080"
47 - "8081:8081"
48 environment:
49 NODE_ENV: production
50 MODE: dev
51 BASE_VERSION: 1.0.0
52 ORGANIZATION_ID: quan-erp
53
54 FRONTEND_URL: http://localhost
55 BACKEND_URL: http://localhost:8080
56 DEV_TOOL_URL: http://localhost:8081
57 PLUGIN_SERVER_URL: http://localhost:8082
58
59 ACCESS_TOKEN_SECRET: change-me
60 ACCESS_TOKEN_SECRET_EXPIRATION_TIME: 15m
61 REFRESH_TOKEN_SECRET: change-me
62 REFRESH_TOKEN_SECRET_EXPIRATION_TIME: 30d
63
64 DATABASE_HOST: db
65 DB_HOST: db
66 DB_USERNAME: postgres
67 DB_PASSWORD: change-me
68 DB_PORT: 5432
69 DB_SCHEMA: quan-erp
70 DB_SYNC: true
71
72 REDIS_HOST: redis
73 REDIS_PORT: 6379
74 REDIS_PASSWORD: change-me
75
76 CLUSTER_MODE: false
77 CLUSTER_MAX_COUNT: 2
78 ENV_ENCRYPTION_KEY: change-me-32-char-hex-or-secret
79 FIREBASE_CONFIG: ''
80
81 OPENAI_BASE_URL: https://api.deepseek.com
82 OPENAI_API_KEY: <sk-key>
83
84 CORS_ALLOWED_ORIGINS: http://localhost:3000,http://127.0.0.1:3000,http://localhost,https://localhost
85
86 AVAILABLE_PLUGINS_FOLDER: /app/available-plugins
87 INSTALLED_PLUGINS_FOLDER: /app/installed-plugins
88 APP_DATA_FOLDER: /app/data/data/
89 UPLOAD_FILE_TEMP_FOLDER: /app/data/temp
90 UPLOAD_FILE_FOLDER: /app/data/data/
91 PLUGINS_ENV_FILE: /app/data/data/plugin.env.json
92 RUNNER_FLOW_FILE: /app/data/data/workflows/
93
94 ROOT_ADMIN_USERNAME: admin
95 ROOT_ADMIN_PASSWORD: change-me
96 DEVELOPER_CONFIG_PASSWORD: change-me
97
98 MAX_USER_LIMIT: 5
99 MAX_ACTIVE_USER_LIMIT: 5
100 MAX_USER_SESSION_LIMIT_PER_USER: 1
101 MAX_ORGANIZATION_BRANCH: 1
102 MAX_ROLE_LIMIT: 5
103 MAX_SUBSCRIPTION_GRACE_PERIOD_DAYS: 14
104 SUBSCRIPTION_END_DATE: '2099-01-01'
105 volumes:
106 - ./backend/installed-plugins:/app/installed-plugins
107 - ./data:/app/data
108 - ./backend/logs:/app/logs
109 - ./available-plugins:/app/available-plugins
110 depends_on:
111 - db
112 - redis
113 networks:
114 - app-network
115 dns:
116 - 1.1.1.1
117 - 8.8.8.8
118
119 frontend:
120 build:
121 context: ./frontend
122 dockerfile: Dockerfile
123 image: theparadance/quan-erp-base-frontend:1.0.0
124 restart: unless-stopped
125 platform: linux/amd64
126 container_name: frontend
127 environment:
128 VITE_BACKEND_API: http://localhost:8080
129 VITE_MODE: dev
130 ports:
131 - "80:80"
132 volumes:
133 - ./data/frontend/web-env.json:/usr/share/nginx/html/web-env.json
134 networks:
135 - app-network
136
137networks:
138 app-network:
139 driver: bridge3. 服务与端口
db:5432(DB_HOST)、redis:6379、backend:8080/8081、frontend:80、主机 Nginx。生产勿对外暴露 db/redis。
- db (postgres:17) — 5432;DB_HOST=db、DB_PORT=5432;schema quan-erp;./data/db-data
- redis — 6379;REDIS_HOST=redis + REDIS_PASSWORD;./data/redis
- backend — :8080 / :8081;挂载 plugins、data、logs
- frontend — :80;VITE_BACKEND_API 必须浏览器可达
- 主机 Nginx — ./install.sh install 用于 TLS / 反向代理
4. 部署插件
使用 quan-erp build:prod|watch|pack:prod 暂存,再在 ERP UI 中安装。
- 构建产物 → available-plugins/<name>/<version>/
- UI 安装后 → installed-plugins/<name>/
- 后端加载 installed=true 的模块
- 前端加载 module.js 并调用 register(AppRegistry)
- 仅本地/开发可插入 module 行 — 切勿在 UAT/生产这样做
1# From repo root
2quan-erp build:prod sample-es
3# Continuous during development
4quan-erp watch sample-es
5
6# Distributable zip (frontend + backend + metadata)
7quan-erp pack:prod sample-es
8quan-erp pack:prod sample-es ./dist-archives5. 版本对齐
保持 base 镜像标签与插件 @quan-erp/* 版本一致。
- 插件 package.json 中的 @quan-erp/* 需与 base 镜像同版本
- compose 镜像标签与 BASE_VERSION 保持同步
- module.metadata.json 的 pluginVersion / requiredBasedVersion 需匹配
- 升级 base 后,用对应 @quan-erp/* 重建插件
6. 环境配置
DB_* 指向 db:5432,配置 REDIS_*、令牌、CORS、URL,并用卷持久化插件与数据目录。生产使用 migrations。
- DB_* / DATABASE_HOST — 示例栈用 db:5432;DB_SCHEMA 对应 POSTGRES_DB
- REDIS_* — 必须匹配 redis 的 requirepass
- ACCESS_TOKEN_* / REFRESH_TOKEN_* / ENV_ENCRYPTION_KEY — 勿用模板值
- CORS_ALLOWED_ORIGINS — 填入浏览器来源
- FRONTEND_URL / BACKEND_URL / VITE_BACKEND_API — 可达 URL
- 插件 / 数据目录路径 — 用卷持久化
- BASE_VERSION + 镜像标签 — 与插件版本对齐
- DB_SYNC — 仅本地/开发;预发/生产用 migrations
- MODE — 模板多为 dev;生产使用生产模式
7. 预发与生产清单
先运行 ./install.sh install,更换默认密钥,勿暴露 db/redis,用 Nginx 做 TLS,勿把 Firebase / npm 密钥提交进 git,禁止生产 seed。
- 首次启动前运行 ./install.sh install
- 更换 Postgres / Redis / ROOT_ADMIN_* / 令牌与加密密钥
- 勿公开 Postgres / Redis 端口;用 Nginx 终止 TLS
- 持久化并备份 ./data、plugins、logs
- 上线前关闭 DB_SYNC=true、过宽 CORS、示例密钥
- 通过 UI 安装插件 — 生产禁止 SQL seed
- 用 migrations 管理 schema,勿依赖 synchronize
- FRONTEND_URL / BACKEND_URL / VITE_BACKEND_API 需匹配公网主机名
- 升级前对齐 base 与 @quan-erp/* 版本
- 切勿把 FIREBASE / npm 密钥提交进 git
8. 日常运维
使用 ./install.sh start|stop,并规划 base / 插件升级、日志、备份与回滚。
- 启停:cd installation && ./install.sh start|stop
- 升级 base:换新镜像标签后重建容器
- 升级插件:quan-erp build:prod|pack:prod → available-plugins → UI 安装
- 健康检查:docker compose ps;查看 backend 日志
- 数据:备份 Postgres 卷与 APP_DATA_FOLDER
- 回滚:保留旧插件版本目录与镜像标签
1cd installation # or cd base for the Node template
2docker compose logs -f backend
3docker compose restart backend frontend
4docker compose down
5./install.sh start排查
- install 失败 — OS / sudo / Docker 源
- docker 权限 — 重新登录以生效 docker 组
- start 失败 — 检查 POSTGRES_* / REDIS_* / 镜像标签
- 连不上 DB — DB_HOST=db、DB_PORT=5432
- 前端调不通 API — VITE_BACKEND_API 需为浏览器可达地址
- UI 无插件 — available-plugins / 版本 / 本地 module 行
- 页面空白 — 重建前端并重新安装
- CORS / 认证失败 — FRONTEND_URL 与 origins
- 版本错误 — base 与 @quan-erp/* 不一致
部署遇到问题?
若在部署 Quark ERP 时遇到困难,可向 The Paradance 寻求支持。根据具体情况,协助可能免费,也可能另行收费——取决于工作范围、紧急程度与环境。
- 请提供 BASE_VERSION / 镜像标签、操作系统、compose 日志与复现步骤
- 简单指引可能免费;动手搭建、生产加固或定制运维可能收费
- 开始收费工作前会先明确免费或付费