mirror of
https://github.com/Ground-Zerro/DomainMapper.git
synced 2025-12-10 01:47:18 +07:00
web
This commit is contained in:
5
web/README.md
Normal file
5
web/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Попытка перенести DomainMapper на WEB платформу для размещения желающими на собсвтенном хостинге.
|
||||
|
||||
Не уверен, что закончу начатое.
|
||||
|
||||
Предложения в виде **pull requests** приветствуются.
|
||||
75
web/app.py
Normal file
75
web/app.py
Normal 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
126
web/index.html
Normal 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
132
web/web_install.sh
Normal 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"
|
||||
Reference in New Issue
Block a user