A deployable markdown editor that connects with your self hosted files and lets you edit in a beautiful interface
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}