
Serveur d'hébergement web partagé automatisé basé sur Tor avec support multi-version PHP, routage email, instances Tor à mise à l'échelle automatique, et renforcement de sécurité intégré incluant protection CSRF, CSP, et clés onion chiffrées.
Ceci est une configuration pour un serveur d'hébergement partagé basé sur Tor. Il est fourni tel quel et avant de le mettre en production, vous devez effectuer des modifications selon vos besoins. C'est un travail en cours et vous devez vérifier attentivement l'historique des commits pour les modifications avant de mettre à jour. Pour un serveur de production, au moins 1 To d'espace disque SSD, 32 Go de RAM et 8 cœurs de CPU sont recommandés. Pour un petit serveur de test/personnel, 4 Go de RAM et 1 cœur de CPU suffisent.
Les traductions sont gérées dans Weblate.
Si vous préférez soumettre manuellement des traductions, le script update-translations.sh peut être utilisé pour mettre à jour le modèle de langue et les fichiers de traduction à partir de la source.
Il générera le fichier var/www/locale/hosting.pot que vous pourrez ensuite utiliser comme base pour créer un nouveau fichier de langue dans var/www/VOTRE_CODE_LANGUE/LC_MESSAGES/hosting.po et l'éditer avec un programme de traduction, tel que Poedit.
Une fois terminé, vous pouvez ouvrir une pull request, ou m'envoyer un email, pour inclure la traduction.
La configuration a été testée avec Debian 13 (Trixie) et Ubuntu 24.04 LTS. Il est recommandé d'installer Debian 13 ou Ubuntu 24.04 sur votre serveur, mais avec quelques ajustements, vous pouvez également faire fonctionner cela sur d'autres distributions et/ou versions. Si vous souhaitez le construire sur un raspberry pi, veuillez ne pas utiliser les images raspbian car plusieurs choses casseront. Téléchargez plutôt une image pour votre modèle de pi depuis https://raspi.debian.net/daily-images/.
Le moyen le plus simple d'installer est d'utiliser l'installateur automatisé :
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
./install.sh
L'installateur gère tout : installation des paquets, compilation de PHP/ImageMagick, configuration de Tor, configuration MySQL et provisionnement des services. Il demandera les mots de passe ou les générera automatiquement.
Options :
./install.sh --non-interactive # Ignorer les invites, générer des mots de passe aléatoires
./install.sh --vanity <préfixe> # Générer une adresse .onion personnalisée
./install.sh --skip-binaries # Ignorer la compilation (utiliser si déjà compilé)
./install.sh --db-pass <motdepasse> # Définir le mot de passe MySQL de l'hébergement
./install.sh --pma-pass <motdepasse> # Définir le mot de passe MySQL de phpMyAdmin
./install.sh --admin-pass <motdepasse> # Définir le mot de passe du panneau d'administration
La génération d'adresse .onion personnalisée utilise mkp224o (compilé automatiquement). Seuls les caractères a-z et 2-7 sont valides. Un préfixe de 4 caractères prend quelques minutes, 5 caractères prend 10 à 30 minutes, 6 caractères et plus prend des heures.
Les identifiants sont enregistrés dans /root/hosting-credentials.txt.
cd hosting
./update.sh # Mettre à jour le code, préserver la configuration
./update.sh --rebuild # Recompiler PHP/ImageMagick également
./update.sh --code-only # Mettre à jour uniquement les fichiers PHP
Le script de mise à jour sauvegarde votre configuration, récupère le dernier code, restaure les mots de passe et l'adresse onion, puis redémarre les services. Il détecte si install_binaries.sh a changé et vous avertit de recompiler.
Si vous préférez installer manuellement, suivez les étapes ci-dessous.
Désinstaller les paquets qui pourraient interférer avec cette configuration :
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
Si vous avez des problèmes pour résoudre les noms d'hôte après cette étape, basculez temporairement vers un serveur de noms public comme 1.1.1.1 (de CloudFlare) ou 8.8.8.8 (de Google)
rm /etc/resolv.conf && echo "nameserver 1.1.1.1" > /etc/resolv.conf
Ajouter des dépôts supplémentaires (Debian uniquement — Ubuntu a nginx et brotli nativement) :
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
Installer git et cloner ce dépôt
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
Installer les binaires optimisés personnalisés
./install_binaries.sh
Notez que debian a également une archive de paquets pour les services onion, vous pouvez donc vouloir modifier /etc/apt/sources.list pour charger depuis celle-ci à la place :
deb tor://2s4yqjx5ul6okpp3f2gaunr2syex5jgbfpfvhxxbbjwnrsvbk5v3qbid.onion/debian `lsb_release -cs` main
Copier (et modifier selon vos besoins) les fichiers du site dans var/www vers /var/www et les fichiers de configuration dans etc vers /etc une fois l'installation terminée. Redémarrez ensuite certains services :
systemctl daemon-reload && systemctl restart bind9.service && systemctl restart [email protected]
Remplacez le domaine .onion par défaut par votre domaine :
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
Pour votre domaine clearnet, vous devez l'ajouter à relay_domains dans /etc/postfix/main.cf et modifier le domaine par défaut dans les fichiers suivants :
/var/www/common.php
/etc/postfix/canonical
/etc/postfix-clearnet/canonical
Cette configuration a deux instances postfix, une pour recevoir et envoyer du courrier vers d'autres services .onion et une pour réécrire les adresses afin de les transmettre à un relais de courrier destiné au clearnet. Vous pouvez ou non vouloir créer la deuxième instance en exécutant
postmulti -e init
postmulti -I postfix-clearnet -e create
postmulti -i clearnet -e enable
postmulti -i clearnet -p start
Si vous avez créé une instance, décommentez la configuration relative au relais clearnet dans etc/postfix/main.cf et assurez-vous de copier et modifier également les fichiers de configuration depuis etc/postfix-clearnet
Si vous avez rencontré le problème suivant : postfix: fatal: chdir(/var/spool/postfix-clearnet): No such file or directory, vous pouvez simplement copier le chroot depuis l'instance postfix par défaut comme ceci cd /var/spool/ && cp -a postfix/ postfix-clearnet/
Après avoir copié (et modifié) la configuration de postfix, vous devez créer des bases de données à partir des fichiers de correspondance (également à chaque fois que vous mettez à jour ces fichiers) :
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 #uniquement si vous avez une deuxième instance
Pour enregistrer les fichiers temporaires en mémoire, ajoutez ce qui suit à /etc/fstab :
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/log/nginx tmpfs rw,user,noatime 0 0
Pour renforcer le système et cacher les pids aux utilisateurs non-root, ajoutez également ce qui suit :
proc /proc proc defaults,hidepid=2 0 0
Et ajoutez les options noatime,usrjquota=aquota.user,jqfmt=vfsv1 au point de montage /home, puis initialisez le quota. Remplacez /home par /, si vous n'avez pas de partition séparée :
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)
Dans certains cas, vous pouvez obtenir une erreur indiquant que le quota n'est pas pris en charge. C'est généralement le cas dans les environnements virtuels. Assurez-vous d'avoir le noyau complet installé, pas un avec un paquet -virtual. Il s'agit généralement de linux-image-amd64, linux-image-arm64 ou linux-image-generic, selon votre distribution. Assurez-vous également d'exécuter une vraie machine virtuelle (par exemple KVM). Certains fournisseurs proposent des VPS conteneurisés (par exemple OpenVZ), ce qui signifie que vous n'exécutez pas votre propre noyau...
Installer sodium_compat pour la prise en charge des services cachés v3
cd /var/www && composer install
Créez un utilisateur mysql pour phpmyadmin et configurez-le dans /var/www/html/phpmyadmin/config.inc.php et remplissez $cfg['blowfish_secret'] avec des caractères aléatoires :
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
Créez un utilisateur mysql avec toutes les permissions pour notre gestion d'hébergement :
mysql
CREATE USER 'hosting'@'%' IDENTIFIED BY 'MY_PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'hosting'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
Modifiez ensuite la configuration de la base de données dans /var/www/common.php et /etc/postfix/sql/alias.cf
Enfin, configurez la base de données en exécutant
php /var/www/setup.php
Activez les minuteurs systemd pour exécuter régulièrement diverses tâches de gestion :
systemctl enable hosting-del.timer && systemctl enable hosting.timer && systemctl enable hosting-autoscale.timer
La dernière étape consiste à redémarrer, attendre environ 5 minutes que tous les services démarrent, et vérifier que tout fonctionne en créant un compte de test.
Les utilisateurs peuvent choisir entre PHP 8.2, 8.3, 8.4 et 8.5 lors de l'inscription et modifier leur version depuis le tableau de bord. La version par défaut est PHP 8.5.
Les instances Tor sont mises à l'échelle automatiquement en fonction du nombre de comptes. Le hosting-autoscale.timer s'exécute toutes les heures et ajoute une nouvelle instance pour environ 250 comptes. Les identifiants d'instance vont de a à z, puis aa, ab, etc. Vous pouvez également définir manuellement les instances dans SERVICE_INSTANCES dans /var/www/common.php et exécuter setup.php.
htmlspecialchars()script-src 'none'