Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan Now×
Skip to content
World desk13 min

How to Deploy Django with PostgreSQL, Nginx and Gunicorn on a VPS

Deploy Django on a VPS with PostgreSQL, Nginx and Gunicorn using a secure, repeatable production workflow.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Deploy a Django site on one VPS with this request path: browser → Nginx → Gunicorn → Django → PostgreSQL. Nginx handles HTTP/HTTPS and static files, Gunicorn runs Django’s WSGI application, and PostgreSQL stores application data. The procedure below covers an Ubuntu-style Linux server, a non-root deployment user, systemd socket activation, protected settings, database migrations, HTTPS, and post-deployment checks.

What this architecture does

A single VPS is a practical production starting point for a small application, a small team, or a deployment that does not need containers or multiple application servers. Each component has a defined job:

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Component Responsibility
Browser Requests pages and assets over HTTP or HTTPS.
Nginx Terminates TLS, accepts public traffic, serves static and media files, and proxies dynamic requests through a private Unix socket.
Gunicorn Maintains worker processes and invokes Django’s WSGI application.
Django Runs URL routing, views, middleware, authentication, templates, and application logic.
PostgreSQL Stores relational application data and receives connections from Django.

Django supports both WSGI and ASGI. This guide uses Gunicorn with WSGI. If your project depends on long-lived asynchronous connections, WebSockets, or other ASGI-specific behavior, choose an ASGI server and architecture instead of treating Gunicorn WSGI as a drop-in replacement.

Django’s documentation is explicit: “The runserver command starts a lightweight development server, which is not suitable for production.” Use it only for local development.

#1 Best Overall
Sale
TOZO A1 Wireless Earbuds Bluetooth 5.3 Light Weight in Ear Headphones | IPX5 Waterproof,2 Mics for AI Calls,Immersive Premium Sound Bass Headset with Charging Case,32 EQ via App Black
  • [Ultra-Lightweight Ear Buds Designed for Small Ears] Each earbud weighs only 3.7g and features a compact, ergonomic in-ear design made especially for small ears. Secure, low-profile, and comfortable for workouts, all-day wear or overnight sleeping.The ultra-slim profile sits flush in your ear with no hard edges poking or rubbing, so you can even sleep on your side without discomfort.
  • [Immersive Stereo Sound with TOZO OrigX Technology] TOZO OrigX tuning delivers clear vocals, balanced mids, and natural stereo sound for music, podcasts, and videos.
  • [Long Battery Life for Daily Use] Get up to 7 hours of playtime on a single charge, with up to 32 hours total using the charging case—ideal for workdays, commuting, and extended listening sessions.
  • [Bluetooth 5.3 & Stable Connection] Bluetooth 5.3 provides fast pairing, stable wireless performance, and reduced dropouts as you move around home or office.
  • [Deep Bass with Clear Vocals] High-performance drivers produce punchy bass while keeping vocals clean and detailed for everyday listening.

Before you start

Server and domain prerequisites

  • A VPS running a supported Linux distribution, with a public IPv4 address and, if needed, IPv6.
  • SSH access to an administrative account. You will create a separate non-root user for the application.
  • A domain name whose DNS records can be pointed to the VPS.
  • A project that has a production dependency file such as requirements.txt or a lockfile, a WSGI module, and a working migration history.
  • A plan for PostgreSQL backups, migration rollback, and recovery before the first production release.

Choose the database location

PostgreSQL can run on the same VPS or on a managed/remote server. A local database is simple and keeps network latency low, but the VPS becomes a single failure domain. A remote database can simplify database backups and scaling, but requires network access controls, TLS decisions, and the PostgreSQL client build dependency. If PostgreSQL is remote, keep libpq-dev (or the equivalent development package for your distribution) available when installing Python drivers that compile against libpq.

Prepare the VPS

