Rack and External Resources

Rack Resources are infrastructure components managed at the Rack level through the CLI, independent of any single App. They are available only on cloud-backed Racks (not local development Racks).

For resources defined in convox.yml and tied to a specific App, see App Resources.

Managing Rack Resources

Creating a Resource

Create a Rack Resource with default options or pass custom values at creation time:

$ convox rack resources create postgres
Creating resource... OK, postgres-8458

$ convox rack resources create postgres MultiAZ=true
Creating resource... OK, postgres-2871

Listing Resources

$ convox rack resources
NAME                     TYPE      STATUS
console-v1-175092fe6ab1  webhook   running
syslog-2984              syslog    running
postgres-8458            postgres  running
postgres-2871            postgres  running

Viewing Resource Info

$ convox rack resources info postgres-8458

Viewing Available Options

$ convox rack resources options memcached
NAME           DEFAULT         DESCRIPTION
InstanceType   cache.t3.micro  The type of instance to use
NumCacheNodes  1               The number of cache clusters for this replication group

Listing Available Resource Types

$ convox rack resources types

Updating a Resource

$ convox rack resources update postgres-8458 MultiAZ=true

Linking a Resource to an App

Only syslog Rack Resources can be linked to an App. Linking sends the App's logs to the syslog destination:

$ convox rack resources link syslog-2984 --app myapp
Linking to myapp... OK

To remove the link:

$ convox rack resources unlink syslog-2984 --app myapp
Unlinking from myapp... OK

To use a Rack database or cache from an App, get its URL with convox rack resources url and set it as an App environment variable, as described in External Resources.

Deleting a Resource

$ convox rack resources delete postgres-8458
Deleting resource... OK

Available Rack Resource Types

memcached

On AWS, creates an ElastiCache Memcached cluster.

$ convox rack resources options memcached
NAME           DEFAULT         DESCRIPTION
InstanceType   cache.t3.micro  The type of instance to use
NumCacheNodes  1               The number of cache clusters for this replication group

redis

On AWS, creates an ElastiCache Redis cluster.

$ convox rack resources options redis
NAME                      DEFAULT         DESCRIPTION
AutomaticFailoverEnabled  false           Indicates whether Multi-AZ is enabled. Must be accompanied with NumCacheClusters=2 or higher.
Database                  0               Default database index
Encrypted                 false           Encrypt at rest and in transit
Engine                    redis           The cache engine to use (redis or valkey)
EngineVersion             7.0             The version of the cache engine
InstanceType              cache.t3.micro  The type of instance to use
NumCacheClusters          1               The number of cache clusters for this replication group

valkey

On AWS, creates an ElastiCache Valkey cluster.

$ convox rack resources options valkey
NAME                      DEFAULT         DESCRIPTION
AutomaticFailoverEnabled  false           Indicates whether Multi-AZ is enabled. Must be accompanied with NumCacheClusters=2 or higher.
Database                  0               Default database index
Encrypted                 false           Encrypt at rest and in transit
EngineVersion             8.1             The version of the cache engine
InstanceType              cache.t3.micro  The type of instance to use
NumCacheClusters          1               The number of cache clusters for this replication group

While memcached, redis and valkey are available as Rack Resources, there are advantages to using them as App Resources instead: configuration is version controlled in convox.yml, and App Resources are automatically available during review workflows.

mysql

On AWS, creates an RDS MySQL instance.

$ convox rack resources options mysql
NAME                        DEFAULT      DESCRIPTION
AllocatedStorage            20           Allocated storage size (GB)
AllowMajorVersionUpgrade    false
AutoMinorVersionUpgrade     true
Database                    app          Default database name
DatabaseSnapshotIdentifier               ARN of database snapshot to restore
Encrypted                   false        Encrypt database with KMS
EngineVersion               8.4          Version of MySQL
InstanceType                db.t3.micro  Instance class for database nodes
MultiAZ                     false        Multiple availability zone
Password                    (generated)  Server password
Username                    app          Server username

postgres

On AWS, creates an RDS PostgreSQL instance.

