lightningnetwork / lnd

Lightning Network Daemon ⚡️
MIT License
7.69k stars 2.09k forks source link

[documentation] [feature]: sample-lnd.conf makes misleading or wrong statement about env var expansion #8679

Open dienummer opened 6 months ago

dienummer commented 6 months ago

Background

sample-lnd.conf contains the statement "Environment variables are expanded so they may be used" near the top of the file: https://github.com/lightningnetwork/lnd/blob/2b74a34301fe4a90b2b4f02b075bc93c938fe410/sample-lnd.conf#L24

However, this is only true for path-type variables, which call CleanAndExpandPath when they are parsed: https://github.com/lightningnetwork/lnd/blob/7af195768aa3e06ec447615ce25dd32343d8bd59/config.go#L1749, and for the special case of the rpc user and rpc password, parsed by supplyEnvValue https://github.com/lightningnetwork/lnd/blob/7af195768aa3e06ec447615ce25dd32343d8bd59/config.go#L1951

https://github.com/lightningnetwork/lnd/blob/7af195768aa3e06ec447615ce25dd32343d8bd59/config.go#L1831-L1834

It could be extremely important to allow env var substitution also for backend RPC hostname, ZMQ host and port, etc. when running in a container orchestration system or other professional setup.

In general, storing critical elements of the config in the environment is preferred (https://12factor.net/config)

Your environment

Steps to reproduce

N/A; see https://github.com/lightningnetwork/lnd/blob/7af195768aa3e06ec447615ce25dd32343d8bd59/config.go and in particular review lines https://github.com/lightningnetwork/lnd/blob/7af195768aa3e06ec447615ce25dd32343d8bd59/config.go#L927-L945 which are distinct from non-path type config settings (with the exception of RPCuser and RPCpass, which are the only other elements parsed from environment)

Expected behaviour

I expect env var expansion / substitution to work for all config settings so that I can more easily deploy LND in a professionally-managed container orchestration setup.

I would also expect that RPCUser and RPCPass config item env var expansion be documented.

Actual behaviour

Documentation suggests any config item could undergo variable expansion.

Only path-type vars, plus RPCUser and RPCPass undergo env var substitution.

Documentation does not mention that RPCUser and RPCPass undergo env var substitution.

MegalithicBTC commented 3 months ago

Oops. Ran into this issue also. I guess the hack/workaround is to create a script that writes a uniqe lnd.conf for each deployment?

guggero commented 3 months ago

It's correct that the text about the env variable parameter expansion is a bit misleading. But it's actually only meant for the datadir variable, not for the whole file. But any field that takes a directory or file path can use environment variables. And any password field also allows expansion, although with a slightly extended syntax: https://github.com/lightningnetwork/lnd/pull/8310

So in short, anything that isn't a path/directory or password value doesn't support environment variable expansion.

Oops. Ran into this issue also. I guess the hack/workaround is to create a script that writes a uniqe lnd.conf for each deployment?

I would suggest using command line flags for the dynamic parts. You can mix a configuration file and command line flags, IIRC command line flags take precedence. So have everything general in the config file and then use node-specific values in flags, such as ports, paths and so on.