Databases

3 min read

Databases and other stateful services run as accessories alongside your app. Define them in teploy.yml and manage them with teploy accessory.

Define accessories

Add an accessories block to your teploy.yml:

app: myapp
domain: myapp.com
server: production

accessories:
  postgres:
    image: postgres:16
    port: 5432
    env:
      POSTGRES_PASSWORD: "${SECRET_DB_PASSWORD}"
    volumes:
      data: /var/lib/postgresql/data

When you run teploy deploy, the CLI ensures all defined accessories are running before deploying your app. Connection details are automatically injected as environment variables.

Supported databases

Any Docker image works as an accessory. Common examples:

accessories:
  # PostgreSQL
  postgres:
    image: postgres:16
    port: 5432
    env:
      POSTGRES_PASSWORD: secret
    volumes:
      data: /var/lib/postgresql/data

  # MySQL
  mysql:
    image: mysql:8
    port: 3306
    env:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      data: /var/lib/mysql

  # Redis
  redis:
    image: redis:7
    port: 6379
    volumes:
      data: /data

  # MongoDB
  mongo:
    image: mongo:7
    port: 27017
    env:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: secret
    volumes:
      data: /data/db

Managing accessories

List running accessories

teploy accessory list

Start and stop

teploy accessory stop postgres
teploy accessory start postgres

View logs

teploy accessory logs postgres
teploy accessory logs postgres --lines 100

Upgrade to a new version

teploy accessory upgrade postgres postgres:17

This pulls the new image, stops the old container, and starts a new one with the same volumes.

Backups

On-demand backup

Back up an accessory to S3 with a database-aware dump (not just a volume snapshot):

teploy accessory backup postgres --bucket my-backups --region us-east-1

For PostgreSQL, this runs pg_dump. For MySQL, it runs mysqldump. For other images, it backs up volumes.

Scheduled backups

teploy accessory backup postgres --bucket my-backups --schedule "0 3 * * *"

This creates a cron job on the server that runs the backup daily at 3 AM.

Restore from backup

teploy accessory restore postgres 2026-03-15 --bucket my-backups

This stops the accessory, restores the backup, and restarts it.

Volume backups

For app-level volume backups (not database-aware):

teploy backup create --bucket my-backups
teploy backup list --bucket my-backups
teploy backup restore 2026-03-15 --bucket my-backups
teploy backup schedule "0 4 * * *" --bucket my-backups

Backup storage

Use any S3-compatible storage:

Provider Endpoint Pricing
AWS S3 Default $0.023/GB
Cloudflare R2 Custom $0.015/GB, no egress fees
Backblaze B2 Custom $0.005/GB
Wasabi Custom $0.007/GB, no egress fees
MinIO Self-hosted Free

See Recommended Services for setup details.

Connection strings

When accessories are running, the CLI injects connection environment variables into your app container. Reference them in your application code:

# Injected automatically based on accessory name and type
DATABASE_URL=postgresql://postgres:secret@myapp-postgres:5432/postgres
REDIS_URL=redis://myapp-redis:6379

You can also set connection strings manually:

teploy env set DATABASE_URL=postgresql://user:pass@myapp-postgres:5432/mydb