Files
MrixsCraft-server/internal/config/config.go
Vladimir Zagainov d419d59fe3
All checks were successful
CI / lint (push) Successful in 59s
CI / test (push) Successful in 29s
CI / build (push) Successful in 19s
CI / docker (push) Successful in 1m16s
fix: create skins directory on startup
2026-06-05 16:37:13 +03:00

72 lines
1.9 KiB
Go

// package config handles server configuration from environment variables.
package config
import (
"fmt"
"os"
"path/filepath"
"strconv"
)
// Config holds all server configuration.
type Config struct {
// HTTP
Port int `json:"port"`
// Database
DatabaseURL string `json:"database_url"`
// Storage
CASDir string `json:"cas_dir"` // Content-Addressable Storage root
SkinsDir string `json:"skins_dir"` // Uploaded skins
// Auth
JWTSecret string `json:"jwt_secret"`
CIsecret string `json:"ci_secret"` // Token for CI/CD launcher release endpoint
// Public
BaseURL string `json:"base_url"` // External URL for CDN links
}
// Load reads configuration from environment variables with sensible defaults.
func Load() (*Config, error) {
port, err := strconv.Atoi(getEnv("SERVER_PORT", "8080"))
if err != nil {
return nil, fmt.Errorf("invalid SERVER_PORT: %w", err)
}
cfg := &Config{
Port: port,
DatabaseURL: getEnv("DATABASE_URL", ""),
CASDir: getEnv("CAS_DIR", "/var/www/cdn/files"),
SkinsDir: getEnv("SKINS_DIR", "/var/www/cdn/skins"),
JWTSecret: getEnv("JWT_SECRET", ""),
CIsecret: getEnv("CI_SECRET", ""),
BaseURL: getEnv("BASE_URL", "https://minecraft.mrixs.me"),
}
if cfg.DatabaseURL == "" {
return nil, fmt.Errorf("DATABASE_URL is required")
}
if cfg.JWTSecret == "" {
return nil, fmt.Errorf("JWT_SECRET is required")
}
// Create storage directories if they don't exist.
if err := os.MkdirAll(cfg.CASDir, 0o755); err != nil {
return nil, fmt.Errorf("failed to create CAS directory: %w", err)
}
if err := os.MkdirAll(filepath.Join(cfg.SkinsDir, "aa"), 0o755); err != nil { // Create with subdirectory structure
return nil, fmt.Errorf("failed to create skins directory: %w", err)
}
return cfg, nil
}
func getEnv(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}