Compare commits

..
4 Commits
Author SHA1 Message Date
lukaszraczylo 96f9f4a36c fix: use free GoReleaser syntax for Docker builds
Problem:
- GoReleaser Pro features (use: buildx, build_flag_templates) not available in free version
- CI/CD failing with "field not found in type config.DockerV2" errors

Solution:
- Split each Docker image into separate amd64 and arm64 builds
- Use goarch field to specify architecture
- Use build_flags instead of build_flag_templates
- Add docker_manifests section to combine arch-specific images into multi-arch manifests

Changes:
- Each service now has two Docker image definitions (amd64 and arm64)
- Images tagged with architecture suffix (e.g., v1.0.0-amd64, v1.0.0-arm64)
- Docker manifests combine them into unified tags (e.g., v1.0.0, latest)
- Users can pull multi-arch images normally, Docker will select correct arch

Result:
- Works with free GoReleaser version
- Maintains multi-architecture support
- Multi-stage Dockerfiles compile for each architecture natively
2026-01-03 21:59:28 +00:00
lukaszraczylo 311e4d13f6 fix: resolve CGO cross-compilation issues with multi-stage Docker builds
Problem:
- Enabling CGO_ENABLED=1 for SQLite support caused cross-compilation failures
- ARM64 assembly errors when building from amd64 host
- Cross-compilation with CGO requires architecture-specific toolchains

Solution:
- Converted all Dockerfiles to multi-stage builds
- Binaries now compile inside Docker using native platform builders
- Used --platform flag to build for target architecture natively
- Removed binary builds from .goreleaser.yaml (skip: true)
- Updated dockers_v2 to use buildx with multi-platform support

Changes:
- .goreleaser.yaml: Skip standalone builds, use Docker buildx
- Dockerfile.server: Multi-stage build with CGO
- Dockerfile.scanner: Multi-stage build with CGO
- Dockerfile.migrate: Multi-stage build with CGO

Benefits:
- No cross-compilation needed (each platform builds natively)
- Docker buildx handles multi-platform builds automatically
- SQLite support working with CGO enabled
- Cleaner separation between build and runtime environments
2026-01-03 21:55:01 +00:00
lukaszraczylo f936dfa359 Enable CGO for all GoHoarder binaries to support SQLite
Changes:
- Set CGO_ENABLED=1 for gohoarder main binary in .goreleaser.yaml
- Add sqlite-libs and musl to Dockerfile.server
- Add sqlite-libs and musl to Dockerfile.scanner

All Go binaries that interact with SQLite now have CGO enabled:
 gohoarder (main binary) - used by server and scanner
 migrate (migration tool)

Runtime containers include necessary C libraries:
 Dockerfile.server - SQLite runtime support
 Dockerfile.scanner - SQLite runtime support
 Dockerfile.migrate - SQLite runtime support

This fixes: 'Binary was compiled with CGO_ENABLED=0, go-sqlite3 requires cgo'
2026-01-03 21:41:59 +00:00
lukaszraczylo c1103630f0 Enable CGO for migrate binary to support SQLite
Changes:
- Set CGO_ENABLED=1 for migrate build in .goreleaser.yaml
- Add sqlite-libs and musl runtime dependencies to Dockerfile.migrate

