Fix DB auth: local-only Postgres, install password defaults

This commit is contained in:
vpn-panel
2026-05-21 19:07:07 +03:00
parent 74d5d34679
commit 98f78d712e
5 changed files with 106 additions and 33 deletions
+49 -10
View File
@@ -11,6 +11,7 @@ import (
"strings"
"syscall"
"github.com/joho/godotenv"
"golang.org/x/term"
"vpn-panel/internal/auth"
"vpn-panel/internal/database"
@@ -18,6 +19,8 @@ import (
)
func main() {
_ = godotenv.Load()
fmt.Println()
fmt.Println(" ╔══════════════════════════════════════╗")
fmt.Println(" ║ VPN Panel — Установщик ║")
@@ -41,12 +44,18 @@ func main() {
domain := prompt(reader, "Домен панели (например panel.example.com)", "localhost")
appPort := prompt(reader, "Порт приложения", "8080")
fmt.Println("\n--- PostgreSQL 17 ---")
dbHost := prompt(reader, "Хост БД", "postgres")
dbPort := prompt(reader, "Порт БД", "5432")
dbUser := prompt(reader, "Пользователь БД", "vpnpanel")
dbPass := promptSecret("Пароль БД")
dbName := prompt(reader, "Имя базы данных", "vpnpanel")
fmt.Println("\n--- PostgreSQL 17 (только локально, Docker-сеть) ---")
fmt.Println("Хост БД в Docker: postgres (не localhost)")
if os.Getenv("POSTGRES_PASSWORD") != "" {
fmt.Printf("Пароль из окружения/.env: задан (пользователь %s)\n", envOr("POSTGRES_USER", "vpnpanel"))
}
dbHost := prompt(reader, "Хост БД", envOr("POSTGRES_HOST", "postgres"))
dbPort := prompt(reader, "Порт БД", envOr("POSTGRES_PORT", "5432"))
dbUser := prompt(reader, "Пользователь БД", envOr("POSTGRES_USER", "vpnpanel"))
dbPassDefault := envOr("POSTGRES_PASSWORD", "changeme")
dbPass := promptSecretDefault("Пароль БД", dbPassDefault)
dbName := prompt(reader, "Имя базы данных", envOr("POSTGRES_DB", "vpnpanel"))
fmt.Println("\n--- Администратор (единственный) ---")
adminEmail := prompt(reader, "Email администратора", "admin@localhost")
@@ -78,7 +87,7 @@ func main() {
pool, err := database.Connect(ctx, databaseURL)
if err != nil {
fmt.Fprintf(os.Stderr, "не удалось подключиться: %v\n", err)
fmt.Println("Запустите PostgreSQL (docker compose up -d postgres) и повторите установку.")
printDBHelp(dbPassDefault)
os.Exit(1)
}
defer pool.Close()
@@ -114,7 +123,7 @@ DATABASE_URL=%s
SECRET_KEY=%s
INSTALLED=true
# PostgreSQL (для docker-compose)
# PostgreSQL (docker-compose, только внутренняя сеть)
POSTGRES_USER=%s
POSTGRES_PASSWORD=%s
POSTGRES_DB=%s
@@ -135,13 +144,33 @@ POSTGRES_PORT=%s
fmt.Println(" ✓ Файл .env создан")
fmt.Println()
fmt.Println(" Дальше:")
fmt.Println(" docker compose up -d")
fmt.Println(" или: go run ./cmd/panel")
fmt.Println(" docker compose up -d --build panel")
fmt.Println()
fmt.Printf(" Панель: http://%s:%s\n", domain, appPort)
fmt.Println()
}
func printDBHelp(defaultPass string) {
fmt.Println()
fmt.Println(" Подсказки:")
fmt.Println(" 1. PostgreSQL уже запущен? Пароль задан при ПЕРВОМ старте тома pgdata.")
fmt.Printf(" По умолчанию был: %s — нажмите Enter в поле «Пароль БД».\n", defaultPass)
fmt.Println(" 2. Сменили пароль в установщике, а том старый — сбросьте БД:")
fmt.Println(" docker compose down")
fmt.Println(" docker volume rm vpn-panel_pgdata")
fmt.Println(" docker compose up -d postgres")
fmt.Println(" docker compose --profile tools run --rm install")
fmt.Println(" 3. Убедитесь: docker compose up -d postgres && хост БД = postgres")
fmt.Println()
}
func envOr(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func prompt(reader *bufio.Reader, label, defaultVal string) string {
if defaultVal != "" {
fmt.Printf("%s [%s]: ", label, defaultVal)
@@ -166,6 +195,16 @@ func promptSecret(label string) string {
return string(b)
}
func promptSecretDefault(label, defaultVal string) string {
fmt.Printf("%s [%s] (Enter = по умолчанию): ", label, defaultVal)
b, err := term.ReadPassword(int(syscall.Stdin))
fmt.Println()
if err != nil || len(b) == 0 {
return defaultVal
}
return string(b)
}
func generateSecret() (string, error) {
b := make([]byte, 32)
if _, err := rand.Read(b); err != nil {