diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a1b98658 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.git +.gitignore +.dockerignore +Dockerfile +README.md + +frontend/.svelte-kit +frontend/node_modules +frontend/build + +backend/pb_data +backend/pb_public diff --git a/.gitignore b/.gitignore index 821a6718..7a8b2596 100644 --- a/.gitignore +++ b/.gitignore @@ -192,10 +192,7 @@ package # End of https://www.toptal.com/developers/gitignore/api/go,visualstudiocode,svelte,node -frontend/build -frontend/.svelte-kit -frontend/vite.config.js.timestamp-* -frontend/vite.config.ts.timestamp-* +build backend/pb_data backend/pb_public/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..ce82d569 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM node:19-alpine as frontend +COPY frontend /app +WORKDIR /app +RUN npm i &&\ + npm run build + +FROM golang:1.19-alpine as backend +COPY backend /app +WORKDIR /app +COPY --from=frontend /app/build pb_public +RUN apk update &&\ + apk add gcc musl-dev &&\ + go mod tidy &&\ + go build -ldflags "-s -w" -o upsnap main.go + +FROM alpine:3.17 +WORKDIR /app +COPY --from=backend /app/upsnap . +RUN apk update &&\ + apk add --no-cache nmap curl samba-common-tools &&\ + rm -rf /var/cache/apk/* +CMD ["./upsnap", "serve", "--http", "0.0.0.0:8090"] diff --git a/backend/main.go b/backend/main.go index a18d0115..09464468 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1,9 +1,16 @@ package main import ( + "embed" + + "github.com/labstack/echo/v5" "github.com/seriousm4x/upsnap/backend/pb" ) +//go:embed all:pb_public +var distDir embed.FS +var distDirFS = echo.MustSubFS(distDir, "pb_public") + func main() { - pb.StartPocketBase() + pb.StartPocketBase(distDirFS) } diff --git a/backend/pb/pb.go b/backend/pb/pb.go index c6b392c9..c92717f1 100644 --- a/backend/pb/pb.go +++ b/backend/pb/pb.go @@ -1,6 +1,7 @@ package pb import ( + "io/fs" "log" "net/http" "os" @@ -18,7 +19,7 @@ import ( var App *pocketbase.PocketBase -func StartPocketBase() { +func StartPocketBase(distDirFS fs.FS) { App = pocketbase.New() App.RootCmd.Short = "UpSnap CLI" App.RootCmd.Version = "3.0.0b1" @@ -31,7 +32,7 @@ func StartPocketBase() { // event hooks App.OnBeforeServe().Add(func(e *core.ServeEvent) error { // set static website path - e.Router.GET("/*", apis.StaticDirectoryHandler(os.DirFS("./pb_public"), true)) + e.Router.GET("/*", apis.StaticDirectoryHandler(distDirFS, true)) // add wake route to api e.Router.AddRoute(echo.Route{ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..b8976756 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: "3" +services: + upsnap: + build: . + network_mode: host + command: ["./upsnap", "serve", "--http", "0.0.0.0:8090"] + healthcheck: + test: ["CMD", "curl", "-fs", "http://localhost:8090/api/health"] + interval: 1m + timeout: 10s + retries: 3 diff --git a/frontend/src/components/DeviceForm.svelte b/frontend/src/components/DeviceForm.svelte index 73fbbd63..e68815b7 100644 --- a/frontend/src/components/DeviceForm.svelte +++ b/frontend/src/components/DeviceForm.svelte @@ -341,7 +341,10 @@
(1) Same cron syntax as for ping interval.
-(2) Shell command to be executed. e.g.:
++ (2) Shell command to be executed. "net rpc", "sshpass" and "nmap" are available. + e.g.: +