Улучшение фронта

This commit is contained in:
2026-02-08 06:12:19 +07:00
parent caf52afcdf
commit a3cdf02d48
34 changed files with 487 additions and 641 deletions

View File

@@ -39,7 +39,6 @@ func StartHTTPS() {
serverName := chi.ServerName
if serverName == "" {
tools.Logs_file(1, "HTTPS", "⚠️ Подключение без SNI (возможно по IP)", "logs_https.log", false)
} else if cert, ok := certMap[serverName]; ok {
// Найден точный сертификат для домена
@@ -59,7 +58,6 @@ func StartHTTPS() {
}
if fallbackCert != nil {
tools.Logs_file(1, "HTTPS", "⚠️ Используем fallback-сертификат", "logs_https.log", false)
return fallbackCert, nil
}

View File

@@ -377,7 +377,6 @@ func PHPHandler(w http.ResponseWriter, r *http.Request, host string, originalURI
return
}
tools.Logs_file(0, "PHP", fmt.Sprintf("✅ FastCGI обработал: %s (порт %d)", phpPath, port), "logs_php.log", false)
}
// Streaming чтение FastCGI ответа с поддержкой SSE и chunked transfer

View File

@@ -28,16 +28,9 @@ func isWebSocketRequest(r *http.Request) bool {
// Проксирует WebSocket соединение
func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig config.Proxy_Service) bool {
// Определяем протокол для локального соединения
protocol := "ws"
networkProtocol := "tcp"
if proxyConfig.ServiceHTTPSuse {
protocol = "wss"
}
targetAddr := proxyConfig.LocalAddress + ":" + proxyConfig.LocalPort
tools.Logs_file(0, "WS-PROXY", "🔌 WebSocket: "+r.RemoteAddr+" → "+protocol+"://"+targetAddr+r.URL.Path, "logs_proxy.log", false)
// Захватываем клиентское соединение через Hijacker
hijacker, ok := w.(http.Hijacker)
@@ -135,7 +128,6 @@ func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig co
return true
}
tools.Logs_file(0, "WS-PROXY", "✅ WebSocket установлен: "+r.Host+r.URL.Path, "logs_proxy.log", false)
// Двунаправленное проксирование данных
done := make(chan struct{}, 2)
@@ -171,7 +163,6 @@ func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig co
// Ждём завершения одного из направлений
<-done
tools.Logs_file(0, "WS-PROXY", "🔌 WebSocket закрыт: "+r.Host+r.URL.Path, "logs_proxy.log", false)
return true
}

View File

@@ -388,32 +388,32 @@ func checkRules(rules []VAccessRule, requestPath string, r *http.Request, checkF
if errorPage == "" {
errorPage = "404"
}
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+requestPath, logFile, false)
return false, errorPage
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+r.Host+requestPath, logFile, false)
return false, errorPage
}
// Все условия Allow выполнены - разрешаем доступ
return true, ""
case "Disable":
// Disable правило: запрещаем если ЛЮБОЕ условие выполнено
shouldBlock := true
// Для расширений файлов (только если проверка включена)
if checkFileExtensions && len(rule.TypeFile) > 0 && !fileMatches {
shouldBlock = false
}
// Для IP адресов
if len(rule.IPList) > 0 && !ipMatches {
shouldBlock = false
}
if shouldBlock {
errorPage := rule.UrlError
if errorPage == "" {
errorPage = "404"
}
// Все условия Allow выполнены - разрешаем доступ
return true, ""
case "Disable":
// Disable правило: запрещаем если ЛЮБОЕ условие выполнено
shouldBlock := true
// Для расширений файлов (только если проверка включена)
if checkFileExtensions && len(rule.TypeFile) > 0 && !fileMatches {
shouldBlock = false
}
// Для IP адресов
if len(rule.IPList) > 0 && !ipMatches {
shouldBlock = false
}
if shouldBlock {
errorPage := rule.UrlError
if errorPage == "" {
errorPage = "404"
}
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+requestPath, logFile, false)
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+r.Host+requestPath, logFile, false)
return false, errorPage
}

View File

