diff --git a/internal/biz/container_compose.go b/internal/biz/container_compose.go index aeb05ab4..40381bfe 100644 --- a/internal/biz/container_compose.go +++ b/internal/biz/container_compose.go @@ -5,8 +5,8 @@ import "github.com/tnb-labs/panel/pkg/types" type ContainerComposeRepo interface { List() ([]types.ContainerCompose, error) Get(name string) (string, string, error) - Create(name, compose, env string) error - Update(name, compose, env string) error + Create(name, compose string, envs []types.KV) error + Update(name, compose string, envs []types.KV) error Up(name string, force bool) error Down(name string) error Remove(name string) error diff --git a/internal/data/container_compose.go b/internal/data/container_compose.go index c92232c9..f2cc97a3 100644 --- a/internal/data/container_compose.go +++ b/internal/data/container_compose.go @@ -5,6 +5,7 @@ import ( "io/fs" "os" "path/filepath" + "strings" "time" "github.com/tnb-labs/panel/internal/app" @@ -31,12 +32,17 @@ func (r *containerComposeRepo) List() ([]types.ContainerCompose, error) { return nil, err } - index := make(map[string]int) var composes []types.ContainerCompose - err = filepath.WalkDir(filepath.Join(app.Root, "server", "compose"), func(path string, d fs.DirEntry, err error) error { + index := make(map[string]int) + composeDir := filepath.Join(app.Root, "server", "compose") + err = filepath.WalkDir(composeDir, func(path string, d fs.DirEntry, err error) error { if err != nil { return err } + // 跳过自身 + if path == composeDir { + return nil + } if !d.IsDir() { return nil } @@ -75,7 +81,7 @@ func (r *containerComposeRepo) Get(name string) (string, string, error) { } // Create 创建编排文件 -func (r *containerComposeRepo) Create(name, compose, env string) error { +func (r *containerComposeRepo) Create(name, compose string, envs []types.KV) error { dir := filepath.Join(app.Root, "server", "compose", name) if err := os.MkdirAll(dir, 0644); err != nil { return err @@ -83,7 +89,15 @@ func (r *containerComposeRepo) Create(name, compose, env string) error { if err := os.WriteFile(filepath.Join(dir, "docker-compose.yml"), []byte(compose), 0644); err != nil { return err } - if err := os.WriteFile(filepath.Join(dir, ".env"), []byte(env), 0644); err != nil { + + var sb strings.Builder + for _, kv := range envs { + sb.WriteString(kv.Key) + sb.WriteString("=") + sb.WriteString(kv.Value) + sb.WriteString("\n") + } + if err := os.WriteFile(filepath.Join(dir, ".env"), []byte(sb.String()), 0644); err != nil { return err } @@ -91,12 +105,20 @@ func (r *containerComposeRepo) Create(name, compose, env string) error { } // Update 更新编排文件 -func (r *containerComposeRepo) Update(name, compose, env string) error { +func (r *containerComposeRepo) Update(name, compose string, envs []types.KV) error { dir := filepath.Join(app.Root, "server", "compose", name) if err := os.WriteFile(filepath.Join(dir, "docker-compose.yml"), []byte(compose), 0644); err != nil { return err } - if err := os.WriteFile(filepath.Join(dir, ".env"), []byte(env), 0644); err != nil { + + var sb strings.Builder + for _, kv := range envs { + sb.WriteString(kv.Key) + sb.WriteString("=") + sb.WriteString(kv.Value) + sb.WriteString("\n") + } + if err := os.WriteFile(filepath.Join(dir, ".env"), []byte(sb.String()), 0644); err != nil { return err } diff --git a/internal/http/request/container_compose.go b/internal/http/request/container_compose.go index 88e11dc9..de2466f4 100644 --- a/internal/http/request/container_compose.go +++ b/internal/http/request/container_compose.go @@ -1,19 +1,21 @@ package request +import "github.com/tnb-labs/panel/pkg/types" + type ContainerComposeGet struct { Name string `uri:"name" validate:"required"` } type ContainerComposeCreate struct { - Name string `json:"name" validate:"required"` - Compose string `json:"compose" validate:"required"` - Env string `json:"env"` + Name string `json:"name" validate:"required|regex:^[a-zA-Z0-9_-]+$"` + Compose string `json:"compose" validate:"required"` + Envs []types.KV `json:"envs"` } type ContainerComposeUpdate struct { - Name string `uri:"name" validate:"required"` - Compose string `json:"compose" validate:"required"` - Env string `json:"env"` + Name string `uri:"name" validate:"required|regex:^[a-zA-Z0-9_-]+$"` + Compose string `json:"compose" validate:"required"` + Envs []types.KV `json:"envs"` } type ContainerComposeUp struct { diff --git a/internal/service/container_compose.go b/internal/service/container_compose.go index 0a0916f0..57a9e85f 100644 --- a/internal/service/container_compose.go +++ b/internal/service/container_compose.go @@ -60,7 +60,7 @@ func (s *ContainerComposeService) Create(w http.ResponseWriter, r *http.Request) return } - if err = s.containerComposeRepo.Create(req.Name, req.Compose, req.Env); err != nil { + if err = s.containerComposeRepo.Create(req.Name, req.Compose, req.Envs); err != nil { Error(w, http.StatusInternalServerError, "%v", err) return } @@ -75,7 +75,7 @@ func (s *ContainerComposeService) Update(w http.ResponseWriter, r *http.Request) return } - if err = s.containerComposeRepo.Update(req.Name, req.Compose, req.Env); err != nil { + if err = s.containerComposeRepo.Update(req.Name, req.Compose, req.Envs); err != nil { Error(w, http.StatusInternalServerError, "%v", err) return }