
Автоматизированный сервер общего веб-хостинга на базе Tor с поддержкой нескольких версий PHP, маршрутизацией электронной почты, автоматическим масштабированием экземпляров Tor и встроенной защитой, включая защиту от CSRF, CSP и зашифрованные ключи onion.
Это конфигурация для сервера общего хостинга на базе Tor. Предоставляется «как есть», и перед вводом в эксплуатацию вы должны внести изменения в соответствии со своими потребностями. Это незавершённая работа, и перед обновлением следует внимательно проверять историю коммитов на предмет изменений. Для production-сервера рекомендуется не менее 1 ТБ SSD-дискового пространства, 32 ГБ ОЗУ и 8 ядер ЦП. Для небольшого тестового/личного сервера достаточно 4 ГБ ОЗУ и 1 ядра ЦП.
Переводы управляются в Weblate.
Если вы предпочитаете отправлять переводы вручную, скрипт update-translations.sh можно использовать для обновления шаблона языка и файлов перевода из исходного кода.
Он создаст файл var/www/locale/hosting.pot, который вы затем можете использовать как основу для создания нового языкового файла в var/www/ВАШ_КОД_ЯЗЫКА/LC_MESSAGES/hosting.po и отредактировать его с помощью программы для перевода, такой как Poedit.
После завершения вы можете открыть pull request или написать мне, чтобы включить перевод.
Конфигурация тестировалась с Debian 13 (Trixie) и Ubuntu 24.04 LTS. Рекомендуется установить Debian 13 или Ubuntu 24.04 на ваш сервер, но с небольшими доработками вы также сможете запустить это на других дистрибутивах и/или версиях. Если вы хотите собрать это на Raspberry Pi, не используйте образы Raspbian, так как некоторые вещи сломаются. Вместо этого загрузите образ для вашей модели Pi с https://raspi.debian.net/daily-images/.
Самый простой способ установки — с помощью автоматического установщика:
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
./install.sh
Установщик обрабатывает всё: установку пакетов, компиляцию PHP/ImageMagick, настройку Tor, настройку MySQL и подготовку сервисов. Он запросит пароли или сгенерирует их автоматически.
Параметры:
./install.sh --non-interactive # Пропустить запросы, сгенерировать случайные пароли
./install.sh --vanity <префикс> # Сгенерировать «ванильный» .onion-адрес
./install.sh --skip-binaries # Пропустить компиляцию (использовать, если уже собрано)
./install.sh --db-pass <пароль> # Установить пароль MySQL для хостинга
./install.sh --pma-pass <пароль> # Установить пароль MySQL для phpMyAdmin
./install.sh --admin-pass <пароль> # Установить пароль панели администратора
Генерация «ванильного» .onion использует mkp224o (компилируется автоматически). Допустимы только символы a-z и 2-7. Префикс из 4 символов занимает минуты, из 5 символов — 10-30 минут, из 6+ символов — часы.
Учётные данные сохраняются в /root/hosting-credentials.txt.
cd hosting
./update.sh # Обновить код, сохранить конфигурацию
./update.sh --rebuild # Также пересобрать PHP/ImageMagick
./update.sh --code-only # Обновить только PHP-файлы
Скрипт обновления создаёт резервную копию вашей конфигурации, загружает последний код, восстанавливает пароли и .onion-адрес, а затем перезапускает сервисы. Он определяет, изменился ли install_binaries.sh, и предупреждает о необходимости пересборки.
Если вы предпочитаете устанавливать вручную, следуйте шагам ниже.
Удалите пакеты, которые могут мешать этой настройке:
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
Если после этого шага у вас возникли проблемы с разрешением имён хостов, временно переключитесь на публичный DNS-сервер, например 1.1.1.1 (от CloudFlare) или 8.8.8.8 (от Google):
rm /etc/resolv.conf && echo "nameserver 1.1.1.1" > /etc/resolv.conf
Добавьте дополнительные репозитории (только для Debian — в Ubuntu nginx и brotli есть изначально):
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
Установите git и клонируйте этот репозиторий:
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
Установите пользовательские оптимизированные бинарные файлы:
./install_binaries.sh
Обратите внимание, что в Debian также есть архив пакетов onion-сервисов, поэтому вы можете отредактировать /etc/apt/sources.list для загрузки оттуда:
deb tor://2s4yqjx5ul6okpp3f2gaunr2syex5jgbfpfvhxxbbjwnrsvbk5v3qbid.onion/debian `lsb_release -cs` main
Скопируйте (и измените в соответствии со своими потребностями) файлы сайта из var/www в /var/www и файлы конфигурации из etc в /etc после завершения установки. Затем перезапустите некоторые сервисы:
systemctl daemon-reload && systemctl restart bind9.service && systemctl restart [email protected]
Замените домен .onion по умолчанию на свой:
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
Для вашего clearnet-домена вам нужно добавить его в relay_domains в /etc/postfix/main.cf и отредактировать домен по умолчанию в следующих файлах:
/var/www/common.php
/etc/postfix/canonical
/etc/postfix-clearnet/canonical
Эта настройка имеет два экземпляра Postfix: один для приёма и отправки почты другим .onion-сервисам, и один для перезаписи адресов для передачи их на почтовый релей для clearnet. Вы можете создать второй экземпляр, выполнив:
postmulti -e init
postmulti -I postfix-clearnet -e create
postmulti -i clearnet -e enable
postmulti -i clearnet -p start
Если вы создали экземпляр, раскомментируйте соответствующие настройки релея clearnet в etc/postfix/main.cf и не забудьте также скопировать и изменить файлы конфигурации из etc/postfix-clearnet.
Если вы столкнулись со следующей ошибкой: postfix: fatal: chdir(/var/spool/postfix-clearnet): No such file or directory, вы можете просто скопировать chroot из экземпляра Postfix по умолчанию следующим образом: cd /var/spool/ && cp -a postfix/ postfix-clearnet/
После копирования (и изменения) конфигурации Postfix необходимо создать базы данных из файлов сопоставления (также каждый раз при обновлении этих файлов):
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 # только если у вас есть второй экземпляр
Чтобы сохранять временные файлы в памяти, добавьте следующее в /etc/fstab:
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/log/nginx tmpfs rw,user,noatime 0 0
Для укрепления системы и скрытия PID от обычных пользователей также добавьте:
proc /proc proc defaults,hidepid=2 0 0
И добавьте опции noatime,usrjquota=aquota.user,jqfmt=vfsv1 к точке монтирования /home, затем инициализируйте квоту. Замените /home на /, если у вас нет отдельного раздела:
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)
В некоторых случаях вы можете получить ошибку о том, что квота не поддерживается. Обычно это происходит в виртуальных средах. Убедитесь, что у вас установлено полное ядро, а не пакет с -virtual. Обычно это linux-image-amd64, linux-image-arm64 или linux-image-generic, в зависимости от вашего дистрибутива. Также убедитесь, что вы работаете на реальной виртуальной машине (например, KVM). Некоторые провайдеры предоставляют контейнерные VPS (например, OpenVZ), что означает, что вы не используете собственное ядро.
Установите sodium_compat для поддержки v3 hidden_service:
cd /var/www && composer install
Создайте пользователя MySQL для phpmyadmin и настройте его в /var/www/html/phpmyadmin/config.inc.php, а также заполните $cfg['blowfish_secret'] случайными символами:
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
Создайте пользователя MySQL со всеми привилегиями для управления хостингом:
mysql
CREATE USER 'hosting'@'%' IDENTIFIED BY 'MY_PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'hosting'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
Затем отредактируйте конфигурацию базы данных в /var/www/common.php и /etc/postfix/sql/alias.cf.
И последнее, но не менее важное: настройте базу данных, выполнив:
php /var/www/setup.php
Включите systemd-таймеры для регулярного выполнения различных задач управления:
systemctl enable hosting-del.timer && systemctl enable hosting.timer && systemctl enable hosting-autoscale.timer
Финальный шаг — перезагрузиться, подождать около 5 минут, пока все сервисы запустятся, и проверить, всё ли работает, создав тестовую учётную запись.
Пользователи могут выбирать между PHP 8.2, 8.3, 8.4 и 8.5 при регистрации и менять версию на панели управления. По умолчанию используется PHP 8.5.
Экземпляры Tor масштабируются автоматически в зависимости от количества учётных записей. Таймер hosting-autoscale.timer запускается каждый час и добавляет новый экземпляр примерно на каждые 250 учётных записей. Идентификаторы экземпляров идут от a до z, затем aa, ab и т.д. Вы также можете вручную задать экземпляры в SERVICE_INSTANCES в /var/www/common.php и запустить setup.php.
htmlspecialchars()script-src 'none'