
Tor 기반 자동화된 공유 웹 호스팅 서버로, PHP 다중 버전 지원, 이메일 라우팅, 자동 확장 Tor 인스턴스, 그리고 CSRF 보호, CSP, 암호화된 양파 키를 포함한 내장 보안 강화 기능을 제공합니다.
이것은 Tor 기반 공유 호스팅 서버 설정입니다. 있는 그대로 제공되며, 프로덕션에 배포하기 전에 필요에 따라 변경해야 합니다. 이는 진행 중인 작업이며, 업데이트 전에 변경 사항을 위해 커밋 히스토리를 주의 깊게 확인해야 합니다. 프로덕션 서버의 경우 최소 1TB SSD 디스크 공간, 32GB RAM 및 8 CPU 코어를 권장합니다. 소규모 테스트/개인 서버의 경우 4GB RAM과 1 CPU 코어면 충분합니다.
번역은 Weblate에서 관리됩니다.
번역을 수동으로 제출하려면 스크립트 update-translations.sh를 사용하여 소스에서 언어 템플릿과 번역 파일을 업데이트할 수 있습니다.
이 스크립트는 var/www/locale/hosting.pot 파일을 생성하며, 이를 기반으로 var/www/YOUR_LANG_CODE/LC_MESSAGES/hosting.po에 새 언어 파일을 만들고 Poedit과 같은 번역 프로그램으로 편집할 수 있습니다.
완료되면 pull request를 열거나 이메일로 번역을 포함시킬 수 있습니다.
이 구성은 Debian 13 (Trixie) 및 Ubuntu 24.04 LTS에서 테스트되었습니다. 서버에 Debian 13 또는 Ubuntu 24.04를 설치하는 것이 좋지만, 약간의 조정을 통해 다른 배포판 및/또는 버전에서도 작동할 수 있습니다. 라즈베리 파이에서 구축하려면 raspbian 이미지를 사용하지 마십시오. 여러 항목이 손상될 수 있습니다. 대신 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 <prefix> # 개인화된 .onion 주소 생성
./install.sh --skip-binaries # 컴파일 건너뛰기 (이미 빌드된 경우 사용)
./install.sh --db-pass <pass> # 호스팅 MySQL 비밀번호 설정
./install.sh --pma-pass <pass> # phpMyAdmin MySQL 비밀번호 설정
./install.sh --admin-pass <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
이 단계 후에 호스트 이름 확인에 문제가 있으면 일시적으로 CloudFlare의 1.1.1.1 또는 Google의 8.8.8.8과 같은 공개 네임서버로 전환하십시오.
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
클리어넷 도메인의 경우, /etc/postfix/main.cf의 relay_domains에 추가하고 다음 파일에서 기본 도메인을 편집해야 합니다:
/var/www/common.php
/etc/postfix/canonical
/etc/postfix-clearnet/canonical
이 설정에는 두 개의 postfix 인스턴스가 있습니다. 하나는 다른 .onion 서비스로 메일을 수신 및 전송하는 용도이고, 다른 하나는 주소를 다시 작성하여 클리어넷 메일 릴레이에 전달하는 용도입니다. 다음을 실행하여 두 번째 인스턴스를 생성할 수도 있고 생성하지 않을 수도 있습니다:
postmulti -e init
postmulti -I postfix-clearnet -e create
postmulti -i clearnet -e enable
postmulti -i clearnet -p start
인스턴스를 생성한 경우 etc/postfix/main.cf에서 클리어넷 릴레이 관련 구성을 주석 해제하고 etc/postfix-clearnet의 구성 파일도 복사 및 수정해야 합니다.
다음 문제가 발생한 경우: postfix: fatal: chdir(/var/spool/postfix-clearnet): No such file or directory 다음과 같이 기본 postfix 인스턴스에서 chroot를 복사할 수 있습니다: 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
그리고 /home 마운트 포인트에 noatime,usrjquota=aquota.user,jqfmt=vfsv1 옵션을 추가한 다음 쿼터를 초기화하십시오. 별도의 파티션이 없는 경우 /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)를 판매하며, 이는 자체 커널을 실행하지 않음을 의미합니다...
v3 히든 서비스 지원을 위해 sodium_compat 설치
cd /var/www && composer install
phpmyadmin용 mysql 사용자를 생성하고 /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개의 계정마다 새 인스턴스를 추가합니다. 인스턴스 ID는 a부터 z까지, 그 다음 aa, ab 등으로 진행됩니다. 또한 /var/www/common.php의 SERVICE_INSTANCES에서 인스턴스를 수동으로 설정하고 setup.php를 실행할 수 있습니다.
htmlspecialchars()로 이스케이프됩니다script-src 'none'을 사용합니다