The simplest way to deploy Docker Compose applications to any server
Stop wrestling with complex CI/CD. Start shipping faster.
π― Quick Start β’ π₯ Features β’ π Examples β’ π οΈ Install
You've built something amazing locally. docker-compose up
works perfectly. Now you need to deploy it...
Option 1: Managed Platforms
- πΈ Expensive as you scale
- π Vendor lock-in
- βοΈ Limited customization
- π« Not all apps supported
Option 2: Complex CI/CD
- π Hours learning Kubernetes/Docker Swarm
- π§ Complex pipeline setup
- π More things to break
- β° Weeks to get right
What if there was a third way?
DCD gives you the simplicity of Heroku with the power of your own server. Deploy Docker Compose apps to any VPS with a single command.
# That's it. Your app is live. π
dcd up user@your-server.com
Perfect for:
- ποΈ Personal projects that outgrew localhost
- π‘ Side hustles that need production deployment
- π Startups wanting infrastructure control
- π¨βπ» Developers who value simplicity over complexity
No YAML hell, no pipeline setup. If it runs with docker-compose
, it deploys with DCD.
From code change to live production in under 30 seconds. No build queues, no waiting.
Deploy to any Linux server you control. Keep your data, control your costs.
Drop-in action for automatic deployments. Perfect CI/CD in 5 lines of YAML.
$5/month VPS vs $20+/month managed platform. DCD pays for itself immediately.
# macOS
brew install g1ibby/dcd/dcd
# Other platforms
cargo install dcd
Or download from releases
# 1. Have a docker-compose.yml? β
# 2. Have SSH access to a server? β
# 3. Deploy!
dcd up user@your-server.com
# That's literally it. Your app is live!
Add this to .github/workflows/deploy.yml
:
- name: Deploy to production
uses: g1ibby/dcd/dcd-deploy@v1
with:
target: ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
Push to main = instant deployment β‘
I created DCD to solve my own deployment frustrations while building HomeLLM - a self-hosted AI platform with Open WebUI, LiteLLM proxy, PostgreSQL, and Traefik.
The Pain Before DCD: Every deployment was a manual nightmare:
ssh user@my-server.com
cd /opt/homellm
git pull origin main
docker-compose down
docker-compose pull
docker-compose up -d
This process took 5-10 minutes and often failed. I avoided deploying updates, which meant bugs stayed unfixed and features took weeks to reach production.
After Building DCD:
dcd up user@my-server.com
The transformation:
- β‘ 10x faster
- π 100% reliable
- π Deploy confidence
- π― Focus on features
See the live deployment workflow β
Now HomeLLM automatically deploys every time I push to main. What used to be a stressful weekend task is now a seamless part of my development flow.
Before DCD:
# Every deployment was a nightmare
ssh user@server
git pull
docker-compose down
docker-compose pull
docker-compose up -d
With DCD:
dcd up user@server
Result: Went from deploying once a week (too scary) to deploying multiple times per day. Shipped features faster, caught bugs earlier, grew revenue 3x.
- π³ Any Docker Compose app
- π Web apps (React, Vue, Next.js...)
- ποΈ Full-stack apps with databases
- π€ AI/ML applications
- π Data analytics platforms
- π API services and microservices
- π§ Ubuntu/Debian servers
- βοΈ Any VPS (DigitalOcean, Linode, AWS EC2...)
- π Self-hosted servers
- π Private infrastructure
π Full Command Reference
dcd analyze
- Preview what will be deployeddcd up <target>
- Deploy or update your appdcd status <target>
- Check deployment statusdcd destroy <target>
- Clean removal
-f, --file <FILES>... Docker Compose files
-e, --env-file <FILES>... Environment files
-i, --identity <KEY> SSH private key (Auto-detects ~/.ssh/id_rsa or ~/.ssh/id_ed25519 if not specified)
-w, --workdir <DIR> Remote working directory
-v, --verbose Debug output
# Multiple compose files
dcd -f docker-compose.yml -f docker-compose.prod.yml up user@server
# Custom SSH key and port
dcd -i ~/.ssh/deploy_key up user@server.com:2222
# Different environment
dcd -e .env.production up user@prod-server.com
π GitHub Actions Integration
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: g1ibby/dcd/dcd-deploy@v1
with:
target: ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
- uses: g1ibby/dcd/dcd-deploy@v1
with:
command: up
target: ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}
compose_files: "docker-compose.yml docker-compose.prod.yml"
env_files: ".env.prod"
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
remote_dir: "/opt/myapp"
no_health_check: false
jobs:
deploy:
environment: production # GitHub environment with secrets
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
βοΈ Technical Details
- Analyzes your Docker Compose configuration locally
- Syncs necessary files to your server via SSH/SFTP
- Installs Docker if needed (optional)
- Deploys using
docker compose up
- Verifies health checks pass
- Reports success or failure
- Automatically detects referenced files in volumes
- Syncs only what's needed
- Preserves file permissions
- Creates backups before updates
- Scans compose files for variable usage
- Sources from local environment
- Generates
.env.dcd
file for remote deployment - Secure handling of secrets
- Uses SSH key authentication
- Files transferred over encrypted SFTP
- No credentials stored on remote server
- Configurable working directories
Star this repo if DCD helps your deployments! β
Open an issue - we respond fast!
Join discussions and help shape DCD's future.
brew install g1ibby/dcd/dcd
cargo install dcd
Get the latest release for your platform:
dcd --version
Stop spending hours on deployment setup. Start shipping features.
# Install DCD
brew install g1ibby/dcd/dcd # macOS
# cargo install dcd # Other platforms
# Deploy your app
dcd up user@your-server.com
Made with β€οΈ for developers who want to ship, not configure
π Report Bug β’ π‘ Request Feature β’ π Documentation
While DCD handles most Docker Compose deployments perfectly, there are a few current limitations:
- Build Context: Services using
build:
directive aren't supported yet. Use pre-built images from registries instead. - Platform Support: Currently optimized for Debian/Ubuntu systems. Other Linux distributions may need adjustments.