--- title: 环境变量详解 --- # 环境变量详解 IoT DC3 有两套环境变量文件,读取者完全不同:根目录 `.env` 给 Docker Compose 做插值,`dc3/env/dev.env(.sh)` 给本地 Java 进程。读完这页,你能分清哪个变量该写进哪个文件、`localhost` 端口与容器内端口为何不一样,以及生产前必须改掉的两个密钥默认值。 > 你在这里:已经[从源码本地开发](./)或用 Compose 起栈。下一步看[部署模式与镜像源](../guide/usage)了解整套栈如何拉起。 ## 为什么有两套文件 同一个变量名(如 `POSTGRES_HOST`),在容器里和在你笔记本上的 Java 进程里,含义不一样。容器之间靠 Compose 网络上的服务名( `dc3-postgres`)互访;而你本地 IDE 里跑的 Java 进程在宿主机上,只能通过 Compose **发布到宿主机的端口**(如 `localhost:35432` )连进去。两套文件就是为这两条互不重叠的路径准备的——混用会让本地进程去连一个解析不了的容器名,或让容器去连一个它根本看不到的 `localhost`。 | 文件 | 读取者 | 用途 | 注入方式 | |----------------------|-------------------|-----------------------------------------|------------------| | `.env.example` | Docker Compose 模板 | 复制为根目录 `.env`,定义镜像仓库、镜像标签、发布端口 | Compose 变量插值 | | `.env` | Docker Compose | 本机未跟踪配置,供 `dc3/docker-compose*.yml` 插值 | Compose 变量插值 | | `dc3/env/dev.env` | IDE(EnvFile 插件) | 本地 Java 进程环境变量,**不带** `export` | IDE EnvFile 插件读取 | | `dc3/env/dev.env.sh` | Shell | 本地 Java 进程环境变量,带 `export`,用 `source` 加载 | Shell 环境注入 | ::: warning 根 `.env` 不会注入本地 Java 进程 根目录 `.env` 只服务 Docker Compose,**不会**自动注入到本地 IDE/命令行启动的 Java 进程。本地源码运行必须用 `dc3/env/dev.env(.sh)`,让进程指向 Compose 发布在 `localhost` 上的依赖端口。在根 `.env` 里写 `POSTGRES_HOST=localhost` 也不会改变任何容器的运行时环境。 ::: ## 两条互不注入的路径 下图说明两套文件如何沿各自路径生效。关键是这两条路径**互不交叉**:Compose 不读 `dev.env.sh`,本地 Java 进程也不自动读根 `.env`。 ```mermaid flowchart LR subgraph Compose路径["Compose 路径"] Env[".env (根目录)"] -->|"Compose 插值"| Yml["docker-compose*.yml"] Yml -->|"environment / env_file"| Ctn["容器进程
看到 dc3-postgres:5432"] end subgraph 本地路径["本地源码路径"] Sh["dc3/env/dev.env.sh"] -->|"source (导出)"| Proc["本地 Java 进程
看到 localhost:35432"] DevEnv["dc3/env/dev.env"] -->|"IDE EnvFile 插件"| Proc end Field["host 端口 35432/35672/31883"] -.->|"宿主机发布"| Proc Ctn -.->|"内部端口 5432/5672/1883"| Field ``` host 端口与 internal 端口的对应关系,是理解这张图的核心: | 依赖 | host(本地进程用) | internal(容器互访用) | |---------------|-------------------|----------------------| | PostgreSQL | `localhost:35432` | `dc3-postgres:5432` | | RabbitMQ AMQP | `localhost:35672` | `dc3-rabbitmq:5672` | | EMQX MQTT | `localhost:31883` | `dc3-emqx:1883`(约定值) | ## 怎么用 ### Compose 起栈 先从模板创建本地 `.env`,再用 `make`(底层是 `podman compose`)拉起: ::: code-group ```bash [make] cp .env.example .env make up-db && make up-optional && make up-dev ``` ```bash [podman compose] cp .env.example .env podman compose -f dc3/docker-compose-dev.yml config --quiet ``` ::: 根 `.env` 的变量用于 compose 文件插值,例如镜像与发布端口: ```yaml image: ${DC3_IMAGE_REGISTRY:-pnoker}/dc3-gateway:${DC3_IMAGE_TAG:-2026.6} ports: - "${DC3_BIND_HOST:-127.0.0.1}:${DC3_GATEWAY_PORT:-8000}:8000" ``` Compose 不会把 `.env` 里每个变量都注入每个容器——只有 compose 文件通过 `environment`、`env_file` 显式引用的变量才会进入容器。 ### 本地源码运行 从命令行启动 Java 进程前先 `source`: ```bash source dc3/env/dev.env.sh ``` 不加载时,本地进程会回退到容器内服务名(`dc3-postgres`、`dc3-rabbitmq`、`dc3-center-manager`)或默认端口,从而连不上本机依赖。JetBrains IDEA 用户改用 `dc3/env/dev.env`(同样内容、无 `export`):安装 EnvFile 插件 → 在 Run Configuration 启用 EnvFile → 添加 `dc3/env/dev.env`。不要把 `.env.example` 直接当作 IDEA 环境变量文件——它是 Compose 模板,不是 Java 运行时配置。 ## 按场景分组的关键变量 下面按"为某个场景实际需要"的角度分组列出关键变量。完整长表在文末 `::: details` 折叠,这里只列你会真正改动或排错时查的那些。变量的 `Scope` 三类含义:`Runtime`(本地或容器内 Java 进程都读)、`Compose only`(仅根 `.env` 给 Compose)、`Per-process`(单服务覆盖)。 ### 安全密钥(Runtime) 两个密钥是平台的身份根。它们自带默认值仅为方便首次启动,绝不可带进生产。 | 变量 | 默认值 | 用途 | |--------------------|------------------------------------------|-----------------------------------------------------| | `DC3_SECURITY_KEY` | `dc3.security.key.2026.io.github.pnoker` | 鉴权中心生成/校验登录 Token 的签名密钥 | | `AUTH_HMAC_SECRET` | `io.github.pnoker.dc3` | Gateway 向后端服务签名 `X-Auth-Principal` 的 HMAC-SHA256 密钥 | ::: danger 生产必须改成强随机值,且切勿提交/打印 `DC3_SECURITY_KEY` 与 `AUTH_HMAC_SECRET` 自带默认值,生产环境必须改成强随机值,切勿提交进仓库、写入日志或打印真实密钥。当 Spring profile 为 `pre`/`pro` 且 `AUTH_HMAC_SECRET` 为空或仍等于默认值 `io.github.pnoker.dc3` 时,服务会 fail-fast 抛 `IllegalStateException` 拒绝启动——这是有意为之的安全闸门,不要绕过。 ::: ### PostgreSQL(Runtime) 本地进程连 `localhost:35432`;容器内连 `dc3-postgres:5432`。`POSTGRES_SCHEMA` 只在单服务进程里做 schema 覆盖(如 `dc3_manager`、`dc3_data`),不要全局设。 | 变量 | 默认值 | Scope | 用途 | |---------------------|-------------|--------------|-------------------------------------| | `POSTGRES_HOST` | `localhost` | Runtime | 本地用 `localhost`,容器内用 `dc3-postgres` | | `POSTGRES_PORT` | `35432` | Runtime | host 发布端口;internal 为 `5432` | | `POSTGRES_USERNAME` | `dc3` | Runtime | 用户名 | | `POSTGRES_PASSWORD` | `dc3dc3dc3` | Runtime | 密码 | | `POSTGRES_DB` | `dc3` | Runtime | 数据库名 | | `POSTGRES_SCHEMA` | (未设) | Per-process | 单服务 schema 覆盖 | | `DC3_POSTGRES_PORT` | `35432` | Compose only | 容器发布到宿主机的端口 | ### RabbitMQ(Runtime) AMQP host 端口 `35672`,internal `5672`。开启 TLS 时内部端口切到 `5671`。 | 变量 | 默认值 | Scope | 用途 | |--------------------------------|-------------|--------------|-----------------------------------| | `RABBITMQ_HOST` | `localhost` | Runtime | 本地 `localhost`,容器内 `dc3-rabbitmq` | | `RABBITMQ_PORT` | `35672` | Runtime | AMQP host 端口;internal `5672` | | `RABBITMQ_USERNAME` | `dc3` | Runtime | 用户名 | | `RABBITMQ_PASSWORD` | `dc3dc3dc3` | Runtime | 密码 | | `RABBITMQ_VIRTUAL_HOST` | `dc3` | Runtime | virtual host | | `RABBITMQ_SSL_ENABLED` | `false` | Runtime | 启用 TLS(true 时走 5671) | | `DC3_RABBITMQ_PORT` | `35672` | Compose only | AMQP 发布端口 | | `DC3_RABBITMQ_MANAGEMENT_PORT` | `15672` | Compose only | 管理界面发布端口 | ### EMQX / MQTT(Runtime) MQTT broker host 端口 `31883`。EMQX 还发布 WebSocket、Dashboard 等多个端口,详见折叠长表。 | 变量 | 默认值 | Scope | 用途 | |---------------------------|-------------|--------------|--------------------------------------| | `MQTT_BROKER_HOST` | `localhost` | Runtime | broker 主机 | | `MQTT_BROKER_PORT` | `31883` | Runtime | broker 端口(EMQX 发布;internal 约 `1883`) | | `MQTT_USERNAME` | `dc3` | Runtime | 用户名 | | `MQTT_PASSWORD` | `dc3dc3dc3` | Runtime | 密码 | | `DC3_EMQX_MQTT_PORT` | `31883` | Compose only | MQTT 发布端口 | | `DC3_EMQX_DASHBOARD_PORT` | `18083` | Compose only | Dashboard 发布端口 | ### gRPC / facade(Runtime) 中心服务之间通过 facade 互联。分布式部署默认 `DC3_FACADE_MODE=grpc`,本地进程用 `CENTER_*_HOST` 指到 `localhost`。 | 变量 | 默认值 | Scope | 用途 | |-------------------------------|-------------|---------|---------------------------------------| | `CENTER_AUTH_HOST` | `localhost` | Runtime | 鉴权中心主机 | | `CENTER_MANAGER_HOST` | `localhost` | Runtime | 管理中心主机 | | `CENTER_DATA_HOST` | `localhost` | Runtime | 数据中心主机 | | `CENTER_AGENTIC_HOST` | `localhost` | Runtime | 智能中心主机 | | `DC3_FACADE_MODE` | `grpc` | Runtime | facade 协议模式 | | `DC3_FACADE_GRPC_DEADLINE_MS` | `3000` | Runtime | gRPC 单次请求 deadline,`0` 关闭客户端 deadline | ### 网关与服务端口(Compose only) 网关是唯一对外 HTTP 入口(`8000`)。各中心 HTTP/gRPC 发布端口如下;`SERVER_PORT`/`GRPC_SERVER_PORT` 仅在本地同时跑多个服务、需要错开端口时作单进程覆盖。 | 变量 | 默认值 | Scope | 用途 | |----------------------------------|--------|--------------|-----------------------------| | `DC3_GATEWAY_PORT` | `8000` | Compose only | 网关 HTTP 发布端口(入口) | | `DC3_AUTH_PORT` | `8300` | Compose only | 鉴权中心 HTTP | | `DC3_MANAGER_PORT` | `8400` | Compose only | 管理中心 HTTP | | `DC3_DATA_PORT` | `8500` | Compose only | 数据中心 HTTP | | `DC3_AGENTIC_PORT` | `8600` | Compose only | 智能中心 HTTP | | `DC3_AUTH_GRPC_PORT` | `9300` | Compose only | 鉴权中心 gRPC | | `DC3_MANAGER_GRPC_PORT` | `9400` | Compose only | 管理中心 gRPC | | `DC3_DATA_GRPC_PORT` | `9500` | Compose only | 数据中心 gRPC | | `DC3_LISTENING_VIRTUAL_TCP_PORT` | `6270` | Compose only | Listening Virtual 驱动 TCP 发布 | | `DC3_LISTENING_VIRTUAL_UDP_PORT` | `6271` | Compose only | Listening Virtual 驱动 UDP 发布 | | `SERVER_PORT` | (未设) | Per-process | 单服务 HTTP 端口覆盖 | | `GRPC_SERVER_PORT` | (未设) | Per-process | 单中心 gRPC 端口覆盖 | ::: warning `DC3_LISTENING_VIRTUAL_*_PORT` 是宿主机发布端口 `DC3_LISTENING_VIRTUAL_TCP_PORT`/`DC3_LISTENING_VIRTUAL_UDP_PORT` 是 Compose 发布到宿主机的端口;进程内部端口用 `TCP_PORT`/`UDP_PORT`(Per-process),两者别混。 ::: ### Agentic / AI(Runtime) 仅当 `dc3_model_provider` 没有配置可用提供方时,才回退到这组 `AGENTIC_FALLBACK_OPENAI_*`。会话记忆默认关闭。 | 变量 | 默认值 | 用途 | |---------------------------------------|--------------------------------|------------------------------------------------------------------| | `AGENTIC_FALLBACK_OPENAI_BASE_URL` | `https://api.openai.com` | fallback OpenAI 兼容 API 地址 | | `AGENTIC_FALLBACK_OPENAI_API_KEY` | (空) | fallback API key(端点需鉴权时填) | | `AGENTIC_FALLBACK_OPENAI_MODEL` | `gpt-4o` | fallback 模型名 | | `AGENTIC_FALLBACK_OPENAI_TEMPERATURE` | `0.7` | 采样温度(0.0–2.0) | | `AGENTIC_FALLBACK_OPENAI_MAX_TOKENS` | `2048` | 最大输出 token | | `AGENTIC_MEMORY_SCHEMA_INIT` | `never` | Spring AI JDBC 记忆表初始化模式(`always`/`never`/`create_if_not_exists`) | | `AGENTIC_MEMORY_ENABLED` | `false` | 是否启用持久化会话记忆 | | `AGENTIC_TOOL_CALLING_ENABLED` | `true` | 是否启用工具调用 | | `AGENTIC_MEMORY_MAX_MESSAGES` | `50` | 每个对话窗口保留的最大消息数 | | `AGENTIC_ATTACHMENT_STORAGE_PATH` | `dc3/data/agentic/attachments` | 附件存储路径 | ::: info `AGENTIC_MEMORY_SCHEMA_INIT` 的建表绑定以代码为准 `AGENTIC_MEMORY_SCHEMA_INIT` 默认 `never`,意在控制记忆表初始化模式。但该变量经 compose 注入容器后,仓库内未见 `application*.yml` 把它绑定到 Spring AI 的 `initialize-schema`;记忆表实际由 initdb 脚本预建。是否真能通过设为 `always` 触发自动建表,请以代码为准,不要当成已接线的可用开关。 ::: ::: danger 真实 API key 不进文档/日志/提交历史 `AGENTIC_FALLBACK_OPENAI_API_KEY` 等敏感值绝不能写入文档、日志或提交历史。正式提供方应配置在 `dc3_model_provider` 表,fallback 仅作兜底。 ::: ::: info 表中默认值取自 `.env.example`,与代码内回退默认不一致 上表 `AGENTIC_MEMORY_ENABLED`(`false`)、`AGENTIC_ATTACHMENT_STORAGE_PATH`(`dc3/data/agentic/attachments`)取自 `.env.example`——走 `cp .env.example .env` + `source` 路径时会被显式注入这些值。但 `application-agentic.yml` 的代码内回退默认不同(未设环境变量时记忆默认开启、附件路径为 `dc3/data/upload/agentic/attachment`)。不走 `.env.example` 路径时以代码为准。 ::: ### 批处理(Runtime) MQTT 与位号值各有一组"数量阈值 + 间隔"参数,由 Quartz 定时按 `interval`(秒)把累积缓冲一次性刷出, `speed = count / interval`。 | 变量 | 默认值 | 用途 | |------------------------|-------|------------------| | `MQTT_BATCH_SPEED` | `100` | MQTT 批量大小阈值(条/批) | | `MQTT_BATCH_INTERVAL` | `5` | MQTT 批处理间隔(秒) | | `POINT_BATCH_SPEED` | `100` | 位号值批量大小阈值 | | `POINT_BATCH_INTERVAL` | `5` | 位号值批处理间隔(秒) | ### 镜像源(Compose only) 中国大陆网络可把 `REGISTRY` 设为 `cn` 走阿里云镜像。注意:Makefile 读 `REGISTRY`,Compose 插值读 `DC3_IMAGE_REGISTRY` ,两者各管一段。 | 变量 | 默认值 | 用途 | |----------------------|-------------|--------------------------------------------------| | `REGISTRY` | `auto` | Makefile 镜像源选择器(仅接受 `auto`/`global`/`cn`,其它值会报错) | | `DC3_IMAGE_REGISTRY` | `pnoker` | 镜像命名空间 | | `DC3_IMAGE_TAG` | `2026.6` | 所有服务/依赖镜像标签 | | `DC3_BIND_HOST` | `127.0.0.1` | 发布端口绑定地址(`0.0.0.0` 对外) | ### 可观测性(Compose only / Runtime) 可选栈(EMQX、ELK、Prometheus、Grafana)通过 `make up-optional` 拉起,端口与 JVM 参数如下。 | 变量 | 默认值 | Scope | 用途 | |----------------------|-------------------------|--------------|---------------------| | `GF_SERVER_ROOT_URL` | `http://localhost:3000` | Runtime | Grafana 对外 root URL | | `DC3_GRAFANA_PORT` | `3000` | Compose only | Grafana 发布端口 | | `DC3_KIBANA_PORT` | `5601` | Compose only | Kibana 发布端口 | | `DC3_ES_JAVA_OPTS` | `-Xms512m -Xmx512m` | Runtime | Elasticsearch JVM 堆 | | `DC3_LS_JAVA_OPTS` | `-Xms256m -Xmx256m` | Runtime | Logstash JVM 堆 | | `APM_AGENT_ENABLE` | `false` | Runtime | 是否启用 Java APM agent | ::: details 完整变量参考(折叠) #### Security & Authentication(Runtime) | 变量 | 默认值 | 用途 | |--------------------|------------------------------------------|-----------------------------------| | `DC3_SECURITY_KEY` | `dc3.security.key.2026.io.github.pnoker` | 登录 Token 签名密钥 | | `AUTH_HMAC_SECRET` | `io.github.pnoker.dc3` | `X-Auth-Principal` HMAC-SHA256 密钥 | #### PostgreSQL | 变量 | 默认值 | Scope | |---------------------|-------------|--------------| | `POSTGRES_HOST` | `localhost` | Runtime | | `POSTGRES_PORT` | `35432` | Runtime | | `POSTGRES_USERNAME` | `dc3` | Runtime | | `POSTGRES_PASSWORD` | `dc3dc3dc3` | Runtime | | `POSTGRES_DB` | `dc3` | Runtime | | `POSTGRES_SCHEMA` | (未设) | Per-process | | `DC3_POSTGRES_PORT` | `35432` | Compose only | #### RabbitMQ | 变量 | 默认值 | Scope | |--------------------------------------------|--------------|--------------| | `RABBITMQ_HOST` | `localhost` | Runtime | | `RABBITMQ_PORT` | `35672` | Runtime | | `RABBITMQ_USERNAME` | `dc3` | Runtime | | `RABBITMQ_PASSWORD` | `dc3dc3dc3` | Runtime | | `RABBITMQ_VIRTUAL_HOST` | `dc3` | Runtime | | `RABBITMQ_MQTT_EXCHANGE` | `dc3.e.mqtt` | Runtime | | `RABBITMQ_SSL_ENABLED` | `false` | Runtime | | `RABBITMQ_SSL_ALGORITHM` | `TLS` | Runtime | | `RABBITMQ_SSL_VALIDATE_SERVER_CERTIFICATE` | `false` | Runtime | | `RABBITMQ_SSL_VERIFY_HOSTNAME` | `false` | Runtime | | `RABBITMQ_CONTAINER_PORT` | `5672` | Runtime | | `DC3_RABBITMQ_PORT` | `35672` | Compose only | | `DC3_RABBITMQ_TLS_PORT` | `35671` | Compose only | | `DC3_RABBITMQ_MANAGEMENT_PORT` | `15672` | Compose only | #### EMQX / MQTT | 变量 | 默认值 | Scope | |---------------------------|-------------|--------------| | `MQTT_BROKER_HOST` | `localhost` | Runtime | | `MQTT_BROKER_PORT` | `31883` | Runtime | | `MQTT_USERNAME` | `dc3` | Runtime | | `MQTT_PASSWORD` | `dc3dc3dc3` | Runtime | | `MQTT_BATCH_SPEED` | `100` | Runtime | | `MQTT_BATCH_INTERVAL` | `5` | Runtime | | `DC3_EMQX_WS_PORT` | `38083` | Compose only | | `DC3_EMQX_WSS_PORT` | `38084` | Compose only | | `DC3_EMQX_MQTT_PORT` | `31883` | Compose only | | `DC3_EMQX_MQTTS_PORT` | `38883` | Compose only | | `DC3_EMQX_DASHBOARD_PORT` | `18083` | Compose only | #### gRPC / facade | 变量 | 默认值 | Scope | |-------------------------------|-------------|--------------| | `CENTER_AUTH_HOST` | `localhost` | Runtime | | `CENTER_MANAGER_HOST` | `localhost` | Runtime | | `CENTER_DATA_HOST` | `localhost` | Runtime | | `CENTER_AGENTIC_HOST` | `localhost` | Runtime | | `DC3_FACADE_MODE` | `grpc` | Runtime | | `DC3_FACADE_GRPC_DEADLINE_MS` | `3000` | Runtime | | `DC3_AUTH_GRPC_PORT` | `9300` | Compose only | | `DC3_MANAGER_GRPC_PORT` | `9400` | Compose only | | `DC3_DATA_GRPC_PORT` | `9500` | Compose only | #### HTTP Gateway & 服务端口 | 变量 | 默认值 | Scope | |----------------------------------|--------|--------------| | `DC3_GATEWAY_PORT` | `8000` | Compose only | | `DC3_AUTH_PORT` | `8300` | Compose only | | `DC3_MANAGER_PORT` | `8400` | Compose only | | `DC3_DATA_PORT` | `8500` | Compose only | | `DC3_AGENTIC_PORT` | `8600` | Compose only | | `SERVER_PORT` | (未设) | Per-process | | `GRPC_SERVER_PORT` | (未设) | Per-process | | `DC3_LISTENING_VIRTUAL_TCP_PORT` | `6270` | Compose only | | `DC3_LISTENING_VIRTUAL_UDP_PORT` | `6271` | Compose only | | `TCP_PORT` | (未设) | Per-process | | `UDP_PORT` | (未设) | Per-process | | `GATEWAY_ROUTE_AUTH_TOKEN_URI` | (未设) | Per-process | | `GATEWAY_ROUTE_AUTH_URI` | (未设) | Per-process | | `GATEWAY_ROUTE_MANAGER_URI` | (未设) | Per-process | | `GATEWAY_ROUTE_DATA_URI` | (未设) | Per-process | | `GATEWAY_ROUTE_AGENTIC_URI` | (未设) | Per-process | #### Agentic / AI(Runtime) | 变量 | 默认值 | |---------------------------------------|--------------------------------| | `AGENTIC_FALLBACK_OPENAI_BASE_URL` | `https://api.openai.com` | | `AGENTIC_FALLBACK_OPENAI_API_KEY` | (空) | | `AGENTIC_FALLBACK_OPENAI_MODEL` | `gpt-4o` | | `AGENTIC_FALLBACK_OPENAI_TEMPERATURE` | `0.7` | | `AGENTIC_FALLBACK_OPENAI_MAX_TOKENS` | `2048` | | `AGENTIC_MEMORY_SCHEMA_INIT` | `never` | | `AGENTIC_MEMORY_ENABLED` | `false` | | `AGENTIC_MEMORY_MAX_MESSAGES` | `50` | | `AGENTIC_TOOL_CALLING_ENABLED` | `true` | | `AGENTIC_ATTACHMENT_STORAGE_PATH` | `dc3/data/agentic/attachments` | #### 批处理 / 镜像 / 可观测性 | 变量 | 默认值 | Scope | |------------------------|-------------------------|--------------| | `POINT_BATCH_SPEED` | `100` | Runtime | | `POINT_BATCH_INTERVAL` | `5` | Runtime | | `REGISTRY` | `auto` | Compose only | | `DC3_IMAGE_REGISTRY` | `pnoker` | Compose only | | `DC3_IMAGE_TAG` | `2026.6` | Compose only | | `DC3_LOG_MAX_SIZE` | `10M` | Compose only | | `DC3_LOG_MAX_FILE` | `20` | Compose only | | `DC3_BIND_HOST` | `127.0.0.1` | Compose only | | `GF_SERVER_ROOT_URL` | `http://localhost:3000` | Runtime | | `DC3_GRAFANA_PORT` | `3000` | Compose only | | `DC3_KIBANA_PORT` | `5601` | Compose only | | `DC3_ES_JAVA_OPTS` | `-Xms512m -Xmx512m` | Runtime | | `DC3_LS_JAVA_OPTS` | `-Xms256m -Xmx256m` | Runtime | | `APM_AGENT_ENABLE` | `false` | Runtime | | `NODE_ENV` | `dev` | Runtime | ::: ## 约束与常见误区 - 改 `.env.example` 不会影响运行——必须先 `cp .env.example .env`。 - `dc3/env/dev.env` 与根 `.env` 用途不同,不是同一个文件,别互相复制。 - 服务发布端口统一用 `DC3_*_PORT`;进程内部仍用 `SERVER_PORT`、`GRPC_SERVER_PORT` 等 Spring Boot 原生命名。 - Per-process 变量(`POSTGRES_SCHEMA`、`SERVER_PORT`、`TCP_PORT` 等)只作单服务覆盖,不要全局滥用。 - Compose 应用栈可以用与本地源码不同的 `NODE_ENV`。 ## 延伸阅读 - [从源码本地开发](./) — 起栈、登录、跑通第一个设备的完整路径 - [部署模式与镜像源](../guide/usage) — 整套栈如何拉起、`REGISTRY=cn` 怎么用