Log in over SSH with an administrative account, update the operating system, and install the tools needed to build and run the release. Package names vary by distribution; the following commands illustrate a Debian/Ubuntu-style server.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo apt update
sudo apt upgrade
sudo apt install python3 python3-venv python3-pip python3-dev build-essential git nginx ufw postgresql postgresql-contrib libpq-dev

If PostgreSQL is managed elsewhere, omit the local PostgreSQL server packages but retain the client libraries and libpq-dev when your driver needs them.

Create a deployment user and directories

sudo adduser deploy
sudo usermod -aG www-data deploy
sudo mkdir -p /srv/myproject
sudo chown -R deploy:deploy /srv/myproject

Use the new account for application files and releases. Do not run the Django application as root. Keep a separate directory for uploaded media if the application accepts user files, and ensure the account running Gunicorn can write only where the application actually needs to write.

Configure the firewall

Allow SSH before enabling the firewall so you do not lock yourself out, then permit web traffic.

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

PostgreSQL should not be exposed publicly unless a remote topology requires it. If the database is local, bind it to the local interface and allow only the application’s local connection. If it is remote, restrict inbound access to the VPS address and use the provider’s network controls as well as PostgreSQL authentication.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Sale
Smart Watch for Men Women Compatible with iPhone Samsung Android Phone 1.69 inch Full Touch Screen IP68 Waterproof Bluetooh Fitness Tracker Heart Rate/Sleep Monitor (Black)
  • 【IP68 Waterproof Multifunctinal Smart Watch】Torjalph fitness activity tracker smart watch is IP68 waterproof technology ,you can wear it when swimming,handwashing,it's rain-proof which means that you perform multiple exercise modes outside without worrying about sweat or rain corroding your fitness smart watch,and this watch equipped with a 230 mAh large capacity battery magnetic charging ,and this sports activity tracker watch can be used 5-7 days If fully charged.
  • 【Larger 1.83'' Full Screen Watch & Multi-dial Selection】1.83 inch full HD color touch screen smart watch for men / women provides excellent 240*284 resolution image quality ,This Bluetooth smart watch offers a better touch experience and remarkable immersion and ,more than 200 watch faces for you to choose from App"Da Fit ", you can change the dial style according to your mood to wear keeping the world on your wrist
  • 【Accurate Activity Tracker Smart Watch 】sports watch activity tracker uses sweat and dust resistant breathable silicone strap, our Fitness Tracker Smart Watch for Android iOS Phones supports 12 sports modes,walking,running,bicycle,swimming,badminton,basketball,football,rope skipping. This bluetooth calls smart watch for men women is lightweight and stylish, bringing more convenient and relaxing sports experience while also providing more protection.
  • 【Your 24 Hour Personal Daily Health Monitor】Fitness watch for women men full touch screen IP67 waterproof bluetooth smartwatch for Android iOS Phones with heart rate blood pressure monitor multifunction Andriod smart watch with steps counter sleep monitor sports fitness watch, monitoring blood oxygen saturation allows you to understand your physical condition in real time to track fitness progress ,to know your health status in time.
  • 【More Functions Bluetooth Call Smart Watch】This fitness activity smart watch full screen for iPhone and Android phones includes a bunch of new features including:The bluetooth smart watch can hang up the phone, receive and display WhatsAPP /Text /Facebook /Twitter /Messenger reminder.Support sedentary reminder, alarm clock, stopwatch, timer,weather information,music control, remote camera control compatible with Android 5.0 and above or iOS 9.0 and above smartphones.

Put the project on the server

Switch to the deployment user, clone the repository into the application directory, create an isolated virtual environment, and install the exact dependencies used by the release.

sudo -iu deploy
cd /srv/myproject
git clone YOUR_REPOSITORY_URL app
cd app
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt

Replace the repository placeholder with your real repository address; do not put credentials in the URL. Pin dependency versions and keep the commit, dependency file, and migration state that produced each release so you can reproduce or roll back it.

Store secrets outside source control

Create an environment file readable only by root and the service account. A common location is /etc/myproject.env.

