Fix DB auth: local-only Postgres, install password defaults
This commit is contained in:
+49
-10
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user