Updated the README.md to enhance the deployment guide for HestiaCP and Django with Gunicorn, including formatting improvements and additional sections.
79 lines
2.7 KiB
Markdown
79 lines
2.7 KiB
Markdown
# HestiaCP + Django + Gunicorn Deployment Guide
|
||
|
||
**Simple, fast and reliable way** to run Django applications on HestiaCP using Gunicorn (unix socket) and NGINX reverse proxy — without manual nginx.conf editing every time.
|
||
|
||
Prepared by: **MohammadAmin Baranzehi**
|
||
Website/Contact: [hacktube.ir](https://hacktube.ir)
|
||
Last updated: February 2026
|
||
|
||
## Features
|
||
- Unix socket for secure & fast communication
|
||
- Custom NGINX templates (no subfolder needed)
|
||
- One-command systemd service creation
|
||
- Static/media files served directly by NGINX
|
||
- Tested on Ubuntu 22.04 + HestiaCP 1.6.x+
|
||
|
||
## Requirements
|
||
- HestiaCP with NGINX proxy mode
|
||
- Django project in `/home/user/web/yourdomain.com/public_html/`
|
||
- Python 3.10+ and virtualenv
|
||
- Gunicorn installed in venv
|
||
|
||
## Step-by-Step Deployment Checklist
|
||
|
||
### 1. Place Custom NGINX Templates
|
||
Copy files **directly** (no subfolder) to:
|
||
/usr/local/hestia/data/templates/web/nginx/django-gunicorn.tpl
|
||
/usr/local/hestia/data/templates/web/nginx/django-gunicorn.stpl
|
||
textSet permissions:
|
||
```bash
|
||
sudo chown root:root /usr/local/hestia/data/templates/web/nginx/django-gunicorn.*
|
||
sudo chmod 644 /usr/local/hestia/data/templates/web/nginx/django-gunicorn.*
|
||
2. Apply Template in HestiaCP Panel
|
||
|
||
Go to: Web → Edit domain (e.g. example.com)
|
||
Select django-gunicorn in NGINX Template (or Proxy Template)
|
||
Click Save
|
||
Force rebuild (recommended):Bashsudo v-rebuild-web-domain amin example.com yes
|
||
sudo systemctl restart nginx
|
||
|
||
3. Create & Start Gunicorn Service
|
||
Run:
|
||
Bashadd-gunicorn-service example.com amin yourprojectname
|
||
# Example: add-gunicorn-service panel.example.com amin zamzam
|
||
Restart:
|
||
Bashsudo systemctl restart gunicorn-example.com
|
||
4. Verify Everything
|
||
|
||
Service status:Bashsudo systemctl status gunicorn-example.com
|
||
Socket check:Bashls -l /home/amin/web/example.com/public_html/gunicorn.sock
|
||
# Expected: srw-rw---- 1 amin www-data ...
|
||
Fix socket permissions if needed:Bashsudo chown amin:www-data gunicorn.sock
|
||
sudo chmod 660 gunicorn.sock
|
||
sudo systemctl restart gunicorn-example.com
|
||
Fix db.sqlite3 permissions:Bashsudo chown amin:www-data db.sqlite3
|
||
sudo chmod 664 db.sqlite3
|
||
|
||
5. Test & Monitor
|
||
|
||
Open: https://example.com
|
||
Real-time Gunicorn logs:Bashjournalctl -u gunicorn-example.com -f
|
||
NGINX logs:Bashtail -f /var/log/nginx/error.log
|
||
|
||
Quick Fixes
|
||
|
||
502 Bad Gateway → Check socket permissions + rebuild domain
|
||
Readonly database → chown/chmod db.sqlite3
|
||
Default page shows → mv index.html index.html.bak
|
||
Template not in list → Force rebuild + logout/login panel
|
||
|
||
Important Notes
|
||
|
||
Set DEBUG = False in production
|
||
After code changes: git pull → collectstatic → migrate → restart gunicorn
|
||
For new domains: Repeat steps 2–5 only (templates stay forever)
|
||
|
||
Enjoy your stable Django setup! 🚀
|
||
Prepared with ❤️ by MohammadAmin Baranzehi
|
||
https://hacktube.ir
|