added docker setup
This commit is contained in:
54
.dockerignore
Normal file
54
.dockerignore
Normal 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
53
Dockerfile
Normal 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"]
|
||||||
94
Makefile
94
Makefile
@@ -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:
|
run:
|
||||||
go run main.go
|
go run main.go
|
||||||
|
|
||||||
# Build the binary
|
# Build the binary locally
|
||||||
build:
|
build:
|
||||||
go build -o mealprep main.go
|
go build -o mealprep main.go
|
||||||
|
|
||||||
@@ -33,14 +36,95 @@ test:
|
|||||||
install:
|
install:
|
||||||
go 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
|
# Show help
|
||||||
help:
|
help:
|
||||||
@echo "Available targets:"
|
@echo "Available targets:"
|
||||||
@echo " run - Run the application"
|
@echo ""
|
||||||
@echo " build - Build the binary"
|
@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 " deps - Install dependencies"
|
||||||
@echo " clean - Remove binary and database"
|
@echo " clean - Remove binary and database"
|
||||||
@echo " clean-db - Remove only database"
|
@echo " clean-db - Remove only database"
|
||||||
|
@echo " dev - Run with auto-reload (requires air)"
|
||||||
@echo " test - Run tests"
|
@echo " test - Run tests"
|
||||||
@echo " install - Install binary to GOPATH"
|
@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"
|
@echo " help - Show this help message"
|
||||||
|
|||||||
31
docker-compose.yml
Normal file
31
docker-compose.yml
Normal 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
15
main.go
@@ -8,6 +8,7 @@ import (
|
|||||||
"mealprep/database"
|
"mealprep/database"
|
||||||
"mealprep/handlers"
|
"mealprep/handlers"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,8 +16,14 @@ func main() {
|
|||||||
// Print startup banner
|
// Print startup banner
|
||||||
printBanner()
|
printBanner()
|
||||||
|
|
||||||
|
// Get database path from environment variable or use default
|
||||||
|
dbPath := os.Getenv("DB_PATH")
|
||||||
|
if dbPath == "" {
|
||||||
|
dbPath = "mealprep.db"
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize database
|
// 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)
|
log.Fatalf("Failed to initialize database: %v", err)
|
||||||
}
|
}
|
||||||
defer database.DB.Close()
|
defer database.DB.Close()
|
||||||
@@ -48,6 +55,12 @@ func main() {
|
|||||||
})
|
})
|
||||||
http.HandleFunc("/logout", handlers.LogoutHandler)
|
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
|
// Protected routes
|
||||||
http.HandleFunc("/", auth.RequireAuth(indexHandler))
|
http.HandleFunc("/", auth.RequireAuth(indexHandler))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user