概述
将 base/backend/.env.sample 复制为 .env(或在 Compose 中设置相同键)。插件级运行时键见 PluginEnv。切勿将真实密钥提交到 git。
| 主题 | 说明 |
|---|---|
| File | base/backend/.env(模板:base/backend/.env.sample) |
| Compose | 也可在 Compose backend service environment 中设置 |
| PluginEnv | 插件级可编辑键 — 与本页不同 |
| Secrets | 示例值仅用于本地 / 开发,上线前务必轮换 |
运行时与标识
| Variable | 说明 | Example |
|---|---|---|
| NODE_ENV | Node runtime mode | production |
| MODE | App mode (template often uses dev) | dev |
| BASE_VERSION | Base platform version — keep aligned with @quan-erp/* and image tags | 1.0.0 |
| ORGANIZATION_ID | Organization identifier for this deployment | quan-erp |
| DEBUG_LOG | Optional debug scope | plugin-manager |
服务 URL
| Variable | 说明 | Example |
|---|---|---|
| FRONTEND_URL | Public frontend origin | http://localhost |
| BACKEND_URL | Backend API base | http://localhost:8080 |
| DEV_TOOL_URL | Base dev tools | http://localhost:8081 |
| PLUGIN_SERVER_URL | Plugin server | http://localhost:8082 |
| CORS_ALLOWED_ORIGINS | Comma-separated browser origins allowed to call the API | http://localhost:3000,... |
认证令牌
在共享或生产环境部署前,请轮换所有 token 密钥。
| Variable | 说明 | Example |
|---|---|---|
| ACCESS_TOKEN_SECRET | JWT access-token signing secret | change-me |
| ACCESS_TOKEN_SECRET_EXPIRATION_TIME | Access token TTL | 15m |
| REFRESH_TOKEN_SECRET | JWT refresh-token signing secret | change-me |
| REFRESH_TOKEN_SECRET_EXPIRATION_TIME | Refresh token TTL | 30d |
OpenAI 兼容 AI
| Variable | 说明 | Example |
|---|---|---|
| OPENAI_BASE_URL | API base URL | https://api.deepseek.com |
| OPENAI_API_KEY | Provider API key (leave empty if unused) | — |
数据库
在 Compose 内主机名通常是服务名(pgbouncer / db)。经 PgBouncer 时 DB_PORT 多为 6432。
| Variable | 说明 | Example |
|---|---|---|
| DATABASE_HOST | Postgres or PgBouncer host (alias used by some entrypoints) | pgbouncer |
| DB_HOST | Postgres or PgBouncer host | pgbouncer |
| DB_PORT | Database port (6432 via PgBouncer, 5432 direct) | 6432 |
| DB_USERNAME | Database username | postgres |
| DB_PASSWORD | Database password | change-me |
| DB_SCHEMA | Schema name | quan-erp |
| DB_SYNC | TypeORM synchronize — local/dev only; use migrations in staging/production | true |
Redis
| Variable | 说明 | Example |
|---|---|---|
| REDIS_HOST | Redis service name | redis |
| REDIS_PORT | Redis port | 6379 |
| REDIS_PASSWORD | Redis auth password | change-me |
集群
| Variable | 说明 | Example |
|---|---|---|
| CLUSTER_MODE | Enable multi-process cluster | false |
| CLUSTER_MAX_COUNT | Max worker processes when cluster is on | 2 |
加密与 Firebase
不要把生产私钥贴进 git、Doc 或聊天 — 只从密钥库或本地 .env 加载。
| Variable | 说明 | Example |
|---|---|---|
| ENV_ENCRYPTION_KEY | Key used to encrypt sensitive env values at rest | change-me-… |
| FIREBASE_CONFIG | Single-line JSON string for the Firebase Admin service account (push / auth) | {"type":"service_account",…} |
目录与文件
| Variable | 说明 | Example |
|---|---|---|
| AVAILABLE_PLUGINS_FOLDER | Staged plugin builds | /app/available-plugins |
| INSTALLED_PLUGINS_FOLDER | Active installed plugins | /app/installed-plugins |
| APP_DATA_FOLDER | Persistent app data root | /app/data/data/ |
| UPLOAD_FILE_TEMP_FOLDER | Temporary upload staging | /app/data/temp |
| UPLOAD_FILE_FOLDER | Persisted uploads | /app/data/data/ |
| PLUGINS_ENV_FILE | Plugin env JSON file path | /app/data/data/plugin.env.json |
| RUNNER_FLOW_FILE | Workflow definitions directory | /app/data/data/workflows/ |
管理员、限额与订阅
| Variable | 说明 | Example |
|---|---|---|
| ROOT_ADMIN_USERNAME | Bootstrap root admin username | admin |
| ROOT_ADMIN_PASSWORD | Bootstrap root admin password — change outside local template | change-me |
| MAX_USER_LIMIT | Max users for the org | 5 |
| MAX_ACTIVE_USER_LIMIT | Max concurrently active users | 5 |
| MAX_USER_SESSION_LIMIT_PER_USER | Sessions per user | 1 |
| MAX_ORGANIZATION_BRANCH | Max branches | 1 |
| MAX_ROLE_LIMIT | Max roles | 5 |
| MAX_SUBSCRIPTION_GRACE_PERIOD_DAYS | Grace days after subscription end | 14 |
| DEVELOPER_CONFIG_PASSWORD | Password gate for developer config UI / APIs | change-me |
| SUBSCRIPTION_END_DATE | Subscription end date | 2026-01-01 |
示例(.env.sample 结构)
与 base/backend/.env.sample 结构一致。请替换所有 change-me。下列密钥仅为占位符。
TSbase/backend/.env
1NODE_ENV=production
2
3MODE=dev
4BASE_VERSION=1.0.0
5ORGANIZATION_ID=quan-erp
6
7FRONTEND_URL=http://localhost
8BACKEND_URL=http://localhost:8080
9DEV_TOOL_URL=http://localhost:8081
10PLUGIN_SERVER_URL=http://localhost:8082
11
12DEBUG_LOG=plugin-manager
13
14ACCESS_TOKEN_SECRET=change-me
15ACCESS_TOKEN_SECRET_EXPIRATION_TIME=15m
16REFRESH_TOKEN_SECRET=change-me
17REFRESH_TOKEN_SECRET_EXPIRATION_TIME=30d
18
19OPENAI_BASE_URL=https://api.deepseek.com
20OPENAI_API_KEY=
21
22# database
23DATABASE_HOST=pgbouncer
24DB_HOST=pgbouncer
25DB_USERNAME=postgres
26DB_PASSWORD=change-me
27DB_PORT=6432
28DB_SCHEMA=quan-erp
29DB_SYNC=true
30
31# redis
32REDIS_HOST=redis
33REDIS_PORT=6379
34REDIS_PASSWORD=change-me
35
36CLUSTER_MODE=false
37CLUSTER_MAX_COUNT=2
38
39ENV_ENCRYPTION_KEY=change-me-32-char-hex-or-secret
40
41CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost,https://localhost
42
43AVAILABLE_PLUGINS_FOLDER=/app/available-plugins
44INSTALLED_PLUGINS_FOLDER=/app/installed-plugins
45
46APP_DATA_FOLDER=/app/data/data/
47UPLOAD_FILE_TEMP_FOLDER=/app/data/temp
48UPLOAD_FILE_FOLDER=/app/data/data/
49PLUGINS_ENV_FILE=/app/data/data/plugin.env.json
50RUNNER_FLOW_FILE=/app/data/data/workflows/
51
52FIREBASE_CONFIG={"type":"service_account","project_id":"your-project",...}
53
54ROOT_ADMIN_USERNAME=admin
55ROOT_ADMIN_PASSWORD=change-me
56
57MAX_USER_LIMIT=5
58MAX_ACTIVE_USER_LIMIT=5
59MAX_USER_SESSION_LIMIT_PER_USER=1
60MAX_ORGANIZATION_BRANCH=1
61MAX_ROLE_LIMIT=5
62MAX_SUBSCRIPTION_GRACE_PERIOD_DAYS=14
63DEVELOPER_CONFIG_PASSWORD=change-me
64SUBSCRIPTION_END_DATE=2026-01-01关键规则
| 规则 | 说明 |
|---|---|
| Start from sample | 从 .env.sample 起步 |
| No secrets in git | 不要提交真实 .env 或 Firebase 私钥 |
| Version alignment | BASE_VERSION 与镜像 / @quan-erp/* 对齐 |
| Production harden | 上线前关闭 DB_SYNC 并轮换密钥 |
| Two layers | 插件配置 → PluginEnv;主机基础设施 → 本文件 |