Application Setup
Environment
Convox applications are configured using environment variables. You will need to specify your variables in your convox.yml
to be available to your running application. You can set and unset them from the Convox CLI or web Console before or after any code deployments. You can even control the release of your environmental changes. The variables are stored securely and encrypted and only available to the specific application and services you require.
Definition
All environment variables defined in your convox.yml
are required to start up your application, but you can easily set a default or empty value in your configuration for those that are appropriate to do so.
Global
Environment variables specified in the top level environment:
section will be available to all services in the application:
environment:
- ENABLED=true
- LICENSE=
- ENVIRONMENT
...
In this example the ENABLED
variable has a default value of true
, the LICENSE
variable will just be empty and the ENVIRONMENT
variable must be defined using the CLI or Web console before the application will start.
Service
You can also configure each service individually to limit secrets to the services that need them:
services:
web:
build: .
environment:
- LOG_LEVEL=debug
- DEFAULT_CLIENT=
- MULTI_TENANT
In this example the LOG_LEVEL
variable has a default value of debug
, DEFAULT_CLIENT
will just be empty and the MULTI_TENANT
variable must be defined using the CLI or Web console before the application will start.
Environment variables defined at the service level will not be shared or visible to other services in the same app. You can have a variable with the same name in separate services with different declared values, but note that updating this variable after deployment will update the value in all services with that variable name.
Wildcard
You can use the wildcard syntax to provide all available environment variables to a service:
services:
web:
build: .
environment:
- "*"
If you wish to declare and inject new environment variables on demand without declaring them in the convox.yml
beforehand, you should use the wildcard syntax to pick them up.
Setting and Editing your Environment Variables
You can configure your env vars through the Convox web console for your cloud-based Racks, or through the Convox CLI your local and cloud Racks:
$ convox env set FOO=bar
Setting FOO... OK
Release: RFMGESPZHC
$ convox env get FOO
bar
$ convox env unset FOO
Unsetting FOO... OK
Release: RZIDXFIJAC
$ convox env edit
Setting ... OK
Release: RRJQTMVKRS
convox env edit
allows you to interactively update your environment variables in a terminal editor 😊
You can use convox env edit
along with convox releases
to restore an Environment Variable set from another release:
First run convox releases -a <app-name>
to identify the correct RELEASE-ID
Next, examine the release’s environment variables with convox releases info <RELEASE-ID> -a <app-name>
Copy the desired variables.
Finally run convox env edit
paste and save the variables to create and promote a new RELEASE
for your app with updated environment variables.
Promoting your environment variable changes
If you update your env vars through the CLI, that will create a new release containing your changes. By default this will not be promoted. For this to take effect, you will need to promote that release:
$ convox env set FOO=bar
Setting FOO... OK
Release: RFMGESPZHC
$ convox releases promote RFMGESPZHC
Promoting RFMGESPZHC... OK
Alternatively you can pass the --promote
/-p
flag to the env commands to automatically promote the release:
$ convox env set FOO=bar --promote
Setting FOO... OK
Release: RYFPMIHLPKD
Promoting RYFPMIHLPKD... OK
Environment variable updates made through the Convox web console create releases which are promoted automatically for you.
Environment variable comprehensive example
Given this example convox.yml
:
environment:
- ENABLED=true
- LICENSE=
- ENVIRONMENT
services:
web:
...
environment:
- WEB_LOGGING_LEVEL=info
- WEB_CLIENT=
- WEB_MULTI_TENANT
- SHARED=web
...
worker:
...
environment:
- WORKER_LOGGING_LEVEL=error
- WORKER_CLIENT=
- WORKER_MULTI_TENANT
- SHARED=worker
...
anotherservice:
...
environment:
- ANOTHER_LOGGING_LEVEL=trace
- "*"
The ENVIRONMENT
, WEB_MULTI_TENANT
and WORKER_MULTI_TENANT
variables will all need to be set before first deployment.
Once deployed, the web
service will have the ENABLED, LICENSE, ENVIRONMENT, WEB_LOGGING_LEVEL, WEB_CLIENT, WEB_MULTI_TENANT, SHARED
environment variables all available to it, and SHARED
will have the value of web
.
The worker
service will have the ENABLED, LICENSE, ENVIRONMENT, WORKER_LOGGING_LEVEL, WORKER_CLIENT, WORKER_MULTI_TENANT, SHARED
environment variables all available to it, and SHARED
will have the value of worker
.
The anotherservice
will have ENABLED, LICENSE, ENVIRONMENT, ANOTHER_LOGGING_LEVEL
environment variables all available to it, as well as WEB_MULTI_TENANT
and WORKER_MULTI_TENANT
as I will have to have previously set those before deployment.
If I update any of the ENABLED, LICENSE, ENVIRONMENT
, or SHARED
environment variables and promote that update, those values will then be reflected in the web
and worker
services, as well as in anotherservice
. If I update any of the WEB_*
or WORKER_*
variables and promote that update, those values will then be reflected in their respective services, as well as in anotherservice
.
If I set a value against a NEW_VARIABLE
environment variable which wasn’t originally declared, and promote that update, it will be reflected and available in the anotherservice
only. If I want that to be available to the other services, I should add that declaration to the convox.yml
and redeploy, at which point they will then pick that up.