© {{ new Date().getFullYear() }} LmVPN. All rights reserved.
+
+ {{ t('footer.lastCommit') }}: {{ versionInfo.commitTime }} · {{ versionInfo.commit }}
+
diff --git a/frontend/src/locales/en.ts b/frontend/src/locales/en.ts
index ca03005..1e3e1be 100644
--- a/frontend/src/locales/en.ts
+++ b/frontend/src/locales/en.ts
@@ -149,6 +149,9 @@ export default {
selectUserAndIp: 'Please select a user and fill in at least one IP address',
confirmDeleteReservation: 'Delete this reservation?',
},
+ footer: {
+ lastCommit: 'Last commit',
+ },
home: {
tagline: 'Secure, fast, and reliable VPN tunnel management system',
secureTunnel: 'Secure Tunnel',
diff --git a/frontend/src/locales/zh.ts b/frontend/src/locales/zh.ts
index cc95872..3966481 100644
--- a/frontend/src/locales/zh.ts
+++ b/frontend/src/locales/zh.ts
@@ -148,6 +148,9 @@ export default {
selectUserAndIp: '请选择用户并至少填写一个 IP 地址',
confirmDeleteReservation: '确认删除该预留?',
},
+ footer: {
+ lastCommit: '最后提交',
+ },
home: {
tagline: '安全、快速、可靠的 VPN 隧道管理系统',
secureTunnel: '安全隧道',
diff --git a/install_linux.sh b/install_linux.sh
index 476937f..9cdc30a 100755
--- a/install_linux.sh
+++ b/install_linux.sh
@@ -25,7 +25,11 @@ npm run build
cd ..
echo ">>> 编译 Go 后端..."
-go build -o lmvpn .
+VERSION=$(git describe --tags --always 2>/dev/null || echo "dev")
+COMMIT=$(git rev-parse --short HEAD)
+COMMIT_TIME=$(git log -1 --format=%cI)
+BUILD_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
+go build -ldflags "-X lmvpn/internal/version.Version=$VERSION -X lmvpn/internal/version.Commit=$COMMIT -X lmvpn/internal/version.CommitTime=$COMMIT_TIME -X lmvpn/internal/version.BuildTime=$BUILD_TIME" -o lmvpn .
echo ">>> 创建 lmvpn 系统用户..."
if ! id lmvpn &>/dev/null; then
diff --git a/internal/handler/version.go b/internal/handler/version.go
new file mode 100644
index 0000000..30b3e9f
--- /dev/null
+++ b/internal/handler/version.go
@@ -0,0 +1,25 @@
+package handler
+
+import (
+ "net/http"
+
+ "lmvpn/internal/version"
+
+ "github.com/gin-gonic/gin"
+)
+
+type versionResponse struct {
+ Version string `json:"version"`
+ Commit string `json:"commit"`
+ CommitTime string `json:"commit_time"`
+ BuildTime string `json:"build_time"`
+}
+
+func GetVersion(c *gin.Context) {
+ c.JSON(http.StatusOK, versionResponse{
+ Version: version.Version,
+ Commit: version.Commit,
+ CommitTime: version.CommitTime,
+ BuildTime: version.BuildTime,
+ })
+}
diff --git a/internal/router/router.go b/internal/router/router.go
index 8163b81..e583548 100644
--- a/internal/router/router.go
+++ b/internal/router/router.go
@@ -15,6 +15,7 @@ func Setup(r *gin.Engine) {
r.GET("/ws", vpn.HandleWS)
r.POST("/api/login", middleware.LoginRateLimit(), handler.Login)
+ r.GET("/api/version", handler.GetVersion)
auth := r.Group("/api")
auth.Use(middleware.AuthMiddleware())
diff --git a/internal/version/version.go b/internal/version/version.go
new file mode 100644
index 0000000..5e5dd61
--- /dev/null
+++ b/internal/version/version.go
@@ -0,0 +1,8 @@
+package version
+
+var (
+ Version = "dev"
+ Commit = "unknown"
+ CommitTime = "unknown"
+ BuildTime = "unknown"
+)