diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..fbc6d82 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,40 @@ +# Git +.git +.gitignore + +# Documentation +*.md +CLAUDE.md + +# Build artifacts +s3pit +tmp/ +data/ + +# Development files +.qodo/ +examples/ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Test files +*_test.go +testdata/ + +# Docker files (not needed in the image) +Dockerfile* +docker-compose*.yml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e100e1a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +# Build stage +FROM golang:1.24-alpine AS builder + +# Install git and ca-certificates (needed for go mod download) +RUN apk add --no-cache git ca-certificates tzdata + +# Set working directory +WORKDIR /app + +# Copy go mod files +COPY go.mod go.sum ./ + +# Download dependencies +RUN go mod download + +# Copy source code +COPY . . + +# Build the binary with optimizations +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ + -ldflags='-w -s -extldflags "-static"' \ + -a -installsuffix cgo \ + -o s3pit . + +# Runtime stage +FROM scratch + +# Copy ca-certificates from builder stage +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ + +# Copy timezone data from builder stage +COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo + +# Copy the binary from builder stage +COPY --from=builder /app/s3pit /s3pit + +# Expose port 3333 (default port used by s3pit) +EXPOSE 3333 + +# Set the binary as entrypoint +ENTRYPOINT ["/s3pit"] \ No newline at end of file diff --git a/Makefile b/Makefile index a5f7ebb..04a3927 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,11 @@ -.PHONY: help build run test clean all +.PHONY: help build run test clean all docker-build docker-run docker-run-detached docker-stop docker-clean docker-push docker-shell # Variables BINARY_NAME=s3pit GO=go GOFLAGS=-v +DOCKER_IMAGE=s3pit +DOCKER_TAG=latest # Colors for output GREEN=\033[0;32m @@ -63,6 +65,43 @@ lint: ## Run linter all: build test lint fmt ## Run all checks @echo "${GREEN}All checks complete!${NC}" +# Docker commands +docker-build: ## Build Docker image + @echo "${YELLOW}Building Docker image ${DOCKER_IMAGE}:${DOCKER_TAG}...${NC}" + docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} . + @echo "${GREEN}Docker image built successfully!${NC}" + +docker-run: docker-build ## Build and run Docker container + @echo "${YELLOW}Running Docker container...${NC}" + docker run --rm -p 3333:3333 ${DOCKER_IMAGE}:${DOCKER_TAG} + +docker-run-detached: docker-build ## Build and run Docker container in detached mode + @echo "${YELLOW}Running Docker container in detached mode...${NC}" + docker run -d --name ${DOCKER_IMAGE} -p 3333:3333 ${DOCKER_IMAGE}:${DOCKER_TAG} + @echo "${GREEN}Container started with name: ${DOCKER_IMAGE}${NC}" + +docker-stop: ## Stop running Docker container + @echo "${YELLOW}Stopping Docker container...${NC}" + docker stop ${DOCKER_IMAGE} || true + docker rm ${DOCKER_IMAGE} || true + @echo "${GREEN}Container stopped and removed!${NC}" + +docker-clean: ## Remove Docker image and containers + @echo "${YELLOW}Cleaning Docker artifacts...${NC}" + docker stop ${DOCKER_IMAGE} 2>/dev/null || true + docker rm ${DOCKER_IMAGE} 2>/dev/null || true + docker rmi ${DOCKER_IMAGE}:${DOCKER_TAG} 2>/dev/null || true + @echo "${GREEN}Docker cleanup complete!${NC}" + +docker-push: docker-build ## Build and push Docker image to registry + @echo "${YELLOW}Pushing Docker image to registry...${NC}" + docker push ${DOCKER_IMAGE}:${DOCKER_TAG} + @echo "${GREEN}Docker image pushed successfully!${NC}" + +docker-shell: docker-build ## Run Docker container with shell access (for debugging) + @echo "${YELLOW}Starting Docker container with shell...${NC}" + docker run --rm -it --entrypoint /bin/sh ${DOCKER_IMAGE}:${DOCKER_TAG} + # Release commands release-patch: ## Create a patch release (v0.0.X) @echo "${YELLOW}Creating patch release...${NC}" diff --git a/go.mod b/go.mod index 5d45efc..ad5eb55 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,13 @@ module github.com/wozozo/s3pit go 1.24.6 +require ( + github.com/gin-gonic/gin v1.10.1 + github.com/pelletier/go-toml/v2 v2.2.2 + github.com/spf13/cobra v1.9.1 + github.com/stretchr/testify v1.10.0 +) + require ( github.com/bytedance/sonic v1.11.6 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect @@ -10,7 +17,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.10.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.20.0 // indirect @@ -22,11 +28,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/spf13/cobra v1.9.1 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/stretchr/testify v1.10.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.8.0 // indirect diff --git a/go.sum b/go.sum index 1b0f66d..51fb00f 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -24,6 +26,8 @@ github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBEx github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -81,8 +85,11 @@ golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=