From c6ebb4665df8fd84bb99ab2650db42311e245a13 Mon Sep 17 00:00:00 2001 From: Agent Date: Fri, 15 May 2026 14:08:39 +0800 Subject: [PATCH 1/4] feat: add Dockerfile for containerized deployment Multi-stage build using golang:1.24-alpine for building and alpine:3.21 for the runtime image. Includes CGO support for go-sqlite3 dependency. Co-Authored-By: Claude Opus 4.7 --- .dockerignore | 6 ++++++ Dockerfile | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..fe0f9d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +dist +fixtures +.claude +*.md +LICENSE diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d9bd209 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +# Build stage +FROM golang:1.24-alpine AS builder + +RUN apk add --no-cache gcc musl-dev + +WORKDIR /app + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . +RUN CGO_ENABLED=1 GOOS=linux go build -ldflags="-s -w" -o /html-server ./cmd/html-server + +# Runtime stage +FROM alpine:3.21 + +RUN apk add --no-cache ca-certificates + +WORKDIR /app + +COPY --from=builder /html-server /usr/local/bin/html-server + +EXPOSE 8080 + +ENTRYPOINT ["html-server"] From ab0079dc789acf5c831958ba942e70b30c46a421 Mon Sep 17 00:00:00 2001 From: Agent Date: Fri, 15 May 2026 14:11:53 +0800 Subject: [PATCH 2/4] fix: address PR review feedback - Change EXPOSE from 8080 to 3939 (matches app default port) - Add non-root user (appuser) for security - Add .git to .dockerignore to reduce build context - Use /LICENSE instead of LICENSE to avoid over-matching Co-Authored-By: Claude Opus 4.7 --- .dockerignore | 3 ++- Dockerfile | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index fe0f9d0..970c946 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ +.git node_modules dist fixtures .claude *.md -LICENSE +/LICENSE diff --git a/Dockerfile b/Dockerfile index d9bd209..3e06019 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,10 +16,14 @@ FROM alpine:3.21 RUN apk add --no-cache ca-certificates +RUN adduser -D -u 1000 appuser + WORKDIR /app COPY --from=builder /html-server /usr/local/bin/html-server -EXPOSE 8080 +USER appuser + +EXPOSE 3939 ENTRYPOINT ["html-server"] From 69d1120e170ee6ce412d4e467ce282b5f0e2b33a Mon Sep 17 00:00:00 2001 From: Agent Date: Fri, 15 May 2026 14:17:42 +0800 Subject: [PATCH 3/4] fix: add HEALTHCHECK and narrow .dockerignore *.md scope - Add HEALTHCHECK directive for container orchestration awareness - Change *.md to /*.md to avoid filtering markdown files in subdirectories Co-Authored-By: Claude Opus 4.7 --- .dockerignore | 2 +- Dockerfile | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 970c946..635486c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,5 +3,5 @@ node_modules dist fixtures .claude -*.md +/*.md /LICENSE diff --git a/Dockerfile b/Dockerfile index 3e06019..4fe53a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,4 +26,7 @@ USER appuser EXPOSE 3939 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://localhost:3939/ || exit 1 + ENTRYPOINT ["html-server"] From 89b390e9fa98e147800b12bf367f3fc2c1808d81 Mon Sep 17 00:00:00 2001 From: Agent Date: Fri, 15 May 2026 14:51:50 +0800 Subject: [PATCH 4/4] fix: add default CMD and narrow fixtures path in .dockerignore - Add CMD ["start", "--host", "0.0.0.0", "--port", "3939"] so docker run without args starts the server by default - Change fixtures to /fixtures to avoid matching subdirectories Co-Authored-By: Claude Opus 4.7 --- .dockerignore | 2 +- Dockerfile | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 635486c..cdded75 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,7 @@ .git node_modules dist -fixtures +/fixtures .claude /*.md /LICENSE diff --git a/Dockerfile b/Dockerfile index 4fe53a0..1737792 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,3 +30,4 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget -qO- http://localhost:3939/ || exit 1 ENTRYPOINT ["html-server"] +CMD ["start", "--host", "0.0.0.0", "--port", "3939"]