This commit is contained in:
66 changed files with 19815 additions and 0 deletions

70
back/cmd/serve.go Normal file
View File

@@ -0,0 +1,70 @@
package cmd
import (
"crypto/sha256"
"embed"
"fmt"
"os"
"strings"
"port-knocker/internal"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/spf13/cobra"
)
//go:embed public/*
var embeddedFS embed.FS
var serveCmd = &cobra.Command{
Use: "serve",
Short: "Запуск встроенного веб-сервера с GUI и REST API",
RunE: runServe,
}
func init() {
rootCmd.AddCommand(serveCmd)
}
func runServe(cmd *cobra.Command, args []string) error {
pass := os.Getenv("GO_KNOCKER_SERVE_PASS")
if strings.TrimSpace(pass) == "" {
return fmt.Errorf("GO_KNOCKER_SERVE_PASS не задан — задайте пароль для доступа к GUI/API")
}
// Хеш, который будем использовать как ключ шифрования (совместимо с internal)
passHash := sha256.Sum256([]byte(pass))
// Пробрасываем пароль; internal сам выполнит sha256 от значения env
os.Setenv(internal.EncryptionKeyEnvVar, pass)
port := os.Getenv("GO_KNOCKER_SERVE_PORT")
if strings.TrimSpace(port) == "" {
port = "8888"
}
r := gin.Default()
// CORS: разрешаем для локальной разработки
r.Use(cors.New(cors.Config{
AllowOrigins: []string{"http://localhost:4200", "http://127.0.0.1:8888", "http://localhost:8888"},
AllowMethods: []string{"GET", "POST", "OPTIONS"},
AllowHeaders: []string{"Authorization", "Content-Type"},
AllowCredentials: true,
}))
// Применяем middleware для защиты HTML страниц
r.Use(staticAuthMiddleware(pass))
// API роуты с авторизацией
api := r.Group("/api/v1/knock-actions")
api.Use(authMiddleware(pass))
// Настраиваем роуты
setupKnockRoutes(api)
setupCryptoRoutes(api, passHash)
setupStaticRoutes(r, embeddedFS)
fmt.Printf("Serving on :%s\n", port)
return r.Run(":" + port)
}