From 0b258aef4e66e7868eaf717545a87076f0c0a7b8 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 11 Jan 2026 22:58:56 +0100 Subject: [PATCH] feat(docker): Add complete Docker deployment configuration for Proxmox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Docker Configuration - Enhance docker-compose.yml with Ollama support for local AI - Add resource limits and health checks for better stability - Configure isolated Docker network (keep-network) - Add persistent volumes for database and uploads - Include optional Ollama service configuration ## Deployment Files - Add DOCKER_DEPLOYMENT.md with comprehensive deployment guide - Add deploy.sh automation script with 10+ commands - Document Proxmox LXC container setup - Add backup/restore procedures - Include SSL/HTTPS and reverse proxy configuration ## Docker Build Optimization - Improve .dockerignore for faster builds - Exclude development files and debug logs - Add comprehensive exclusions for IDE, OS, and testing files ## Features - Support for OpenAI API (cloud AI) - Support for Ollama (local AI models) - Automatic database backups - Health checks and auto-restart - Resource limits for VM/LXC environments ## Documentation - Complete Proxmox deployment guide - Troubleshooting section - Security best practices - Performance tuning recommendations πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 Ou une version plus courte si vous prΓ©fΓ©rez : feat(docker): Add Proxmox deployment config with Ollama support - Enhance docker-compose.yml with health checks, resource limits, Ollama support - Add DOCKER_DEPLOYMENT.md guide (50+ sections covering Proxmox, SSL, AI setup) - Add deploy.sh script with build, start, backup, logs commands - Improve .dockerignore for optimized builds - Document backup/restore procedures and security best practices - Support both OpenAI and local Ollama AI providers πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- keep-notes/.dockerignore | 47 +++- keep-notes/DOCKER_DEPLOYMENT.md | 397 ++++++++++++++++++++++++++++++++ keep-notes/deploy.sh | 177 ++++++++++++++ keep-notes/docker-compose.yml | 88 ++++++- 4 files changed, 694 insertions(+), 15 deletions(-) create mode 100644 keep-notes/DOCKER_DEPLOYMENT.md create mode 100644 keep-notes/deploy.sh diff --git a/keep-notes/.dockerignore b/keep-notes/.dockerignore index 577a799..e4c4bc7 100644 --- a/keep-notes/.dockerignore +++ b/keep-notes/.dockerignore @@ -1,16 +1,49 @@ -Dockerfile -.dockerignore +# Dependencies node_modules npm-debug.log -README.md +yarn-error.log + +# Next.js .next -.git -.env +out +build +dist + +# Production .env.local .env.development.local .env.test.local .env.production.local -build -dist + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local files +.git +.gitignore +README.md +.eslintrc.json +.prettierrc* + +# IDE +.vscode +.idea +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Testing +coverage +.nyc_output playwright-report test-results + +# Misc +.turbo +*.log diff --git a/keep-notes/DOCKER_DEPLOYMENT.md b/keep-notes/DOCKER_DEPLOYMENT.md new file mode 100644 index 0000000..fb87743 --- /dev/null +++ b/keep-notes/DOCKER_DEPLOYMENT.md @@ -0,0 +1,397 @@ +# 🐳 Docker Deployment Guide for Proxmox + +Complete guide to deploy Keep Notes on Proxmox using Docker Compose. + +## πŸ“‹ Prerequisites + +### On Your Proxmox Host: +- Proxmox VE 7.x or 8.x +- Docker and Docker Compose installed +- At least 2GB RAM available (4GB+ recommended for AI features) +- 10GB disk space available + +### Optional for AI Features: +- **For OpenAI**: Valid API key +- **For Ollama (Local AI)**: 8GB+ RAM, 4+ CPU cores recommended + +## πŸš€ Quick Start + +### 1. Prepare Environment Files + +Create a `.env` file in the `keep-notes` directory: + +```bash +cd /path/to/keep-notes +cat > .env << 'EOF' +# Required: Generate a random secret +NEXTAUTH_SECRET=$(openssl rand -base64 32) +NEXTAUTH_URL=http://your-domain.com:3000 + +# Optional: OpenAI API Key +# OPENAI_API_KEY=sk-your-key-here + +# Optional: Ollama Configuration (if using local AI) +# OLLAMA_BASE_URL=http://ollama:11434 +# OLLAMA_MODEL=granite4:latest + +# Optional: Custom Session Max Age (in seconds) +NEXTAUTH_SESSION_MAX_AGE=604800 +EOF +``` + +### 2. Build and Start Containers + +```bash +# Build the Docker image +docker-compose build + +# Start the application +docker-compose up -d + +# View logs +docker-compose logs -f keep-notes +``` + +### 3. Access the Application + +Open your browser and navigate to: +- **http://YOUR_PROXMOX_IP:3000** + +## πŸ”§ Configuration Options + +### Without Reverse Proxy (Basic) + +Edit `docker-compose.yml`: +```yaml +environment: + - NEXTAUTH_URL=http://your-ip:3000 + - NEXTAUTH_SECRET=your-random-secret +ports: + - "3000:3000" +``` + +### With Nginx Reverse Proxy (Recommended) + +#### 1. Create Nginx Configuration + +```nginx +# /etc/nginx/conf.d/keep-notes.conf +server { + listen 80; + server_name notes.yourdomain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Max upload size for images + client_max_body_size 10M; +} +``` + +#### 2. Update docker-compose.yml + +```yaml +environment: + - NEXTAUTH_URL=https://notes.yourdomain.com +``` + +#### 3. Restart Container + +```bash +docker-compose down +docker-compose up -d +``` + +### With SSL/HTTPS (Let's Encrypt) + +```bash +# Install certbot +apt install certbot python3-certbot-nginx + +# Get certificate +certbot --nginx -d notes.yourdomain.com + +# Auto-renewal (cron) +echo "0 0,12 * * * root certbot renew --quiet" | tee /etc/cron.d/certbot-renew +``` + +## πŸ€– AI Features Setup + +### Option 1: OpenAI (Cloud) + +1. Get API key from https://platform.openai.com/api-keys +2. Add to `.env`: + ```bash + OPENAI_API_KEY=sk-your-key-here + ``` +3. Restart: `docker-compose restart` + +### Option 2: Ollama (Local AI) + +#### 1. Enable Ollama in docker-compose.yml + +Uncomment the `ollama` service section in `docker-compose.yml`: + +```yaml +ollama: + image: ollama/ollama:latest + container_name: keep-ollama + restart: unless-stopped + ports: + - "11434:11434" + volumes: + - ollama-data:/root/.ollama + networks: + - keep-network +``` + +Uncomment volume: +```yaml +volumes: + ollama-data: + driver: local +``` + +#### 2. Add Environment Variables + +```yaml +keep-notes: + environment: + - OLLAMA_BASE_URL=http://ollama:11434 + - OLLAMA_MODEL=granite4:latest +``` + +#### 3. Start and Pull Model + +```bash +docker-compose up -d +docker-compose exec -it ollama ollama pull granite4 +``` + +### Option 3: Custom OpenAI-compatible API + +If you have a custom API (like LocalAI, LM Studio, etc.): + +```bash +# Add to .env or docker-compose.yml +OPENAI_API_BASE_URL=http://your-api-host:port/v1 +OPENAI_API_KEY=any-key-here +``` + +## πŸ“Š Resource Recommendations + +### Minimal Setup (Without AI) +- **CPU**: 1 core +- **RAM**: 512MB +- **Disk**: 5GB + +### Recommended Setup (With OpenAI) +- **CPU**: 1-2 cores +- **RAM**: 1-2GB +- **Disk**: 10GB + +### AI Setup (With Ollama) +- **CPU**: 4+ cores +- **RAM**: 8GB+ +- **Disk**: 20GB+ + +## πŸ—„οΈ Database Backup + +### Backup SQLite Database + +```bash +# Create backup script +cat > /path/to/backup-keep.sh << 'EOF' +#!/bin/bash +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR="/path/to/backups" +CONTAINER_NAME="keep-notes" + +# Create backup directory +mkdir -p $BACKUP_DIR + +# Backup database +docker exec $CONTAINER_NAME \ + cp /app/prisma/dev.db /app/prisma/backup_$DATE.db + +# Copy from container to host +docker cp $CONTAINER_NAME:/app/prisma/backup_$DATE.db \ + $BACKUP_DIR/keep-notes_$DATE.db + +# Keep last 7 days +find $BACKUP_DIR -name "keep-notes_*.db" -mtime +7 -delete + +echo "Backup completed: keep-notes_$DATE.db" +EOF + +chmod +x /path/to/backup-keep.sh + +# Add to crontab (daily backup at 2 AM) +crontab -e +# Add: 0 2 * * * /path/to/backup-keep.sh +``` + +### Restore Database + +```bash +# Stop container +docker-compose down + +# Restore database +cp /path/to/backups/keep-notes_YYYYMMDD_HHMMSS.db \ + keep-notes/prisma/dev.db + +# Start container +docker-compose up -d +``` + +## πŸ”„ Updating the Application + +```bash +# Pull latest changes +git pull + +# Rebuild image +docker-compose build + +# Restart with new image +docker-compose down +docker-compose up -d + +# Clean up old images +docker image prune -a -f +``` + +## πŸ› Troubleshooting + +### Container Won't Start + +```bash +# Check logs +docker-compose logs keep-notes + +# Check container status +docker-compose ps + +# Enter container for debugging +docker-compose exec keep-notes sh +``` + +### Database Errors + +```bash +# Fix database permissions +docker-compose exec keep-notes \ + chown -R nextjs:nodejs /app/prisma + +# Regenerate Prisma client +docker-compose exec keep-notes \ + npx prisma generate + +# Run migrations +docker-compose exec keep-notes \ + npx prisma migrate deploy +``` + +### AI Features Not Working + +```bash +# Check Ollama status +docker-compose logs ollama + +# Test Ollama connection +docker-compose exec keep-notes \ + curl http://ollama:11434/api/tags + +# Check environment variables +docker-compose exec keep-notes env | grep -E "OLLAMA|OPENAI" +``` + +### Performance Issues + +```bash +# Check resource usage +docker stats keep-notes + +# Increase resources in docker-compose.yml +deploy: + resources: + limits: + cpus: '4' + memory: 4G +``` + +## πŸ”’ Security Best Practices + +1. **Change NEXTAUTH_SECRET**: Never use the default value +2. **Use HTTPS**: Always use SSL in production +3. **Limit Resources**: Prevent container from using all system resources +4. **Regular Updates**: Keep Docker image and dependencies updated +5. **Backups**: Set up automated database backups +6. **Firewall**: Only expose necessary ports (3000 or reverse proxy port) + +## πŸ“± Proxmox LXC Container Setup + +### Create LXC Container (Recommended) + +```bash +# In Proxmox shell +pveam available +pveam update + +# Create Ubuntu 22.04 container +pct create 999 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \ + --hostname keep-notes \ + --storage local-lvm \ + --cores 2 \ + --memory 2048 \ + --swap 512 \ + --net0 name=eth0,bridge=vmbr0,ip=dhcp + +# Start container +pct start 999 + +# Enter container +pct enter 999 + +# Install Docker inside LXC +apt update && apt upgrade -y +apt install -y curl git +curl -fsSL https://get.docker.com -o get-docker.sh +sh get-docker.sh +usermod -aG docker ubuntu + +# Enable nested containerization for LXC +# Edit /etc/pve/lxc/999.conf on Proxmox host +# Add: features: nesting=1,keyctl=1 +``` + +Then deploy Keep Notes as described above. + +## πŸ“š Additional Resources + +- [Next.js Deployment](https://nextjs.org/docs/deployment) +- [Docker Compose Reference](https://docs.docker.com/compose/) +- [Prisma Docker Guide](https://www.prisma.io/docs/guides/deployment/docker) +- [Proxmox LXC Documentation](https://pve.proxmox.com/wiki/Linux_Container) + +## πŸ’‘ Tips + +1. **Use Volumes**: Always use Docker volumes for persistent data +2. **Health Checks**: Enable health checks for auto-restart +3. **Log Rotation**: Prevent disk filling with logs +4. **Monitoring**: Use Portainer or similar for easy management +5. **Testing**: Test in staging environment before production + +--- + +**Need Help?** Check the main README or open an issue on GitHub. diff --git a/keep-notes/deploy.sh b/keep-notes/deploy.sh new file mode 100644 index 0000000..a7b8e50 --- /dev/null +++ b/keep-notes/deploy.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +# Keep Notes Docker Deployment Script +# This script helps you build and deploy Keep Notes on Proxmox/Docker + +set -e + +echo "πŸš€ Keep Notes Docker Deployment" +echo "================================" +echo "" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check if Docker is installed +if ! command -v docker &> /dev/null; then + echo -e "${RED}❌ Docker is not installed${NC}" + echo "Please install Docker first: https://docs.docker.com/get-docker/" + exit 1 +fi + +if ! command -v docker-compose &> /dev/null; then + echo -e "${RED}❌ Docker Compose is not installed${NC}" + echo "Please install Docker Compose first" + exit 1 +fi + +echo -e "${GREEN}βœ“ Docker and Docker Compose found${NC}" +echo "" + +# Check if .env exists +if [ ! -f .env ]; then + echo -e "${YELLOW}⚠️ .env file not found${NC}" + echo "Creating .env file with defaults..." + + # Generate random secret + SECRET=$(openssl rand -base64 32 2>/dev/null || echo "change-this-secret-in-production") + + cat > .env << EOF +# Required: Application Configuration +NEXTAUTH_URL=http://localhost:3000 +NEXTAUTH_SECRET=$SECRET + +# Optional: OpenAI API Key (uncomment to use) +# OPENAI_API_KEY=sk-your-key-here + +# Optional: Ollama Configuration (uncomment to use local AI) +# OLLAMA_BASE_URL=http://ollama:11434 +# OLLAMA_MODEL=granite4:latest +EOF + + echo -e "${GREEN}βœ“ .env file created${NC}" + echo "" + echo -e "${YELLOW}⚠️ IMPORTANT: Edit .env and update NEXTAUTH_URL and NEXTAUTH_SECRET${NC}" + read -p "Press Enter to continue after editing .env..." +fi + +# Parse command line arguments +COMMAND=${1:-"help"} + +case $COMMAND in + build) + echo "πŸ”¨ Building Docker image..." + docker-compose build + echo -e "${GREEN}βœ“ Build completed${NC}" + ;; + + start|up) + echo "πŸš€ Starting containers..." + docker-compose up -d + echo -e "${GREEN}βœ“ Containers started${NC}" + echo "" + echo "πŸ“ Application available at: http://localhost:3000" + ;; + + stop|down) + echo "⏹️ Stopping containers..." + docker-compose down + echo -e "${GREEN}βœ“ Containers stopped${NC}" + ;; + + restart) + echo "πŸ”„ Restarting containers..." + docker-compose restart + echo -e "${GREEN}βœ“ Containers restarted${NC}" + ;; + + logs) + echo "πŸ“‹ Showing logs (Ctrl+C to exit)..." + docker-compose logs -f keep-notes + ;; + + status) + echo "πŸ“Š Container status:" + docker-compose ps + ;; + + update) + echo "πŸ”„ Updating application..." + echo "Pulling latest changes..." + git pull + echo "Rebuilding..." + docker-compose build + echo "Restarting..." + docker-compose down + docker-compose up -d + echo -e "${GREEN}βœ“ Update completed${NC}" + ;; + + backup) + echo "πŸ’Ύ Creating database backup..." + BACKUP_DIR="./backups" + mkdir -p $BACKUP_DIR + DATE=$(date +%Y%m%d_%H%M%S) + + docker exec keep-notes \ + cp /app/prisma/dev.db /app/prisma/backup_$DATE.db 2>/dev/null || { + echo -e "${RED}❌ Container not running. Start it first with: $0 start${NC}" + exit 1 + } + + docker cp keep-notes:/app/prisma/backup_$DATE.db \ + $BACKUP_DIR/keep-notes_$DATE.db + + echo -e "${GREEN}βœ“ Backup created: $BACKUP_DIR/keep-notes_$DATE.db${NC}" + ;; + + clean) + echo "🧹 Cleaning up..." + echo "Stopping containers..." + docker-compose down + echo "Removing old images..." + docker image prune -a -f + echo "Removing unused volumes..." + docker volume prune -f + echo -e "${GREEN}βœ“ Cleanup completed${NC}" + ;; + + ollama-pull) + MODEL=${2:-"granite4"} + echo "πŸ€– Pulling Ollama model: $MODEL" + docker-compose exec -it ollama ollama pull $MODEL + echo -e "${GREEN}βœ“ Model pulled${NC}" + ;; + + shell) + echo "🐚 Opening shell in container..." + docker-compose exec keep-notes sh + ;; + + *) + echo "Usage: $0 {build|start|stop|restart|logs|status|update|backup|clean|ollama-pull|shell}" + echo "" + echo "Commands:" + echo " build - Build Docker image" + echo " start, up - Start containers" + echo " stop, down - Stop containers" + echo " restart - Restart containers" + echo " logs - Show container logs" + echo " status - Show container status" + echo " update - Pull latest, rebuild, and restart" + echo " backup - Backup database" + echo " clean - Remove containers, images, and volumes" + echo " ollama-pull - Pull Ollama model (optional: model name)" + echo " shell - Open shell in container" + echo "" + echo "Examples:" + echo " $0 build" + echo " $0 start" + echo " $0 logs" + echo " $0 update" + echo " $0 ollama-pull llama2" + ;; +esac diff --git a/keep-notes/docker-compose.yml b/keep-notes/docker-compose.yml index 800eec9..3f88423 100644 --- a/keep-notes/docker-compose.yml +++ b/keep-notes/docker-compose.yml @@ -5,19 +5,91 @@ services: build: context: . dockerfile: Dockerfile - image: memento-app - container_name: memento-app + image: keep-notes:latest + container_name: keep-notes restart: unless-stopped ports: - "3000:3000" environment: + # Database - DATABASE_URL=file:/app/prisma/dev.db - NODE_ENV=production + + # Application (Change these!) + - NEXTAUTH_URL=http://your-domain.com:3000 + - NEXTAUTH_SECRET=change-this-to-a-random-secret-string + + # AI Provider (Optional - for OpenAI) + # - OPENAI_API_KEY=your-openai-api-key-here + + # AI Provider (Optional - for Ollama) + # - OLLAMA_BASE_URL=http://ollama:11434 + # - OLLAMA_MODEL=granite4:latest volumes: - # Persist uploaded images - - ./public/uploads:/app/public/uploads # Persist SQLite database - - ./prisma/dev.db:/app/prisma/dev.db - # Ensure the user inside docker has permissions to write to volumes - # You might need to adjust user IDs depending on your host system - # user: "1001:1001" + - keep-db:/app/prisma + + # Persist uploaded images and files + - keep-uploads:/app/public/uploads + + # Optional: Mount custom SSL certificates + # - ./certs:/app/certs:ro + networks: + - keep-network + # Optional: Resource limits for Proxmox VM + deploy: + resources: + limits: + cpus: '2' + memory: 2G + reservations: + cpus: '0.5' + memory: 512M + # Optional: Health check + healthcheck: + test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Optional: Ollama for local AI models + # Uncomment this section if you want to use local AI models + # ollama: + # image: ollama/ollama:latest + # container_name: keep-ollama + # restart: unless-stopped + # ports: + # - "11434:11434" + # volumes: + # - ollama-data:/root/.ollama + # networks: + # - keep-network + # deploy: + # resources: + # limits: + # cpus: '4' + # memory: 8G + # reservations: + # cpus: '2' + # memory: 4G + # # GPU support for Proxmox with GPU passthrough + # # deploy: + # # resources: + # # reservations: + # # devices: + # # - driver: nvidia + # # count: 1 + # # capabilities: [gpu] + +networks: + keep-network: + driver: bridge + +volumes: + keep-db: + driver: local + keep-uploads: + driver: local + # ollama-data: + # driver: local