This fixes the migration error: 'Binary was compiled with CGO_ENABLED=0,
go-sqlite3 requires cgo to work'
2026-01-03 21:38:34 +00:00
4 changed files with 316 additions and 83 deletions
+193 -68
View File
@@ -13,42 +13,13 @@ before:
# - ./script/generate-version.sh
# Build configuration
# Note: Binaries are built inside Docker containers (multi-stage builds)
# to avoid CGO cross-compilation issues. No standalone builds here.
builds:
- id: gohoarder
main: ./cmd/gohoarder
binary: gohoarder
env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
ldflags:
- -s -w
- -X github.com/lukaszraczylo/gohoarder/internal/version.Version={{.Version}}
- -X github.com/lukaszraczylo/gohoarder/internal/version.GitCommit={{.ShortCommit}}
- -X github.com/lukaszraczylo/gohoarder/internal/version.BuildTime={{.Date}}
skip: true
- id: migrate
main: ./cmd/migrate
binary: migrate
env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
ldflags:
- -s -w
- -X main.Version={{.Version}}
- -X main.GitCommit={{.ShortCommit}}
- -X main.BuildTime={{.Date}}
skip: true
# Archives for releases
archives:
@@ -108,16 +79,43 @@ release:
dockers_v2:
# 1. Application Engine - Main GoHoarder server
- id: gohoarder-server
ids:
- gohoarder
images:
- ghcr.io/lukaszraczylo/gohoarder-server
goarch: amd64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=amd64"
tags:
- "{{ .Version }}"
- latest
platforms:
- linux/amd64
- linux/arm64
- "{{ .Version }}-amd64"
- latest-amd64
dockerfile: Dockerfile.server
labels:
org.opencontainers.image.title: GoHoarder Server
org.opencontainers.image.description: Universal package cache proxy server
org.opencontainers.image.url: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.source: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.version: "{{ .Version }}"
org.opencontainers.image.created: "{{ .Date }}"
org.opencontainers.image.revision: "{{ .FullCommit }}"
extra_files:
- config.yaml.example
- id: gohoarder-server-arm64
images:
- ghcr.io/lukaszraczylo/gohoarder-server
goarch: arm64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=arm64"
tags:
- "{{ .Version }}-arm64"
- latest-arm64
dockerfile: Dockerfile.server
labels:
org.opencontainers.image.title: GoHoarder Server
@@ -132,16 +130,31 @@ dockers_v2:
# 2. Website - Frontend Dashboard
- id: gohoarder-frontend
ids:
- gohoarder
images:
- ghcr.io/lukaszraczylo/gohoarder-frontend
goarch: amd64
tags:
- "{{ .Version }}"
- latest
platforms:
- linux/amd64
- linux/arm64
- "{{ .Version }}-amd64"
- latest-amd64
dockerfile: Dockerfile.frontend
labels:
org.opencontainers.image.title: GoHoarder Frontend
org.opencontainers.image.description: GoHoarder web dashboard
org.opencontainers.image.url: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.source: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.version: "{{ .Version }}"
org.opencontainers.image.created: "{{ .Date }}"
org.opencontainers.image.revision: "{{ .FullCommit }}"
extra_files:
- frontend
- id: gohoarder-frontend-arm64
images:
- ghcr.io/lukaszraczylo/gohoarder-frontend
goarch: arm64
tags:
- "{{ .Version }}-arm64"
- latest-arm64
dockerfile: Dockerfile.frontend
labels:
org.opencontainers.image.title: GoHoarder Frontend
@@ -156,16 +169,43 @@ dockers_v2:
# 3. Scanning Engine - Background scanner worker
- id: gohoarder-scanner
ids:
- gohoarder
images:
- ghcr.io/lukaszraczylo/gohoarder-scanner
goarch: amd64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=amd64"
tags:
- "{{ .Version }}"
- latest
platforms:
- linux/amd64
- linux/arm64
- "{{ .Version }}-amd64"
- latest-amd64
dockerfile: Dockerfile.scanner
labels:
org.opencontainers.image.title: GoHoarder Scanner
org.opencontainers.image.description: GoHoarder vulnerability scanning engine
org.opencontainers.image.url: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.source: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.version: "{{ .Version }}"
org.opencontainers.image.created: "{{ .Date }}"
org.opencontainers.image.revision: "{{ .FullCommit }}"
extra_files:
- config.yaml.example
- id: gohoarder-scanner-arm64
images:
- ghcr.io/lukaszraczylo/gohoarder-scanner
goarch: arm64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=arm64"
tags:
- "{{ .Version }}-arm64"
- latest-arm64
dockerfile: Dockerfile.scanner
labels:
org.opencontainers.image.title: GoHoarder Scanner
@@ -180,16 +220,29 @@ dockers_v2:
# 4. Gateway - Nginx reverse proxy for unified deployment
- id: gohoarder-gateway
ids:
- gohoarder
images:
- ghcr.io/lukaszraczylo/gohoarder-gateway
goarch: amd64
tags:
- "{{ .Version }}"
- latest
platforms:
- linux/amd64
- linux/arm64
- "{{ .Version }}-amd64"
- latest-amd64
dockerfile: Dockerfile.gateway
labels:
org.opencontainers.image.title: GoHoarder Gateway
org.opencontainers.image.description: Nginx reverse proxy for unified GoHoarder deployment
org.opencontainers.image.url: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.source: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.version: "{{ .Version }}"
org.opencontainers.image.created: "{{ .Date }}"
org.opencontainers.image.revision: "{{ .FullCommit }}"
- id: gohoarder-gateway-arm64
images:
- ghcr.io/lukaszraczylo/gohoarder-gateway
goarch: arm64
tags:
- "{{ .Version }}-arm64"
- latest-arm64
dockerfile: Dockerfile.gateway
labels:
org.opencontainers.image.title: GoHoarder Gateway
@@ -202,16 +255,41 @@ dockers_v2:
# 5. Migration Engine - Database migration tool
- id: gohoarder-migrate
ids:
- migrate
images:
- ghcr.io/lukaszraczylo/gohoarder-migrate
goarch: amd64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=amd64"
tags:
- "{{ .Version }}"
- latest
platforms:
- linux/amd64
- linux/arm64
- "{{ .Version }}-amd64"
- latest-amd64
dockerfile: Dockerfile.migrate
labels:
org.opencontainers.image.title: GoHoarder Migrate
org.opencontainers.image.description: Database migration tool for GoHoarder V2 schema
org.opencontainers.image.url: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.source: https://github.com/lukaszraczylo/gohoarder
org.opencontainers.image.version: "{{ .Version }}"
org.opencontainers.image.created: "{{ .Date }}"
org.opencontainers.image.revision: "{{ .FullCommit }}"
- id: gohoarder-migrate-arm64
images:
- ghcr.io/lukaszraczylo/gohoarder-migrate
goarch: arm64
build_flags:
- "--build-arg=VERSION={{ .Version }}"
- "--build-arg=GIT_COMMIT={{ .ShortCommit }}"
- "--build-arg=BUILD_TIME={{ .Date }}"
- "--build-arg=TARGETOS=linux"
- "--build-arg=TARGETARCH=arm64"
tags:
- "{{ .Version }}-arm64"
- latest-arm64
dockerfile: Dockerfile.migrate
labels:
org.opencontainers.image.title: GoHoarder Migrate
@@ -243,3 +321,50 @@ docker_signs:
- sign
- "${artifact}@${digest}"
- "--yes"
# Docker manifests for multi-arch support
docker_manifests:
- name_template: ghcr.io/lukaszraczylo/gohoarder-server:{{ .Version }}
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-server:{{ .Version }}-amd64
- ghcr.io/lukaszraczylo/gohoarder-server:{{ .Version }}-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-server:latest
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-server:latest-amd64
- ghcr.io/lukaszraczylo/gohoarder-server:latest-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-frontend:{{ .Version }}
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-frontend:{{ .Version }}-amd64
- ghcr.io/lukaszraczylo/gohoarder-frontend:{{ .Version }}-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-frontend:latest
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-frontend:latest-amd64
- ghcr.io/lukaszraczylo/gohoarder-frontend:latest-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-scanner:{{ .Version }}
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-scanner:{{ .Version }}-amd64
- ghcr.io/lukaszraczylo/gohoarder-scanner:{{ .Version }}-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-scanner:latest
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-scanner:latest-amd64
- ghcr.io/lukaszraczylo/gohoarder-scanner:latest-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-gateway:{{ .Version }}
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-gateway:{{ .Version }}-amd64
- ghcr.io/lukaszraczylo/gohoarder-gateway:{{ .Version }}-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-gateway:latest
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-gateway:latest-amd64
- ghcr.io/lukaszraczylo/gohoarder-gateway:latest-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-migrate:{{ .Version }}
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-migrate:{{ .Version }}-amd64
- ghcr.io/lukaszraczylo/gohoarder-migrate:{{ .Version }}-arm64
- name_template: ghcr.io/lukaszraczylo/gohoarder-migrate:latest
image_templates:
- ghcr.io/lukaszraczylo/gohoarder-migrate:latest-amd64
- ghcr.io/lukaszraczylo/gohoarder-migrate:latest-arm64
+41 -5
View File
@@ -1,25 +1,61 @@
# Migration Engine - Database Migration Tool
# Multi-stage build to compile with CGO support
ARG TARGETOS=linux
ARG TARGETARCH=amd64
# Build stage
FROM --platform=$TARGETOS/$TARGETARCH golang:1.23-alpine AS builder
# Install build dependencies for CGO
RUN apk add --no-cache \
gcc \
g++ \
musl-dev \
sqlite-dev \
git
WORKDIR /build
# Copy go mod files
COPY go.mod go.sum ./
RUN go mod download
# Copy source code
COPY . .
# Build with CGO enabled
ARG TARGETOS
ARG TARGETARCH
ARG VERSION=dev
ARG GIT_COMMIT=unknown
ARG BUILD_TIME=unknown
RUN CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH \
go build -ldflags="-s -w \
-X main.Version=${VERSION} \
-X main.GitCommit=${GIT_COMMIT} \
-X main.BuildTime=${BUILD_TIME}" \
-o migrate ./cmd/migrate
# Runtime stage
FROM alpine:latest
# Install runtime dependencies
# Install runtime dependencies (including CGO/SQLite dependencies)
RUN apk add --no-cache \
ca-certificates \
postgresql-client \
mysql-client \
busybox-extras \
sqlite-libs \
musl \
&& update-ca-certificates
# Create non-root user
RUN addgroup -g 1000 gohoarder && \
adduser -D -u 1000 -G gohoarder gohoarder
# Copy binary (from platform-specific path)
ARG TARGETOS
ARG TARGETARCH
COPY ${TARGETOS}/${TARGETARCH}/migrate /usr/local/bin/migrate
# Copy binary from builder
COPY --from=builder /build/migrate /usr/local/bin/migrate
RUN chmod +x /usr/local/bin/migrate
WORKDIR /app
+41 -5
View File
@@ -1,10 +1,46 @@
# Scanning Engine - Background Scanner Worker
# Multi-stage build to compile with CGO support
ARG TARGETOS=linux
ARG TARGETARCH=amd64
# Build stage
FROM --platform=$TARGETOS/$TARGETARCH golang:1.23-alpine AS builder
# Install build dependencies for CGO
RUN apk add --no-cache \
gcc \
g++ \
musl-dev \
sqlite-dev \
git
WORKDIR /build
# Copy go mod files
COPY go.mod go.sum ./
RUN go mod download
# Copy source code
COPY . .
# Build with CGO enabled
ARG TARGETOS
ARG TARGETARCH
ARG VERSION=dev
ARG GIT_COMMIT=unknown
ARG BUILD_TIME=unknown
RUN CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH \
go build -ldflags="-s -w \
-X github.com/lukaszraczylo/gohoarder/internal/version.Version=${VERSION} \
-X github.com/lukaszraczylo/gohoarder/internal/version.GitCommit=${GIT_COMMIT} \
-X github.com/lukaszraczylo/gohoarder/internal/version.BuildTime=${BUILD_TIME}" \
-o gohoarder ./cmd/gohoarder
# Runtime stage
FROM alpine:latest
# Install scanning tools and runtime dependencies
# Install scanning tools and runtime dependencies (including CGO/SQLite dependencies)
RUN apk add --no-cache \
ca-certificates \
tzdata \
@@ -12,6 +48,8 @@ RUN apk add --no-cache \
curl \
wget \
bash \
sqlite-libs \
musl \
&& update-ca-certificates
# Install Trivy for container scanning
@@ -37,10 +75,8 @@ RUN mkdir -p /var/cache/gohoarder \
/var/lib/gohoarder \
/var/lib/trivy
# Copy binary (from platform-specific path)
ARG TARGETOS
ARG TARGETARCH
COPY ${TARGETOS}/${TARGETARCH}/gohoarder /usr/local/bin/gohoarder
# Copy binary from builder
COPY --from=builder /build/gohoarder /usr/local/bin/gohoarder
RUN chmod +x /usr/local/bin/gohoarder
# Copy example config
+41 -5
View File
@@ -1,13 +1,51 @@
# Application Engine - GoHoarder Server
# Multi-stage build to compile with CGO support
ARG TARGETOS=linux
ARG TARGETARCH=amd64
# Build stage
FROM --platform=$TARGETOS/$TARGETARCH golang:1.23-alpine AS builder
# Install build dependencies for CGO
RUN apk add --no-cache \
gcc \
g++ \
musl-dev \
sqlite-dev \
git
WORKDIR /build
# Copy go mod files
COPY go.mod go.sum ./
RUN go mod download
# Copy source code
COPY . .
# Build with CGO enabled
ARG TARGETOS
ARG TARGETARCH
ARG VERSION=dev
ARG GIT_COMMIT=unknown
ARG BUILD_TIME=unknown
RUN CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH \
go build -ldflags="-s -w \
-X github.com/lukaszraczylo/gohoarder/internal/version.Version=${VERSION} \
-X github.com/lukaszraczylo/gohoarder/internal/version.GitCommit=${GIT_COMMIT} \
-X github.com/lukaszraczylo/gohoarder/internal/version.BuildTime=${BUILD_TIME}" \
-o gohoarder ./cmd/gohoarder
# Runtime stage
FROM alpine:latest
# Install runtime dependencies
# Install runtime dependencies (including CGO/SQLite dependencies)
RUN apk add --no-cache \
ca-certificates \
tzdata \
sqlite-libs \
musl \
&& update-ca-certificates
# Create non-root user
@@ -24,10 +62,8 @@ RUN mkdir -p /var/cache/gohoarder \
chmod -R 750 /var/cache/gohoarder \
/var/lib/gohoarder
# Copy binary (from platform-specific path)
ARG TARGETOS
ARG TARGETARCH
COPY ${TARGETOS}/${TARGETARCH}/gohoarder /usr/local/bin/gohoarder
# Copy binary from builder
COPY --from=builder /build/gohoarder /usr/local/bin/gohoarder
RUN chmod +x /usr/local/bin/gohoarder
# Copy example config