package main import ( "fmt" "log" "net/http" "net/http/httputil" "net/url" "os" "os/exec" "path/filepath" "strings" ) const indexHTML = ` HF Seedbox
qBittorrent
Filebrowser
` func writeQBConfig() { configDir := "/home/user/profile/qBittorrent/config" os.MkdirAll(configDir, 0755) configData := `[LegalNotice] Accepted=true [Preferences] WebUI\Port=8082 WebUI\LocalHostAuth=false WebUI\AuthSubnetWhitelistEnabled=true WebUI\AuthSubnetWhitelist=127.0.0.1/32 ` err := os.WriteFile(filepath.Join(configDir, "qBittorrent.conf"), []byte(configData), 0644) if err != nil { log.Fatalf("Ошибка записи конфига qB: %v", err) } } func main() { // 1. Подготовка директорий и конфигов os.MkdirAll("/home/user/downloads", 0755) writeQBConfig() // 2. Запуск Filebrowser (на порту 8081) fbCmd := exec.Command("./filebrowser", "-a", "127.0.0.1", "-p", "8081", "-r", "/home/user/downloads", "--noauth", "-b", "/fb", "-d", "/home/user/filebrowser.db", ) fbCmd.Stdout = os.Stdout fbCmd.Stderr = os.Stderr if err := fbCmd.Start(); err != nil { log.Fatalf("Не удалось запустить Filebrowser: %v", err) } fmt.Println("Filebrowser запущен на 127.0.0.1:8081") // 3. Запуск qBittorrent (на порту 8082) qbCmd := exec.Command("./qbittorrent-nox", "--webui-port=8082", "--profile=/home/user/profile", "--save-path=/home/user/downloads", ) qbCmd.Stdout = os.Stdout qbCmd.Stderr = os.Stderr if err := qbCmd.Start(); err != nil { log.Fatalf("Не удалось запустить qBittorrent: %v", err) } fmt.Println("qBittorrent запущен на 127.0.0.1:8082") // 4. Настройка Reverse Proxy fbURL, _ := url.Parse("http://127.0.0.1:8081") qbURL, _ := url.Parse("http://127.0.0.1:8082") fbProxy := httputil.NewSingleHostReverseProxy(fbURL) qbProxy := httputil.NewSingleHostReverseProxy(qbURL) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // Главная страница с вкладками if r.URL.Path == "/" { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write([]byte(indexHTML)) return } // Виртуальный путь для загрузки WebUI qBittorrent в iframe if r.URL.Path == "/qb-ui" { r.URL.Path = "/" qbProxy.ServeHTTP(w, r) return } // Запросы к Filebrowser if strings.HasPrefix(r.URL.Path, "/fb") { fbProxy.ServeHTTP(w, r) return } // Все остальные запросы (API, CSS, JS от qBittorrent) проксируются в qB qbProxy.ServeHTTP(w, r) }) // 5. Запуск веб-сервера на порту 7860 fmt.Println("Proxy сервер запущен на 0.0.0.0:7860") if err := http.ListenAndServe("0.0.0.0:7860", nil); err != nil { log.Fatalf("Ошибка запуска сервера: %v", err) } }