From a3397f54c09323b972d733aa4f4e2a4eba6cebc9 Mon Sep 17 00:00:00 2001 From: Lain Iwakura Date: Wed, 25 Mar 2026 21:56:03 +0300 Subject: feat: staaatus --- .woodpecker.yaml | 16 ++++++++++++++++ Dockerfile | 23 +++++++++++++++++++++++ server/go.mod | 3 +++ server/main.go | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 .woodpecker.yaml create mode 100644 Dockerfile create mode 100644 server/go.mod create mode 100644 server/main.go diff --git a/.woodpecker.yaml b/.woodpecker.yaml new file mode 100644 index 0000000..984bd93 --- /dev/null +++ b/.woodpecker.yaml @@ -0,0 +1,16 @@ +steps: + - name: build + image: docker:dind + privileged: true + commands: + - dockerd-entrypoint.sh & + - sleep 3 + - docker build -t reg.nx.kroot.sh/blog:latest -t reg.nx.kroot.sh/blog:${CI_COMMIT_SHA:0:7} . + - echo "$REGISTRY_PASSWORD" | docker login reg.nx.kroot.sh -u "$REGISTRY_USER" --password-stdin + - docker push reg.nx.kroot.sh/blog:latest + - docker push reg.nx.kroot.sh/blog:${CI_COMMIT_SHA:0:7} + secrets: [registry_user, registry_password] + +when: + branch: master + event: push diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..089bd0f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM reg.nx.kroot.sh/makko AS builder-makko + +WORKDIR /src +COPY blog/ blog/ +COPY templates/ templates/ +COPY makko.json . + +RUN makko . + +FROM golang:alpine AS builder-go + +WORKDIR /src +COPY server/go.mod server/main.go ./ +COPY --from=builder-makko /src/web ./static/ + +RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /blog-server . + +FROM scratch + +COPY --from=builder-go /blog-server /blog-server + +EXPOSE 8080 +ENTRYPOINT ["/blog-server"] diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..8b76811 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,3 @@ +module blog-server + +go 1.22 diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..bffc427 --- /dev/null +++ b/server/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "embed" + "flag" + "io/fs" + "log/slog" + "net/http" // sure, we could use fiber... but for now lets' stick with net/http to keep dependencies to a minimum + "os" +) + +//go:embed static/* +var staticFS embed.FS + +func main() { + addr := flag.String("addr", ":8080", "listen address") + flag.Parse() + + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) + slog.SetDefault(logger) + + /* strip "static/" prefix so files are served from root */ + subFS, err := fs.Sub(staticFS, "static") + if err != nil { + slog.Error("failed to create sub filesystem", "error", err) + os.Exit(1) + } + + fileServer := http.FileServer(http.FS(subFS)) + http.Handle("/", fileServer) + + slog.Info("starting server", "addr", *addr) + if err := http.ListenAndServe(*addr, nil); err != nil { + slog.Error("server failed", "error", err) + os.Exit(1) + } +} -- cgit v1.3