System Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 20.04 LTS | Ubuntu 22.04 / 24.04 LTS |
| CPU | 2 vCPUs | 4 vCPUs |
| RAM | 2 GB | 4 GB+ |
| Disk | 20 GB | 40 GB+ SSD |
| Ports | 80, 443 | 80, 443, 8090 |
Software dependencies (Docker, Python 3, Caddy, Git) are installed automatically.
Fresh Installation
One-Command Install
SSH into your server as root and run:
curl -fsSL https://raw.githubusercontent.com/SMSLYCLOUD/smsly-hosting/main/install.sh -o /tmp/install.sh
sudo bash /tmp/install.shWhat Happens During Installation
Pre-flight
Checks OS, root access, available resources
Dependencies
Installs Docker, Python, system packages. Stops conflicting services
Configuration
Generates secrets: Django SECRET_KEY, Fernet key, DB/Redis passwords, HMAC gateway secret
Deployment
Builds and starts all Docker containers
Database
Waits for PostgreSQL, syncs passwords, runs Django migrations
Admin User
Creates admin superuser (credentials saved to /opt/smsly-hosting/.credentials)
Reverse Proxy
Installs Caddy for HTTP or HTTPS with auto-SSL
Verification
Runs health checks, prints container status
After Installation
- Open the URL shown in the terminal
- Log in with
adminand the password in/opt/smsly-hosting/.credentials - (Recommended) Change the admin password (Settings → Security)
- Configure your cloud providers (Settings → Cloud)
Deployment Modes
IP Mode (Quick Start)
- • Access:
http://YOUR_IP - • No domain needed
- • Best for testing
- • Select option 1 during install
SSL Mode (Production) ✦
- • Access:
https://your-domain.com - • Auto Let's Encrypt SSL
- • Requires DNS A record
- • Select option 2 during install
Updating CloudNeuron
From the Terminal
Full Update (Frontend + Backend)
cd /opt/smsly-hosting
sudo bash install.sh --updateFrontend Only (1-2 min, no backend downtime)
cd /opt/smsly-hosting
sudo bash install.sh --update-frontendBackend Only (includes migrations)
cd /opt/smsly-hosting
sudo bash install.sh --update-backendRollback on Failure
If an update fails, the installer automatically:
- Stops new containers
- Restores the previous
.envbackup - Pops the git stash (rolls back code)
Manual rollback:
cd /opt/smsly-hosting
git log --oneline -n 5 # Find the previous commit
git checkout <commit-hash> # Roll back
docker compose -f docker-compose.prod.yml up -d --buildFrom the Dashboard
Admins can trigger updates from Settings → System → Update Software.
Managing Services
View Container Status
cd /opt/smsly-hosting
docker compose -f docker-compose.prod.yml psView Logs
# All services
docker compose -f docker-compose.prod.yml logs -f
# Specific service
docker compose -f docker-compose.prod.yml logs -f backend
docker compose -f docker-compose.prod.yml logs -f frontendRestart Services
# Restart everything
docker compose -f docker-compose.prod.yml restart
# Restart specific service
docker compose -f docker-compose.prod.yml restart backendHealth Check
curl http://localhost:8090/healthContainer Map
| Service | Port | Purpose |
|---|---|---|
| backend | 8000 | Django API (Gunicorn) |
| frontend | 3000 | Next.js SSR |
| nginx | 8090 | Internal routing |
| db | 5432 | PostgreSQL 16 |
| redis | 6379 | Cache + Celery broker |
| celery | — | Background task worker |
| celery-beat | — | Periodic task scheduler |
Database Operations
Backup
cd /opt/smsly-hosting
docker compose -f docker-compose.prod.yml exec db \
pg_dump -U smsly_admin smsly_hosting | gzip > backup_$(date +%Y%m%d).sql.gzAutomated Backups
Add to root crontab (crontab -e):
# Daily at 2 AM
0 2 * * * cd /opt/smsly-hosting && docker compose -f docker-compose.prod.yml exec -T db pg_dump -U smsly_admin smsly_hosting | gzip > backups/daily_$(date +\%Y\%m\%d).sql.gzRestore from Backup
# Stop write-services
docker compose -f docker-compose.prod.yml stop backend celery celery-beat
# Restore
gunzip -c backup_20260211.sql.gz | \
docker compose -f docker-compose.prod.yml exec -T db psql -U smsly_admin -d smsly_hosting
# Restart
docker compose -f docker-compose.prod.yml start backend celery celery-beatReset Admin Password
docker compose -f docker-compose.prod.yml exec backend python manage.py shell -c \
"from django.contrib.auth import get_user_model; User = get_user_model(); u = User.objects.get(username='admin'); u.set_password('your_new_password'); u.save(); print('Done.')"SSL & Custom Domains
Switch from IP Mode to SSL
- Create a DNS A record pointing to your server IP
- Edit Caddyfile:
nano /etc/caddy/Caddyfile
your-domain.com {
reverse_proxy localhost:8090
encode gzip
}- Update
.env— setDOMAIN,USE_SSL=true,ALLOWED_HOSTS,CSRF_TRUSTED_ORIGINS - Restart:
systemctl restart caddy && docker compose -f docker-compose.prod.yml restart backend
Troubleshooting
Dashboard Not Loading
Database Connection Error
Build Fails During Update
Caddy SSL Error
Container Keeps Restarting
Security Hardening
Post-Install Checklist
Firewall Setup (UFW)
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableCredential Locations
| File | Purpose | Permissions |
|---|---|---|
| /opt/smsly-hosting/.env | All secrets & config | chmod 600 |
| /opt/smsly-hosting/.credentials | Admin login info | chmod 600 |