Add Docker support for easy deployment

- Add multi-stage Dockerfile with Alpine Linux for minimal image size
- Include docker-compose.yml for simplified deployment with volume persistence
- Add .dockerignore to exclude unnecessary files from build context
- Update main.go to support DATABASE_PATH environment variable
- Update README to promote Docker as the recommended deployment method
- Use non-root user in container for improved security
- Final image size ~38MB with all dependencies

Docker deployment now available via:
  docker-compose up -d
or
  docker build -t alpenqueue .
  docker run -d -p 8080:8080 -v alpenqueue-data:/app/data alpenqueue

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Max 2025-11-16 18:25:46 +00:00
parent 1df02d94a9
commit dac3f96ad1
5 changed files with 155 additions and 4 deletions

37
.dockerignore Normal file
View File

@ -0,0 +1,37 @@
# Git
.git
.gitignore
# Binaries
alpenqueue
*.exe
*.dll
*.so
*.dylib
# Test files
*_test.go
# Database files
*.db
*.db-shm
*.db-wal
# Documentation
README.md
*.md
# Docker files (prevent recursion)
Dockerfile
docker-compose.yml
.dockerignore
# IDE files
.vscode/
.idea/
*.swp
*.swo
# OS files
.DS_Store
Thumbs.db

51
Dockerfile Normal file
View File

@ -0,0 +1,51 @@
# Multi-stage build for smaller final image
FROM golang:1.25-alpine AS builder
# Install build dependencies for CGO (required for SQLite)
RUN apk add --no-cache gcc musl-dev sqlite-dev
# 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 with CGO enabled for SQLite
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o alpenqueue ./cmd/alpenqueue
# Final stage - minimal image
FROM alpine:latest
# Install runtime dependencies
RUN apk --no-cache add ca-certificates sqlite-libs
# Create non-root user
RUN addgroup -g 1001 -S alpenqueue && \
adduser -u 1001 -S alpenqueue -G alpenqueue
# Set working directory
WORKDIR /app
# Copy binary from builder
COPY --from=builder /build/alpenqueue .
# Create directory for SQLite database
RUN mkdir -p /app/data && chown -R alpenqueue:alpenqueue /app
# Switch to non-root user
USER alpenqueue
# Expose port
EXPOSE 8080
# Volume for persistent data
VOLUME ["/app/data"]
# Run the application
CMD ["./alpenqueue"]

View File

@ -14,15 +14,39 @@ A simple, self-hosted web scraping task queue with SQLite persistence, flexible
## Quick Start ## Quick Start
### Prerequisites ### 🐳 Docker (Recommended)
The easiest way to run AlpenQueue is with Docker:
```bash
# Using Docker Compose (recommended)
docker-compose up -d
# Or build and run manually
docker build -t alpenqueue .
docker run -d -p 8080:8080 -v alpenqueue-data:/app/data alpenqueue
```
That's it! AlpenQueue is now running on http://localhost:8080
#### Docker Configuration
- **Port**: 8080 (configurable in docker-compose.yml)
- **Data**: Persisted in Docker volume `alpenqueue-data`
- **Database**: SQLite database stored in `/app/data/`
- **User**: Runs as non-root user for security
### Manual Installation
#### Prerequisites
- Go 1.25 or later - Go 1.25 or later
- SQLite (automatically included via go-sqlite3) - SQLite (automatically included via go-sqlite3)
### Installation #### Installation
```bash ```bash
git clone https://github.com/yourusername/alpenqueue.git git clone https://git.maxtheweb.com/maxtheweb/AlpenQueue.git
cd AlpenQueue cd AlpenQueue
go build -o alpenqueue ./cmd/alpenqueue go build -o alpenqueue ./cmd/alpenqueue
``` ```

View File

@ -8,10 +8,17 @@ import (
"io" "io"
"log" "log"
"net/http" "net/http"
"os"
) )
func main() { func main() {
database, err := db.Init("./alpenqueue.db") // Get database path from environment or use default
dbPath := os.Getenv("DATABASE_PATH")
if dbPath == "" {
dbPath = "./alpenqueue.db"
}
database, err := db.Init(dbPath)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

32
docker-compose.yml Normal file
View File

@ -0,0 +1,32 @@
version: '3.8'
services:
alpenqueue:
build: .
image: alpenqueue:latest
container_name: alpenqueue
ports:
- "8080:8080"
volumes:
# Persist SQLite database
- alpenqueue-data:/app/data
environment:
# Optional: Override default database location
- DATABASE_PATH=/app/data/alpenqueue.db
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
networks:
- alpenqueue-network
volumes:
alpenqueue-data:
driver: local
networks:
alpenqueue-network:
driver: bridge