added docker setup

This commit is contained in:
2025-10-25 22:30:16 +02:00
parent cc28aa9a8e
commit 335c34ce64
5 changed files with 247 additions and 12 deletions

54
.dockerignore Normal file
View File

@@ -0,0 +1,54 @@
# Database files
*.db
*.db-shm
*.db-wal
# Binaries
mealprep
*.exe
*.dll
*.so
*.dylib
# Test and coverage files
*.test
*.out
coverage.txt
*.coverprofile
# Documentation
*.md
*.txt
IMPLEMENTATION_NOTES.txt
SECURITY_REPORT.txt
# Git
.git
.gitignore
# IDE and editor files
.vscode
.idea
*.swp
*.swo
*~
.DS_Store
# Logs
*.log
logs/
# Temporary files
tmp/
temp/
.env
.env.local
# Build artifacts
dist/
build/
# Docker files (no need to include in image)
Dockerfile
docker-compose.yml
.dockerignore

53
Dockerfile Normal file
View File

@@ -0,0 +1,53 @@
# Build stage
FROM golang:1.21-bookworm AS builder
# Install build dependencies
RUN apt-get update && apt-get install -y \
gcc \
sqlite3 \
libsqlite3-dev \
&& rm -rf /var/lib/apt/lists/*
# Set working directory
WORKDIR /build
# Copy go mod files
COPY go.mod go.sum ./
# Download dependencies
RUN go mod download
# Copy source code
COPY . .
# Build the application
RUN CGO_ENABLED=1 go build -o mealprep -ldflags="-s -w" .
# Runtime stage
FROM debian:bookworm-slim
# Install runtime dependencies
RUN apt-get update && apt-get install -y \
ca-certificates \
sqlite3 \
libsqlite3-0 \
&& rm -rf /var/lib/apt/lists/*
# Create app directory and data directory
WORKDIR /app
RUN mkdir -p /app/data
# Copy binary from builder
COPY --from=builder /build/mealprep .
# Copy static files
COPY --from=builder /build/static ./static
# Expose port
EXPOSE 8080
# Set environment variables
ENV DB_PATH=/app/data/mealprep.db
# Run the application
CMD ["./mealprep"]

View File

@@ -1,10 +1,13 @@
.PHONY: run build clean test deps install
.PHONY: all run build clean test deps install docker-build docker-up docker-down docker-logs docker-restart docker-clean help
# Run the application
# Default target: build and start with Docker
all: docker-up
# Run the application locally
run:
go run main.go
# Build the binary
# Build the binary locally
build:
go build -o mealprep main.go
@@ -33,14 +36,95 @@ test:
install:
go install
# Docker: Build the Docker image
docker-build:
docker build -t mealprep:latest .
# Docker: Build and start containers
docker-up:
docker compose up -d
# Docker: Build and start with logs
docker-up-logs:
docker compose up --build
# Docker: Stop and remove containers
docker-down:
docker compose down
# Docker: View logs
docker-logs:
docker compose logs -f
# Docker: Restart containers
docker-restart:
docker compose restart
# Docker: Stop containers
docker-stop:
docker compose stop
# Docker: Start containers
docker-start:
docker compose start
# Docker: Clean everything (containers, volumes, images)
docker-clean:
docker compose down -v
docker rmi mealprep:latest 2>/dev/null || true
# Docker: Rebuild and restart
docker-rebuild:
docker compose down
docker compose build --no-cache
docker compose up -d
# Docker: Shell into container
docker-shell:
docker exec -it mealprep-app /bin/sh
# Docker: Show container status
docker-status:
docker compose ps
# Deploy: Build and deploy to production
deploy: docker-build
@echo "Building and deploying to Docker server..."
docker compose up -d --build
@echo "Deployment complete!"
# Show help
help:
@echo "Available targets:"
@echo " run - Run the application"
@echo " build - Build the binary"
@echo ""
@echo "Default:"
@echo " make / all - Build and start with Docker (default)"
@echo ""
@echo "Local Development:"
@echo " run - Run the application locally"
@echo " build - Build the binary locally"
@echo " deps - Install dependencies"
@echo " clean - Remove binary and database"
@echo " clean-db - Remove only database"
@echo " dev - Run with auto-reload (requires air)"
@echo " test - Run tests"
@echo " install - Install binary to GOPATH"
@echo ""
@echo "Docker Commands:"
@echo " docker-build - Build the Docker image"
@echo " docker-up - Build and start containers in background"
@echo " docker-up-logs - Build and start with logs attached"
@echo " docker-down - Stop and remove containers"
@echo " docker-logs - View container logs"
@echo " docker-restart - Restart containers"
@echo " docker-stop - Stop containers"
@echo " docker-start - Start stopped containers"
@echo " docker-clean - Remove everything (containers, volumes, images)"
@echo " docker-rebuild - Rebuild from scratch and start"
@echo " docker-shell - Open shell in container"
@echo " docker-status - Show container status"
@echo ""
@echo "Deployment:"
@echo " deploy - Build and deploy to production"
@echo ""
@echo " help - Show this help message"

31
docker-compose.yml Normal file
View File

@@ -0,0 +1,31 @@
services:
mealprep:
build:
context: .
dockerfile: Dockerfile
container_name: mealprep-app
ports:
- "8080:8080"
volumes:
- mealprep-data:/app/data
environment:
- DB_PATH=/app/data/mealprep.db
restart: unless-stopped
healthcheck:
test:
[
"CMD",
"wget",
"--quiet",
"--tries=1",
"--spider",
"http://localhost:8080/health",
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
mealprep-data:
driver: local

15
main.go
View File

@@ -8,6 +8,7 @@ import (
"mealprep/database"
"mealprep/handlers"
"net/http"
"os"
"strings"
)
@@ -15,8 +16,14 @@ func main() {
// Print startup banner
printBanner()
// Get database path from environment variable or use default
dbPath := os.Getenv("DB_PATH")
if dbPath == "" {
dbPath = "mealprep.db"
}
// Initialize database
if err := database.InitDB("mealprep.db"); err != nil {
if err := database.InitDB(dbPath); err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
defer database.DB.Close()
@@ -48,6 +55,12 @@ func main() {
})
http.HandleFunc("/logout", handlers.LogoutHandler)
// Health check endpoint (public, for Docker)
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
})
// Protected routes
http.HandleFunc("/", auth.RequireAuth(indexHandler))