Recommended Free Tools
The reliable production layout is: a supported Ubuntu Server LTS VPS, a non-root administrator, a dedicated application user, a Python virtual environment, Gunicorn (with an ASGI worker for FastAPI or other ASGI apps), systemd for boot-time supervision, Nginx as the public reverse proxy, and UFW allowing only the ports you need. Build and test those layers in that order, and your Django, Flask, or FastAPI application can restart after a crash or reboot without exposing its application server directly to the internet.
Antihost offers Linux VPS plans with full root access, unlimited traffic on a 1 Gbps port and a 14-day free trial.
What each layer does
A VPS provider gives you a virtual machine; it does not install or operate your Python application stack for you. You add Ubuntu, Python, your framework, the application server, Nginx, and the firewall.
As an Amazon Associate I earn from qualifying purchases.
Free tools Windows power users keep installed
One-click scans. No signup required.
- Ubuntu Server LTS supplies the operating system and package manager. Ubuntu’s current Server documentation lists Ubuntu 24.04 LTS and Ubuntu 22.04 LTS as supported Server releases; check the release status when you create a new machine.
- Python and a virtual environment keep your application’s interpreter and pinned dependencies separate from the operating system.
- Gunicorn and its workers keep the Python process model suitable for production. Django and Flask normally use WSGI; FastAPI uses ASGI and needs an ASGI worker class.
- systemd starts the service at boot, restarts it when configured to do so, and provides a standard status and log interface.
- Nginx is the public HTTP boundary. It handles the hostname, TLS termination, static files, buffering, and proxy controls before passing dynamic requests to Gunicorn.
- UFW is Ubuntu’s default firewall configuration tool. It should expose only SSH and the web ports required by your deployment.
Keeping these boundaries separate makes failures easier to diagnose: an application error is different from a systemd failure, an Nginx error, or a blocked firewall port.
Choose the image and prepare access
Select a supported Ubuntu LTS image
Choose Ubuntu Server 24.04 LTS or 22.04 LTS from the VPS provider’s image list, then record the public IPv4 or IPv6 address, the initial login name, and the region. A release can move into a different maintenance phase, so verify support and security-update information in Ubuntu’s current documentation before provisioning.
#1 Best Overall
- BLUE LIGHT BLOCKING GLASSES: Our blue light glasses for women boast UV400 protection, blocking harmful blue rays from computer screens. With these bluelight glasses women, you can enjoy gaming, reading, or watching TV with no worries of eye strain.
- EYE RELIEF: Our blue light glasses are engineered to reduce blurry vision or strain caused by prolonged screen time. These womens blue light glasses aid in better sleep by preventing blue light from disrupting your natural sleep cycle, helping you fall asleep faster and enjoy a more restful night's sleep, making them the perfect christmas present.
- COMFORTABLE: Crafted from durable material, our trendy blue light glasses for woman or blue light glasses men ensure long-lasting comfort. The high-transmittance lenses accessories, gamer gifts for men, help keep your eyes relaxed. Perfect stocking stuffers, gifts for gamers men, christmas gifts for men, halloween costumes.
- LIGHTWEIGHT: These clear blue light glasses feature a lightweight frame, meaning they’ll stay comfy for long-term wear. Perfect as blue blockers glasses for women or mens blue light glasses, these non-prescription fake glasses for men can be worn throughout the day. The blue light blocking glasses women feature polycarbonate HD lenses, which are anti-reflective and restore true color.
- WORRY-FREE PURCHASE: If you experience any issues, our support team is ready to assist you quickly. These are the perfect costume glasses for cosplay dressing up.
Use a small instance for a low-traffic service only if it has enough memory for your framework, workers, and Nginx. The supplied evidence does not establish a universal CPU, RAM, throughput, uptime, or cost figure; size the machine from your application’s measured resource use rather than from a promised benchmark.
Connect with SSH
From your workstation, connect using the credentials supplied by the provider:
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →ssh administrator@SERVER_IP
If the provider supplied a different account, substitute that name. Prefer an SSH key, and keep a second terminal available while changing authentication or firewall settings so you can recover from a mistake.
Apply updates and establish a non-root workflow
Update the base system
sudo apt updatesudo apt upgrade- Reboot if the package manager reports that a reboot is required, then reconnect over SSH.
Continue applying Ubuntu security updates on a planned schedule. A deployment is not finished when the first application request succeeds; the operating system and its packages remain part of the security boundary.
Create an administrative account
Do routine work through a named account with sudo, not through a root shell:
sudo adduser deploy
sudo usermod -aG sudo deploy
In a second terminal, verify that the new account can log in and run a harmless command with sudo before you disable or restrict the original provider account. Do not remove the only account that can administer the VPS.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Repair Windows errors before they cause bigger problems3Fix the driver behind crashes, sound loss and screen glitchesCreate a dedicated service identity
Run the application as a separate user that has access to its code and data but is not a system administrator:
Rank #2
- WINDEX GAMING WIPES: effortlessly clean all your gaming gear and gaming electronics in one easy step with our new Windex Gaming Wipes
- AMMONIA FREE: our ammonia-free formula is safe to use on all of your favorite gaming equipment like consoles, headsets, controllers, screens, keyboards, and more
- PRE-MOISTENED WIPES: each wipe instantly removes dust, dirt, and stubborn smudges and fingerprints leaving a streak-free shine
- ANTI-STATIC: great for cleaning and wiping down your gaming gear and electronics leaving behind no visible residue
- COMPACT RESEALABLE PACKAGE: store your pack of Windex Gaming Wipes anywhere in your home for whenever a quick and easy wipedown is needed
sudo adduser --system --group --home /srv/myapp myapp
sudo mkdir -p /srv/myapp
sudo chown -R myapp:myapp /srv/myapp
Keep deployment files, uploaded data, and secrets in deliberately chosen directories. Avoid placing application secrets in a world-readable project directory or committing them to source control.
Configure UFW without locking yourself out
Ubuntu identifies UFW as its default firewall configuration tool. Allow SSH before enabling it, then allow only the web ports your proxy will use:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
If SSH uses a non-standard port, allow that port instead of 22. Do not open the Gunicorn socket or its loopback port to the internet; Nginx should be the externally reachable application layer. When you add a database, cache, monitoring agent, or administration port, restrict it to the required source addresses rather than opening a broad range.
Install Python, Nginx, and build prerequisites
Install the distribution packages that your project needs. The exact dependency list varies by framework and by packages such as database drivers:
sudo apt install python3 python3-venv python3-pip nginx
Some Python packages compile native extensions. Install only the compiler, headers, or development libraries explicitly required by your pinned dependency set; extra packages increase maintenance surface. Confirm the interpreter selected by your Ubuntu release with python3 --version, then use that same interpreter to create the virtual environment.
Place the project in an isolated virtual environment
Create the directory and environment
sudo -u myapp -H bash
cd /srv/myapp
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
Leave the shell with exit when you are done as the service user. A virtual environment prevents one application’s dependency upgrades from changing another application’s imports or the operating system’s Python packages.
Deploy reproducible application code
Copy a tagged release or checkout a controlled revision into /srv/myapp. Install a lock file or a pinned requirements file rather than an unconstrained set:
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minutePC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Rank #3
- Ergonomic & Adjustable Design: Fight "text neck" and improve your posture. Designed for comfort, it offers an adjustable height (7.1in-8.5in) (1.4in adjustable range) and angle (5°-85°) Please note: cell phone stand is only 9 inches tall—the length of a standard pencil
- Without blocking subtitles Perfect for office desk Tiktok Face Time Zoom video—this is the ultimate kitchen desk essential for phones! Perfect viewing experience while reducing neck back strain, A must-have for gamers streamers desk, and anyone who values both style and support!
- Sleek & Stable Design fits Otterbox Case: Say goodbye to bent cables, tangles, and tip-overs! LISEN’s stylish adjustable desk phone holder features a built-in charging hole and smart cable management, keeping your phone secure and your workspace clutter-free cool gadgets for men
- ANTI-SLIP DESIGN free hands: The under 10.00 items easy gadgets back and the bottom of this kitchen essentials for women are fully covered by anti-skid silicone, which LISEN stand up desk decor can provide maximum protection device from any scratches and slides
- Your Perfect Viewing Companion:If your product arrives damaged or breaks within 365 days, reach out to LISEN for a quick and hassle-free solution. Struggling with assembly, like tightening the screw? We’ve got your back! Your experience matters to us. (Product including: phone Holder stand*1, screw*1, hexagon screwdriver*1, specification*1)
source /srv/myapp/.venv/bin/activate
python -m pip install -r requirements.txt
For Django, run database migrations and collect static files during deployment, before switching traffic to a new release:
cd /srv/myapp
source .venv/bin/activate
python manage.py migrate
python manage.py collectstatic --noinput
For FastAPI or Flask, run the project’s documented initialization and asset steps instead. Never assume that a migration, upload directory, or generated asset can be recreated safely without a backup.
Store configuration outside the code
Use environment variables or a protected configuration file for database URLs, signing keys, API credentials, allowed hosts, and debug settings. A practical systemd-readable file is:
sudo install -o root -g www-data -m 0640 /dev/null /etc/myapp.env
sudoedit /etc/myapp.env
Put one variable per line, for example APP_SETTINGS=production. Do not paste real secrets into shell history or the article’s service file. Ensure the application turns debug mode off and validates its allowed host names before public traffic is enabled.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Choose WSGI or ASGI and the process model
The interface must match the framework. Django and Flask deployments commonly expose a WSGI callable; FastAPI exposes an ASGI callable. A WSGI worker cannot serve an ASGI application correctly, and an ASGI worker is unnecessary complexity for a strictly WSGI service.
| Application type | Gunicorn command pattern | Typical callable | What to verify |
|---|---|---|---|
| Django (WSGI) | gunicorn project.wsgi:application |
project.wsgi:application |
The settings module, allowed hosts, database, and static-file settings load without an interactive shell. |
| Flask (WSGI) | gunicorn module:app |
module:app |
The module can be imported from the service working directory and does not start a development server on import. |
| FastAPI (ASGI) | gunicorn -k uvicorn.workers.UvicornWorker module:app |
module:app |
The application is an ASGI callable and startup or shutdown hooks complete successfully. |
Uvicorn’s deployment guidance distinguishes development from production: use uvicorn --reload for local development, and use gunicorn -k uvicorn.workers.UvicornWorker for production, additionally behind Nginx for a self-hosted deployment. Reload mode watches files and is not a production supervision strategy.
Unix socket or loopback TCP?
| Connection | Advantages | Costs and checks |
|---|---|---|
| Unix-domain socket | Local-only by construction and avoids a TCP listening port; Nginx can connect directly to the socket. | Directory and socket permissions must let the Nginx worker traverse the path and read/write the socket. Log the exact path when troubleshooting. |
Loopback TCP, such as 127.0.0.1:8000 |
Easy to inspect with ordinary TCP tools and convenient when Nginx and the app are separated later. | Bind to loopback, not the public interface, and account for the port in local policy and service documentation. |
For a single-host deployment, a Unix socket is a sensible default. Uvicorn’s guide also recommends it where suitable and warns that forwarded headers must be trusted only from known proxies.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Rank #4
- Easy Installation: Our gaming lights have been designed to enhance your entertainment experience. Simply position the led light bar next to your TV or game console to create a game room environment with ease. They come with USB power and a 60 inch cord for direct mounting and mobility
- Audio Syncing & Extensive Mode: The built-in high-sensitivity music sensor allows you to sync the TV led lights to your favorite music. Lights react and move to the beat of music, film and game audio, creating an incredible immersive sound and light experience – and all without the need for an additional hub. You can choose from 64+ patterns, including strobe, illusion, jump, energy, gradient, running, chasing, fluttering mode etc. Each mode can be applied to different scenes
- 64+ Chasing IC+RGB & W Effect: The independent control design of IC+RGB and white all-in-one multifunctional rgbw led bar lights monitor backlight allows you to easily switch the led lights for desk between IC+RGB and white to enjoy a variety of lighting effects, you can choose white lighting mode with high brightness for better illumination when working, etc. Choose IC+RGB lighting mode when you need to create an entertaining atmosphere for the light show, 16 million colours of Color changing rgb light bar let you dance to the beat and create a dynamic party atmosphere
- Dynamic and Dimmable Lights: 1%-full brightness free brightness adjustment gives you the flexibility to adjust dimmable led light bar for room decorations or a variety of occasions
- USB Powered: USB light bars for room can be powered by powernank, usb charger, TV, Monitor, laptop PC mainframe, making behind TV led lighting bar easy to install in any location.TV led lights are powered by the TV usb interface / PC mainframe, can be turned on/off synchronously with TV / PC
Create a systemd service
Run the application through systemd so it starts after boot and has a consistent restart and log interface. Create /etc/systemd/system/myapp.service:
[Unit]
Description=My Python web application
After=network.target
[Service]
Type=simple
User=myapp
Group=www-data
WorkingDirectory=/srv/myapp
EnvironmentFile=/etc/myapp.env
RuntimeDirectory=myapp
RuntimeDirectoryMode=0750
UMask=0007
ExecStart=/srv/myapp/.venv/bin/gunicorn --workers 2 --bind unix:/run/myapp/myapp.sock project.wsgi:application
Restart=on-failure
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Replace the callable and, for FastAPI, replace project.wsgi:application with -k uvicorn.workers.UvicornWorker module:app. The two-worker value is an initial configuration example, not a performance guarantee; measure memory use and request behavior before changing it. Gunicorn’s official systemd example uses the same important boundaries: User, Group, WorkingDirectory, ExecStart, reload signaling, and PrivateTmp=true.
The service above places the socket in a systemd-created runtime directory and gives it a group that Nginx can use. If your distribution’s Nginx account or directory policy differs, adjust ownership and permissions deliberately rather than making the socket world-readable.
Load and operate the unit
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
sudo journalctl -u myapp.service -e
sudo systemctl restart myapp.service
A successful enable creates boot-time activation; --now starts it immediately. During a controlled release, use sudo systemctl restart myapp. For a configuration-only reload, add an explicit reload implementation and signal supported by your Gunicorn setup; do not assume every application can reload safely. Gunicorn also documents systemd socket activation as an alternative when you need systemd to own the listening socket, but a direct service-owned socket is simpler for a first single-VPS deployment.
Put Nginx in front of Gunicorn
Configure the server block
Create a site configuration such as /etc/nginx/sites-available/myapp:
upstream myapp_backend {
server unix:/run/myapp/myapp.sock;
}
server {
listen 80;
listen [::]:80;
server_name app.example.com;
location /static/ {
alias /srv/myapp/staticfiles/;
}
location / {
proxy_pass http://myapp_backend;
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;
}
}
Replace app.example.com with a hostname whose DNS records point to the VPS. The alias directory must exist and be readable by Nginx; remove that location if your application does not generate a static directory. Do not put private uploads under a publicly served path unless your application explicitly intends that behavior.
Enable and test the configuration
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx
sudo journalctl -u nginx -e
Keep the default site disabled only after confirming that your own server block responds correctly. Nginx should be the internet-facing layer; do not bind Gunicorn to 0.0.0.0 merely to make a test work. Nginx can serve static media and buffer slow requests, leaving application workers available for application work.
Best Value
- Compatible with Wide Screens - To ensure compatibility with the dual monitor mount, your each monitor must meet three conditions at the same time: First, computer screens size range: 13 to 32 inches. Second, screen weight range: 4.4 to 19.8 lbs. Third, the back of the monitor screen must have VESA mounting holes with a pitch of 75x75mm or 100x100mm.
- Regarding the compatibility with desks - Your desk must meet three conditions at the same time: First, desk material: Only wooden desks are recommended, plastic or glass desks cannot be used. Second, desk thickness range: 0.59" - 3.54". Third, the bottom of the desk should not have any cross beams or panels, as this will interfere with installation. We recommend carefully checking that your desk and monitors meets all above conditions before purchasing.
- Dual C-Clamp Hold - Worried your dual monitors might wobble or slip? Our upgraded base uses a larger platform plus a dual C-clamp structure to lock the dual monitor arm firmly to your desk. Each arm safely keeps your screens steady while you type, click and game—no shaking, no sliding, just a clean and secure setup you can trust every day. It also provides Grommet Mounting installation choice, both options ensure stable and secure fixation for your 0.59" - 3.54" desk.
- Full-Motion Adjustment For Comfortable View - Pull the screen closer when you’re deep in a spreadsheet, push it back to watch videos, or rotate to portrait for coding — moving everything smoothly with just one hand. The monitor stand offers +85°/-50° tilt, ±90° swivel and 360° rotation. Raise your monitor up to 15.75″ to support a healthy sitting posture. Whether you’re working from home, gaming through the night, or switching between video calls and documents, getting the screens to your natural line of sight helps relieve neck, shoulder and back strain so you can stay focused longer with less fatigue.
- Keep Your Desk Organized: By lifting both screens off the desktop, this dual monitor stand opens up valuable space for your keyboard, notebook, docking station or a simple, clutter-free work area. Built-in cable management guides wires along the arms, keeping cords out of sight and out of the way. Enjoy a tidy, modern workstation that looks as good as it feels to use.
Publish HTTPS safely
Once the hostname resolves to the VPS and HTTP works, obtain a certificate through a reputable certificate authority using an ACME-capable client, then configure Nginx to listen on 443 with the certificate and private key. Redirect plain HTTP to HTTPS after the certificate is active. Keep the private key readable only by the account and group that Nginx requires.
Set the application’s external URL and secure-cookie or proxy settings consistently with the HTTPS scheme. Forwarded headers are security-sensitive: trust them only when they come from your own Nginx proxy, and do not enable a framework option that accepts arbitrary client-supplied forwarding headers on a directly exposed application port.
Validate in layers before calling the deployment complete
- Application layer: from the VPS, make a local request through the Unix socket or loopback binding using the appropriate HTTP client. Confirm a known health endpoint and verify that database access and startup hooks work.
- Process layer: run
systemctl status myappand inspectjournalctl -u myapp. Look for import errors, missing environment variables, permission failures, worker exits, and migration exceptions. - Proxy layer: run
sudo nginx -t, inspect the Nginx error and access logs, and check that the upstream socket path in the configuration exactly matches the systemd service. - External HTTP layer: request the public hostname over HTTP and HTTPS from a separate network. Confirm the expected status code, hostname, certificate, redirects, static assets, and application routes.
- Persistence layer: reboot during a maintenance window, reconnect over SSH, and verify both
myappand Nginx are active without manually starting them. - Firewall layer: run
sudo ufw status verboseand confirm that only the intended SSH, HTTP, and HTTPS rules are enabled.
Record how to stop the service, restore the previous application revision, restore data, and undo the last Nginx change. A rollback plan is useful only if the commands and backup locations are written down before an incident.
Troubleshoot by symptom
SSH stopped working after firewall changes
Use the provider’s console or recovery access, restore the SSH rule for the actual port, and check UFW status before enabling it again. Always preserve one tested administrative path before making a remote firewall change.
Nginx returns 502 Bad Gateway
- Check
systemctl status myapp; the worker may have crashed or failed to import the callable. - Check that
/run/myapp/myapp.sockexists after starting the service. - Compare socket ownership and directory permissions with the Nginx worker account.
- Confirm that the Nginx upstream uses the same socket path and that the service’s
WorkingDirectoryand virtual-environment path are correct.
The service starts manually but not at boot
Verify systemctl is-enabled myapp, run systemctl cat myapp to inspect the installed unit, and read the boot-time journal. A shell’s activated virtual environment, exported variables, or current directory does not exist automatically under systemd; put those requirements in ExecStart, EnvironmentFile, and WorkingDirectory.
Static files are missing
For Django, rerun collectstatic, verify the configured output directory matches Nginx’s alias, and ensure Nginx can read it. For another framework, confirm that the asset build ran during deployment and that the URL prefix in the application matches the Nginx location.
HTTPS or redirect loops occur
Check which layer terminates TLS, the value of X-Forwarded-Proto, and the framework’s trusted-proxy configuration. A proxy header should describe a connection from your known Nginx instance, not an arbitrary public request.
Quick Recap
Operational habits that keep the VPS healthy
- Pin and review Python dependencies; deploy a known revision instead of editing production files in place.
- Keep secrets in protected configuration, rotate them when an administrator or service is decommissioned, and limit file permissions.
- Review systemd and Nginx logs for repeated worker exits, permission errors, and unexpected traffic.
- Apply Ubuntu security updates and test reboots periodically so boot persistence is not an untested assumption.
- Back up databases, uploaded files, environment configuration, and deployment metadata separately; test restoration on another machine when possible.
- Monitor disk space, memory pressure, certificate expiry, and the health endpoint. No published source establishes a universal uptime or capacity number, so use measurements from your own workload.
A repeatable deployment checklist
- Supported Ubuntu LTS image selected and release support checked.
- SSH key or other secure login tested with a named sudo account.
- Application user, project directory, virtual environment, and pinned dependencies created.
- Secrets supplied through protected environment configuration; debug mode disabled.
- Correct WSGI or ASGI Gunicorn command tested manually.
- systemd unit enabled, restarting on failure, and readable in the journal.
- Nginx proxy and static-file paths tested with
nginx -t. - Hostname, certificate, forwarded-header policy, and HTTPS redirect verified.
- UFW enabled only after SSH was allowed; required ports confirmed.
- External request, reboot persistence, logs, backups, and rollback procedure tested.
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.




