Environments allow you create multiple deployments from the same code. These deployments are isolated from one another, meaning you can test your changes in a safe way before shipping them out.
The environment variable SYNAPSE_ENV is used to switch environments. For example, I might enter the beta environment like so:
export SYNAPSE_ENV=beta
synapse status
# env: betaEnvironment names are not special with two exceptions:
localis the default environment. Deployments created in this environment are assumed to be isolated to a single user/machine.- Names that contain the word
productionare automatically considered a production enviroment. Production environments have additional safeguards in place:- Prevents replacement of stateful resources whenever possible
synapse destroyrequires a confirmation
In theory, environments should be exact copies of one another. In practice, this often isn't the case.
The current support for per-environment configuration is limited to .env files. Synapse automatically reads environment variables from a .env.${envName} file in the working directory. For example, .env.beta would be used when SYNAPSE_ENV is set to beta. You can then write code that uses process.env to change configuration.
Here are some common scenarios where you might want to tweak things slightly per-environment:
- Cost optimization e.g. smaller host machines in developer/test environments, less frequent backups, etc.
- Enabling debug options/tools in non-prod, disabling them in prod
- External dependencies like API keys or DB urls
- These should be converted to resources whenever possible
In general, the differences between non-prod and prod should be subtractive. That is, prod potentially executes less code than non-prod, never more. The code would never be tested otherwise!