diff --git a/.env.example b/.env.example index 018a191..b8e341b 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,24 @@ -# 复制为 .env 后填入真实值 -# .env 会覆盖 config.yaml 中的同名字段 +# ================================== +# MCE 环境变量配置模板 +# 复制为 .env 后填入实际值 +# cp .env.example .env +# ================================== -DATABASE_PASSWORD=your_password_here -JWT_SECRET=generate-a-random-64-char-string-here -REDIS_PASSWORD=your_redis_password_here +# --- 数据库 --- +DATABASE_HOST=127.0.0.1 +DATABASE_PORT=5432 +DATABASE_USER=metazone +DATABASE_PASSWORD= +DATABASE_DBNAME=metalab_dev +DATABASE_SSLMODE=disable + +# --- Redis(enabled=false 时以下可忽略) --- +REDIS_ENABLED=true +REDIS_HOST=127.0.0.1 +REDIS_PORT=6379 +REDIS_PASSWORD= +REDIS_DB=0 + +# --- 服务 --- +SERVER_PORT=8080 +SERVER_MODE=debug diff --git a/README.md b/README.md index 8a3c120..ea8933c 100644 --- a/README.md +++ b/README.md @@ -85,31 +85,29 @@ git clone git@git.metazone.cc:MetaZone/mce.git cd mce ``` -编辑 `config.yaml`,修改数据库和 Redis 连接信息: - -```yaml -database: - host: 127.0.0.1 - port: 5432 - user: metazone - password: "your_password" # 或用 .env 注入 - dbname: metalab_dev # 提前创建此数据库 - -redis: - enabled: true # false 则使用内存存储,无需 Redis - host: 127.0.0.1 - port: 6379 - password: "" -``` - -敏感信息(数据库密码、Redis 密码)可通过 `.env` 注入: +复制环境变量模板并填入实际值: ```bash -# .env(git 不追踪) -DB_PASSWORD=your_password -REDIS_PASSWORD=your_redis_password +cp .env.example .env ``` +编辑 `.env`,至少填入数据库密码: + +```bash +DATABASE_HOST=127.0.0.1 +DATABASE_PORT=5432 +DATABASE_USER=metazone +DATABASE_PASSWORD=your_password +DATABASE_DBNAME=metalab_dev + +REDIS_ENABLED=true # 可选,false 则使用内存存储 +REDIS_HOST=127.0.0.1 +REDIS_PORT=6379 +REDIS_PASSWORD= +``` + +> 所有连接信息统一在 `.env` 管理。`config.yaml` 保留默认值兜底,通常无需修改。 + ### 2. 初始化数据库 ```bash diff --git a/docs/deployment.md b/docs/deployment.md index a29e3f6..d383e4b 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -30,33 +30,33 @@ done ## 3. 配置 -复制并修改生产配置: +```bash +cp .env.example .env +``` + +编辑 `.env`,填入生产环境值: ```bash -cp config.yaml /etc/mce/config.yaml +# 服务 +SERVER_MODE=release + +# 数据库(生产实例地址) +DATABASE_HOST=10.0.0.1 +DATABASE_PORT=5432 +DATABASE_USER=metazone +DATABASE_PASSWORD=your_secure_password +DATABASE_DBNAME=metalab_prod +DATABASE_SSLMODE=require + +# Redis +REDIS_ENABLED=true +REDIS_HOST=10.0.0.2 +REDIS_PORT=6379 +REDIS_PASSWORD=your_redis_password +REDIS_DB=0 ``` -生产环境关键调整: - -```yaml -server: - mode: release # 关闭 debug 日志 - cookie_secure: true # HTTPS 下启用 - -session: - idle_timeout: 120 # 2 小时 - remember_timeout: 43200 # 30 天 - -redis: - enabled: true # 生产环境建议启用 -``` - -敏感信息通过环境变量注入(不写进配置文件): - -```bash -export DB_PASSWORD="..." -export REDIS_PASSWORD="..." -``` +> `config.yaml` 中的默认值会被 `.env` 覆盖,通常无需修改。 ## 4. systemd 服务 @@ -71,7 +71,6 @@ After=network.target postgresql.service redis.service Type=simple User=mce WorkingDirectory=/opt/mce -EnvironmentFile=-/etc/mce/env ExecStart=/usr/local/bin/mce Restart=on-failure RestartSec=5 @@ -80,13 +79,6 @@ RestartSec=5 WantedBy=multi-user.target ``` -`/etc/mce/env`: - -```bash -DB_PASSWORD=your_db_password -REDIS_PASSWORD=your_redis_password -``` - 启动: ```bash diff --git a/internal/config/config.go b/internal/config/config.go index 04b62da..b76b010 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -136,10 +136,24 @@ func loadEnvFile(path string) { } } -// bindEnvOverride 将环境变量映射到 config 的嵌套键 +// bindEnvOverride 将环境变量映射到 config 的嵌套键(.env 覆盖 config.yaml 默认值) func bindEnvOverride(v *viper.Viper) { + // 数据库 + _ = v.BindEnv("database.host", "DATABASE_HOST") + _ = v.BindEnv("database.port", "DATABASE_PORT") + _ = v.BindEnv("database.user", "DATABASE_USER") _ = v.BindEnv("database.password", "DATABASE_PASSWORD") + _ = v.BindEnv("database.dbname", "DATABASE_DBNAME") + _ = v.BindEnv("database.sslmode", "DATABASE_SSLMODE") + // Redis + _ = v.BindEnv("redis.enabled", "REDIS_ENABLED") + _ = v.BindEnv("redis.host", "REDIS_HOST") + _ = v.BindEnv("redis.port", "REDIS_PORT") _ = v.BindEnv("redis.password", "REDIS_PASSWORD") + _ = v.BindEnv("redis.db", "REDIS_DB") + // 服务 + _ = v.BindEnv("server.port", "SERVER_PORT") + _ = v.BindEnv("server.mode", "SERVER_MODE") } // GetIdleTimeout 返回临时会话空闲超时(分钟),实现 controller.sessionConfig 接口