VM200 is the Web entry point of the self-hosted infrastructure. It publishes applications installed on other machines without directly exposing their internal ports to the Internet. It receives HTTPS connections, presents the public certificate, selects the requested service and relays the request to the right machine on the local network.
✅ Deployed state
  • Dedicated Linux VM from an Ubuntu Server template
  • Nginx as the reverse proxy
  • Let's Encrypt certificates managed by Certbot
  • Active local firewall
  • Fail2ban active and validated for SSH administration
  • HTTP → HTTPS redirection and certificate renewal tested
  • Streaming responses and WebSocket connections validated
  • VM200 restart validated with no configuration loss
🌐 Publication status
ServicePublic status
OpenWebUI · VM210🟢 published & HTTPS validated
n8n · VM300🟢 published & HTTPS validated
Nextcloud · VM205🟢 published & HTTPS validated
other internal services⚪ not published / deferred
🧭 From a domain name to another machine
path of a public request
1. Navigateur Internet
        ↓ demande gpt.stephanemuraro.fr
2. DNS public
        ↓ renvoie l'adresse Internet de la connexion
3. Routeur
        ↓ transfère uniquement le trafic Web vers VM200
4. VM200 / Nginx
        ↓ choisit le virtual host correspondant au nom
5. VM210 / OpenWebUI
        ↓ produit la réponse applicative
6. VM200 / Nginx
        ↓ renvoie la réponse dans la session HTTPS
7. Navigateur

DNS only associates the public name with the Internet address — it does not know which VM hosts the application. The router does not choose the service either: it hands Web connections off to VM200. It is Nginx that performs the application-level routing: the name requested during the TLS negotiation and in the HTTP request selects a configuration block (virtual host) that designates the target internal machine and service.

several public names, one Internet connection
gpt.stephanemuraro.fr         ─┐
n8n.stephanemuraro.fr         ─┼─> même adresse publique ─> VM200
nextcloud.stephanemuraro.fr   ─┘                           ├─> VM IA
                                                           ├─> VM automatisation
                                                           └─> VM fichiers
The existence of a DNS record does not prove that a service is published: a virtual host, a valid certificate, an authorized backend and a test from an external network are also required.
🧱 Role of the components
ComponentResponsibilityLimit
Public DNSassociate a name with the Internet addressdoes not choose the internal VM
Routerforward Web traffic to VM200does not understand the applications
VM200 firewallreject unplanned inbound connectionsdoes not replace authentication
Nginxterminate HTTPS, select the virtual host, relaydoes not store business data
Certbotobtain/renew Let's Encrypt certificatesdoes not publish an application by itself
Fail2banblock certain repetitive attacks from the logsreplaces neither a firewall nor strong passwords
Backendserve the application, control its usersmust not be exposed directly
🔐 TLS termination

Public encryption terminates on VM200. The certificate and its private key stay centralized on the reverse proxy, which avoids managing a different public certificate on each backend.

Client Internet  ═════ HTTPS chiffré ═════>  VM200
VM200            ───── flux LAN contrôlé ──>  backend

Nginx forwards the requested name, the external protocol and the information needed for traceability to the backend. For interactive applications, it supports WebSockets, streaming responses and timeouts suited to long-running processing.

🛡️ Defense in depth
  • the router only sends VM200 the necessary Web traffic
  • the local firewall rejects other inbound connections
  • administration stays limited to the internal network
  • Nginx only relays configured names and services
  • TLS encrypts and authenticates the public connection
  • Fail2ban reduces certain observable repetitive attempts
  • each backend keeps its own authentication and filtering
  • databases and technical APIs stay absent from the WAN

Fail2ban is validated for SSH; this does not automatically protect application login forms — each protection requires an exploitable log and a tested filter.

➕ Publishing a new service
  • validate the service on the local network
  • identify its HTTPS, WebSocket, request size and timeout needs
  • define its public name and authentication model
  • configure the application for its public origin
  • create a separate virtual host on VM200
  • validate the Nginx syntax before reloading
  • obtain and test the certificate
  • test from a genuinely external network
  • check the logs and the absence of direct exposure
  • document the rollback
↩️ Rollback — three levels:

The formal test of the global rollback by removing the WAN forwarding remains the last open check of the first phase.

🎯 Skills demonstrated
  • Design of a shared reverse proxy
  • DNS, NAT, SNI, virtual hosts and proxy headers
  • Automation of the certificate lifecycle
  • Support for WebSockets and streaming
  • Segmentation between the Internet boundary and backends
  • Defense in depth and rollback strategy
  • Publishing a service hosted on another machine

Related pages

References & Sources

CategoryResourceURL
Official documentationNginx — Documentationnginx.org/en/docs
Official documentationCertbot / Let's Encrypteff-certbot.readthedocs.io
Official documentationFail2bangithub.com/fail2ban/fail2ban
Validated publicationsOpenWebUI (VM210) · n8n (VM300) · Nextcloud (VM205) — HTTPS testé depuis un réseau extérieur, 2026-08-15—
LicenseNginx — BSD-2-Clause · Certbot — Apache-2.0 · Fail2ban — GPLv2nginx.org/LICENSE
Content of this pageShared under CC BY-SA 4.0creativecommons.org/licenses/by-sa/4.0