sudo install -o root -g deploy -m 0640 /dev/null /etc/myproject.env
sudoedit /etc/myproject.env

Store values such as:

DJANGO_SECRET_KEY=replace-with-a-long-random-value
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=example.com,www.example.com
DJANGO_CSRF_TRUSTED_ORIGINS=https://example.com,https://www.example.com
DATABASE_URL=postgresql://app_role:[email protected]:5432/app_db

Use your project’s existing variable names if they differ. Protect the file, avoid committing it, and do not print it in shell history or diagnostic output. If the password contains characters with URL meaning, encode it correctly or use separate database settings instead of an unescaped URL.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Set Django for production

Production settings must be explicit. At minimum, set DEBUG=False, define the real hostnames, configure trusted HTTPS origins, and enable secure proxy and cookie behavior after Nginx is forwarding the correct headers.

Core settings

import os

DEBUG = os.environ.get('DJANGO_DEBUG', 'False').lower() == 'true'
ALLOWED_HOSTS = [h for h in os.environ.get('DJANGO_ALLOWED_HOSTS', '').split(',') if h]
CSRF_TRUSTED_ORIGINS = [u for u in os.environ.get('DJANGO_CSRF_TRUSTED_ORIGINS', '').split(',') if u]
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

Only enable the proxy setting when requests can reach Django through a proxy you control and Nginx sets the forwarded protocol consistently. Incorrect proxy configuration can create redirect loops or allow Django to misidentify an HTTP request as HTTPS. During an initial HTTP-only test, temporarily defer the HTTPS redirect; turn it on before public use.

Rank #3
New Bee Guitar Cable 10ft Electric Instrument Bass AMP Cord
  • [Low Noise High Fidelity] New bee guitar cord with 22AWG oxygen-free-copper center conductors provides enhanced signal transfer, the PVC insulation material and the high-density stranded copper double shield provide noise rejection for quiet operation
  • [Ideal for Choice] New bee 1/4 straight and right angle metal connectors, ensures a secure connection in any instrument, pedal, or amp jack. L shape great fro on stage guitar stands
  • [Wide Compatible] Suitable for mixer, power amplifier, microphone, effector, decoder, equalizer, electoronic organ, electric guitar, electric bass and other electronic equipments. Widely used in the installation of smart home, karaoke speaker, professional stage audio, etc
  • [Easy Disassemble] Making incidental repairs quick and easy! Very nice, flexible cable
  • [Dont Hesite to Order] 24 hours customer services and professional technology team are standing by

Static and media settings

Set a filesystem location for collected static assets and a separate location for user-uploaded media. The URL prefixes must match the Nginx configuration you will create later.

STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

Run the deployment check before exposing the site:

cd /srv/myproject/app
. .venv/bin/activate
python manage.py check --deploy

Treat every warning as a release issue. This check does not replace a review of firewall rules, database backups, filesystem permissions, or application-specific security settings.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Create and secure the PostgreSQL database

Local PostgreSQL

Use the PostgreSQL administrator account to create a dedicated role and database. Avoid sharing the default superuser with Django. An interactive session avoids placing a password in shell history.

sudo -u postgres psql

Inside psql, create an application role with a password, create a database owned by that role, and leave the administrative session:

CREATE ROLE app_role LOGIN PASSWORD 'use-a-unique-secret';
CREATE DATABASE app_db OWNER app_role;
q

Use a strong, unique password and place the same credential in the protected environment file. Grant only the permissions the application needs. Keep migrations and administrative tasks under a controlled release process rather than granting the application superuser privileges.

Remote PostgreSQL

