Replace env vars with toml config

This commit is contained in:
2025-08-14 12:01:29 +03:00
parent 121585f807
commit 137da5a893
6 changed files with 151 additions and 29 deletions

50
main.go
View File

@@ -3,6 +3,7 @@ package main
import (
"context"
"database/sql"
"flag"
"fmt"
"log/slog"
"net/http"
@@ -16,6 +17,7 @@ import (
ffmpegmv "git.vakhrushev.me/av/transcriber/internal/adapter/metaviewer/ffmpeg"
"git.vakhrushev.me/av/transcriber/internal/adapter/recognizer/yandex"
"git.vakhrushev.me/av/transcriber/internal/adapter/repo/sqlite"
"git.vakhrushev.me/av/transcriber/internal/config"
httpcontroller "git.vakhrushev.me/av/transcriber/internal/controller/http"
tgcontroller "git.vakhrushev.me/av/transcriber/internal/controller/tg"
"git.vakhrushev.me/av/transcriber/internal/controller/worker"
@@ -31,10 +33,8 @@ import (
)
const (
TelegramUpdateTimeout = 10
ServerShutdownTimeout = 5
ForceShutdownTimeout = 20
ForceShutdownTimeout = 20
)
func main() {
@@ -44,6 +44,22 @@ func main() {
}))
slog.SetDefault(logger)
// Parse command line flags
configPath := flag.String("c", "config.toml", "Path to config file")
flag.StringVar(configPath, "config", "config.toml", "Path to config file (alias for -c)")
flag.Parse()
// Load configuration
cfg, err := config.LoadConfig(*configPath)
if err != nil {
// If config file doesn't exist, use defaults
cfg = config.DefaultConfig()
// Log that we're using default config
logger.Info("Using default configuration", "config_path", *configPath, "error", err)
} else {
logger.Info("Configuration loaded successfully", "config_path", *configPath)
}
// Загружаем переменные окружения из .env файла
if err := godotenv.Load(); err != nil {
logger.Warn("Warning: .env file not found, using system environment variables")
@@ -55,7 +71,7 @@ func main() {
os.Exit(1)
}
db, err := sql.Open("sqlite3", "data/transcriber.db")
db, err := sql.Open("sqlite3", cfg.Database.Path)
if err != nil {
logger.Error("failed to open database", "error", err)
os.Exit(1)
@@ -84,13 +100,13 @@ func main() {
converter := ffmpegconv.NewFfmpegConverter()
recognizer, err := yandex.NewYandexAudioRecognizerService(yandex.YandexAudioRecognizerConfig{
Region: os.Getenv("AWS_REGION"),
AccessKey: os.Getenv("AWS_ACCESS_KEY_ID"),
SecretKey: os.Getenv("AWS_SECRET_ACCESS_KEY"),
BucketName: os.Getenv("S3_BUCKET_NAME"),
Endpoint: os.Getenv("S3_ENDPOINT"),
ApiKey: os.Getenv("YANDEX_CLOUD_API_KEY"),
FolderID: os.Getenv("YANDEX_CLOUD_FOLDER_ID"),
Region: cfg.AWS.Region,
AccessKey: cfg.AWS.AccessKey,
SecretKey: cfg.AWS.SecretKey,
BucketName: cfg.AWS.BucketName,
Endpoint: cfg.AWS.Endpoint,
ApiKey: cfg.Yandex.APIKey,
FolderID: cfg.Yandex.FolderID,
})
if err != nil {
logger.Error("failed to create audio recognizer", "error", err)
@@ -109,8 +125,8 @@ func main() {
var wg sync.WaitGroup
tgConfig := tgcontroller.TelegramConfig{
BotToken: os.Getenv("TELEGRAM_BOT_TOKEN"),
UpdateTimeout: TelegramUpdateTimeout,
BotToken: cfg.Telegram.BotToken,
UpdateTimeout: cfg.Telegram.UpdateTimeout,
}
// Создаем Telegram бот
@@ -182,7 +198,7 @@ func main() {
// Создаем HTTP сервер
srv := &http.Server{
Addr: ":8080",
Addr: fmt.Sprintf(":%d", cfg.Server.Port),
Handler: router,
}
@@ -190,7 +206,7 @@ func main() {
wg.Add(1)
go func() {
defer wg.Done()
logger.Info("Starting HTTP server", "port", 8080)
logger.Info("Starting HTTP server", "port", cfg.Server.Port)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.Error("HTTP server error", "error", err)
}
@@ -214,7 +230,7 @@ func main() {
}
// Создаем контекст с таймаутом для graceful shutdown HTTP сервера
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), ServerShutdownTimeout*time.Second)
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), time.Duration(cfg.Server.ShutdownTimeout)*time.Second)
defer shutdownCancel()
// Останавливаем HTTP сервер
@@ -239,7 +255,7 @@ func main() {
select {
case <-done:
logger.Info("All workers stopped gracefully")
case <-time.After(ForceShutdownTimeout * time.Second):
case <-time.After(time.Duration(cfg.Server.ForceShutdownTimeout) * time.Second):
logger.Warn("Timeout reached, forcing shutdown")
}