Blog

  • 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 …)

  • Come creare una magnifica OLD_STYLE CHAT nel vostro PC, sicura, privata e veramente REAL-TIME

    Dopo una lunga assenza vi propongo in occasione del giorno di San Valentino l’installazione di una chat che pur grezza e funzionante da linea di comando vi darà una particolare esperienza utente. Questa chat infatti rispetto a tutte le comuni chat piu’ diffuse, vi consente di trasmettere carattere per carattere al vostro interlocutore e non solo le righe una volta completate. Provare per credere 😉

    Ecco come procedere:

    Dal vostro router instradate la porta 2822 verso l’indirizzo IP del vostro PC Windows (ovviamente il tutto funziona anche direttamente in un pc con s.o. Linux )

    Installate Debian (o altra distribuzione… io preferisco Debian) in una macchina virtuale WSL2:

    da powershell (come amministratore):

    wsl --install -d Debian

    Dopo aver avviato la macchina viruale da utente root della macchina Debian :

    leggete l’ip della vostra macchina linux:
    ip addr | grep eth0

    Assumiamo che Linux abbia IP: 192.168.35.17

    Aggiorniamo i pacchetti della macchina virtuale:

    sudo apt update && sudo apt upgrade -y
    sudo apt-get install ytalk openssh-server

    Modifichiamo ora le impostazioni ssh:

    sudo vi /etc/ssh/sshd_config

    Aggiungete queste righe:

    Port 2222
    ListenAddress 0.0.0.0

    Creao un nuovo utente

    sudo useradd talkd
    sudo usermod -a -G tty talkd

    sudo vi /etc/inetd.conf

    modificate queste linee:
    talk dgram udp wait nobody.tty /usr/sbin/in.talkd in.talkd
    ntalk dgram udp wait nobody.tty /usr/sbin/in.ntalkd in.ntalkd

    in modo che diventino cosi’
    talk dgram udp4 wait talkd.tty /usr/sbin/in.talkd in.talkd
    ntalk dgram udp4 wait talkd.tty /usr/sbin/in.ntalkd in.ntalkd

    Riavviamo il servizio inetd:

    sudo service openbsd-inetd restart

    Aggiungo alla macchina virtuale gli utenti che potranno utilizzare la chat:

    sudo adduser romeo
    sudo adduser giulietta

    Dalla macchina windows (powershell come amministratore)

    netsh interface portproxy add v4tov4 listenport=2822 listenaddress=0.0.0.0 connectport=2222 connectaddress=192.168.35.17


    New-NetFirewallRule -DisplayName "SSH Server WSL" -Direction Inbound -LocalPort 2822 -Protocol TCP -Action Allow

    Eventualmente per gestire le regole di forward:

    Digitando il comando netsh interface portproxy show all si possono controllare tutte le porte che si sono inoltrate verso le macchine virtuali.

    Utilizzando il comando netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=PORTA si possono eliminare singole regole di inoltro.

    Abbiamo finito. Ora raggiungete sia voi (romeo) che il vostro interlocutore (giulietta) la macchina linux tramite ssh

    Romeo: ssh romeo@192.168.35.17 -p 2222

    Giulietta: ssh giulietta@ip_casa_di_romeo -p 2822 (ip_casa_di_romeo è l’ip pubblico del router di romeo)

    una volta entrati basta dare il comando:

    romeo: ytalk giulietta

    e giulietta: ytalk romeo

    Buon divertimento 😉

  • Configurare Open VPN su Mikrotik RouterOS

    La seguente guida (spudoratamente ispirata da qui ) spiega come installare una Open VPN sul sistema RouterOS di Mikrotik (testato sulla versione 6.41.3)

    Partiamo da una configurazione Base del Mikrotik

    /system reset-configuration

    Assegnare l’identificativo al Mikrotik da

    /system identity set name="MioMikrotik"

    Impostare l’ora esatta con NTP:

    /system ntp client set mode=unicast enabled=yes servers=([:resolve 0.it.pool.ntp.org],[:resolve 1.it.pool.ntp.org])
    

    Impostare il fuso orario:

    /system clock set time-zone-name=Europe/Rome

    Copiare questo script personalizzando le variabili global alle prime linee

    # Setup OpenVPN Server and generate certs
    #
    # Change variables below and paste the script
    # into MikroTik terminal window.
    #
    
    :global CN [/system identity get name]
    :global COUNTRY "IT"
    :global STATE "MYSTATE"
    :global LOC "MYCITY"
    :global ORG "MyOrg"
    :global OU ""
    :global KEYSIZE "2048"
    
    ## functions
    :global waitSec do={:return ($KEYSIZE * 10 / 1024)}
    
    ## generate a CA certificate
    /certificate
    
    add name=ca-template country="$COUNTRY" state="$STATE" locality="$LOC" \
      organization="$ORG" unit="$OU" common-name="$CN" key-size="$KEYSIZE" \
      days-valid=3650 key-usage=crl-sign,key-cert-sign
    sign ca-template ca-crl-host=127.0.0.1 name="$CN"
    :delay [$waitSec]
    
    ## generate a server certificate
    /certificate
    add name=server-template country="$COUNTRY" state="$STATE" locality="$LOC" \
      organization="$ORG" unit="$OU" common-name="server@$CN" key-size="$KEYSIZE" \
      days-valid=3650 key-usage=digital-signature,key-encipherment,tls-server
    sign server-template ca="$CN" name="server@$CN"
    :delay [$waitSec]
    
    ## create a client template
    /certificate
    add name=client-template country="$COUNTRY" state="$STATE" locality="$LOC" \
      organization="$ORG" unit="$OU" common-name="client" \
      key-size="$KEYSIZE" days-valid=3650 key-usage=tls-client
    
    ## create IP pool
    /ip pool
    add name=VPN-POOL ranges=192.168.252.128-192.168.252.224
    
    ## add VPN profile
    /ppp profile
    add dns-server=192.168.252.1 local-address=192.168.252.1 name=VPN-PROFILE \
      remote-address=VPN-POOL use-encryption=yes
    
    ## setup OpenVPN server
    /interface ovpn-server server
    set auth=sha1 certificate="server@$CN" cipher=aes128,aes192,aes256 \
      default-profile=VPN-PROFILE enabled=yes require-client-certificate=yes
    
    ## add a firewall rule
    /ip firewall filter
    add chain=input dst-port=1194 protocol=tcp comment="Allow OpenVPN"
    
    ## Sposto la regola del firewall prima della generica deny
    /ip firewall filter move [find \
    comment="Allow OpenVPN"] \
    [find where chain=input in-interface-list="!LAN"]
    

    ed incollarlo nel terminale del Mikrotik (io trovo comodo copiarlo dal terminale dopo essermi collegato via ssh al Mikrotik)

    Stessa cosa col seguente script per la configurazione dell’utente client (questo andrà ripetuto per ogni nuovo utente da abilitare):

    # Add a new user and generate/export certs
    #
    # Change variables below and paste the script
    # into MikroTik terminal window.
    #
    
    :global CN [/system identity get name]
    :global USERNAME "user"
    :global PASSWORD "password"
    
    ## add a user
    /ppp secret
    add name=$USERNAME password=$PASSWORD profile=VPN-PROFILE service=ovpn
    
    ## generate a client certificate
    /certificate
    add name=client-template-to-issue copy-from="client-template" \
      common-name="$USERNAME@$CN"
    sign client-template-to-issue ca="$CN" name="$USERNAME@$CN"
    :delay 20
    
    ## export the CA, client certificate, and private key
    /certificate
    export-certificate "$CN" export-passphrase=""
    export-certificate "$USERNAME@$CN" export-passphrase="$PASSWORD"

    A questo punto dal pc possiamo scaricare i certificati, tramite interfaccia web (impostare correttamente l’indirizzo ip del vostro Mikrotik es: 192.168.88.1):

    http://MikroTik_IP/webfig/#Files

    o da terminale con sftp:

    sftp admin@MikroTik_IP:cert_export_\*

    Creare nella stessa cartella dei certificati un file user.auth con indicati nome utente e password:

    user
    password

    Sempre nella stessa cartella creare il file di configurazione lato client modificando i parametri in grassetto:

    client
    dev tun
    proto tcp-client
    remote MikroTik_IP 1194
    nobind
    persist-key
    persist-tun
    cipher AES-256-CBC
    auth SHA1
    pull
    verb 2
    mute 3
    
    # Create a file 'user.auth' with a username and a password
    #
    # cat << EOF > user.auth
    # user
    # password
    # EOF
    auth-user-pass user.auth
    
    # Copy the certificates from MikroTik and change
    # the filenames below if needed
    ca cert_export_MioMikroTik.crt
    cert cert_export_user@MioMikroTik.crt
    key cert_export_user@MioMikroTik.key
    
    # Add routes to networks behind MikroTik
    #route 192.168.10.0 255.255.255.0

    A questo punto la configurazione è pronta per essere data in pasto al vostro client OVPN

    Se preferite che non venga chiesta la password all’avvio della VPN è necessario trasformare la chiave privata in questo modo:

    openssl rsa -passin pass:password -in cert_export_user@MioMikroTik.key -out cert_export_user_np@MioMikroTik.key

    ed utilizzare questa nuova chiave privata.

    Per rimuovere un utente e revocare il relativo certificato:

    # Delete a user and revoke his certificate
    #
    # Change variables below and paste the script
    # into MikroTik terminal window.
    #
    
    :global CN [/system identity get name]
    :global USERNAME "user"
    
    ## delete a user
    /ppp secret
    remove [find name=$USERNAME profile=VPN-PROFILE]
    
    ## revoke a client certificate
    /certificate
    issued-revoke [find name="$USERNAME@$CN"]

    Per rimuovere la configurazione OpenVPN dal Mikrotik:

    # Revert OpenVPN configuration
    #
    
    /ip pool
    remove [find name=VPN-POOL]
    
    /ppp profile
    remove [find name=VPN-PROFILE]
    
    /ip firewall filter
    remove [find comment="Allow OpenVPN"]
    
    /ppp secrets
    remove [find profile=VPN-PROFILE]
    
    /certificate
    ## delete the certificates manually

    I certificati vanno rimossi manualmente.

    Buon Lavoro 😉

  • Installare GitLab in Debian 8 con certificato Let’s Encrypt

    Da utente root:

    su -
    
    apt-get update && apt-get install curl

    Installo certbot

    echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
    
    apt-get update && apt-get install certbot -t jessie-backports

    Creo il file di configurazione di letsencrypt per gitlab.(cambiare gitlab.yourdomain.com con il nome del vostro sito e your@email.com con il vostro indirizzo email)

    Il dominio mattermost.yourdomain.com serve per abilitare anche la chat inclusa in gitlab (cambiare yourdomain.com col vostro dominio)

    mkdir -p /root/letsencrypt-config 
    cat <<EOT >> /root/letsencrypt-config/gitlab.ini
    # this is the let's Encrypt config for our gitlab instance
    
    # use the webroot authenticator. 
     authenticator = webroot
    # the following path needs to be served by our webserver
    # to validate our domains
     webroot-path = /var/www/letsencrypt
    
    # generate certificates for the specified domains.
    domains = gitlab.yourdomain.com, mattermost.yourdomain.com
    
    # register certs with the following email address
    email = your@email.com
    
    # use a 4096 bit RSA key instead of 2048
    rsa-key-size = 4096
    EOT

    Creo una cartella per la verifica del sito

    mkdir -p /var/www/letsencrypt

    Installo Gitlab

    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
    apt-get install gitlab-ce

    Modifico il file di configurazione di Gitlab impostando il nome del sito (cambiare gitlab.yourdomain.com con il nome del vostro sito)

    vi /etc/gitlab/gitlab.rb
    external_url "http://gitlab.yourdomain.com"

    Per abilitare la chat mattermost modificare anche la seguente riga:

    mattermost_external_url 'http://mattermost.yourdomain.com'

    Aggiungo al file di configurazione delle linee per utilizzare le chiavi e per attivare l’invio della posta. Modificare opportunamente le variabili evidenziate

    cat <<EOT >> /etc/gitlab/gitlab.rb
    ### Customize NGINX
    nginx['redirect_http_to_https'] = true
    nginx['ssl_certificate']= "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
    nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
    
    nginx['custom_gitlab_server_config']="location ^~ /.well-known {\n alias /var/www/letsencrypt/.well-known;\n}\n"
    
    ### SMTP
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.gmail.com"
    gitlab_rails['smtp_port'] = 587
    gitlab_rails['smtp_user_name'] = "my.email@gmail.com"
    gitlab_rails['smtp_password'] = "my-gmail-password"
    gitlab_rails['smtp_domain'] = "smtp.gmail.com"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = false
    gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
    EOT

    Per configurare anche la chat Mattermost aggiungere le seguenti righe:

    cat <<EOT >> /etc/gitlab/gitlab.rb
    mattermost_nginx['custom_gitlab_mattermost_server_config'] = "location ^~ /.well-known {\n alias /var/www/letsencrypt/.well-known;\n}\n"
    mattermost['enable'] = true
    mattermost['gitlab_auth_endpoint'] = "https://gitlab.yourdomain.com/oauth/authorize"
    mattermost['gitlab_token_endpoint'] = "https://gitlab.yourdomain.com/oauth/token"
    mattermost['gitlab_user_api_endpoint'] = "https://gitlab.yourdomain.com/api/v3/user"
    mattermost_nginx['redirect_http_to_https'] = true
    mattermost_nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
    mattermost_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
    mattermost['email_enable_sign_up_with_email'] = true
    mattermost['email_enable_sign_in_with_email'] = true
    mattermost['email_enable_sign_in_with_username'] = true
    mattermost['email_send_email_notifications'] = true
    mattermost['email_require_email_verification'] = false
    mattermost['email_smtp_username'] = "my.email@gmail.com"
    mattermost['email_smtp_password'] = "my-gmail-password"
    mattermost['email_smtp_server'] = "smtp.gmail.com"
    mattermost['email_smtp_port'] = 587
    mattermost['email_connection_security'] = "STARTTLS"
    EOT

    Per altre configurazioni smtp vedi: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.md

    Riconfiguro GITLAB

    gitlab-ctl reconfigure

    Creo il certificato

    certbot certonly -c /root/letsencrypt-config/gitlab.ini

    Modifico la configurazione impostando https

    vi /etc/gitlab/gitlab.rb
    external_url "https://gitlab.yourdomain.com/"

    anche per Mattermost

    mattermost_external_url 'https://mattermost.yourdomain.com'

    Creo uno script per l’aggiornamento del certificato

    cat <<EOT >> /etc/cron.monthly/renew-ssl-certificates
    
    #!/bin/bash
    
    /usr/bin/certbot certonly -c /root/letsencrypt-config/gitlab.ini --renew-by-default
    # or /usr/bin/certbot renew --quiet
    
    gitlab-ctl restart
    EOT

    Rendo eseguibile lo script

    chmod +x /etc/cron.monthly/renew-ssl-certificates

    Accedo a gitlab con l’utente root (la password viene richiesta alla prima schermata)

    Dall’area admin – Settings – Applications, modifico l’url dell’applicazione Mattermost da http a https

    https://mattermost.yourdomain.com/signup/gitlab/complete
    
    https://mattermost.yourdomain.com/login/gitlab/complete
  • VestaCP e Iptables su container Proxmox

    Utilizzando il Pannello VestaCP su una macchina virtuale (container) sotto Proxmox ho riscontrato che non potevo inviare mail tramite smtp.

    Indagando sono riuscito a capire che iptables non funziona correttamente nei container di Proxmox.
    In particolare queste regole ad esempio non si attivano:
    – append INPUT – match state – state ESTABLISHED, RELATED – jump ACCEPT
    – append OUTPUT – match state – state ESTABLISHED, RELATED – jump ACCEPT
    Allora, visto che modprobe non è attivo nei container ho trovato che nella macchina padre Proxmox bisogna modificare il file

    /etc/vz/vz.conf
    e nella sezione IPv4 modificare la riga IPTABLES in:

    IPTABLES="iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_state ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT xt_mac ipt_owner"

    A questo punto riavviare la macchina e dai container le regole viste sopra funzionano..
    Ma ho visto anche che lo script di attivazione di iptables di vestaCP fa un test per verificare se e’ presente il modulo “state” che non funziona ancora..

    Allora ho modificato il file
    /usr/local/vesta/bin/v-update-firewall

    alla riga 41 e seguenti in questo modo:

    # Checking conntrack module avaiabilty
    #$modprobe nf_conntrack >/dev/null 2>&1
    #$modprobe nf_conntrack_ftp >/dev/null 2>&1
    cat /proc/net/ip_tables_matches | grep state > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    stateful='no'
    fi
    

    riavviando dal pannello VestaCP il servizio di firewall, ora tutto funziona a dovere !!

  • Aumentare la dimensione di un disco virtuale in Centos 6

    Questa mini guida spiega come aumentare la dimensione di un disco di una macchina virtuale Linux Centos 6 su sistema VMware.

    Ci sono diverse guide a proposito ma poche coprono tutti i seguenti aspetti:

    • Macchina virtuale su VMWare
    • Sistema Linux Centos 6
    • Dischi gestiti con LVM
    • Evitare di dover definire una partizione aggiuntiva

    Ecco i passaggi che ho fatto.

    Installazione base di Centos 6.4 su VMPlayer o VMware Fusion su Mac

    Il disco di base era dimensionato a 6 GB

    Ora voglio portarlo a 12 GB

    Controllo lo spazio a disposizione inizialmente:

    [root@localhost ~]# df -h
    Filesystem Size Used Avail Use% Montato su
    /dev/mapper/VolGroup-lv_root
     3,5G 620M 2,8G 19% /
    tmpfs 497M 0 497M 0% /dev/shm
    /dev/sda1 485M 32M 429M 7% /boot

    Controllo la dimensione delle partizioni in settori:

    [root@localhost ~]# fdisk -ul /dev/sda
     
    Disco /dev/sda: 6442 MB, 6442450944 byte
    255 testine, 63 settori/tracce, 783 cilindri, totale 12582912 settori
    Unità = settori di 1 * 512 = 512 byte
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Identificativo disco: 0x0009fd66
     
    Dispositivo Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048     1026047      512000   83  Linux
    La partizione 1 non termina al limite del cilindro.
    /dev/sda2         1026048    12582911     5778432   8e  Linux LVM
    La partizione 2 non termina al limite del cilindro.

    Prendo nota del settore  1026048 iniziale della partizione /dev/sda2

    Spengo la macchina virtuale con

    [root@localhost ~]# halt

    e aumento la dimensione del disco fisso a 12 GB. Avvio nuovamente la macchina e uso fdisk per ridimensionare la partizione /dev/sda2

    [root@localhost ~]# fdisk /dev/sda
     
    WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
             switch off the mode (command 'c') and change display units to
             sectors (command 'u').
     
    Comando (m per richiamare la guida): p
     
    Disco /dev/sda: 12.9 GB, 12884901888 byte
     
    255 testine, 63 settori/tracce, 1566 cilindri
    Unità = cilindri di 16065 * 512 = 8225280 byte
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Identificativo disco: 0x0009fd66
     
    Dispositivo Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          64      512000   83  Linux
    La partizione 1 non termina al limite del cilindro.
    /dev/sda2              64         784     5778432   8e  Linux LVM
    La partizione 2 non termina al limite del cilindro.
     
    Comando (m per richiamare la guida): d
    Numero della partizione (1-4): 2
     
    Comando (m per richiamare la guida): n
    Azione comando
        e   estesa
       p   partizione primaria (1-4)
    p
    Numero della partizione (1-4): 2
    Primo cilindro (64-1566, predefinito 64):
    Utilizzo del valore predefinito 64
    Last cilindro, +cilindri or +size{K,M,G} (64-1566, predefinito 1566):
    Utilizzo del valore predefinito 1566
     
    Comando (m per richiamare la guida): t
    Numero della partizione (1-4): 2
    Codice esadecimale (digitare L per elencare i codici): 8e
    Modificato il tipo di sistema della partizione 2 in 8e (Linux LVM)
     
    Comando (m per richiamare la guida): u
    Modifica delle unità di visualizzazione/immissione su settori
     
    Comando (m per richiamare la guida): p
     
    Disco /dev/sda: 12.9 GB, 12884901888 byte
     
    255 testine, 63 settori/tracce, 1566 cilindri, totale 25165824 settori
    Unità = settori di 1 * 512 = 512 byte
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Identificativo disco: 0x0009fd66
     
    Dispositivo Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048     1026047      512000   83  Linux
    La partizione 1 non termina al limite del cilindro.
    /dev/sda2         1026048    25157789    12065871   8e  Linux LVM

    Se il primo settore della partizione /dev/sda2 non e’ uguale a prima del ridimensionamento possiamo utilizzare la modalitò avanzata di fdisk

    Comando (m per richiamare la guida): x
     
    Comando per esperti (m per richiamare la guida): b
    Numero della partizione (1-4): 2
    Nuovo inizio dati (1026048-25157789, predefinito 1026048): 1026048
     
    Comando per esperti (m per richiamare la guida): w
    La tabella delle partizioni è stata alterata!
     
    Chiamata di ioctl() per rileggere la tabella delle partizioni.
     
    WARNING: Re-reading the partition table failed with error 16: Dispositivo o risorsa occupata.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Sincronizzazione dei dischi in corso.

    Riavvio per applicare le modifiche

    [root@localhost ~]# reboot

    Controllo la dimensione dei Gruppi di volume LVM

    [root@localhost ~]# vgdisplay
      --- Volume group ---
      VG Name               VolGroup
      System ID
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  3
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               5,51 GiB
      PE Size               4,00 MiB
      Total PE              1410
      Alloc PE / Size       1410 / 5,51 GiB
      Free  PE / Size       0 / 0
      VG UUID               cGePzQ-4rCO-T6XB-dmAu-S8Vl-OvrU-09IU5I

    Ridimensione il gruppo in base alla partizione

    [root@localhost ~]# pvresize /dev/sda2
      Physical volume "/dev/sda2" changed
      1 physical volume(s) resized / 0 physical volume(s) not resized

    Controllo ora il risultato

    [root@localhost ~]# vgdisplay
      --- Volume group ---
      VG Name               VolGroup
      System ID
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  4
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               11,50 GiB
      PE Size               4,00 MiB
      Total PE              2945
      Alloc PE / Size       1410 / 5,51 GiB
      Free  PE / Size       1535 / 6,00 GiB
      VG UUID               cGePzQ-4rCO-T6XB-dmAu-S8Vl-OvrU-09IU5I

    Estendo ora il volume logico lv_root

    [root@localhost ~]# lvextend -l +100%FREE /dev/VolGroup/lv_root
      Extending logical volume lv_root to 9,54 GiB
      Logical volume lv_root successfully resized
    [root@localhost ~]# lvdisplay /dev/VolGroup/lv_root --- Logical volume --- LV Path /dev/VolGroup/lv_root LV Name lv_root VG Name VolGroup LV UUID HlpgVs-YQ2L-ve3n-p3S8-N2gC-USV2-3nROu4 LV Write Access read/write LV Creation host, time localhost.localdomain, 2013-06-27 00:10:38 +0200 LV Status available # open 1 LV Size 9,54 GiB Current LE 2441 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0

    Alla fine espando il filesystem

    [root@localhost ~]# resize2fs /dev/VolGroup/lv_root
    resize2fs 1.41.12 (17-May-2010)
    Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
    old desc_blocks = 1, new_desc_blocks = 1
    Performing an on-line resize of /dev/VolGroup/lv_root to 2499584 (4k) blocks.
    The filesystem on /dev/VolGroup/lv_root is now 2499584 blocks long.

    E verifico finalmente il risultato

    [root@localhost ~]# df -h
    Filesystem            Size  Used Avail Use% Montato su
    /dev/mapper/VolGroup-lv_root
                          9,4G  621M  8,4G   7% /
    tmpfs                 497M     0  497M   0% /dev/shm
    /dev/sda1             485M   32M  429M   7% /boot
  • ZIP Puliti con Mac OS-X

    Comprimendo una cartella con il vostro PC Mac avrete notato che vengono inclusi anche dei file nascosti tipo 

    .svn
    .git
    .DS_Store
    Thumbs.db

    Ecco come risolvere il problema in 2 minuti:

    Aprite l'applicazione Automator

    Alla richiesta del modello da creare selezionate Servizio e confermate con il tasto Scegli

    In alto come ricezioni impostate "Documenti e Cartelle" in "Finder"

    Dall'elenco sulla sinistra selezionate dalla categoria "Utility" l'azione "Esegui Apple Script" e trascinatela nell'area di destra

    Troverete gia' scritto del codice di esempio :

    on run {input, parameters}
        (* Your script goes here *)
        return input
    end run

    Cancellate tutto e incollate il codice seguente:

    on run {input, parameters}
        tell application "Finder"
            set n to count of input
            set oggetto to (first item of input as string)
            set Dir to ((container of item oggetto) as string)
            set cartella to quoted form of POSIX path of Dir
            set nome to ""
            repeat with i in input
                set nome to (quoted form of ((name of i) as string) & " " & nome)
            end repeat
            if n = 1 then
                set nome_se to my nome_senza_estensione(oggetto)
            else
                set nome_se to "Archivio"
            end if
            if item (Dir & nome_se & ".zip") exists then
                set theDate to current date
                set theYear to year of theDate as text
                set theMonth to (month of theDate as integer) as text
                if length of theMonth < 2 then
                    set theMonth to ("0" & theMonth)
                end if
                set theDay to (day of theDate) as text
                if length of theDay < 2 then
                    set theDay to ("0" & theDay)
                end if
                set theTime to (characters 1 thru 2 of time string of theDate) & (characters 4 thru 5 of time string of theDate) & (characters 7 thru 8 of time string of theDate)
                set nome_se to (nome_se & "_" & theYear & theMonth & theDay & "-" & theTime)
            end if
            do shell script "cd " & cartella & "; zip -r --exclude=*.DS_Store* --exclude=*.svn* --exclude=*.git* --exclude=*Thumbs.db* " & quoted form of nome_se & " " & nome 
        end tell
        return input
        
    end run
    
    on nome_senza_estensione(an_item)
        tell application "Finder"
            set theName to (name of item an_item) as text
            set theExtension to (name extension of item an_item) as text
            if theExtension is not "" then
                set x to the offset of theExtension in theName
                set theName to text 1 thru (x - 2) of theName
            end if
            return theName
        end tell
    end nome_senza_estensione

    Ora salvare il tutto ed assegnare un nome appropriato al Servizio, es: "Crea Zip Pulito"

    A questo punto "cliccando col tasto destro" su una cartella oppure su un insieme di file troverete la funzione "Crea Zip Pulito" che genererà un archivio di tipo .zip senza i classici file nascosti generati da OS-X 

  • Configurazione dell’accesso internet con Tiscali Mobile su Android 2.2.2

    Ecco come ho configurato con successo l'accesso ad internet su smartphone con Android 2.2.2 con Operatore Tiscali Mobile

    Seguire questi passaggi:

    Impostazioni > Wireless e reti > Reti Mobili > Nomi punti di accesso

    Tasto Menu > Nuovo APN

    Inserire i seguenti dati:

    Nome: Tiscali Internet

    APN: tiscalimobileportale

    Proxy: <Non impostato>

    Porta: <Non impostato>

    Nome Utente: <Non impostato>

    Password: <Non impostato>

    Server: <Non impostato>

    MMSC: http://mms.tiscali.mobi/servlets/mms

    Proxy MMS: 213.230.130.89

    Porta MMS: 80

    Protocollo MMS: WAP 2.0

    MMC: 222

    MNC: 01

    Tipo di autenticazione: PAP

    Tipo APN: default

    Premere il tasto Menu e selezioanre: Salva

     

    Ho provato la connessione internet ma non gli MMS, qualcuno li ha provati ?

  • pdb.set_trace()

    Per il debug degli script Python usiamo da tempo il sistema

    import pdb;pdb.set_trace()

    ma se abbiamo bisogno di debuggare uno script python dalla ZMI di Plone, questo sistema non funziona.

    Ecco che ci viene aiuto un prodottino minimale per zope. Non e’ una novita’ ma l’ho incontrato solo di recente

    basta scaricare dal repository e posizionarlo nella nostra cartella src:

    svn co svn://svn.zope.org/repos/main/Products.enablesettrace/trunk enablesettrace

    abilitarlo dal buildout.cfg, rilanciare ./bin/buildout

    ed ecco che il comando

    pdb.set_trace()

    permette di stoppare l’esecuzione dello script nel punto in cui vogliamo.

    Questo prodotto servira’ solo in fase di sviluppo ovviamente.

    Per ulteriori informazioni du pdb vedi: http://docs.python.org/library/pdb.html

  • Installazione di Plone 4.1 su Debian 6.0.2

    Ecco i passi da fare per installare Plone 4 su una distribuzione Debian 6.0.2 oppure Ubuntu 10.04LTS.

    L’installazione prevede anche l’installazione di python in una directory utente e senza necessita’ di diritti di root

    Gli unici comandi da eseguire come utente root sono i seguenti

    aptitude update
    
    aptitude upgrade
    
    aptitude install zlib1g-dev libjpeg-dev build-essential libssl-dev
    
    # la seguente linea e' opzionale
    aptitude install ssh sudo screen subversion
    
    # l'installazione dei 2 pacchetti seguenti puo' tornar utile per l'installazione di alcuni prodotti Plone:
    aptitude install libxml2-dev libxslt-dev
    
    adduser plone
    
    su - plone

    Ecco dunque tutti i passaggi da fare con l’utente appena creato plone

    mkdir plone4; cd plone4

    Scarico Python, Setuptools e Pip

    wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz
    wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
    wget http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz#md5=47ec6ff3f6d962696fe08d4c8264ad49
    ATTENZIONE: Plone 4.1 non supporta completamente Python 2.7.x. Per quel che ho provato io funziona tutto, ma ufficialmente non e’ supportato Python 2.7.x
    La scelta piu’ cautelare Per Plone 4.1 e’ Python 2.6: http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz

    Scompatto tutti i pacchetti

    for i in `ls -1 *gz `; do tar xvzf $i; done

    Creo il percorso dove andrò ad installare Python

    mkdir -p python/2.7.1
    cd Python-2.7.1

    Configuro i sorgenti di Python per essere installati nel percorso definito sopra

    ./configure --prefix="/home/plone/plone4/python/2.7.1"
    make
    make install

    Verifico che python sia installato con il supporto ssl:

    $ ../python/2.7.1/bin/python
    Python 2.7.1 (r...........)
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket
    >>> socket.ssl
    <function ssl at 0xb768ac34>
    >>>

    Se ottengo un risultato simile a quello sopra posso proseguire tranquillo, esco dalla console python con CTRL+d

    Installo Setuptools e Pip

    cd ../setuptools-0.6c11/
    ../python/2.7.1/bin/python2.7 setup.py install
    cd ../pip-1.0.2/
    ../python/2.7.1/bin/python2.7 setup.py install
    cd ..

    Utilizzo Pip per installare ZopeSkel

    ./python/2.7.1/bin/pip install zopeskel==2.21.2
    ./python/2.7.1/bin/paster create --list-templates

    Creo il buildout di Plone

    ./python/2.7.1/bin/paster create -t plone4_buildout
    Selected and implied templates:
    ZopeSkel#plone4_buildout  A buildout for Plone 4 developer installation
    Enter project name: instance
    Variables:
     egg:      instance
     package:  instance
     project:  instance
    **************************************************************************
    **   *** NOTE: You probably don't want to use this template!
    **  Since Plone 3.1, the preferred way to get a buildout-based setup
    **  for Plone is to use the standard installer for your operating
    **  system (the Windows installer, the Mac installer, or the Unified
    **  Installer for Linux/Unix/BSD). These give you a best-practice,
    **  widely-used setup with an isolated Python and a well-documented
    **  buildout. This template is here for older versions of Plone and
    **  for experts who explicitly want a raw, non-installer-based
    **  installation.
    **  (This message is particularly aimed at people following out-of-
    **  date books/documentation that suggest this is the right way to get
    **  a Plone-based buildout. This is no longer the case.)
    **************************************************************************
    Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']:
    Plone Version (Plone version # to install) ['4.0.5']: 4.1
    Creating template plone4_buildout
    Creating directory ./instance
     Copying README.txt to ./instance/README.txt
     Copying bootstrap.py to ./instance/bootstrap.py
     Copying buildout.cfg_tmpl to ./instance/buildout.cfg
     Recursing into src
     Creating ./instance/src/
     Copying README.txt to ./instance/src/README.txt
     Recursing into var
     Creating ./instance/var/
     Copying README.txt to ./instance/var/README.txt
    **************************************************************************
    **   Generation finished.
    **  You probably want to run python bootstrap.py and then edit
    **  buildout.cfg before running bin/buildout -v".
    **  See README.txt for details.
    **************************************************************************
    cd instance
    ../python/2.7.1/bin/python bootstrap.py
    ./bin/buildout

    Avvio l’istanza in modalità foreground

    ./bin/instance fg

    Per avviarla in background utilizzerò poi

    ./bin/instance start