StarrySkyWorld's picture
Fix Space 404 by packaging and serving frontend dist
d60c39c
package main
import (
"context"
"log"
"net/http"
"os"
"path/filepath"
"fastfileviewer/backend/internal/config"
"fastfileviewer/backend/internal/db"
"fastfileviewer/backend/internal/handlers"
"fastfileviewer/backend/internal/middleware"
"fastfileviewer/backend/internal/services"
"github.com/gin-gonic/gin"
)
func main() {
cfg := config.Load()
if cfg.AutoPassword {
log.Printf("ADMIN_PASSWORD 未设置,已自动生成临时密码: %s", cfg.AdminPassword)
}
if err := os.MkdirAll(cfg.RootDir, 0o755); err != nil {
log.Fatalf("create root dir failed: %v", err)
}
database, err := db.New(cfg.DBPath)
if err != nil {
log.Fatalf("db init failed: %v", err)
}
fsSvc := services.NewFSService(cfg.RootDir)
taskSvc := services.NewTaskService(database, fsSvc, cfg.MaxWorkers)
taskSvc.Start(context.Background())
authHandler := handlers.NewAuthHandler(cfg)
fileHandler := handlers.NewFileHandler(fsSvc)
taskHandler := handlers.NewTaskHandler(taskSvc)
router := gin.Default()
router.GET("/healthz", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{"ok": true})
})
router.POST("/api/login", authHandler.Login)
api := router.Group("/api")
api.Use(middleware.AuthRequired(cfg.JWTSecret))
{
api.GET("/fs/list", fileHandler.List)
api.POST("/fs/upload", fileHandler.Upload)
api.POST("/fs/move", fileHandler.Move)
api.POST("/fs/rename", fileHandler.Rename)
api.POST("/fs/delete", fileHandler.Delete)
api.GET("/fs/download", fileHandler.Download)
api.POST("/tasks/download", taskHandler.CreateDownload)
api.POST("/tasks/extract", taskHandler.CreateExtract)
api.GET("/tasks", taskHandler.List)
api.GET("/tasks/:id", taskHandler.Get)
api.GET("/tasks/:id/stream", taskHandler.Stream)
}
frontendDist := filepath.Join("/app", "web", "dist")
if _, err := os.Stat(frontendDist); err != nil {
frontendDist = filepath.Join("web", "dist")
}
if _, err := os.Stat(frontendDist); err == nil {
router.Static("/assets", filepath.Join(frontendDist, "assets"))
router.NoRoute(func(ctx *gin.Context) {
ctx.File(filepath.Join(frontendDist, "index.html"))
})
} else {
log.Printf("frontend dist not found, only API routes are available")
}
log.Printf("server listening on :%s", cfg.Port)
log.Printf("storage root: %s", cfg.RootDir)
if err := router.Run(":" + cfg.Port); err != nil {
log.Fatalf("server failed: %v", err)
}
}