A deployable markdown editor that connects with your self hosted files and lets you edit in a beautiful interface
at main 92 lines 2.0 kB view raw
1package main 2 3import ( 4 "context" 5 "log" 6 "net/http" 7 "os" 8 "os/signal" 9 "syscall" 10 "time" 11 12 "github.com/joho/godotenv" 13 "github.com/yourusername/markedit/internal/api" 14 "github.com/yourusername/markedit/internal/auth" 15 "github.com/yourusername/markedit/internal/database" 16) 17 18func main() { 19 // Load environment variables 20 if err := godotenv.Load(); err != nil { 21 log.Println("No .env file found, using environment variables") 22 } 23 24 // Get configuration 25 port := os.Getenv("PORT") 26 if port == "" { 27 port = "8080" 28 } 29 30 dbPath := os.Getenv("DATABASE_PATH") 31 if dbPath == "" { 32 dbPath = "./data/markedit.db" 33 } 34 35 // Initialize database 36 db, err := database.New(dbPath) 37 if err != nil { 38 log.Fatalf("Failed to initialize database: %v", err) 39 } 40 defer db.Close() 41 42 // Run migrations 43 if err := db.RunMigrations(); err != nil { 44 log.Fatalf("Failed to run migrations: %v", err) 45 } 46 47 // Initialize authentication 48 if err := auth.InitSessions(); err != nil { 49 log.Fatalf("Failed to initialize sessions: %v", err) 50 } 51 52 if err := auth.SetupProviders(); err != nil { 53 log.Fatalf("Failed to setup OAuth providers: %v", err) 54 } 55 56 // Create router 57 router := api.NewRouter(db) 58 59 // Create HTTP server 60 srv := &http.Server{ 61 Addr: ":" + port, 62 Handler: router, 63 ReadTimeout: 15 * time.Second, 64 WriteTimeout: 15 * time.Second, 65 IdleTimeout: 60 * time.Second, 66 } 67 68 // Start server in a goroutine 69 go func() { 70 log.Printf("Starting server on port %s", port) 71 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { 72 log.Fatalf("Failed to start server: %v", err) 73 } 74 }() 75 76 // Wait for interrupt signal 77 quit := make(chan os.Signal, 1) 78 signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) 79 <-quit 80 81 log.Println("Shutting down server...") 82 83 // Graceful shutdown 84 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) 85 defer cancel() 86 87 if err := srv.Shutdown(ctx); err != nil { 88 log.Fatalf("Server forced to shutdown: %v", err) 89 } 90 91 log.Println("Server exited") 92}