$ convox rack resources options postgres
NAME                        DEFAULT      DESCRIPTION
AllocatedStorage            20           Allocated storage size (GB)
AllowMajorVersionUpgrade    false
AutoMinorVersionUpgrade     true
BackupRetentionPeriod       1            The automatic RDS backup retention period, (default 1 day)
Database                    app          Default database name
DatabaseSnapshotIdentifier               ARN of database snapshot to restore
Encrypted                   false        Encrypt database with KMS
EngineVersion               17           Version of Postgres
Family                      postgres17   Postgres version family
InstanceType                db.t3.micro  Instance class for database nodes
MaxConnections                           ParameterGroup max_connections value, i.e. '{DBInstanceClassMemory/15000000}'
MultiAZ                     false        Multiple availability zone
Password                    (generated)  Server password
Username                    postgres     Server username

While mysql and postgres are available as Rack Resources, there are advantages to using them as App Resources instead: configuration is version controlled in convox.yml, and App Resources are automatically available during review workflows.

Database Versions

convox rack resources options shows the default EngineVersion for mysql and postgres on your Rack. Existing mysql and postgres Resources keep their EngineVersion and Family through Rack updates and convox rack resources update.

For postgres, an EngineVersion without Family sets the matching Family on create. Requires rack version 20261005214736 or newer; on earlier Racks, pass Family with EngineVersion.

$ convox rack resources create postgres EngineVersion=16 --name reports-db --wait
Creating resource... OK, reports-db

To restore from DatabaseSnapshotIdentifier, also pass the snapshot's EngineVersion. Without it, the restore requests the default version, and a postgres restore from a snapshot on a different major version fails.

To upgrade an existing database to a new major version, pass AllowMajorVersionUpgrade=true with the new EngineVersion, and for postgres the matching Family. Requires rack version 20260212195551 or newer.

$ convox rack resources update reports-db AllowMajorVersionUpgrade=true EngineVersion=17 Family=postgres17 --wait
Updating resource... OK

New PostgreSQL 15 and later and MySQL 8.4 databases need clients that connect with TLS. See TLS Connections.

s3

On AWS, creates an S3 bucket for persistent file storage.

$ convox rack resources options s3
NAME        DEFAULT  DESCRIPTION
Topic                SNS resource name for change notifications
Versioning  false    Enable versioning
$ convox rack resources info s3-2988 | grep URL
URL      s3://AKIAIOSFODNN7EXAMPLE:EXAMPLEKEYEXAMPLEKEYEXAMPLEKEYEXAMPLEKEY@test-s3-2988

sns

On AWS, creates an SNS topic for pub/sub messaging. Messages published to the topic are pushed to all subscribers automatically.

$ convox rack resources options sns
NAME   DEFAULT  DESCRIPTION
Queue           SQS resource name to subscribe to this SNS topic
$ convox rack resources info sns-8309 | grep URL
URL      sns://AKIAIOSFODNN7EXAMPLE:EXAMPLEKEYEXAMPLEKEYEXAMPLEKEYEXAMPLEKEY@arn:aws:sns:us-east-1:123456789012:test-sns-8309

sqs

On AWS, creates an SQS queue for reliable queue processing. Unlike SNS, messages must be polled by receivers and are processed by a single consumer.

$ convox rack resources options sqs
NAME                    DEFAULT  DESCRIPTION
MessageRetentionPeriod  345600   Number of seconds that a message should be retained on the queue
ReceiveMessageWaitTime  0        Number of seconds that ReceiveMessage should wait for new messages before returning
VisibilityTimeout       30       Number of seconds that a message should wait for confirmation before being returned to the queue
$ convox rack resources info sqs-5495 | grep URL
URL      sqs://AKIAIOSFODNN7EXAMPLE:EXAMPLEKEYEXAMPLEKEYEXAMPLEKEYEXAMPLEKEY@sqs.us-east-1.amazonaws.com/123456789012/test-sqs-5495

syslog

Connects Rack logging to external logging services. See Syslogs for detailed configuration.

$ convox rack resources options syslog
NAME    DEFAULT                                                   DESCRIPTION
Format  <22>1 {DATE} {GROUP} {SERVICE} {CONTAINER} - - {MESSAGE}  Syslog format string
Url                                                               Syslog URL, e.g. 'tcp+tls://logs1.papertrailapp.com:11235'

