Multipli siti web in diversi container su un server Proxmox 9 con un solo IP Pubblico

tratto da: https://community.ovhcloud.com/community/en/new-os-available-proxmox-virtual-environment-ve-9?id=community_question&sys_id=362f0572b1e7ae14f07803b560bfcdaf

Prerequisiti

  • OVH/Kimsufi dedicated server
  • Proxmox 9 installed by OVH
  • SSH access to the server
  • Basic understanding of Linux networking

Parte 1: Installazione iniziale

1.1 Setup utente amministratore

# SSH into server as root
ssh root@YOUR_SERVER_IP

# Create admin user
adduser utente
usermod -aG sudo utente

# Set up SSH key access
mkdir -p /home/utente/.ssh
cp /root/.ssh/authorized_keys /home/utente/.ssh/
chown -R utente: /home/utente/.ssh
chmod 700 /home/utente/.ssh
chmod 600 /home/utente/.ssh/authorized_keys

# Configure passwordless sudo
echo "utente ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/utente
chmod 440 /etc/sudoers.d/utente

1.2 Accesso Interfaccia Web

Imposto la password di root per poter accedere all’interfaccia web

passwd root

Posso ora accedere alla pagina web di Proxmox: https://YOUR_SERVER_IP:8006

Parte 2: Configurazione di rete dei container

2.1 il problema

La configurazione di default della rete dei container su OVH fallisce a causa di:

  • I container si connettono direttamente alla rete esterna vmbr0
  • Non è prevista la configurazione NAT per i container
  • Mancano le regole di FORWARD tra le reti esterne ed interne

2.2 Creo una rete Bridge interna

Modifica /etc/network/interfaces e aggiungi:

auto vmbr6
iface vmbr6 inet static
address 10.0.0.254/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE

2.3 Attivo il bridge interno

# Bring up the new bridge
ifup vmbr6

# Verify bridge creation
ip addr show vmbr6

2.4 Configuro l’inoltro dei pacchetti:

# Enable IP forwarding permanently
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

# Add FORWARD rules for container-to-internet traffic
iptables -I FORWARD -i vmbr6 -o vmbr0 -j ACCEPT
iptables -I FORWARD -i vmbr0 -o vmbr6 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Importo il forward dei pacchetti web
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.100:15080
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.100:15443
iptables -A FORWARD -p tcp -d 10.0.0.100 --dport 15080 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.0.0.100 --dport 15443 -j ACCEPT

# Save iptables rules
mkdir -p /etc/iptables
iptables-save > /etc/iptables/rules.v4

Parte 3: Creazione del container di routing

3.1 Download del Template per il Container

Dall’interfaccia web di Proxmox:

  • Vai sul nodo –> local storage
  • Clicca sul tab: “CT Templates”
  • Clicca sul tasto “Templates”
  • Scarica Debian-13-standard

3.2 Crea il container dall’interfaccia web

Dal nodo proxmox premo il tasto destro e scelgo “Crea CT”

  • General tab:
    • CT ID: 100
    • Hostname: your-container-name
    • Set password
    • Add SSH public key (opzionale)
  • Template tab:
    • Select debian-13-standard
  • Root Disk tab:
    • Size: 8GB (adjust as needed)
  • CPU/Memory tabs:
    • Set as needed (1 core, 1GB RAM for basic web server)
  • Network tab:
    • CRITICAL: Change bridge from vmbr0 to vmbr6
    • Set static IP: 10.0.0.100/24 (increment for additional containers)
    • Gateway: 10.0.0.254
  • DNS tab:
    • Use host settings

3.3 Verifica e configurazione Container di routing

# Start container
pct start 100

# Enter container
pct enter 100

# Test connectivity
ping -c 3 10.0.0.254 # Gateway
ping -c 3 8.8.8.8 # Internet

# Applico gli aggiornamenti come di prassi
apt update && apt upgrade -y

# Scarico i pacchetti nginx e Let's Encrypt
apt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface python3-certbot-nginx nginx

# Rimuovo la configurazione per il sito di default
rm /etc/nginx/sites-enabled/default

# Creo una configurazione di routing per un primo sito web: example.com sul server locale 10.0.0.101
echo 'server {
listen 15080;
listen [::]:15080; # Also listen on IPv6
server_name example.com;

location / {
proxy_pass http://10.0.0.101:80; # Indirizzo del server di destinazione
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;
}
}' > /etc/nginx/conf.d/router.conf

# Riavvio il server NGINX
service nginx restart

3.4 Test raggiungibilità sito web

I record DNS del vostro sito “example.com” deve essere configurato con un record di tipo A che punta all’indirizzo IP del vostro server Proxmox

Puntate il vostro browser verso l’indirizzo http://example.com

Se tutto e’ andato a buon fine dovreste vedere la pagina di Welcome di NGINX

3.5 Richiesta del certificato Let’s Encrypt

certbot --nginx -d example.com -m mymail@mydomain.com --agree-tos --no-eff-email --http-01-port 15080

Certbot vi chiederà se redirigere il traffico http a https. Per ora rispondete no.

3.6 Modificate la porta per https:

sed -i 's/listen 443 ssl/listen 15443 ssl/g' /etc/nginx/conf.d/router.conf

# Riavvio NGINX
service nginx restart

Parte 4: Server Web