For a remote database, set the host, port, database name, user, and password through environment variables or your project’s database URL. Configure the database firewall to accept connections from the VPS only, verify DNS or private networking, and require encrypted connections when the service supports them. Test connectivity from the VPS before diagnosing Django.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
BSIMB 15.6" Digital Family Calendar & Chore Chart, No Subscription Fees
  • Digital Family Calendar: BSIMB digital calendar wall touch screen puts an end to your chaotic life. Designed for busy families, the digital calendar keeps you organised and in step with your family. Assign different colours and tasks to each family member to make family scheduling easier and more intuitive.
  • Easy Setup and Auto-Sync: Plug in, connect to WLAN and auto-syn your electric calendar in minutes. Digital wall calendar compatible with Google calendar, iCloud calendar, Outlook calendar, Cozi calendar and Yahoo calendar. Add events directly on the device or through the ecalendar app. Electronic calendar stays current whether you're at work or traveling—no manual updates needed.
  • All-In-One Home Assistant: Smart calendar builds habits and encourage independence with personalised chores. Display daily meal plan to reduce the daily ‘What's for dinner?’ stress. To-do lists keep track of everything you want. Turning chores into valuable achievements with stars and rewards, making life easier and more enjoyable.
  • Manage Anytime Anywhere: BSIMB electronic calendar for family stay connected with the powerful ecalendar app. Access and manage your digital wall calendar anytime, anywhere with free features like stars & rewards, photo screensaver, chore charts, meals plans, to-do lists etc. Electronic planner paid features like Magic Import tailor advanced tools for users with special needs.
  • Stay in Touch with Loved Ones: Share photos or videos from your phone to electronic wall calendar with app, instantly update your life moment, and keep in touch with your family, especially those who are far away; you can also surprise your smart calendar digital wall by sending him a wish card; it's also great for keeping tech-illiterate elders in touch with the youngsters.

Run migrations and create an administrator

cd /srv/myproject/app
. .venv/bin/activate
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic --noinput

Migrations change durable production data. Back up the database before a migration that removes or transforms data, test the migration against a recent copy, and document the reverse or restore procedure. Include migrations in the release process rather than running them opportunistically from a web worker.

Run Gunicorn with systemd

Install Gunicorn inside the virtual environment and confirm the WSGI module path. If the Django project package is named config, the application object is commonly config.wsgi:application; use your project’s actual package name.

cd /srv/myproject/app
. .venv/bin/activate
pip install gunicorn
gunicorn --check-config config.wsgi:application

Create a socket unit

A Unix socket keeps Gunicorn off the public network. Create /etc/systemd/system/gunicorn.socket:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
[Unit]
Description=Gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock
SocketMode=0660
SocketUser=www-data
SocketGroup=www-data

[Install]
WantedBy=sockets.target

Create the service unit

Create /etc/systemd/system/gunicorn.service:

[Unit]
Description=Gunicorn daemon for Django
Requires=gunicorn.socket
After=network.target

[Service]
Type=notify
User=deploy
Group=www-data
WorkingDirectory=/srv/myproject/app
EnvironmentFile=/etc/myproject.env
ExecStart=/srv/myproject/app/.venv/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock config.wsgi:application
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

The three-worker value is an example, not a universal performance setting. Adjust worker count after observing memory use, request latency, and workload characteristics. Too many workers can exhaust a small VPS; too few can limit concurrency.

Enable and inspect Gunicorn

sudo systemctl daemon-reload
sudo systemctl enable --now gunicorn.socket
sudo systemctl status gunicorn.socket
sudo systemctl status gunicorn
sudo journalctl -u gunicorn -e
sudo stat /run/gunicorn.sock

Gunicorn’s systemd integration uses Type=notify; the socket is expected at /run/gunicorn.sock. If the service fails, inspect the journal for an incorrect working directory, missing environment variable, import error, permission problem, or unavailable database before changing Nginx.

Configure Nginx as the public gateway

Create a server block such as /etc/nginx/sites-available/myproject. Replace the domain and filesystem paths with your values.

