From 4aee6ea9f09cdbcf0b0742298868bb8dc2507cc1 Mon Sep 17 00:00:00 2001 From: amitrana01 Date: Thu, 11 Sep 2025 18:59:17 +0530 Subject: [PATCH] Make template 100% clone-and-deploy ready --- QUICK_DEPLOY.md | 110 +++++++++++++++++++++++++ docker-compose.dokploy-external-db.yml | 5 +- docker-compose.dokploy-simple.yml | 5 +- startup.sh | 3 +- 4 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 QUICK_DEPLOY.md diff --git a/QUICK_DEPLOY.md b/QUICK_DEPLOY.md new file mode 100644 index 0000000..b403fa7 --- /dev/null +++ b/QUICK_DEPLOY.md @@ -0,0 +1,110 @@ +# ๐Ÿš€ Quick Deploy Guide - Zero Changes Needed! + +This Django template is designed to deploy **without any code changes** - just set environment variables! + +## โœ… **Clone and Deploy in 3 Steps** + +### **Step 1: Clone Repository** +```bash +git clone https://github.com/your-username/django-template.git +cd django-template +``` + +### **Step 2: Set Environment Variables in Dokploy** +Set these **4 required variables** in Dokploy environment tab: + +```env +DOMAIN_NAME=yourdomain.com +ALLOWED_HOSTS=yourdomain.com,www.yourdomain.com +CSRF_TRUSTED_ORIGINS=https://yourdomain.com +SECRET_KEY=your-secret-key-here +``` + +**Optional variables:** +```env +DEBUG=False +SECURE_SSL_REDIRECT=True +GOOGLE_OAUTH2_CLIENT_ID=your-google-client-id +GOOGLE_OAUTH2_CLIENT_SECRET=your-google-client-secret +``` + +### **Step 3: Deploy** +1. **Dokploy Compose Path**: `./docker-compose.dokploy-simple.yml` +2. **Domain**: Set in Dokploy UI (service=web, port=8000) +3. **Deploy** ๐Ÿš€ + +## ๐ŸŽฏ **That's It! No Code Changes Required!** + +### **Default Values** (works out-of-the-box for testing): +- **DOMAIN_NAME**: `localhost` +- **ALLOWED_HOSTS**: `localhost,127.0.0.1` +- **CSRF_TRUSTED_ORIGINS**: `http://localhost:8000` +- **SECRET_KEY**: Development key (change for production!) +- **DEBUG**: `True` (change to `False` for production) + +### **What Happens Automatically:** +โœ… Database migrations run +โœ… User groups created (admin, staff, user) +โœ… Site configured with your domain +โœ… Social apps set up +โœ… Static files collected +โœ… Gunicorn starts serving your app + +## ๐Ÿ”ง **For Different Deployment Platforms** + +### **With Docker Database (Default)** +- **Compose file**: `docker-compose.dokploy-simple.yml` +- **Database**: Included PostgreSQL container +- **Storage**: Docker volumes for persistence + +### **With External Database** +- **Compose file**: `docker-compose.dokploy-external-db.yml` +- **Database**: Set `DATABASE_URL` environment variable +- **Examples**: Neon, Supabase, Railway, etc. + +## ๐Ÿงช **Test Locally First** (Optional) + +```bash +# 1. Set environment variables +export DOMAIN_NAME=localhost +export ALLOWED_HOSTS=localhost,127.0.0.1 +export SECRET_KEY=test-secret-key + +# 2. Test with Docker +docker-compose -f docker-compose.dokploy-simple.yml up + +# 3. Visit http://localhost:8000 +``` + +## ๐ŸŽ‰ **Environment Variable Examples** + +### **For `myapp.com`:** +```env +DOMAIN_NAME=myapp.com +ALLOWED_HOSTS=myapp.com,www.myapp.com +CSRF_TRUSTED_ORIGINS=https://myapp.com,https://www.myapp.com +SECRET_KEY=super-long-secret-key-generate-new-one +DEBUG=False +SECURE_SSL_REDIRECT=True +``` + +### **For `app.example.org`:** +```env +DOMAIN_NAME=app.example.org +ALLOWED_HOSTS=app.example.org +CSRF_TRUSTED_ORIGINS=https://app.example.org +SECRET_KEY=another-unique-secret-key +DEBUG=False +SECURE_SSL_REDIRECT=True +``` + +## โšก **Why This Works** + +- โœ… **No hardcoded domains** - everything uses environment variables +- โœ… **Sensible defaults** - works locally without any setup +- โœ… **Production ready** - just change a few env vars +- โœ… **Platform agnostic** - works on Dokploy, Railway, Heroku, etc. + +--- + +**Clone โžœ Set 4 env vars โžœ Deploy โžœ Done!** ๐Ÿš€ diff --git a/docker-compose.dokploy-external-db.yml b/docker-compose.dokploy-external-db.yml index f0f9afb..ba3dff2 100644 --- a/docker-compose.dokploy-external-db.yml +++ b/docker-compose.dokploy-external-db.yml @@ -5,11 +5,12 @@ services: - "8000:8000" environment: - DEBUG=False - - ALLOWED_HOSTS=dt.netcoptech.com,localhost,127.0.0.1 + - ALLOWED_HOSTS=${ALLOWED_HOSTS:-localhost,127.0.0.1} - DATABASE_URL=${DATABASE_URL} - SECRET_KEY=${SECRET_KEY} - DJANGO_SETTINGS_MODULE=django_project.settings.production - - CSRF_TRUSTED_ORIGINS=https://dt.netcoptech.com + - CSRF_TRUSTED_ORIGINS=${CSRF_TRUSTED_ORIGINS:-http://localhost:8000} + - DOMAIN_NAME=${DOMAIN_NAME:-localhost} - SECURE_SSL_REDIRECT=True - GOOGLE_OAUTH2_CLIENT_ID=${GOOGLE_OAUTH2_CLIENT_ID:-demo-google-client-id} - GOOGLE_OAUTH2_CLIENT_SECRET=${GOOGLE_OAUTH2_CLIENT_SECRET:-demo-google-client-secret} diff --git a/docker-compose.dokploy-simple.yml b/docker-compose.dokploy-simple.yml index 1c72141..4814073 100644 --- a/docker-compose.dokploy-simple.yml +++ b/docker-compose.dokploy-simple.yml @@ -5,11 +5,12 @@ services: - "8000:8000" environment: - DEBUG=True - - ALLOWED_HOSTS=dt.netcoptech.com,localhost,127.0.0.1 + - ALLOWED_HOSTS=${ALLOWED_HOSTS:-localhost,127.0.0.1} - DATABASE_URL=${DATABASE_URL:-postgresql://django_user:django_password@db:5432/django_db} - SECRET_KEY=${SECRET_KEY:-django-insecure-change-this-key} - DJANGO_SETTINGS_MODULE=django_project.settings.production - - CSRF_TRUSTED_ORIGINS=https://dt.netcoptech.com,http://dt.netcoptech.com + - CSRF_TRUSTED_ORIGINS=${CSRF_TRUSTED_ORIGINS:-http://localhost:8000} + - DOMAIN_NAME=${DOMAIN_NAME:-localhost} - SECURE_SSL_REDIRECT=False - GOOGLE_OAUTH2_CLIENT_ID=${GOOGLE_OAUTH2_CLIENT_ID:-demo-google-client-id} - GOOGLE_OAUTH2_CLIENT_SECRET=${GOOGLE_OAUTH2_CLIENT_SECRET:-demo-google-client-secret} diff --git a/startup.sh b/startup.sh index 550af8c..a8ded4a 100755 --- a/startup.sh +++ b/startup.sh @@ -20,7 +20,8 @@ echo "๐Ÿ”— Setting up social applications..." python manage.py setup_social_apps echo "๐Ÿ  Configuring site domain..." -python manage.py configure_site --domain=dt.netcoptech.com --name="Django Template" +DOMAIN_NAME=${DOMAIN_NAME:-localhost} +python manage.py configure_site --domain="$DOMAIN_NAME" --name="Django Template" echo "๐Ÿ“ Collecting static files..." python manage.py collectstatic --noinput