Skip to content

Configuration ​

Mushak follows a "Convention over Configuration" philosophy, but sometimes you need to tweak the settings.

mushak.yaml ​

You can place a mushak.yaml file in the root of your project to override defaults.

yaml
# The port your application container listens on.
# Default: Automatically detected from EXPOSE in Dockerfile, or defaults to 80/3000/8080 checks.
internal_port: 3000

# The path Mushak probes to check if the app is ready.
# Default: /
health_path: /api/health

# How long to wait for the app to become healthy before failing the deploy.
# Default: 30 (seconds)
health_timeout: 60

# Override which service to expose (for docker-compose with multiple services)
# Default: Automatically detects services with "web" in the name, or uses first service
service_name: api

# Services that should persist across deployments (not restarted)
# Useful for databases, caches, and other stateful services
# Default: Automatically detects common infrastructure (postgres, mysql, redis, mongodb, etc.)
persistent_services:
  - postgres
  - redis
  - custom-database

Persistent Services ​

By default, Mushak automatically detects and preserves common infrastructure services during redeployments:

  • Databases: postgres, mysql, mariadb, mongodb, timescale
  • Caches: redis, memcached
  • Message Queues: rabbitmq
  • Search: elasticsearch

These services are:

  1. Started once on first deployment
  2. Not restarted on subsequent deployments (only application services restart)
  3. Kept running to avoid downtime and data loss

Volume Persistence:

Docker volumes are ALWAYS preserved across all deployments, regardless of whether services are marked as persistent. Mushak never removes volumes when cleaning up old containers. This means:

  • Database data persists across deployments
  • Uploaded files remain intact
  • Any data in named volumes or bind mounts is safe
  • You can safely redeploy dozens of times without data loss

Manual Override:

If you have custom infrastructure or want specific services to persist, add them to persistent_services:

yaml
persistent_services:
  - postgres      # Will persist even if not auto-detected
  - custom-cache  # Your custom service
  - background-processor  # Any service you want to keep running

Environment Variables ​

You can manage environment variables using the mushak env set command. Variables are stored securely on the server and injected into your application at runtime.

Environment file priority:

  • Mushak first looks for .env.prod on the server (/var/www/{app}/.env.prod)
  • Falls back to .env if .env.prod doesn't exist
  • Creates .env.prod by default if neither exists
  • During each deployment, the environment file is copied to the release directory

For Dockerfile projects, variables are passed via --env-file. For Docker Compose projects, the environment file is placed in the deployment directory, so you can reference variables in your docker-compose.yml like ${MY_VAR} or use env_file: .env.prod.

Docker Configuration ​

Dockerfile Projects ​

If you have a Dockerfile, Mushak builds it as a standard image.

  • Ensure you EXPOSE the port your app listens on.
  • Use CMD or ENTRYPOINT to start your process.

Docker Compose Projects ​

If you have a docker-compose.yml, Mushak treats it as a service stack.

  • Do not map ports to the host (e.g., - "80:80"). Mushak manages port mapping dynamically to avoid conflicts.
  • Mushak will automatically detect the web service by looking for services with "web" in the name (e.g., web, webapp, web-server). If no service with "web" is found, it uses the first service defined. You can override this with a mushak.yaml file by specifying service_name: your-service.

Container Name Overrides:

Mushak automatically overrides container_name entries in your docker-compose.yml to enable zero-downtime deployments. Even if you specify custom container names, Mushak will override them via docker-compose.override.yml:

  • Application services get versioned names: mushak-<app>-<sha>-<service> (e.g., mushak-myapp-abc123-web)
  • Infrastructure services get static names: <app>_<service> (e.g., myapp_postgres)

This allows old and new application containers to run side-by-side during deployments while keeping infrastructure services (databases, caches) on stable names that don't restart.