Compare commits
46 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
f90482ede2 | |
|
|
7033b0ce5f | |
|
|
3fc24cbc1a | |
|
|
76d8a23f44 | |
|
|
3721ba137d | |
|
|
9ef020f229 | |
|
|
4e915d02ef | |
|
|
6f3495f0f5 | |
|
|
97704ca8d2 | |
|
|
cf0f656032 | |
|
|
13086e55ae | |
|
|
f11e9ffa61 | |
|
|
f165eecf89 | |
|
|
d63d641058 | |
|
|
93076cf365 | |
|
|
3fd0ea7f0f | |
|
|
86266ac556 | |
|
|
db9d56aa29 | |
|
|
008cbc653a | |
|
|
196887fa8b | |
|
|
83552d12a2 | |
|
|
2cb9909697 | |
|
|
2d08dd7cec | |
|
|
6490779a2e | |
|
|
5f178e2123 | |
|
|
de0f97ce7d | |
|
|
b06f970dd8 | |
|
|
12cc7544db | |
|
|
1ca9dde471 | |
|
|
fedb744675 | |
|
|
7aa6be4fe7 | |
|
|
8f2452c804 | |
|
|
a6b12096f8 | |
|
|
191d466798 | |
|
|
7607d29386 | |
|
|
04ec9bf9bf | |
|
|
6de6a1a318 | |
|
|
147d3f12cd | |
|
|
ca400be8b8 | |
|
|
720322bfd6 | |
|
|
87ae7db41c | |
|
|
50fef88276 | |
|
|
f57150d14d | |
|
|
b1befd31ca | |
|
|
e219fb5a72 | |
|
|
7d458f70e0 |
|
|
@ -0,0 +1,33 @@
|
||||||
|
# 第一阶段:使用最新Go版本构建
|
||||||
|
FROM docker.1ms.run/golang:1.24 AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV GOPROXY=https://goproxy.cn,direct
|
||||||
|
|
||||||
|
|
||||||
|
# 复制go.mod和go.sum以缓存依赖
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
# 复制源代码并构建
|
||||||
|
COPY . .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags="-s -w" -o videoplayer .
|
||||||
|
|
||||||
|
# 第二阶段:生产环境(最小化镜像)
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
|
# 复制配置文件
|
||||||
|
COPY --from=builder /app/vp.conf /home/videoplayer/vp.conf
|
||||||
|
|
||||||
|
# 复制二进制文件
|
||||||
|
COPY --from=builder /app/videoplayer /home/videoplayer/videoplayer
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /home/videoplayer
|
||||||
|
|
||||||
|
# 暴露端口
|
||||||
|
EXPOSE 8083
|
||||||
|
|
||||||
|
# 运行应用
|
||||||
|
CMD ["./videoplayer"]
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: vp-image:latest
|
||||||
|
container_name: vp-container
|
||||||
|
ports:
|
||||||
|
- "8088:8083"
|
||||||
|
volumes:
|
||||||
|
- logs:/var/log/vp.log
|
||||||
|
- /etc/vp-app:/etc/vp-app
|
||||||
|
- /data/file:/data/file
|
||||||
|
|
@ -72,13 +72,13 @@ func RunCID(c *gin.Context) {
|
||||||
|
|
||||||
if err := c.ShouldBind(&req); err == nil {
|
if err := c.ShouldBind(&req); err == nil {
|
||||||
// 获取用户ID
|
// 获取用户ID
|
||||||
username, _ := c.Get("username")
|
//username, _ := c.Get("username")
|
||||||
cid := dao.FindCIDByID(req.ID, authID)
|
cid := dao.FindCIDByID(req.ID, authID)
|
||||||
if cid.ID == 0 {
|
if cid.ID == 0 {
|
||||||
c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"})
|
c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"})
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
go RunShell(username.(string), cid.Url, cid.Script, req.ID, authID)
|
go RunShell("", cid.Url, cid.Script, req.ID, authID)
|
||||||
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
25
main.go
25
main.go
|
|
@ -100,7 +100,6 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
}
|
}
|
||||||
// 从请求头中获取 JWT 令牌
|
// 从请求头中获取 JWT 令牌
|
||||||
tokenString := c.Request.Header.Get("token")
|
tokenString := c.Request.Header.Get("token")
|
||||||
|
|
||||||
//请求方式为get时,从url中获取token
|
//请求方式为get时,从url中获取token
|
||||||
if tokenString == "" {
|
if tokenString == "" {
|
||||||
tokenString = c.Query("token")
|
tokenString = c.Query("token")
|
||||||
|
|
@ -117,12 +116,7 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if tokenString == "" {
|
if tokenString == "" {
|
||||||
//c.AbortWithStatus(200)
|
c.AbortWithStatusJSON(http.StatusOK, gin.H{"message": "unauthorized", "error": "token is empty", "code": proto.TokenIsNull})
|
||||||
c.JSON(200, gin.H{
|
|
||||||
"message": "Unauthorized",
|
|
||||||
"error": "token is empty",
|
|
||||||
"code": proto.TokenIsNull,
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if proto.Config.TOKEN_USE_REDIS {
|
if proto.Config.TOKEN_USE_REDIS {
|
||||||
|
|
@ -132,7 +126,6 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//查看token是否在超级token中
|
//查看token是否在超级token中
|
||||||
if worker.IsContainSet("super_permission_tokens", tokenString) {
|
if worker.IsContainSet("super_permission_tokens", tokenString) {
|
||||||
sId := c.Request.Header.Get("super_id")
|
sId := c.Request.Header.Get("super_id")
|
||||||
|
|
@ -147,6 +140,7 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
idFloat64 := float64(id)
|
idFloat64 := float64(id)
|
||||||
//查看s_id类型
|
//查看s_id类型
|
||||||
c.Set("id", idFloat64)
|
c.Set("id", idFloat64)
|
||||||
|
c.Set("user_id", id)
|
||||||
c.Next()
|
c.Next()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -169,15 +163,14 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将用户信息添加到上下文中
|
// 将用户信息添加到上下文中
|
||||||
c.Set("id", token.Claims.(jwt.MapClaims)["id"])
|
id := token.Claims.(jwt.MapClaims)["id"]
|
||||||
c.Set("username", token.Claims.(jwt.MapClaims)["username"])
|
username := token.Claims.(jwt.MapClaims)["username"]
|
||||||
|
c.Set("id", id)
|
||||||
|
c.Set("username", username)
|
||||||
|
c.Set("user_id", int(id.(float64)))
|
||||||
|
|
||||||
if UserFuncIntercept(int(token.Claims.(jwt.MapClaims)["id"].(float64)), c.Request.URL.Path) {
|
if UserFuncIntercept(int(id.(float64)), c.Request.URL.Path) {
|
||||||
c.AbortWithStatusJSON(http.StatusOK, gin.H{
|
c.AbortWithStatusJSON(http.StatusOK, gin.H{"message": "unauthorized", "error": "no function permission", "code": proto.NoPermission})
|
||||||
"message": "no function permission",
|
|
||||||
"error": "no permission",
|
|
||||||
"code": proto.NoPermission,
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,12 @@ func ReadConfig(path string) error {
|
||||||
Config.SERVER_PORT = "8083" // 默认端口
|
Config.SERVER_PORT = "8083" // 默认端口
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
configJson, cErr := json.Marshal(Config)
|
||||||
|
if cErr != nil {
|
||||||
|
log.Println("ReadConfig Error encoding config,err :", cErr)
|
||||||
|
} else {
|
||||||
|
log.Println("ReadConfig configJson:", string(configJson))
|
||||||
|
}
|
||||||
SigningKey = []byte(Config.TOKEN_SECRET)
|
SigningKey = []byte(Config.TOKEN_SECRET)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
vp.conf
18
vp.conf
|
|
@ -1,15 +1,21 @@
|
||||||
{
|
{
|
||||||
"db":0,
|
"db":0,
|
||||||
"mysql_dsn":"video_t2:2t2SKHmWEYj2xFKF@tcp(127.0.0.1:3306)/video_t2?charset=utf8mb4&parseTime=True&loc=Local",
|
"mysql_dsn":"vp-db:ZcxsP7s7kaBxxDPc@tcp(tx.ljsea.top:3306)/vp-db?charset=utf8mb4&parseTime=True&loc=Local",
|
||||||
"pg_dsn":"host=localhost user=video_t2 dbname=video_t2 password=2t2SKHmWEYj2xFKF port=5432 TimeZone=Asia/Shanghai",
|
"pg_dsn":"host=localhost user=video_t2 dbname=video_t2 password=2t2SKHmWEYj2xFKF port=5432 TimeZone=Asia/Shanghai",
|
||||||
"redis_addr":"127.0.0.1:6379",
|
"redis_addr":"tx.ljsea.top:6379",
|
||||||
"redis_db":2,
|
"redis_db":2,
|
||||||
"redis_user_pw":true,
|
"redis_user_pw":true,
|
||||||
"token_use_redis":true,
|
"token_use_redis":false,
|
||||||
"redis_password":"lj502138",
|
"redis_password":"vbgyfea87423wear",
|
||||||
"token_secret":"mfjurnc_32ndj9dfhj",
|
"token_secret":"mfjurnc_32ndj9dfhj",
|
||||||
"cid_base_dir":"/home/lijun/cid/",
|
"cid_base_dir":"/home/lijun/cid/",
|
||||||
"file_base_dir":"/home/lijun/file/",
|
"file_base_dir":"/home/lijun/file/",
|
||||||
"monitor":false,
|
"monitor": true,
|
||||||
"server_port":"8083"
|
"server_port": "8083",
|
||||||
|
"log_save_days": 3,
|
||||||
|
"user_type": "slave",
|
||||||
|
"master_server_domain": "tx.ljsea.top",
|
||||||
|
"user_sync_time": 0,
|
||||||
|
"server_name": "home_vp_docker_server",
|
||||||
|
"monitor_server_token": "627gyf3488h"
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,7 @@ package worker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
@ -20,7 +21,23 @@ var client *http.Client
|
||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
func InitReq() {
|
func InitReq() {
|
||||||
client = &http.Client{}
|
client = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
InsecureSkipVerify: true, // 设置为true将跳过证书验证
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitReqClient() {
|
||||||
|
client = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
InsecureSkipVerify: true, // 设置为true将跳过证书验证
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发起post请求
|
// 发起post请求
|
||||||
|
|
@ -104,9 +121,8 @@ func SyncDataFromMasterReq(url string, token string) proto.UserSync {
|
||||||
m["device"] = ""
|
m["device"] = ""
|
||||||
|
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = &http.Client{}
|
InitReqClient()
|
||||||
}
|
}
|
||||||
client = &http.Client{}
|
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -173,7 +189,7 @@ func SyncDataFromMasterReq2(url string, data proto.SyncUserReq) (proto.UserSync,
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
//传输数据
|
//传输数据
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = &http.Client{}
|
InitReqClient()
|
||||||
}
|
}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
|
|
@ -218,7 +234,7 @@ func SyncDataFromMasterShellReq2(url string, data proto.SyncUserShellReq) ([]dao
|
||||||
req.Header.Set("token", data.Token)
|
req.Header.Set("token", data.Token)
|
||||||
//传输数据
|
//传输数据
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = &http.Client{}
|
InitReqClient()
|
||||||
}
|
}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
|
|
@ -262,7 +278,7 @@ func SyncDataFromMasterShellReq3(url string, data proto.SyncUserShellResp) ([]pr
|
||||||
req.Header.Set("token", data.Token)
|
req.Header.Set("token", data.Token)
|
||||||
//传输数据
|
//传输数据
|
||||||
if client == nil {
|
if client == nil {
|
||||||
client = &http.Client{}
|
InitReqClient()
|
||||||
}
|
}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
|
|
@ -285,7 +301,6 @@ func SyncDataFromMasterShellReq3(url string, data proto.SyncUserShellResp) ([]pr
|
||||||
}
|
}
|
||||||
|
|
||||||
func DoPostRequestJSON(url string, jsonData []byte, headers map[string]string) (error, []byte) {
|
func DoPostRequestJSON(url string, jsonData []byte, headers map[string]string) (error, []byte) {
|
||||||
httpClient := &http.Client{}
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
||||||
|
|
@ -304,11 +319,12 @@ func DoPostRequestJSON(url string, jsonData []byte, headers map[string]string) (
|
||||||
req.Header.Set(k, v)
|
req.Header.Set(k, v)
|
||||||
}
|
}
|
||||||
//传输数据
|
//传输数据
|
||||||
if httpClient == nil {
|
if client == nil {
|
||||||
httpClient = &http.Client{}
|
InitReqClient()
|
||||||
|
client = client
|
||||||
}
|
}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := httpClient.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
|
@ -322,7 +338,6 @@ func DoPostRequestJSON(url string, jsonData []byte, headers map[string]string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
func DoPostRequestForm(url string, jsonData []byte, headers map[string]string) (error, []byte) {
|
func DoPostRequestForm(url string, jsonData []byte, headers map[string]string) (error, []byte) {
|
||||||
httpClient := &http.Client{}
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
||||||
|
|
@ -382,7 +397,7 @@ func DoPostRequestForm(url string, jsonData []byte, headers map[string]string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送请求
|
// 发送请求
|
||||||
resp, err := httpClient.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
|
@ -398,7 +413,6 @@ func DoPostRequestForm(url string, jsonData []byte, headers map[string]string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
func DoPostRequestFormUrlEncoded(url_ string, jsonData []byte, headers map[string]string) (error, []byte) {
|
func DoPostRequestFormUrlEncoded(url_ string, jsonData []byte, headers map[string]string) (error, []byte) {
|
||||||
httpClient := &http.Client{}
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
log.Println("SyncDataFromMasterReq2 error:", r)
|
log.Println("SyncDataFromMasterReq2 error:", r)
|
||||||
|
|
@ -449,7 +463,7 @@ func DoPostRequestFormUrlEncoded(url_ string, jsonData []byte, headers map[strin
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送请求
|
// 发送请求
|
||||||
resp, err := httpClient.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
|
@ -465,7 +479,6 @@ func DoPostRequestFormUrlEncoded(url_ string, jsonData []byte, headers map[strin
|
||||||
}
|
}
|
||||||
|
|
||||||
func DoGetRequest(url string, headers map[string]string) (error, []byte) {
|
func DoGetRequest(url string, headers map[string]string) (error, []byte) {
|
||||||
httpClient := &http.Client{}
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
fmt.Println("SyncDataFromMasterReq2 error:", r)
|
||||||
|
|
@ -483,11 +496,12 @@ func DoGetRequest(url string, headers map[string]string) (error, []byte) {
|
||||||
req.Header.Set(k, v)
|
req.Header.Set(k, v)
|
||||||
}
|
}
|
||||||
//传输数据
|
//传输数据
|
||||||
if httpClient == nil {
|
if client == nil {
|
||||||
httpClient = &http.Client{}
|
InitReqClient()
|
||||||
|
client = client
|
||||||
}
|
}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := httpClient.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue