
Server di hosting web condiviso automatizzato basato su Tor con supporto multi-versione PHP, routing email, istanze Tor con auto-scaling, e rafforzamento della sicurezza integrato inclusa protezione CSRF, CSP e chiavi onion crittografate.
Questa è una configurazione per un server di hosting condiviso basato su Tor. Viene fornita così com'è e, prima di metterla in produzione, dovresti apportare modifiche in base alle tue esigenze. È un lavoro in corso e dovresti controllare attentamente la cronologia dei commit per eventuali modifiche prima di aggiornare. Per un server di produzione, si consigliano almeno 1 TB di spazio su disco SSD, 32 GB di RAM e 8 core della CPU. Per un piccolo server di test/personale, sono sufficienti 4 GB di RAM e 1 core della CPU.
Le traduzioni sono gestite in Weblate.
Se preferisci inviare manualmente le traduzioni, lo script update-translations.sh può essere utilizzato per aggiornare il template della lingua e i file di traduzione dal sorgente.
Genererà il file var/www/locale/hosting.pot che potrai poi usare come base per creare un nuovo file di lingua in var/www/YOUR_LANG_CODE/LC_MESSAGES/hosting.po e modificarlo con un programma di traduzione, come Poedit.
Una volta terminato, puoi aprire una pull request, o inviarmi un'email, per includere la traduzione.
La configurazione è stata testata con Debian 13 (Trixie) e Ubuntu 24.04 LTS. Si consiglia di installare Debian 13 o Ubuntu 24.04 sul tuo server, ma con qualche piccolo aggiustamento potresti riuscire a farla funzionare anche su altre distribuzioni e/o versioni. Se vuoi costruirlo su un raspberry pi, non usare le immagini raspbian perché molte cose si romperanno. Scarica invece un'immagine per il tuo modello di pi da https://raspi.debian.net/daily-images/.
Il modo più semplice per installare è con l'installer automatico:
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
./install.sh
L'installer gestisce tutto: installazione dei pacchetti, compilazione di PHP/ImageMagick, configurazione di Tor, setup di MySQL e provisioning dei servizi. Richiederà le password o le genererà automaticamente.
Opzioni:
./install.sh --non-interactive # Salta le richieste, genera password casuali
./install.sh --vanity <prefisso> # Genera un indirizzo .onion personalizzato
./install.sh --skip-binaries # Salta la compilazione (usa se già compilato)
./install.sh --db-pass <pass> # Imposta la password MySQL per hosting
./install.sh --pma-pass <pass> # Imposta la password MySQL per phpMyAdmin
./install.sh --admin-pass <pass> # Imposta la password del pannello di amministrazione
La generazione di un .onion personalizzato usa mkp224o (compilato automaticamente). Sono validi solo i caratteri a-z e 2-7. Un prefisso di 4 caratteri richiede minuti, 5 caratteri richiede 10-30 minuti, 6+ caratteri richiede ore.
Le credenziali sono salvate in /root/hosting-credentials.txt.
cd hosting
./update.sh # Aggiorna il codice, preserva la configurazione
./update.sh --rebuild # Ricostruisce anche PHP/ImageMagick
./update.sh --code-only # Aggiorna solo i file PHP
Lo script di aggiornamento esegue un backup della configurazione, recupera l'ultimo codice, ripristina le password e l'indirizzo onion, e riavvia i servizi. Rileva se install_binaries.sh è cambiato e ti avvisa di ricostruire.
Se preferisci installare manualmente, segui i passaggi seguenti.
Rimuovi i pacchetti che potrebbero interferire con questa configurazione:
DEBIAN_FRONTEND=noninteractive apt purge -y apache2* dnsmasq* eatmydata exim4* imagemagick-6-common mysql-client* mysql-server* nginx* libnginx-mod* php7* resolvconf && systemctl disable systemd-resolved.service && systemctl stop systemd-resolved.service
Se dopo questo passaggio hai problemi a risolvere i nomi host, passa temporaneamente a un nameserver pubblico come 1.1.1.1 (di CloudFlare) o 8.8.8.8 (di Google)
rm /etc/resolv.conf && echo "nameserver 1.1.1.1" > /etc/resolv.conf
Aggiungi repository aggiuntivi (solo Debian — Ubuntu ha nginx e brotli nativamente):
apt update && apt install git apt-transport-tor curl lsb-release
curl -sSL https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc > /etc/apt/trusted.gpg.d/torproject.asc
curl -sSL https://packages.sury.org/nginx/apt.gpg > /etc/apt/trusted.gpg.d/sury.gpg
echo "deb tor://apow7mjfryruh65chtdydfmqfpj5btws7nbocgtaovhvezgccyjazpqd.onion/torproject.org/ `lsb_release -cs` main" >> /etc/apt/sources.list
echo "deb https://packages.sury.org/nginx/ `lsb_release -cs` main" >> /etc/apt/sources.list
apt update && apt upgrade
Installa git e clona questo repository
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
Installa i binari personalizzati ottimizzati
./install_binaries.sh
Nota che anche Debian ha un archivio di pacchetti per servizi onion, quindi potresti voler modificare /etc/apt/sources.list per caricare da lì invece:
deb tor://2s4yqjx5ul6okpp3f2gaunr2syex5jgbfpfvhxxbbjwnrsvbk5v3qbid.onion/debian `lsb_release -cs` main
Copia (e modifica secondo le tue esigenze) i file del sito in var/www in /var/www e i file di configurazione in etc in /etc dopo che l'installazione è terminata. Poi riavvia alcuni servizi:
systemctl daemon-reload && systemctl restart bind9.service && systemctl restart [email protected]
Sostituisci il dominio .onion predefinito con il tuo dominio:
sed -i "s/dhosting4xxoydyaivckq7tsmtgi4wfs3flpeyitekkmqwu4v4r46syd.onion/`cat /var/lib/tor/hidden_service/hostname`/g" /etc/postfix/sql/alias.cf /etc/postfix/sender_login_maps /etc/postfix/main.cf /var/www/skel/www/index.hosting.html /var/www/common.php /etc/postfix/canonical /etc/postfix-clearnet/canonical /var/www/html/squirrelmail/config/config.php
Per il tuo dominio clearnet, devi aggiungerlo a relay_domains in /etc/postfix/main.cf e modificare il dominio predefinito nei seguenti file:
/var/www/common.php
/etc/postfix/canonical
/etc/postfix-clearnet/canonical
Questa configurazione ha due istanze di postfix, una per ricevere e inviare mail ad altri servizi .onion e una per riscrivere gli indirizzi per passarli a un relay di posta clearnet. Potresti voler creare o meno la seconda istanza eseguendo
postmulti -e init
postmulti -I postfix-clearnet -e create
postmulti -i clearnet -e enable
postmulti -i clearnet -p start
Se hai creato un'istanza, decommenta la configurazione relativa al relay clearnet in etc/postfix/main.cf e assicurati di copiare e modificare anche i file di configurazione da etc/postfix-clearnet
Se hai riscontrato il seguente problema: postfix: fatal: chdir(/var/spool/postfix-clearnet): No such file or directory puoi semplicemente copiare il chroot dall'istanza postfix predefinita così: cd /var/spool/ && cp -a postfix/ postfix-clearnet/
Dopo aver copiato (e modificato) la configurazione di posfix, devi creare i database dai file di mapping (anche ogni volta che aggiorni quei file):
postalias /etc/aliases
postmap /etc/postfix/canonical /etc/postfix/sender_login_maps /etc/postfix/transport
postmap /etc/postfix-clearnet/canonical /etc/postfix-clearnet/sasl_password /etc/postfix-clearnet/transport #solo se hai una seconda istanza
Per salvare i file temporanei in memoria, aggiungi quanto segue a /etc/fstab:
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/log/nginx tmpfs rw,user,noatime 0 0
Per indurire il sistema e nascondere i pid agli utenti non root, aggiungi anche quanto segue:
proc /proc proc defaults,hidepid=2 0 0
E aggiungi le opzioni noatime,usrjquota=aquota.user,jqfmt=vfsv1 al mountpoint /home, poi inizializza la quota. Sostituisci /home con /, se non hai una partizione separata:
systemctl daemon-reload
mount -o remount $(findmnt -n -o TARGET --target /home)
quotacheck -cMu $(findmnt -n -o TARGET --target /home)
quotaon $(findmnt -n -o TARGET --target /home)
In alcuni casi, potresti ottenere un errore che la quota non è supportata. Questo di solito accade in ambienti virtuali. Assicurati di avere il kernel completo installato, non uno con un pacchetto -virtual. Di solito sono linux-image-amd64, linux-image-arm64 o linux-image-generic, a seconda della tua distribuzione. Assicurati anche di eseguire una macchina virtuale reale (es. KVM). Alcuni fornitori vendono VPS containerizzati (es. OpenVZ), il che significa che non esegui il tuo kernel...
Installa sodium_compat per il supporto di v3 hidden_service
cd /var/www && composer install
Crea un utente mysql per phpmyadmin e configuralo in /var/www/html/phpmyadmin/config.inc.php e riempi $cfg['blowfish_secret'] con caratteri casuali:
mysql
CREATE USER 'phpmyadmin'@'%' IDENTIFIED BY 'MY_PASSWORD';
CREATE DATABASE phpmyadmin;
GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'phpmyadmin'@'%';
FLUSH PRIVILEGES;
quit
mysql phpmyadmin < /var/www/html/phpmyadmin/sql/create_tables.sql
Crea un utente mysql con tutti i permessi per la gestione dell'hosting:
mysql
CREATE USER 'hosting'@'%' IDENTIFIED BY 'MY_PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'hosting'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
Poi modifica la configurazione del database in /var/www/common.php e /etc/postfix/sql/alias.cf
Ultimo ma non meno importante, imposta il database eseguendo
php /var/www/setup.php
Abilita i timer di systemd per eseguire regolarmente varie attività di gestione:
systemctl enable hosting-del.timer && systemctl enable hosting.timer && systemctl enable hosting-autoscale.timer
Il passo finale è riavviare, attendere circa 5 minuti per l'avvio di tutti i servizi, e verificare che tutto funzioni creando un account di test.
Gli utenti possono scegliere tra PHP 8.2, 8.3, 8.4 e 8.5 al momento della registrazione e cambiare la loro versione dalla dashboard. Il valore predefinito è PHP 8.5.
Le istanze di Tor si ridimensionano automaticamente in base al numero di account. Il timer hosting-autoscale.timer viene eseguito ogni ora e aggiunge una nuova istanza per ogni ~250 account. Gli ID delle istanze vanno da a a z, poi aa, ab, ecc. Puoi anche impostare manualmente le istanze in SERVICE_INSTANCES in /var/www/common.php ed eseguire setup.php.
htmlspecialchars()script-src 'none'