diff --git a/internal/apps/docker/init.go b/internal/apps/docker/init.go new file mode 100644 index 00000000..111407ce --- /dev/null +++ b/internal/apps/docker/init.go @@ -0,0 +1,19 @@ +package podman + +import ( + "github.com/go-chi/chi/v5" + + "github.com/TheTNB/panel/pkg/apploader" + "github.com/TheTNB/panel/pkg/types" +) + +func init() { + apploader.Register(&types.App{ + Slug: "docker", + Route: func(r chi.Router) { + service := NewService() + r.Get("/config", service.GetConfig) + r.Post("/config", service.UpdateConfig) + }, + }) +} diff --git a/internal/apps/docker/request.go b/internal/apps/docker/request.go new file mode 100644 index 00000000..0b3ba9ea --- /dev/null +++ b/internal/apps/docker/request.go @@ -0,0 +1,5 @@ +package podman + +type UpdateConfig struct { + Config string `form:"config" json:"config" validate:"required"` +} diff --git a/internal/apps/docker/service.go b/internal/apps/docker/service.go new file mode 100644 index 00000000..cebb6822 --- /dev/null +++ b/internal/apps/docker/service.go @@ -0,0 +1,45 @@ +package podman + +import ( + "net/http" + + "github.com/TheTNB/panel/internal/service" + "github.com/TheTNB/panel/pkg/io" + "github.com/TheTNB/panel/pkg/systemctl" +) + +type Service struct{} + +func NewService() *Service { + return &Service{} +} + +func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { + config, err := io.Read("/etc/docker/daemon.json") + if err != nil { + service.Error(w, http.StatusInternalServerError, "%v", err) + return + } + + service.Success(w, config) +} + +func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { + req, err := service.Bind[UpdateConfig](r) + if err != nil { + service.Error(w, http.StatusUnprocessableEntity, "%v", err) + return + } + + if err = io.Write("/etc/docker/daemon.json", req.Config, 0644); err != nil { + service.Error(w, http.StatusInternalServerError, "%v", err) + return + } + + if err = systemctl.Restart("docker"); err != nil { + service.Error(w, http.StatusInternalServerError, "%v", err) + return + } + + service.Success(w, nil) +} diff --git a/internal/apps/init.go b/internal/apps/init.go index 612c5144..e481ccb7 100644 --- a/internal/apps/init.go +++ b/internal/apps/init.go @@ -4,6 +4,7 @@ import ( "github.com/go-chi/chi/v5" _ "github.com/TheTNB/panel/internal/apps/benchmark" + _ "github.com/TheTNB/panel/internal/apps/docker" _ "github.com/TheTNB/panel/internal/apps/fail2ban" _ "github.com/TheTNB/panel/internal/apps/frp" _ "github.com/TheTNB/panel/internal/apps/gitea" diff --git a/web/src/api/apps/docker/index.ts b/web/src/api/apps/docker/index.ts new file mode 100644 index 00000000..964eb4ed --- /dev/null +++ b/web/src/api/apps/docker/index.ts @@ -0,0 +1,4 @@ +import { http } from '@/utils' + +export const getConfig = () => http.Get('/apps/docker/config') +export const updateConfig = (config: string) => http.Post('/apps/docker/config', { config }) diff --git a/web/src/views/apps/docker/IndexView.vue b/web/src/views/apps/docker/IndexView.vue new file mode 100644 index 00000000..a0e68e82 --- /dev/null +++ b/web/src/views/apps/docker/IndexView.vue @@ -0,0 +1,150 @@ + + + diff --git a/web/src/views/apps/docker/route.ts b/web/src/views/apps/docker/route.ts new file mode 100644 index 00000000..55cd9d93 --- /dev/null +++ b/web/src/views/apps/docker/route.ts @@ -0,0 +1,23 @@ +import type { RouteType } from '~/types/router' + +const Layout = () => import('@/layout/IndexView.vue') + +export default { + name: 'docker', + path: '/apps/docker', + component: Layout, + isHidden: true, + children: [ + { + name: 'apps-docker-index', + path: '', + component: () => import('./IndexView.vue'), + meta: { + title: 'Docker', + icon: 'logos:docker-icon', + role: ['admin'], + requireAuth: true + } + } + ] +} as RouteType