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.comPerfect 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 dcdOr 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 -dThis 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.comThe 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 -dWith DCD:
dcd up user@serverResult: 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: falsejobs: 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.dcdfile 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/dcdcargo install dcdGet the latest release for your platform:
dcd --versionStop 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.
