
Servidor de hospedagem compartilhada automatizado baseado em Tor com suporte a múltiplas versões de PHP, roteamento de e-mail, instâncias Tor com autoescalonamento e endurecimento de segurança integrado incluindo proteção CSRF, CSP e chaves onion criptografadas.
Esta é uma configuração para um servidor de hospedagem compartilhada baseado em Tor. É fornecido como está e, antes de colocá-lo em produção, você deve fazer alterações de acordo com suas necessidades. Este é um trabalho em andamento e você deve verificar cuidadosamente o histórico de commits para alterações antes de atualizar. Para um servidor de produção, recomenda-se pelo menos 1 TB de espaço em disco SSD, 32 GB de RAM e 8 núcleos de CPU. Para um servidor pequeno de teste/pessoal, 4 GB de RAM e 1 núcleo de CPU são suficientes.
As traduções são gerenciadas no Weblate.
Se você prefere enviar traduções manualmente, o script update-translations.sh pode ser usado para atualizar o modelo de idioma e os arquivos de tradução a partir da fonte.
Ele gerará o arquivo var/www/locale/hosting.pot, que você poderá usar como base para criar um novo arquivo de idioma em var/www/SEU_CODIGO_DE_IDIOMA/LC_MESSAGES/hosting.po e editá-lo com um programa de tradução, como Poedit.
Quando terminar, você pode abrir um pull request, ou enviar um e-mail para mim, para incluir a tradução.
A configuração foi testada com Debian 13 (Trixie) e Ubuntu 24.04 LTS. Recomenda-se instalar Debian 13 ou Ubuntu 24.04 em seu servidor, mas com alguns ajustes você também pode fazer funcionar em outras distribuições e/ou versões. Se você quiser construí-lo em um raspberry pi, não use as imagens raspbian, pois várias coisas quebrarão. Baixe uma imagem para o seu modelo de pi de https://raspi.debian.net/daily-images/ em vez disso.
A maneira mais fácil de instalar é com o instalador automatizado:
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
./install.sh
O instalador cuida de tudo: instalação de pacotes, compilação do PHP/ImageMagick, configuração do Tor, configuração do MySQL e provisionamento de serviços. Ele solicitará senhas ou as gerará automaticamente.
Opções:
./install.sh --non-interactive # Ignorar prompts, gerar senhas aleatórias
./install.sh --vanity <prefixo> # Gerar um endereço .onion personalizado
./install.sh --skip-binaries # Pular compilação (usar se já foi compilado)
./install.sh --db-pass <senha> # Definir senha MySQL da hospedagem
./install.sh --pma-pass <senha> # Definir senha MySQL do phpMyAdmin
./install.sh --admin-pass <senha> # Definir senha do painel de administração
A geração de .onion personalizado usa mkp224o (compilado automaticamente). Apenas caracteres a-z e 2-7 são válidos. Um prefixo de 4 caracteres leva minutos, 5 caracteres leva de 10 a 30 minutos, 6+ caracteres leva horas.
As credenciais são salvas em /root/hosting-credentials.txt.
cd hosting
./update.sh # Atualizar código, preservar configuração
./update.sh --rebuild # Também recompilar PHP/ImageMagick
./update.sh --code-only # Apenas atualizar arquivos PHP
O script de atualização faz backup da sua configuração, baixa o código mais recente, restaura senhas e endereço onion e reinicia serviços. Ele detecta se install_binaries.sh mudou e avisa para recompilar.
Se você prefere instalar manualmente, siga os passos abaixo.
Desinstale pacotes que podem interferir nesta configuração:
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 você tiver problemas para resolver nomes de host após esta etapa, mude temporariamente para um servidor de nomes público como 1.1.1.1 (da CloudFlare) ou 8.8.8.8 (do Google)
rm /etc/resolv.conf && echo "nameserver 1.1.1.1" > /etc/resolv.conf
Adicione repositórios adicionais (apenas Debian — Ubuntu tem 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
Instale o git e clone este repositório
apt update && apt install git && git clone https://github.com/DanWin/hosting && cd hosting
Instale binários otimizados personalizados
./install_binaries.sh
Note que o Debian também possui um arquivo de pacotes de serviço onion, então você pode querer editar /etc/apt/sources.list para carregar de lá em vez disso:
deb tor://2s4yqjx5ul6okpp3f2gaunr2syex5jgbfpfvhxxbbjwnrsvbk5v3qbid.onion/debian `lsb_release -cs` main
Copie (e modifique de acordo com suas necessidades) os arquivos do site em var/www para /var/www e os arquivos de configuração em etc para /etc após a instalação ser concluída. Em seguida, reinicie alguns serviços:
systemctl daemon-reload && systemctl restart bind9.service && systemctl restart [email protected]
Substitua o domínio .onion padrão pelo seu domínio:
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
Para o seu domínio clearnet, você precisa adicioná-lo a relay_domains em /etc/postfix/main.cf e editar o domínio padrão nos seguintes arquivos:
/var/www/common.php
/etc/postfix/canonical
/etc/postfix-clearnet/canonical
Esta configuração tem duas instâncias do postfix, uma para receber e enviar e-mail para outros serviços .onion e outra para reescrever endereços para encaminhá-los a um relay de e-mail voltado para clearnet. Você pode ou não querer criar a segunda instância executando
postmulti -e init
postmulti -I postfix-clearnet -e create
postmulti -i clearnet -e enable
postmulti -i clearnet -p start
Se você criou uma instância, descomente a configuração relacionada ao relay clearnet em etc/postfix/main.cf e certifique-se de copiar e modificar também os arquivos de configuração de etc/postfix-clearnet
Se você encontrou o seguinte problema: postfix: fatal: chdir(/var/spool/postfix-clearnet): No such file or directory você pode simplesmente copiar o chroot da instância padrão do postfix assim: cd /var/spool/ && cp -a postfix/ postfix-clearnet/
Após copiar (e modificar) a configuração do postfix, você precisa criar bancos de dados a partir dos arquivos de mapeamento (também cada vez que atualizar esses arquivos):
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 #apenas se você tiver uma segunda instância
Para salvar arquivos temporários na memória, adicione o seguinte a /etc/fstab:
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/log/nginx tmpfs rw,user,noatime 0 0
Para endurecer o sistema e ocultar pids de usuários não root, também adicione o seguinte:
proc /proc proc defaults,hidepid=2 0 0
E adicione as opções noatime,usrjquota=aquota.user,jqfmt=vfsv1 ao ponto de montagem /home, então inicialize a cota. Substitua /home por /, se você não tiver uma partição separada:
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)
Em alguns casos, você pode obter um erro de que a cota não é suportada. Isso geralmente acontece em ambientes virtuais. Certifique-se de ter o kernel completo instalado, não um com um pacote -virtual. Eles geralmente são linux-image-amd64, linux-image-arm64 ou linux-image-generic, dependendo da sua distribuição. Também certifique-se de estar executando uma máquina virtual real (ex.: KVM). Alguns provedores vendem VPSs conteinerizados (ex.: OpenVZ), o que significa que você não executa seu próprio kernel...
Instale o sodium_compat para suporte a v3 hidden_service
cd /var/www && composer install
Crie um usuário mysql para o phpmyadmin e configure-o em /var/www/html/phpmyadmin/config.inc.php e preencha $cfg['blowfish_secret'] com caracteres aleatórios:
mysql
CREATE USER 'phpmyadmin'@'%' IDENTIFIED BY 'MINHA_SENHA';
CREATE DATABASE phpmyadmin;
GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'phpmyadmin'@'%';
FLUSH PRIVILEGES;
quit
mysql phpmyadmin < /var/www/html/phpmyadmin/sql/create_tables.sql
Crie um usuário mysql com todas as permissões para nosso gerenciamento de hospedagem:
mysql
CREATE USER 'hosting'@'%' IDENTIFIED BY 'MINHA_SENHA';
GRANT ALL PRIVILEGES ON *.* TO 'hosting'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
Em seguida, edite a configuração do banco de dados em /var/www/common.php e /etc/postfix/sql/alias.cf
Por último, mas não menos importante, configure o banco de dados executando
php /var/www/setup.php
Habilite os temporizadores do systemd para executar regularmente várias tarefas de gerenciamento:
systemctl enable hosting-del.timer && systemctl enable hosting.timer && systemctl enable hosting-autoscale.timer
O passo final é reiniciar, esperar cerca de 5 minutos para todos os serviços iniciarem e verificar se tudo está funcionando criando uma conta de teste.
Os usuários podem escolher entre PHP 8.2, 8.3, 8.4 e 8.5 no registro e alterar sua versão pelo painel. O padrão é PHP 8.5.
As instâncias do Tor escalonam automaticamente com base no número de contas. O hosting-autoscale.timer é executado a cada hora e adiciona uma nova instância a cada ~250 contas. Os IDs das instâncias vão de a a z, depois aa, ab, etc. Você também pode definir instâncias manualmente em SERVICE_INSTANCES em /var/www/common.php e executar setup.php.
htmlspecialchars()script-src 'none'