dsd-vps-kamal

A django-simple-deploy plugin for deploying Django projects to any VPS using Kamal.
Hetzner, DigitalOcean, Linode et al. — if you can SSH into it, you can deploy to it.
- Current Status 🙋♂️
- Installation 💻
- Configuration-only mode
- Fully automated deployment ⚡
- Options
- Installing Kamal 🔧
- Development 🛠️
- Special Thanks ❤️
- License 📄
Current Status 🙋♂️
This plugin is in a pre-1.0 development phase. It's ready for use, but the API is not yet stable. See the roadmap to v1 for what's planned.
Installation 💻
pip install dsd-vps-kamal
Then add django_simple_deploy to INSTALLED_APPS in your settings.py:
INSTALLED_APPS = [
# ...
"django_simple_deploy",
]
Usage 🧑🔧
Configuration-only mode
By default, the plugin configures your project for deployment but doesn't actually deploy. You review the changes, commit, and deploy yourself:
python manage.py deploy --ip-address <your-vps-ip>
This generates all the files Kamal needs — deploy.yml, Dockerfile, secrets, and production settings. Review the changes, then:
git add .
git commit -m "Configured for deployment via Kamal."
rvx kamal setup # see »Installing Kamal« below for more details
Fully automated deployment ⚡
Pass --automate-all and the plugin handles everything — configuration, committing, and running kamal setup for you:
python manage.py deploy --automate-all --ip-address <your-vps-ip>
This requires a few things to be in place:
- VPS provisioning is out of scope (for now) — bring your own server; this command does not create or configure the VPS itself yet.
- SSH root access —
ssh root@<your-vps-ip>must work without a password prompt - Docker running locally — the Docker daemon needs to be active on your machine. We recommend Docker Desktop.
- Kamal installed locally — see Installing Kamal below
Options
--ip-address (required)
The IPv4 address of your VPS. This is how the plugin knows where to deploy.
--host (required for HTTPS, optional otherwise)
A domain name for Kamal's proxy routing, e.g. myapp.example.com. If you've pointed a DNS record at your VPS, pass it here:
python manage.py deploy --ip-address <your-vps-ip> --host myapp.example.com
If omitted, your app is served over HTTP on the IP address (no automatic TLS certificate).
--sqlite (optional)
Use SQLite instead of PostgreSQL:
python manage.py deploy --ip-address <your-vps-ip> --sqlite
Uses dj-lite for production-ready SQLite by default.
Installing Kamal 🔧
Kamal is a Ruby gem. If you already have Ruby set up:
gem install kamal
If you'd rather not manage a Ruby environment, we recommend rv:
brew install rv # see https://github.com/spinel-coop/rv#installation for other OSes
rv tool install kamal
Then use rvx kamal wherever you'd normally run kamal. The plugin detects rv automatically when using --automate-all.
Development 🛠️
Install Just to run the development commands:
just dev-setup # clones core + installs everything in editable mode
## Other `just` recipes for development:
lint # Check linting (no fixes)
format # Format code
test-unit # Run unit tests
test-integration # Run integration tests
All available just commands:
just --list
Special Thanks ❤️
- Eric Matthes for django-simple-deploy — making Django deployment accessible to everyone
- David Heinemeier Hansson for Kamal — zero-downtime deployments to any VPS without the complexity
- Jeff Triplett for django-startproject — a fantastic project template and inspiration
- Adam Hill for dj-lite — production-ready SQLite for Django
- The Djangonauts program & Team Venus 🪐 - Session 6
License 📄
Metadata
Release files for dsd-vps-kamal 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dsd_vps_kamal-0.2.0.tar.gz | 16.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dsd_vps_kamal-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.5 kB
Release files / dsd_vps_kamal-0.2.0.tar.gz
| Download URL | dsd_vps_kamal-0.2.0.tar.gz |
|---|---|
| Size | 16.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1aa3a4f8e4b8276de56c17fb2462e3a60542e1b1d648e106b55ce390a1ee9038
|
|
BLAKE2b-256 checksum How to use checksums |
8c27649f9a7826df0d0ea754bd6c4145b767b211bca25c722197ffe257b0b117
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 13, 2026.
Transparency logRelease files / dsd_vps_kamal-0.2.0-py3-none-any.whl
| Download URL | dsd_vps_kamal-0.2.0-py3-none-any.whl |
|---|---|
| Size | 16.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9ca277b7bc3ea0978046d24d52bad7ceca2e907acd2a5d167c4a9a7e25929d56
|
|
BLAKE2b-256 checksum How to use checksums |
3fd8dbf346618269f5f9710e9c68f05fb53b49ddb584b35c956f38a16a9c8e86
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 13, 2026.
Transparency log