Potete ora creare un nuovo container per ospitare il sito example.com (potete ripetere questi passaggi per altri nuovi container):

  • General tab:
    • CT ID: 101
    • Hostname: example.com
    • Set password
    • Add SSH public key (opzionale)
  • Template tab:
    • Select debian-13-standard
  • Root Disk tab:
    • Size: 8GB (adjust as needed)
  • CPU/Memory tabs:
    • Set as needed (1 core, 1GB RAM for basic web server)
  • Network tab:
    • CRITICAL: Change bridge from vmbr0 to vmbr6
    • Set static IP: 10.0.0.101/24 (increment for additional containers)
    • Gateway: 10.0.0.254
  • DNS tab:
    • Use host settings

Nota che l’indirizzo IP 10.0.0.101 è quello indicato nel file router.conf visto sopra.

Dalla shell di proxmox:

# Start container
pct start 101

# Enter container
pct enter 101

# Test connectivity
ping -c 3 10.0.0.254 # Gateway
ping -c 3 8.8.8.8 # Internet

# Applico gli aggiornamenti come di prassi
apt update && apt upgrade -y

# Scarico, installo e configuro Caddy
wget -O /tmp/caddy.tar.gz 'https://github.com/caddyserver/caddy/releases/download/v2.7.6/caddy_2.7.6_linux_amd64.tar.gz'
tar -xzf /tmp/caddy.tar.gz -C /usr/local/bin/ caddy
chmod +x /usr/local/bin/caddy

# Verify installation
/usr/local/bin/caddy version

# Create directory structure
mkdir -p /etc/caddy /var/www/html

# Create test page
echo '<h1>Working Caddy Web Server</h1><p>Container networking successful!</p>' > /var/www/html/index.html

# Create basic Caddyfile
echo ':80 {
root * /var/www/html
file_server
}' > /etc/caddy/Caddyfile

# Start Caddy
nohup /usr/local/bin/caddy run --config /etc/caddy/Caddyfile > /var/log/caddy.log 2>&1 &

Potete ora navigare su https://example.com

Avete finito !!

Nel file /etc/nginx/conf.d/router.conf potete aggiungere la configurazione anche per altri siti o server locali modificando il nome del sito o l’indirizzo del server (10.0.0.102, 10.0.0.103 …)

Plone Backup e Ftp con pipe

Ecco come ho preparato un comodo script per fare il backup dell’archivio di Plone e subito dopo copiare il backup compresso con TAR in un server FTP senza lasciare nel webserver il file tgz

#!/bin/bash

PLONEPATH="/home/zope/plone32" # where you have your buildout.cfg
REPOZOPATH="${PLONEPATH}/bin/repozo"
DATAFSPATH="${PLONEPATH}/var/filestorage/Data.fs"
DESTINATION="/home/zope/backup/repozo"
DBBACKUP="${REPOZOPATH} -BzQ -r ${DESTINATION} -f ${DATAFSPATH}"
FTP_SERVER_IP="192.168.1.21"
FTP_DESTINATION="dir1/subdir1"
PYTHONPATH="${PLONEPATH}/parts/zope2/lib/python"

export PYTHONPATH # otherwise repozo.py will probably not be able to find its libraries

DATA=`expr $(date +%d)`
RESTO=`expr ${DATA} % 2` # 2 set backup, on even and odd days
DIRNAME_DESTINATION=`dirname ${DESTINATION}`
BASENAME_DESTINATION=`basename ${DESTINATION}`

`${DBBACKUP}`

ftp -n ${FTP_SERVER_IP} <<ENDSCRIPT
user ftp_user ftp_password
binary
put "| /bin/tar -czf - -C ${DIRNAME_DESTINATION} ${BASENAME_DESTINATION}" ${FTP_DESTINATION}/backup_${RESTO}.tgz
bye
ENDSCRIPT

Disabilitare il click sul touchpad – Xubuntu

Ecco come fare per disabilitare la funzione che permette di fare click toccando il mousepad del notebook. Questa funzione e’ detta “touchpad tapping”. Ci sono diverse guide in rete ma questa e’ quella che ho testato e funziona con Xubuntu 9.10

In questa versione di Linux la responsabilità della gestione delle periferiche di input è demandata a HAL (Hardware Abstraction Layer) e quindi bisogna agire in questo modo:

  1. Verificare che HAL gestisca il touchpad:
    lshal | grep synaptics
  2. Il comando dovrebbe dare un risultato tipo:
    input.x11_driver = 'synaptics'  (string)
  3. Creare questo file per abilitare SHMConfig in HAL:
    sudo vi /etc/hal/fdi/policy/shmconfig.fdi
  4. Incollare il seguente codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <deviceinfo version="0.2">
      <device>
        <match key="input.x11_driver" string="synaptics">
          <merge key="input.x11_options.SHMConfig" type="string">True</merge>
        </match>
      </device>
    </deviceinfo>
  5. Riavviare il pc
  6. Eseguire il seguente comando per verificare che HAL abbia preso i comandi dati
    lshal | grep x11_options
  7. Il comando dovrebbe dare questo risultato:
    input.x11_options.SHMConfig = 'True'  (string)
  8. Eseguire ora questo comando per disabilitare scroll e tapping:
    synclient TouchpadOff=2
  9. Eseguire in alternativa il seguente comando per disabilitare solo il tapping:
    synclient MaxTapTime=0
  10. Testare il funzionamento del touchpad
  11. Per rendere permanente l’impostazione andare su:
    Applicazioni > Impostazioni > Sessione e Avvio > Application Autostart, Aggiungere una voce dove inserire nome e descrizione a piacere e come comando quello indicato al punto 8 oppure al punto 9

Vedi post originale