PROD-PROXY-01 (NGINX)
Update system packages
sudo vim /etc/netplan/50-cloud-init.yaml:%d [ENTER]network:
version: 2
ethernets:
enp6s18:
dhcp4: no
addresses:
- 192.168.8.5/22
gateway4: 192.168.8.1
nameservers:
addresses:
- 1.1.1.1
- 8.8.8.8sudo netplan applyReboot the server and login using 192.168.8.4
sudo apt update && sudo apt upgrade -yEnable Basic Firewall Rules:
sudo ufw allow 80sudo ufw allow 443sudo ufw reloadsudo ufw statusInstall Nginx
sudo apt install nginx -yTest Nginx Installation:
Open a browser:
http://192.168.8.5Or run:
curl http://192.168.8.5Enable Nginx to start on boot
sudo systemctl enable nginxsudo systemctl start nginxsudo systemctl status nginxInstall Certbot and Cloudflare DNS Plugin
Install the plugin for Certbot:
sudo apt install python3-certbot-nginx -yEnsure all required Certbot plugins are installed:
sudo apt install python3-certbot-dns-cloudflare -yCreate a Cloudflare API credentials file
sudo nano /etc/letsencrypt/cloudflare.iniAdd the following content to the file:
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKENEnsure the file is secure:
sudo chmod 600 /etc/letsencrypt/cloudflare.iniObtain SSL Certificates
Issue Certificate for udmse:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d udmse.aspireclan.comCheck the certificate:
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/udmse.aspireclan.com/fullchain.pem | grep -A 1 "Subject Alternative Name"Issue Certificate for pve:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d pve.aspireclan.comCheck the certificate:
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/pve.aspireclan.com/fullchain.pem | grep -A 1 "Subject Alternative Name"Issue Certificate for acfw:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d acfw.aspireclan.comCheck the certificate:
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/acfw.aspireclan.com/fullchain.pem | grep -A 1 "Subject Alternative Name"Issue Certificate for nas:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d nas.aspireclan.comCheck the certificate:
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/nas.aspireclan.com/fullchain.pem | grep -A 1 "Subject Alternative Name"Issue Certificate for dhcp:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d dhcp.aspireclan.comCheck the certificate:
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/dhcp.aspireclan.com/fullchain.pem | grep -A 1 "Subject Alternative Name"Configure Nginx for Reverse Proxy
Create a new Nginx configuration file:
sudo nano /etc/nginx/sites-available/prod-proxy-01.confAdd this proxy setup:
server {
listen 443 ssl;
server_name udmse.aspireclan.com;
ssl_certificate /etc/letsencrypt/live/udmse.aspireclan.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/udmse.aspireclan.com/privkey.pem;
location / {
proxy_pass https://192.168.8.1; # Backend IP for udmse
proxy_ssl_verify off; # Disable SSL verification for UDMSE
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
listen 443 ssl;
server_name pve.aspireclan.com;
ssl_certificate /etc/letsencrypt/live/pve.aspireclan.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pve.aspireclan.com/privkey.pem;
location / {
proxy_pass https://192.168.8.23:8006; # Backend IP for udmse
proxy_ssl_verify off; # Disable SSL verification for Proxmox self-signed cert
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
listen 443 ssl;
server_name acfw.aspireclan.com;
ssl_certificate /etc/letsencrypt/live/acfw.aspireclan.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/acfw.aspireclan.com/privkey.pem;
location / {
proxy_pass https://192.168.2.1; # Backend IP for udmse
proxy_ssl_verify off; # Disable SSL verification for Proxmox self-signed cert
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
listen 443 ssl;
server_name nas.aspireclan.com;
ssl_certificate /etc/letsencrypt/live/nas.aspireclan.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nas.aspireclan.com/privkey.pem;
location / {
proxy_pass https://192.168.8.20:5001; # Backend IP for udmse
proxy_ssl_verify off; # Disable SSL verification for Proxmox self-signed cert
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
listen 443 ssl;
server_name dhcp.aspireclan.com;
ssl_certificate /etc/letsencrypt/live/dhcp.aspireclan.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dhcp.aspireclan.com/privkey.pem;
location / {
proxy_pass http://192.168.8.2:8000; # Backend IP for udmse
proxy_ssl_verify off; # Disable SSL verification for Proxmox self-signed cert
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
server {
listen 80;
server_name pve.aspireclan.com;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name udmse.aspireclan.com;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name acfw.aspireclan.com;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name nas.aspireclan.com;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name dhcp.aspireclan.com;
return 301 https://$host$request_uri;
}Save and enable the configuration:
sudo ln -s /etc/nginx/sites-available/prod-proxy-01.conf /etc/nginx/sites-enabled/Test and reload Nginx:
sudo nginx -tsudo systemctl reload nginx[OPTIONAL] Restart Nginx:
sudo systemctl restart nginxConfigure Home Lab DNS
Add Internal DNS Records:
udmse.aspireclan.com --> 192.168.8.50
pve.aspireclan.com --> 192.168.8.50
Test DNS Resolution:
dig udmse.aspireclan.comdig pve.aspireclan.comAutomate SSL Certificate Renewal
Test certificate renewal manually:
sudo certbot renew --dry-runCertbot automatically adds a renewal timer to the system. Verify it:
sudo systemctl list-timers | grep certbotEnsure Nginx Reload on Renewal:
Create a deploy hook script:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.shAdd:
#!/bin/bash
systemctl reload nginxMake it executable:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh