main.go (1822B)
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "net/http" 8 "os" 9 "path/filepath" 10 11 "tagliatelle/internal/app" 12 ) 13 14 func main() { 15 // CLI flags 16 dataDir := flag.String("d", ".", "Data directory (stores tagliatelle.db and uploads/ subfolder)") 17 port := flag.String("p", "8080", "Port to listen on") 18 czkawka := flag.String("czkawka", "czkawka_cli", "Path to the czkawka_cli binary (used by the admin Duplicates page)") 19 flag.Parse() 20 app.CzkawkaBin = *czkawka 21 22 // Derive paths from -d 23 dbPath := filepath.Join(*dataDir, "tagliatelle.db") 24 uploadDir := filepath.Join(*dataDir, "uploads") 25 serverPort := fmt.Sprintf(":%s", *port) 26 27 // Create necessary directories 28 if err := os.MkdirAll(uploadDir, 0755); err != nil { 29 log.Fatalf("Failed to create upload directory: %v", err) 30 } 31 os.MkdirAll("static", 0755) 32 33 // Initialize database 34 var err error 35 app.DB, err = app.InitDatabase(dbPath) 36 if err != nil { 37 log.Fatalf("Failed to initialize database: %v", err) 38 } 39 defer app.DB.Close() 40 41 // Load config from database (gallery size, items per page, aliases, sed rules) 42 app.Cfg, err = app.LoadConfig(app.DB) 43 if err != nil { 44 log.Fatalf("Failed to load config from database: %v", err) 45 } 46 47 // Inject runtime values (not stored in DB) 48 app.Cfg.DatabasePath = dbPath 49 app.Cfg.UploadDir = uploadDir 50 app.Cfg.ServerPort = serverPort 51 52 // Initialize templates 53 app.Tmpl, err = app.InitTemplates() 54 if err != nil { 55 log.Fatalf("Failed to load templates: %v", err) 56 } 57 58 // Register all routes 59 app.RegisterRoutes() 60 61 // Start server 62 log.Printf("Server started at http://localhost%s", app.Cfg.ServerPort) 63 log.Printf("Database: %s", app.Cfg.DatabasePath) 64 log.Printf("Upload directory: %s", app.Cfg.UploadDir) 65 66 if err := http.ListenAndServe(app.Cfg.ServerPort, nil); err != nil { 67 log.Fatalf("Server failed to start: %v", err) 68 } 69 }