server {
    listen 80;
    server_name example.com www.example.com;

    location /static/ {
        alias /srv/myproject/app/staticfiles/;
    }

    location /media/ {
        alias /srv/myproject/app/media/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

Enable the site and remove or disable the default site if it would catch the same hostname:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/myproject
sudo nginx -t
sudo systemctl enable nginx
sudo systemctl reload nginx

nginx -t must succeed before every reload. The alias paths must end with the expected slash and point to the directories populated by collectstatic and used for media. Keep media writable only where necessary; static files should normally be read-only to the web process.

The Nginx proxy configuration should pass the original host, client address, and protocol. The distribution’s proxy_params include commonly supplies these headers; verify its contents on your system. Django’s SECURE_PROXY_SSL_HEADER must match the header Nginx actually sends.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Point DNS to the VPS and enable HTTPS

  1. Create an A record for the bare domain pointing to the VPS IPv4 address. Add an AAAA record only if IPv6 is configured and reachable.
  2. Point the www name to the VPS as well, or choose one canonical hostname and redirect the other.
  3. Put every hostname users can enter into ALLOWED_HOSTS and the corresponding HTTPS origins into CSRF_TRUSTED_ORIGINS.
  4. Confirm that DNS resolves to the correct server before requesting a certificate.
  5. Use Let’s Encrypt or another certificate service to obtain and automatically renew a certificate, then configure Nginx to listen on 443 and redirect HTTP to HTTPS.

After TLS is installed, ensure the HTTPS server block contains the same static, media, and Gunicorn locations, and that the HTTP block performs only the intended redirect. Test renewal before relying on automatic renewal, and monitor certificate expiration.

Release procedure for future deployments

Use a repeatable release sequence so code, dependencies, static assets, and database schema move together.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  1. Take or verify a current database backup and record the release commit.
  2. Fetch the new code as the deployment user and check out the exact release commit.
  3. Install or update pinned dependencies in the virtual environment.
  4. Review environment changes and run python manage.py check --deploy.
  5. Run python manage.py migrate using the controlled migration plan.
  6. Run python manage.py collectstatic --noinput.
  7. Restart or reload Gunicorn: sudo systemctl restart gunicorn.
  8. Validate the socket, service status, Nginx configuration, public HTTPS endpoint, login flow, admin, static files, media permissions, and representative database operations.

For zero-downtime or multi-server releases, use a separate release directory, health checks, automated migrations that are backward compatible, and a rollback process that includes both code and data. A simple in-place VPS release is easier to operate, but it can briefly interrupt requests during a restart.

Verify the complete request path

Check services and logs

sudo systemctl is-active nginx
audo systemctl is-active gunicorn.socket
sudo systemctl is-active gunicorn
sudo journalctl -u gunicorn --since '15 minutes ago'
sudo tail -n 100 /var/log/nginx/access.log
sudo tail -n 100 /var/log/nginx/error.log

Correct the typo if you copy the second command: it should be sudo systemctl is-active gunicorn.socket. Keep service and access logs available long enough to investigate failed releases, authentication errors, and upstream timeouts.

Test locally and publicly

curl --unix-socket /run/gunicorn.sock http://localhost/
curl -I http://127.0.0.1/
curl -I https://example.com/

The socket request tests Gunicorn without Nginx. The local HTTP request tests Nginx routing, and the public HTTPS request tests DNS, TLS, Nginx, Gunicorn, and Django together. A 400 response commonly indicates an incomplete ALLOWED_HOSTS list; a 403 on a form often points to CSRF origin or cookie settings; a 502 means Nginx cannot obtain a valid upstream response.

Production acceptance checklist

  • DEBUG is false and check --deploy has no unresolved warnings.
  • Only the intended SSH and web ports are reachable from the Internet.
  • Secrets and database credentials are outside Git with restrictive permissions.
  • PostgreSQL accepts only the required network connections.
  • Gunicorn starts on boot and its Unix socket has the correct ownership and mode.
  • Nginx configuration tests cleanly and serves static files without sending them through Django.
  • HTTP redirects to HTTPS, the certificate is valid, and renewal is scheduled.
  • Migrations completed from a known backup point.
  • Admin login, CSRF-protected forms, static assets, media uploads, and representative application pages work.
  • Logs, database backups, restore instructions, and an owner for incident response exist.

Troubleshooting by symptom

Symptom Likely causes Checks and fixes
502 Bad Gateway Gunicorn is stopped, the socket path differs, or Nginx cannot read the socket. Inspect systemctl status gunicorn, journalctl -u gunicorn, stat /run/gunicorn.sock, and the Nginx error log. Align proxy_pass, socket ownership, and the service path.
Gunicorn exits immediately Import error, missing environment variable, wrong working directory, or dependency mismatch. Run the exact ExecStart command as the deployment user with the environment loaded, then fix the first traceback shown in the journal.
400 Invalid HTTP_HOST The requested domain is absent from ALLOWED_HOSTS. Add the exact hostname, reload the service, and confirm DNS is not pointing to an old server.
403 CSRF failure The HTTPS origin is absent, forwarded protocol is wrong, or cookies are not secure in the expected way. Check CSRF_TRUSTED_ORIGINS, Nginx forwarded headers, and SECURE_PROXY_SSL_HEADER; test the canonical hostname.
CSS or JavaScript returns 404 collectstatic was not run, STATIC_ROOT differs from Nginx’s alias, or permissions block reads. Run collectstatic --noinput, compare paths exactly, and request the asset directly with curl -I.
Uploads fail The media directory does not exist, is not writable by Django, or Nginx’s alias is wrong. Create the directory with deliberate ownership and mode, verify MEDIA_ROOT, and ensure Nginx can read uploaded files.
Database connection error Incorrect URL, unavailable host or port, rejected network rule, invalid password, or missing driver library. Test the host and port from the VPS, verify PostgreSQL role permissions and firewall rules, and install the required client/build package.
Redirect loop Django believes the request is HTTP while Nginx has redirected it to HTTPS. Verify Nginx’s forwarded protocol header and Django’s proxy setting; avoid enabling a proxy trust rule for an uncontrolled proxy.

When a different architecture is better

Option Strength Trade-off or trigger to change
Single VPS with Nginx, Gunicorn, and PostgreSQL Direct control, low conceptual overhead, and predictable placement of code and data. You maintain OS updates, certificates, backups, monitoring, failover, and capacity. One server is a failure domain.
PaaS Managed build, deploy, TLS, and often scaling workflows. Less control over the runtime and networking; platform-specific deployment behavior and recurring service charges.
Docker Compose on one VPS Repeatable service images and clearer separation between application and database containers. You still maintain the host, persistent volumes, upgrades, backups, networking, and TLS.
Caddy or another automated web proxy Simpler certificate issuance and renewal in some setups. Configuration syntax, operational tooling, and existing team knowledge may favor Nginx instead.
Managed PostgreSQL Offloads much of database maintenance and can provide automated backups or replicas. Network latency, provider-specific limits, cost, and the need to secure the database connection.
ASGI deployment Supports asynchronous Django features and protocols that require ASGI. Requires an ASGI server and possibly a different worker/proxy design; WSGI Gunicorn is not sufficient for every asynchronous workload.

Move beyond one VPS when availability requirements, traffic, concurrency, team size, deployment frequency, or recovery objectives justify the added operational complexity. The decision should account for certificate management, static and media storage, automated CI/CD, database backups and rollback, and whether the application is WSGI or ASGI.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Operational habits that prevent avoidable outages

  • Patch the operating system and Python dependencies on a schedule, testing upgrades before production.
  • Keep database backups off the VPS and perform restoration tests; a backup that has never been restored is only an assumption.
  • Monitor disk space, memory, load, PostgreSQL health, Gunicorn restarts, Nginx errors, certificate expiry, and backup success.
  • Rotate secrets deliberately and restart services after changing environment files.
  • Use least-privilege service accounts and review which directories are writable by Gunicorn or Nginx.
  • Record the deployed commit, dependency lock state, migration state, and configuration changes for every release.
  • Document how to stop traffic, restore the database, roll back code, renew certificates, and recreate the server.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.