main.go
Rama master · réplica de lectura del repositorio original.
package main
import (
"flag"
"fmt"
"net/http"
"os"
"path/filepath"
"wiki-go/internal/auth"
"wiki-go/internal/config"
"wiki-go/internal/goldext"
"wiki-go/internal/handlers"
"wiki-go/internal/logger"
"wiki-go/internal/migration"
"wiki-go/internal/routes"
"wiki-go/internal/static"
)
func main() {
configfilepath := flag.String("configfile",
GetEnvString("CONFIGFILE", config.ConfigFilePath),
"where to find config.yaml")
flag.Parse()
config.ConfigFilePath = *configfilepath
// Fix broken config file if it exists (from previous bug)
if err := migration.FixBrokenConfig(config.ConfigFilePath); err != nil {
logger.Warn("Failed to fix broken config: %v", err)
}
// Migrate user roles from old IsAdmin to new role-based system
if err := migration.MigrateUserRoles(config.ConfigFilePath); err != nil {
logger.Fatal("Error migrating user roles: %v", err)
}
// Load configuration (after migration)
cfg, err := config.LoadConfig(config.ConfigFilePath)
if err != nil {
logger.Fatal("Error loading config: %v", err)
}
// Propagate wiki timezone to the goldext shortcode renderer so that
// :::stats recent=N::: formats edit times in the configured zone
// (consistent with formatTime used elsewhere in templates).
goldext.SetWikiTimezone(cfg.Wiki.Timezone)
goldext.ConfigureContentPaths(cfg.Wiki.RootDir, cfg.Wiki.DocumentsDir)
// Apply log level from config
logger.Init(cfg.Wiki.LogLevel)
// Initialize session store for persistent logins
sessionPath := filepath.Join(cfg.Wiki.RootDir, "temp", "sessions.json")
if err := auth.InitSessionStore(sessionPath); err != nil {
logger.Warn("Failed to initialize session store: %v", err)
}
// Ensure the homepage exists
if err := handlers.EnsureHomepageExists(cfg); err != nil {
logger.Fatal("Error creating homepage: %v", err)
}
// Ensure static assets exist in data directory
if err := static.EnsureStaticAssetsExist(cfg.Wiki.RootDir); err != nil {
logger.Fatal("Error copying static assets: %v", err)
}
// Update handlers with config
handlers.InitHandlers(cfg)
// Setup all routes
routes.SetupRoutes(cfg)
// Start the server
addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port)
if cfg.Server.SSL && cfg.Server.SSLCert != "" && cfg.Server.SSLKey != "" {
logger.Info("HTTPS server starting on %s...", addr)
if err := http.ListenAndServeTLS(addr, cfg.Server.SSLCert, cfg.Server.SSLKey, nil); err != nil {
logger.Fatal("HTTPS server error: %v", err)
}
} else {
logger.Info("HTTP server starting on %s...", addr)
if err := http.ListenAndServe(addr, nil); err != nil {
logger.Fatal("HTTP server error: %v", err)
}
}
}
func GetEnvString(name, defaultvalue string) string {
value, ok := os.LookupEnv(name)
if !ok {
return defaultvalue
}
return value
}