Guides

Docker Compose

Bring an API, a worker, a database and Redis onto Skiff from the Compose file you already have. Skiff turns each service into a project, worker or managed database, so your stack gets backups, rollbacks and the dashboard. Services keep finding each other by the same names, so db:5432 in your config keeps working.

Check a file first

This shows what your file would become, and changes nothing:

terminal
skiff compose plan
skiff compose plan -f deploy/compose.yml --name shop

Create a stack

  1. 1

    Open Stacks in the dashboard

    Choose New stack, then give a repository or paste your file. Services that build from source need a repository.
  2. 2

    Check the file

    Skiff lists what it will create, what will work differently and anything to fix first.
  3. 3

    Fill in missing values

    Values like ${DB_PASSWORD} come from what you enter here, then from a .env file beside the Compose file. Check again after filling them in.
  4. 4

    Create it

    Databases start first, then apps deploy in depends_on order.

Change a stack

For a stack from a GitHub repository, push your Compose file. Safe changes apply on their own, and only the services that changed are redeployed. A push that would delete data, or that has a problem, waits for you: the stack shows why, you get an alert, and new code still deploys with the current settings. Review those with Update. For a pasted file, or another Git host, use Update for every change. Values you entered earlier are remembered, encrypted, so it only asks for new ones.

  • Deleting data needs your OK. Removing a database, a volume or an app with a volume is only applied once you confirm it.
  • Database images and credentials can't be changed this way.A new password or major version doesn't apply to existing data, so Skiff refuses the update and explains why. To change one, back up and restore into a new database service.
  • Your file wins. Settings or environment variables you changed in the dashboard are replaced if they differ from the file, and the update lists them first.

What each service becomes

  • Stock Postgres, MySQL, MongoDB and Redis imagesbecome managed databases with daily backups, using your file's image, username, password and database name. They stay private. Other images, like pgvector/pgvector, run as ordinary private apps, and their data is covered by volume backups.
  • Services that publish a port become public apps with HTTPS. Skiff serves one port per app, so only the first is used.
  • Services with no published port stay private, and only the stack can reach them.
  • A service with the same build, environment and volumes as an app, but its own command and no port, becomes that app's worker.

What's different from Compose

  • Folders on your machine, like ./nginx.conf:/etc/nginx.conf, can't be used because they won't exist on the server. Build the file into the image or use a named volume.
  • Volumes can only be shared between an app and its workers.
  • Health checks are used when they make an HTTP request. Otherwise a private service counts as ready once its port opens.
  • Not supported: privileged, network_mode, devices, extends, secrets and configs. Keys like restart and networks are ignored.
Previews aren't available for a stack's services, and they can't reach your team's other databases and buckets yet. Pushes only reach Skiff with GitHub connected, and an access token is only used when you create or update the stack, so connect GitHub for private repositories.