0

尝试使用 Distillery 在运行时获取系统变量时遇到问题。目前,我已将与数据库的连接定义为:

config :myapp, MyApp.Repo,
  adapter: Ecto.Adapters.Postgres,
  timeout: 2000000,
    username: "${DB_USER}",
    password: "${DB_PASSWORD}",
    database:  "${DB_DATABASE}",
    hostname: "${DB_HOST}",
   port: 5432,
  pool_size: 10

然后,我正在运行 phx.digest 并混合发布来获取我的 tar 文件。然后,我使用在设置了所有环境变量的 ubuntu 服务器上运行的 systemd 配置部署此 tar 文件。这些是 systemd 服务的重要行:

[Service]
Type=forking
WorkingDirectory=/opt/app
User=ubuntu
RemainAfterExit=yes
Restart=on-failure
RestartSec=5
Environment=MIX_ENV=stage "PORT=4000"
Environment=LANG=en_US.UTF-8
Environment=REPLACE_OS_VARS=true
EnvironmentFile=/etc/profile
ExecStart=/opt/app/bin/myapp migrate-start
ExecStop=/opt/app/bin/myapp stop
ExecReload=/opt/app/bin/myapp restart
SyslogIdentifier=myapp

当我尝试在服务器实例上运行此服务时。它正在尝试连接到 ${DB_HOST}:5432 作为 url,并且没有评估我不想用配置的值替换它。在使用硬编码值之前,我已经成功运行了它,所以我知道问题在于替换值。有人对我如何解决此错误有任何建议吗?我在服务器上设置了所有必要的值,包括再次设置 REPLACE_OS_VARS=true。

任何帮助或指导表示赞赏。

4

1 回答 1

0

REPLACE_OS_VARS设置是插入“正常”环境变量的助手,但在构建时而不是运行时

这里的数据库配置值是帮助程序的一个很好的用途,因为您可能需要在应用程序启动时连接到数据库。限制是他们将无法访问或获取运行 tar 的机器上的任何环境变量。

我通常会有一个.env文件,其中包含我在构建时想要的所有环境变量。

# .env contents

 export REPLACE_OS_VARS=true
 export DB_HOSTNAME="postgres"
...

比发布-构建过程看起来像:

$ MIX_ENV=prod
$ source .env
$ mix deps.get
$ mix deps.compile
$ mix phx.digest
$ mix release

这意味着您需要注入的“环境”变量REPLACE_OS_VARS=true在构建版本的机器上都可用,而不是在接收构建的 tar 的机器上。或者使用其他配置管理解决方案。

这是我刚开始时帮助我的资源:https ://hexdocs.pm/distillery/getting-started.html#application-configuration

于 2018-07-04T02:00:25.237 回答