Installation¶
Complete guide for installing SATHI on Linux servers.
Prerequisites¶
System Requirements:
Ubuntu 20.04+ or Debian-based Linux
4GB RAM minimum (8GB recommended)
Python 3.13+
PostgreSQL 14+
Domain name (for SSL)
Required Software:
sudo apt update && sudo apt install -y \
python3.13 python3.13-venv python3.13-dev \
postgresql postgresql-contrib libpq-dev \
nginx supervisor memcached git \
build-essential libssl-dev python3-magic
Development Installation¶
Quick Setup¶
# 1. Clone repository
git clone https://github.com/your-org/chavi-prom.git
cd chavi-prom
# 2. Create virtual environment
python3.13 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 3. Setup PostgreSQL
sudo -u postgres psql -c "CREATE DATABASE chaviprom;"
sudo -u postgres psql -c "CREATE USER chaviprom_user WITH PASSWORD 'password';"
sudo -u postgres psql -c "GRANT ALL ON DATABASE chaviprom TO chaviprom_user;"
# 4. Configure environment
cp sampleenv.txt .env
# Edit .env with your settings
# 5. Run migrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic --noinput
# 6. Start server
python manage.py runserver
Production Installation¶
Step 1: System Setup¶
# Install all dependencies
sudo apt update && sudo apt install -y \
python3.13 python3.13-venv postgresql nginx \
supervisor memcached certbot python3-certbot-nginx
# Create system user
sudo useradd -m -s /bin/bash sathi
sudo usermod -aG www-data sathi
Step 2: Database Setup¶
sudo -u postgres psql << EOF
CREATE DATABASE chaviprom_prod;
CREATE USER chaviprom_prod WITH PASSWORD 'strong_password';
GRANT ALL ON DATABASE chaviprom_prod TO chaviprom_prod;
EOF
Step 3: Application Setup¶
sudo su - sathi
git clone https://github.com/your-org/chavi-prom.git
cd chavi-prom
python3.13 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Create .env file with production settings
nano .env
Production .env:
DJANGO_SECRET_KEY=your-secret-key
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=yourdomain.com
DJANGO_CSRF_TRUSTED_ORIGINS=https://yourdomain.com
DJANGO_DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
DJANGO_DATABASE_NAME=chaviprom_prod
DJANGO_DATABASE_USER=chaviprom_prod
DJANGO_DATABASE_PASSWORD=strong_password
DJANGO_SECURED_FIELDS_KEY=your-encryption-key
DJANGO_ENVIRONMENT=production
Step 4: Gunicorn Configuration¶
Create /home/sathi/chavi-prom/gunicorn_config.py:
import multiprocessing
bind = "127.0.0.1:8000"
workers = multiprocessing.cpu_count() * 2 + 1
accesslog = "/home/sathi/chavi-prom/logs/gunicorn_access.log"
errorlog = "/home/sathi/chavi-prom/logs/gunicorn_error.log"
loglevel = "info"
timeout = 120
Step 5: Supervisor Configuration¶
Create /etc/supervisor/conf.d/sathi.conf:
[program:sathi]
command=/home/sathi/chavi-prom/venv/bin/gunicorn \
--config /home/sathi/chavi-prom/gunicorn_config.py \
chaviprom.wsgi:application
directory=/home/sathi/chavi-prom
user=sathi
autostart=true
autorestart=true
stdout_logfile=/home/sathi/chavi-prom/logs/supervisor.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start sathi
Step 6: Nginx Configuration (HTTP Only - Before SSL)¶
Create initial HTTP-only configuration at /etc/nginx/sites-available/sathi:
upstream sathi_app {
server 127.0.0.1:8000 fail_timeout=0;
}
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
client_max_body_size 100M;
access_log /var/log/nginx/sathi_access.log;
error_log /var/log/nginx/sathi_error.log;
location /static/ {
alias /home/sathi/chavi-prom/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /home/sathi/chavi-prom/media/;
expires 7d;
add_header Cache-Control "public";
}
location / {
proxy_pass http://sathi_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
proxy_connect_timeout 120s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
}
Enable the site and test configuration:
sudo ln -s /etc/nginx/sites-available/sathi /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default # Remove default site
sudo nginx -t
sudo systemctl restart nginx
Verify HTTP access: Visit http://yourdomain.com to ensure the site loads.
Step 7: Obtain SSL Certificate with Let’s Encrypt¶
Prerequisites:
Domain name must point to your server’s IP address
Port 80 must be accessible (for Let’s Encrypt verification)
Nginx must be running with HTTP configuration
Obtain and Install Certificate:
# Run Certbot with Nginx plugin
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot will:
Verify domain ownership via HTTP challenge
Generate SSL certificates
Automatically modify your Nginx configuration to:
Add SSL certificate paths
Configure SSL protocols and ciphers
Set up HTTP to HTTPS redirect
Add security headers
Reload Nginx with new configuration
During the process, Certbot will ask:
Your email address (for renewal notifications)
Agreement to Terms of Service
Whether to redirect HTTP to HTTPS (choose Yes)
Verify SSL Configuration:
# Check certificate was installed
sudo certbot certificates
# Test Nginx configuration
sudo nginx -t
# Verify HTTPS works
curl -I https://yourdomain.com
Test Automatic Renewal:
# Dry run to test renewal process
sudo certbot renew --dry-run
Certificate Auto-Renewal:
Certbot automatically creates a systemd timer for renewal. Verify it’s active:
# Check timer status
sudo systemctl status certbot.timer
# View timer schedule
sudo systemctl list-timers | grep certbot
Certificates will auto-renew when they have 30 days or less remaining.
Manual Renewal (if needed):
sudo certbot renew
sudo systemctl reload nginx
Step 8: Firewall Setup¶
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Maintenance¶
Updating Application¶
sudo su - sathi
cd chavi-prom
git pull
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
exit
sudo supervisorctl restart sathi
Viewing Logs¶
# Application logs
tail -f /home/sathi/chavi-prom/logs/gunicorn_error.log
# Nginx logs
tail -f /var/log/nginx/sathi_error.log
# Supervisor status
sudo supervisorctl status
Troubleshooting¶
Service not starting:
sudo supervisorctl status sathi
sudo supervisorctl tail sathi stderr
Database connection errors:
# Test PostgreSQL connection
psql -U chaviprom_prod -d chaviprom_prod -h localhost
SSL certificate issues:
sudo certbot certificates
sudo certbot renew --force-renewal