This commit is contained in:
Ground-Zerro
2024-12-31 19:07:12 +11:00
parent 4474a7ef8d
commit c299efc6bf
4 changed files with 338 additions and 0 deletions

5
web/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Попытка перенести DomainMapper на WEB платформу для размещения желающими на собсвтенном хостинге.
Не уверен, что закончу начатое.
Предложения в виде **pull requests** приветствуются.

75
web/app.py Normal file
View File

@@ -0,0 +1,75 @@
from fastapi import FastAPI, Form, UploadFile
from fastapi.responses import FileResponse, HTMLResponse
import asyncio
import os
app = FastAPI()
@app.get("/")
async def get_form():
html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DNS Resolver Settings</title>
</head>
<body>
<h2>Настройки</h2>
<form action="/run" method="post" enctype="multipart/form-data">
<label><strong>Список сервисов:</strong></label><br>
<input type="checkbox" name="services" value="service1"> Service 1<br>
<input type="checkbox" name="services" value="service2"> Service 2<br>
<input type="checkbox" name="services" value="service3"> Service 3<br><br>
<label><strong>Список используемых DNS серверов:</strong></label><br>
<input type="checkbox" name="dns_servers" value="dns1"> DNS Server 1<br>
<input type="checkbox" name="dns_servers" value="dns2"> DNS Server 2<br>
<input type="checkbox" name="dns_servers" value="dns3"> DNS Server 3<br><br>
<label><strong>Фильтрация Cloudflare:</strong></label><br>
<input type="checkbox" name="cloudflare" value="yes"> Исключить Cloudflare<br><br>
<label><strong>Агрегация подсетей:</strong></label><br>
<input type="radio" name="aggregation" value="16"> До /16 (255.255.0.0)<br>
<input type="radio" name="aggregation" value="24"> До /24 (255.255.255.0)<br>
<input type="radio" name="aggregation" value="mix"> Микс /24 и /32<br>
<input type="radio" name="aggregation" value="none" checked> Не агрегировать<br><br>
<label><strong>Формат сохранения:</strong></label><br>
<input type="radio" name="format" value="win"> Windows Route<br>
<input type="radio" name="format" value="unix"> Unix Route<br>
<input type="radio" name="format" value="cidr" checked> CIDR<br><br>
<button type="submit">Запустить</button>
</form>
</body>
</html>
"""
return HTMLResponse(content=html_content)
@app.post("/run")
async def run_dns_resolver(
services: list[str] = Form(...),
dns_servers: list[str] = Form(...),
cloudflare: str = Form(...),
aggregation: str = Form(...),
format: str = Form(...)
):
# Генерация config.ini
config_path = "config.ini"
with open(config_path, "w") as config:
config.write("[DomainMapper]\n")
config.write(f"service={','.join(services)}\n")
config.write(f"dnsserver={','.join(dns_servers)}\n")
config.write(f"cloudflare={cloudflare}\n")
config.write(f"subnet={aggregation}\n")
config.write(f"filetype={format}\n")
# Запуск скрипта
result_file = "output.txt"
os.system(f"python3 main.py -c {config_path}")
# Возвращаем файл результата
return FileResponse(path=result_file, filename="output.txt", media_type="text/plain")

126
web/index.html Normal file
View File

@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DNS Resolver Settings</title>
<script>
function validateForm(event) {
const services = document.querySelectorAll('input[name="services"]:checked');
const dnsServers = document.querySelectorAll('input[name="dns_servers"]:checked');
const format = document.querySelector('input[name="format"]:checked');
if (services.length === 0) {
alert("Выберите хотя бы один сервис.");
event.preventDefault();
return false;
}
if (dnsServers.length === 0) {
alert("Выберите хотя бы один DNS сервер.");
event.preventDefault();
return false;
}
if (!format) {
alert("Выберите формат сохранения.");
event.preventDefault();
return false;
}
return true;
}
// Загрузка сервисов из файла и добавление их в форму
function loadServices() {
const serviceUrl = 'https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/platformdb';
fetch(serviceUrl)
.then(response => response.text())
.then(data => {
const lines = data.split('\n');
const servicesContainer = document.getElementById('servicesContainer');
lines.forEach(line => {
const parts = line.split(':');
if (parts.length > 1) {
const serviceName = parts[0].trim();
const label = document.createElement('label');
const input = document.createElement('input');
input.type = 'checkbox';
input.name = 'services';
input.value = serviceName;
label.appendChild(input);
label.appendChild(document.createTextNode(` ${serviceName}`));
servicesContainer.appendChild(label);
servicesContainer.appendChild(document.createElement('br'));
}
});
})
.catch(error => console.error('Error loading services:', error));
}
// Загрузка DNS серверов из файла и добавление их в форму
function loadDNSServers() {
const dnsUrl = 'https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/dnsdb';
fetch(dnsUrl)
.then(response => response.text())
.then(data => {
const lines = data.split('\n');
const dnsServersContainer = document.getElementById('dnsServersContainer');
lines.forEach(line => {
const parts = line.split(':');
if (parts.length > 1) {
const dnsServerName = parts[0].trim();
const label = document.createElement('label');
const input = document.createElement('input');
input.type = 'checkbox';
input.name = 'dns_servers';
input.value = dnsServerName;
label.appendChild(input);
label.appendChild(document.createTextNode(` ${dnsServerName}`));
dnsServersContainer.appendChild(label);
dnsServersContainer.appendChild(document.createElement('br'));
}
});
})
.catch(error => console.error('Error loading DNS servers:', error));
}
window.onload = function() {
loadServices();
loadDNSServers();
};
</script>
</head>
<body>
<h2>Настройки</h2>
<form action="/run" method="post" enctype="multipart/form-data" onsubmit="validateForm(event)">
<label><strong>Список сервисов:</strong></label><br>
<div id="servicesContainer"></div><br>
<label><strong>Список используемых DNS серверов:</strong></label><br>
<div id="dnsServersContainer"></div><br>
<label><strong>Фильтрация Cloudflare:</strong></label><br>
<input type="checkbox" name="cloudflare" value="yes"> Исключить Cloudflare<br><br>
<label><strong>Агрегация подсетей:</strong></label><br>
<input type="radio" name="aggregation" value="16"> До /16 (255.255.0.0)<br>
<input type="radio" name="aggregation" value="24"> До /24 (255.255.255.0)<br>
<input type="radio" name="aggregation" value="mix"> Микс /24 и /32<br>
<input type="radio" name="aggregation" value="none" checked> Не агрегировать<br><br>
<label><strong>Формат сохранения:</strong></label><br>
<input type="radio" name="format" value="win"> Windows Route<br>
<input type="radio" name="format" value="unix"> Unix Route<br>
<input type="radio" name="format" value="cidr" checked> CIDR<br><br>
<button type="submit">Запустить</button>
</form>
<div id="progress" style="margin-top: 20px; font-weight: bold;">Прогресс выполнения будет отображаться здесь...</div>
</body>
</html>

132
web/web_install.sh Normal file
View File

@@ -0,0 +1,132 @@
#!/bin/bash
# Переменные
USERNAME="test123"
APP_DIR="/home/$USERNAME/dns_resolver_app"
SERVICE_FILE="/etc/systemd/system/dns_resolver.service"
NGINX_CONF="/etc/nginx/sites-available/dns_resolver"
EMAIL_ADR="email@example.com"
DOMAIN_NAME="your-domain.com"
# Проверка существования пользователя
if ! id "$USERNAME" &>/dev/null; then
echo "Пользователь $USERNAME не существует."
read -p "Хотите создать пользователя? (y/n): " CREATE_USER
if [[ "$CREATE_USER" =~ ^[Yy]$ ]]; then
sudo useradd -m -s /bin/bash "$USERNAME"
echo "Пользователь $USERNAME успешно создан."
else
echo "Скрипт завершён, так как пользователь не существует."
exit 1
fi
fi
# Обновление системы и установка зависимостей
echo "Обновляем систему и устанавливаем зависимости..."
sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv gunicorn nginx certbot python3-certbot-nginx -y
# Создание директории приложения
echo "Создаем директорию приложения..."
sudo -u $USERNAME mkdir -p $APP_DIR
# Перемещение в директорию приложения
cd $APP_DIR
# Создание виртуального окружения
echo "Создаем виртуальное окружение..."
sudo -u $USERNAME python3 -m venv venv
# Активация виртуального окружения и установка библиотек
echo "Устанавливаем зависимости Python..."
# Загрузка файла requirements.txt
curl -o $APP_DIR/requirements.txt https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/requirements.txt
# Установка зависимостей из requirements.txt и добавление необходимых библиотек
sudo -u $USERNAME bash -c "source $APP_DIR/venv/bin/activate && pip install -r $APP_DIR/requirements.txt fastapi uvicorn pydantic"
# Загрузка файлов приложения
echo "Загружаем файлы приложения..."
curl -o "$APP_DIR/index.html" -L "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/web/index.html"
curl -o "$APP_DIR/app.py" -L "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/web/app.py"
curl -o "$APP_DIR/main.py" -L "https://raw.githubusercontent.com/Ground-Zerro/DomainMapper/refs/heads/main/main.py"
chown "$USERNAME":"$USERNAME" "$APP_DIR/main.py"
# Создание системного сервиса
echo "Создаем системный сервис..."
sudo tee $SERVICE_FILE > /dev/null <<EOF
[Unit]
Description=DNS Resolver Web App
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=$APP_DIR
ExecStart=$APP_DIR/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
[Install]
WantedBy=multi-user.target
EOF
# Активация и запуск сервиса
echo "Активируем и запускаем сервис..."
sudo systemctl daemon-reload
sudo systemctl start dns_resolver
sudo systemctl enable dns_resolver
# Настройка Nginx
echo "Настраиваем Nginx..."
sudo rm -f /etc/nginx/sites-enabled/default # Удаляем стандартный конфиг
sudo tee $NGINX_CONF > /dev/null <<EOF
server {
listen 80;
server_name _;
root $APP_DIR;
index index.html;
location / {
try_files \$uri /index.html;
}
error_page 404 /index.html;
}
EOF
# Создаем символическую ссылку для конфигурации
sudo ln -sf $NGINX_CONF /etc/nginx/sites-enabled/
# Проверяем конфигурацию Nginx
sudo nginx -t
# Перезапускаем Nginx
sudo systemctl restart nginx
# Настройка прав доступа к директории приложения
echo "Настраиваем права доступа для Nginx..."
sudo chown -R www-data:www-data $APP_DIR
sudo chmod -R 755 $APP_DIR
# Настраиваем доступ к домашней директории пользователя, если это требуется
HOME_DIR=$(dirname "$APP_DIR")
sudo chmod 755 $HOME_DIR
echo "Права доступа к директории приложения настроены."
# Открытие портов для Nginx
echo "Открываем порты для Nginx..."
sudo ufw allow 'Nginx Full'
sudo ufw reload
echo "Конфигурация Nginx завершена."
# Настройка HTTPS с помощью Certbot
echo "Настраиваем HTTPS с помощью Certbot..."
sudo certbot --nginx -n --agree-tos --email $EMAIL_ADR -d $DOMAIN_NAME
# Завершение
echo "Настройка завершена. Приложение доступно по адресу $DOMAIN_NAME"