演示

Deployment

用 ./install.sh 准备主机,用 Docker Compose 运行 Quan ERP 基础栈,按 build → available → installed 发布插件,并为预发 / 生产做好加固。

概述

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 组生效
SHTerminal
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 stop

2. 基础栈(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/* 版本一致
  • 模板密钥仅用于本地/开发 — 共享环境前务必更换
SHLocal template
cd base docker compose up -d docker compose ps
SHServer (via install script)
cd installation ./install.sh start ./install.sh stop

2b. 示例 docker-compose.yaml

复制下方本地/开发模板,替换所有 change-me,将 VITE_BACKEND_API 设为浏览器可达地址。Backend 直连 db:5432。

  • DATABASE_HOST / DB_HOST=db,DB_PORT=5432 — 本模板无连接池中间件
  • OPENAI_* / FIREBASE_CONFIG — 仅在需要时配置;切勿提交私钥
YAMLdocker-compose.yaml
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: bridge

3. 服务与端口

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/生产这样做
TSBuild & stage
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-archives

5. 版本对齐

保持 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
  • 回滚:保留旧插件版本目录与镜像标签
YAMLUseful compose commands
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 日志与复现步骤
  • 简单指引可能免费;动手搭建、生产加固或定制运维可能收费
  • 开始收费工作前会先明确免费或付费