webhook

Sends notifications about events within your Apps and Rack to an HTTP endpoint. Console creates one on each Rack it manages, named console-v1-<id>, to feed the Console Events tab and notification integrations such as Slack.

$ convox rack resources options webhook
NAME  DEFAULT  DESCRIPTION
Url            Webhook URL

Url is required and takes an http:// or https:// URL. Use https:// where the receiver supports it, since http:// deliveries are unencrypted. Delivery to http:// URLs requires rack version 20261005214736 or newer.

$ convox rack resources create webhook Url=https://hooks.example.com/convox --name my-hook --wait
Creating resource... OK, my-hook

Each event is a POST to the URL with the event JSON as the body:

{"action":"release:create","data":{"app":"myapp","id":"RABCDEFGHIJ","rack":"production"},"status":"success","timestamp":"2026-10-02T12:00:00.123456789Z"}

A release:promote event has "status":"start" when the promotion begins. An event for a failed operation has "status":"error" and the error text in data.message.

Redirects are not followed: when a receiver redirects http:// to https://, the event never reaches the https:// URL, so give the webhook the https:// URL. Events are sent from AWS Lambda, not from your Rack's instances or NAT gateway, so the receiver must be reachable from the internet and cannot allowlist your Rack's egress IPs. An address reachable only inside the Rack's VPC, such as an internal Service or the router of an InternalOnly Rack, receives nothing.

Changing a Webhook URL

Requires rack version 20261005214736 or newer. On older racks the webhook keeps its URL; delete it and create it again with the new URL.

$ convox rack resources update my-hook Url=https://hooks.example.com/new --wait
Updating resource... OK

$ convox rack resources url my-hook
https://hooks.example.com/new

The option name is case-sensitive on update: a lowercase url= is ignored and the webhook keeps its URL.

Command Result
convox rack resources update <name> Url=<http or https URL> Events go to the new URL
convox rack resources update <name> The webhook keeps its URL
convox rack resources update <name> Url= ERROR: must specify a URL, webhook unchanged
convox rack resources update <name> Url=ftp://... ERROR: invalid URL scheme: ftp. Allowed schemes are: http, https, webhook unchanged
convox rack resources update console-v1-<id> Url=... ERROR: webhook console-v1-<id> is managed by Console and its Url cannot be changed, webhook unchanged

Any webhook whose name starts with console-v1- is treated as Console's and refuses a Url update, so give your own webhooks a different name.

Applying Webhook Fixes

convox rack update does not update existing webhooks. After a Rack update completes (convox rack update --wait), run convox rack resources update <name> with no options to apply webhook fixes, such as http:// delivery, to an existing webhook. When the webhook is already current, the command prints ERROR: ValidationError: No updates are to be performed. and nothing changes.

Console's console-v1-<id> webhook takes the same update. If it is deleted, Console creates it again within about 15 minutes, and the Rack's events do not reach Console until then.

External Resources

For resource types that Convox does not natively support, you can integrate them by injecting environment variables with connection details.

For example, to connect an App to an externally managed MariaDB instance:

$ convox env set MARIADB_URL=jdbc:mariadb://mariadb-instance1.123456789012.us-east-1.rds.amazonaws.com:3306/DB?user=myUsername&password=myPassword -a myapplication -r acme/production

Add the variable to your Service's environment configuration in convox.yml:

services:
  app:
    environment:
      - MARIADB_URL

Environment variables are encrypted and stored securely in KMS. You may also route using internal IP addresses for locked-down environments.

Networking Requirements

  • Resources within AWS: Create them in the same VPC as your Rack, in a peered VPC, or with a public endpoint. Security Groups for the resource must allow access from the Rack instance Security Group ({RACK_NAME}-instances, or check convox rack params | grep InstanceSecurityGroup for custom groups).

  • Resources outside AWS: Must be network-accessible to your Rack instances. For private Racks, outbound traffic comes from NAT gateway IPs (find these in the AWS VPC Dashboard). Non-private Racks do not have predictable egress IPs, so the resource may need to be available on the public internet.

See Also