@@ -42,7 +42,7 @@ func CreateNewSite(siteData SiteInfo) error {
return fmt.Errorf("ошибка добавления в конфиг: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Новый сайт создан: %s (%s)", siteData.Name, siteData.Host), "logs_config.log", true)
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Новый сайт создан: %s (%s)", siteData.Name, siteData.Host), "logs_error.log", true)
return nil
}
@@ -91,7 +91,7 @@ func CreateSiteFolder(host string) error {
return fmt.Errorf("не удалось создать папку: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("📁 Создана папка: %s", folderPath), "logs_config.log", false)
tools.Logs_file(0, "SITES", fmt.Sprintf("📁 Создана папка: %s", folderPath), "logs_error.log", false)
return nil
}
@@ -113,7 +113,7 @@ func CreateStarterFile(host, rootFile string) error {
return fmt.Errorf("не удалось создать файл: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("📄 Создан стартовый файл: %s", rootFile), "logs_config.log", false)
tools.Logs_file(0, "SITES", fmt.Sprintf("📄 Создан стартовый файл: %s", rootFile), "logs_error.log", false)
return nil
}
@@ -142,7 +142,7 @@ func CreateVAccessFile(host string) error {
return fmt.Errorf("не удалось создать vAccess.conf: %w", err)
}
tools.Logs_file(0, "SITES", "🔒 Создан vAccess.conf", "logs_config.log", false)
tools.Logs_file(0, "SITES", "🔒 Создан vAccess.conf", "logs_error.log", false)
return nil
}
@@ -166,7 +166,7 @@ func AddSiteToConfig(siteData SiteInfo) error {
return err
}
tools.Logs_file(0, "SITES", "💾 Конфигурация обновлена", "logs_config.log", false)
tools.Logs_file(0, "SITES", "💾 Конфигурация обновлена", "logs_error.log", false)
return nil
}
@@ -227,7 +227,7 @@ func UploadSiteCertificate(host, certType string, certData []byte) error {
return fmt.Errorf("не удалось сохранить сертификат: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("🔒 Загружен сертификат: %s для %s", fileName, host), "logs_config.log", true)
tools.Logs_file(0, "SITES", fmt.Sprintf("🔒 Загружен сертификат: %s для %s", fileName, host), "logs_error.log", true)
return nil
}
@@ -251,7 +251,7 @@ func DeleteSiteCertificates(host string) error {
return fmt.Errorf("не удалось удалить папку сертификатов: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалены сертификаты для: %s", host), "logs_config.log", true)
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалены сертификаты для: %s", host), "logs_error.log", true)
return nil
}
@@ -281,13 +281,13 @@ func DeleteSite(host string) error {
if err := os.RemoveAll(absSiteDir); err != nil {
return fmt.Errorf("не удалось удалить папку сайта: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалена папка сайта: %s", siteDir), "logs_config.log", false)
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалена папка сайта: %s", siteDir), "logs_error.log", false)
}
// 3. Удаляем сертификаты
if err := DeleteSiteCertificates(host); err != nil {
// Логируем ошибку, но продолжаем удаление
tools.Logs_file(1, "SITES", fmt.Sprintf("Ошибка удаления сертификатов: %v", err), "logs_config.log", false)
tools.Logs_file(1, "SITES", fmt.Sprintf("Ошибка удаления сертификатов: %v", err), "logs_error.log", false)
}
// 4. Удаляем из конфига
@@ -301,7 +301,7 @@ func DeleteSite(host string) error {
return fmt.Errorf("ошибка сохранения конфигурации: %w", err)
}
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Сайт '%s' полностью удалён", host), "logs_config.log", true)
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Сайт '%s' полностью удалён", host), "logs_error.log", true)
return nil
}

View File

@@ -49,16 +49,13 @@ func LoadConfig() {
data, err := os.ReadFile(ConfigPath)
if err != nil {
tools.Logs_file(0, "JSON", "Ошибка загрузки конфигурационного файла", "logs_config.log", true)
} else {
tools.Logs_file(0, "JSON", "config.json успешно загружен", "logs_config.log", true)
tools.Logs_file(1, "JSON", "Ошибка загрузки конфигурационного файла", "logs_error.log", true)
return
}
err = json.Unmarshal(data, &ConfigData)
if err != nil {
tools.Logs_file(0, "JSON", "Ошибка парсинга конфигурационного файла", "logs_config.log", true)
} else {
tools.Logs_file(0, "JSON", "config.json успешно прочитан", "logs_config.log", true)
tools.Logs_file(1, "JSON", "Ошибка парсинга конфигурационного файла", "logs_error.log", true)
}
// Миграция: добавляем новые поля если их нет
@@ -116,7 +113,7 @@ func migrateConfig(originalData []byte) {
// Если нужно обновить - сохраняем конфиг с новыми полями
if needsSave {
tools.Logs_file(0, "JSON", "🔄 Миграция конфига: добавляем новые поля", "logs_config.log", true)
tools.Logs_file(0, "JSON", "🔄 Миграция конфига: добавляем новые поля", "logs_error.log", true)
saveConfig()
}
}
@@ -125,15 +122,15 @@ func migrateConfig(originalData []byte) {
func saveConfig() {
formattedJSON, err := json.MarshalIndent(ConfigData, "", " ")
if err != nil {
tools.Logs_file(1, "JSON", "Ошибка форматирования конфига: "+err.Error(), "logs_config.log", true)
tools.Logs_file(1, "JSON", "Ошибка форматирования конфига: "+err.Error(), "logs_error.log", true)
return
}
err = os.WriteFile(ConfigPath, formattedJSON, 0644)
if err != nil {
tools.Logs_file(1, "JSON", "Ошибка сохранения конфига: "+err.Error(), "logs_config.log", true)
tools.Logs_file(1, "JSON", "Ошибка сохранения конфига: "+err.Error(), "logs_error.log", true)
return
}
tools.Logs_file(0, "JSON", "✅ Конфиг обновлён с новыми полями", "logs_config.log", true)
tools.Logs_file(0, "JSON", "✅ Конфиг обновлён с новыми полями", "logs_error.log", true)
}

View File

@@ -82,12 +82,23 @@ func Logs_file(type_log int, service string, message string, log_file string, co
}
// Открываем файл для дозаписи, создаём если нет, права на запись.
file, err := os.OpenFile(logsDir+"/"+log_files, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
filePath := logsDir + "/" + log_files
isNew := false
if _, err := os.Stat(filePath); os.IsNotExist(err) {
isNew = true
}
file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// UTF-8 BOM для новых файлов (чтобы Windows корректно читал)
if isNew {
file.Write([]byte{0xEF, 0xBB, 0xBF})
}
// Пишем строку в файл
if _, err := file.WriteString(text); err != nil {
log.Fatal(err)