Introduction
Getting started
Deploy Docker containers to production with zero-downtime, automatic SSL, and encrypted secrets. No Kubernetes required.
Installation
Install the Odysseus gems and set up your first deployment configuration.
Configuration
Learn how to configure services, servers, proxy settings, and more.
Deployment
Deploy your applications with rolling updates and health checks.
CLI Reference
Complete reference for all Odysseus commands and options.
Odysseus is a production-grade deployment tool that makes it simple to deploy Docker containers to any server with SSH access. It handles the complexity of zero-downtime deployments, SSL certificates, and service orchestration so you can focus on building your application.
Quick start
Get your first deployment running in minutes. Odysseus uses a single deploy.yml file to define your entire deployment configuration.
Install Odysseus
Odysseus is distributed as Ruby gems. Install the CLI tool to get started:
gem install odysseus-cli
Or add it to your Gemfile for project-specific installations:
gem 'odysseus-cli'
Create your configuration
Create a deploy.yml file in your project root:
service: myapp
image: myregistry/myapp
servers:
web:
hosts:
- app.example.com
proxy:
hosts:
- myapp.example.com
app_port: 3000
ssl: true
ssl_email: admin@example.com
env:
clear:
RAILS_ENV: production
secret:
- DATABASE_URL
- RAILS_MASTER_KEY
ssh:
user: root
keys:
- ~/.ssh/id_ed25519
Prerequisites
Your target server needs Docker and Caddy installed. Odysseus manages Docker containers and configures Caddy as a reverse proxy for automatic HTTPS.
Deploy your application
Build your Docker image and deploy:
odysseus deploy --build --image latest
Odysseus will:
- Build your Docker image locally
- Transfer it to your server (or push to a registry)
- Start the new container
- Wait for health checks to pass
- Update Caddy to route traffic to the new container
- Gracefully drain the old container
- Clean up old containers
First deployment
On first deployment, Odysseus will set up Caddy routes and obtain SSL certificates. Make sure your DNS is configured to point to your server.
Core concepts
Understanding these concepts will help you get the most out of Odysseus.
Services and roles
A service is your application. Each service can have multiple roles:
- web: HTTP services that receive traffic through Caddy
- jobs: Background workers (like Sidekiq or GoodJob)
- Custom roles with specific commands
Zero-downtime deployments
Odysseus achieves zero-downtime through a rolling deployment strategy:
- New container starts alongside the old one
- Health checks verify the new container is ready
- Caddy adds the new container to its upstream pool
- Old container is gracefully drained
- Old container is stopped after connections close
Secrets management
Sensitive values are stored in an encrypted file using AES-256-GCM encryption. Generate a master key and encrypt your secrets:
odysseus secrets generate-key
odysseus secrets encrypt --input secrets.yml --file secrets.yml.enc
What's next?
Now that you understand the basics, dive deeper into specific topics:
- Configuration reference - All configuration options explained
- Deployment strategies - Local builds, remote builds, and registry mode
- Host providers - Static hosts and AWS Auto Scaling Groups
- Accessories - Run databases and other services alongside your app
Getting help
Odysseus is actively developed and we're here to help.
Report an issue
Found a bug or have a feature request? Open an issue on GitHub:
Contributing
Odysseus is open source and contributions are welcome. See the contributing guide to get started.

