buffalo dev 自动加载 .env,但 buffalo build 生成的二进制不读取 .env;生产环境必须通过操作系统级环境变量(如 database_url、secret_key)配置,且 go_env=production 时 database.yml 被忽略。

buffalo dev 会自动加载 .env,但 buffalo build 不会
Buffalo 的 buffalo dev 启动时默认读取项目根目录下的 .env 文件,并注入到进程环境变量中;但执行 buffalo build 打包后的二进制在生产环境运行时,.env 文件**完全不生效**——它不会被自动加载,也不会被嵌入二进制。这是最常被忽略的点,导致本地能跑、部署后报 database URL is empty 或 missing SECRET_KEY 等错误。
真正起作用的是操作系统级环境变量。你必须在启动服务前手动设置,例如:
SECRET_KEY=abc123 DATABASE_URL=postgres://user:pass@db:5432/app?sslmode=disable ./myapp
-
buffalo build生成的是纯静态二进制,不带任何配置文件解析逻辑 -
.env只对buffalo dev和buffalo task有效,是开发便利性设计,不是运行时机制 - 若用 systemd 或 Docker,需显式通过
Environment=或environment:字段传入
config/env.go 里硬编码的值会被环境变量覆盖
Buffalo 在 config/env.go 中定义了各环境的默认配置,比如 ENV、PORT、SESSION_SECRET。这些值本身是 Go 变量,但 Buffalo 内部使用 os.Getenv() 做了优先级覆盖:只要同名环境变量存在,就直接用它,不 fallback 到 env.go 里的字面值。
所以你不需要改 env.go,只需确保以下环境变量在运行时可用:
-
GO_ENV=production(强制切换为 production 模式,影响日志级别、模板重编译等) -
PORT=8080(覆盖env.go中的Port字段) -
SESSION_SECRET=...(必须设置,否则cookies.New()初始化失败) -
DATABASE_URL(如果用了 Pop,它会优先读这个,而非database.yml)
database.yml 在 production 下默认被忽略
Buffalo 的 Pop 数据库层在 GO_ENV=production 时,**跳过读取 database.yml**,只认 DATABASE_URL 环境变量。这是明确的设计行为,不是 bug。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
如果你坚持用 database.yml,必须手动在 app.go 中强制加载:
if env == "production" {
db, err := pop.Connect("production")
// ...
}
但更推荐的做法是彻底弃用 database.yml,生产环境统一走 DATABASE_URL,理由很实在:
- 避免 YAML 解析失败(缩进、引号、注释等易出错)
- 符合 12-factor app 原则,配置与代码分离
- Kubernetes / Docker 中更容易注入和轮换
敏感变量别塞进 Git,用运行时注入
.env 文件如果提交到 Git,等于把数据库密码、密钥全公开。Buffalo 不提供加密配置或密钥管理集成,它假设你已自行解决这个问题。
生产部署时,应由外部系统注入环境变量:
- Kubernetes:用
Secret挂载为环境变量或文件,再通过envFrom:引入 - Docker Compose:用
env_file:指向宿主机上的prod.env(权限设为600) - systemd:在
.service文件中写EnvironmentFile=/etc/myapp/secrets.env
Buffalo 本身不做任何加解密、远程配置拉取或 Vault 集成——它只做一件事:读 os.Getenv()。复杂度在你那边,框架保持克制。










