File size: 2,692 Bytes
2196bfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2bf308
 
 
2196bfe
 
 
 
 
 
 
ba13683
2196bfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0ff2ea
 
 
 
 
2196bfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main

import (
	"log"
	"os"
	"uptime/backend/controllers"
	"uptime/backend/database"
	"uptime/backend/middleware"
	"uptime/backend/models"
	"uptime/backend/services"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	"golang.org/x/crypto/bcrypt"
)

func main() {
	// 在开发环境中加载 .env 文件,如果文件不存在则忽略错误
	// 在生产环境中,变量将通过环境变量直接提供
	if err := godotenv.Load(); err != nil {
		log.Println("No .env file found, using environment variables")
	}

	database.ConnectDatabase()
	if os.Getenv("REDIS_URI") != "" {
		database.ConnectRedis()
	}

	createAdminUser()

	go services.StartMonitoring()

	r := gin.Default()
	config := cors.DefaultConfig()
	config.AllowAllOrigins = true
	config.AllowCredentials = true
	r.Use(cors.New(config))

	api := r.Group("/api")
	{
		api.POST("/login", controllers.Login)

		authorized := api.Group("/")
		authorized.Use(middleware.RequireAuth)
		{
			authorized.POST("/monitors", controllers.CreateMonitor)
			authorized.GET("/monitors", controllers.GetMonitors)
			authorized.GET("/monitors/:id", controllers.GetMonitor)
			authorized.PUT("/monitors/:id", controllers.UpdateMonitor)
			authorized.DELETE("/monitors/:id", controllers.DeleteMonitor)
			authorized.POST("/monitors/:id/check", controllers.ManualCheck)
		}
	}

	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080" // Default port
	}
	r.Run(":" + port)
}

func createAdminUser() {
	username := os.Getenv("ADMIN_USERNAME")
	password := os.Getenv("ADMIN_PASSWORD")

	if username == "" || password == "" {
		log.Println("ADMIN_USERNAME or ADMIN_PASSWORD not set, skipping admin user creation.")
		return
	}

	var user models.User
	database.DB.First(&user, "username = ?", username)

	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 10)
	if err != nil {
		log.Fatalf("Failed to hash password: %v", err)
	}

	if user.ID == 0 {
		// Create new admin user
		admin := models.User{Username: username, Password: string(hashedPassword)}
		if err := database.DB.Create(&admin).Error; err != nil {
			log.Fatalf("Failed to create admin user: %v", err)
		}
		log.Println("Admin user created successfully.")
	} else {
		// Update existing admin user's password
		if err := database.DB.Model(&user).Update("password", string(hashedPassword)).Error; err != nil {
			log.Fatalf("Failed to update admin user: %v", err)
		}
		log.Println("Admin user password updated successfully.")
	}
}