diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index b66c64d..58a4e16 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -17,8 +17,8 @@ env: IMAGE_NAME: ${{ github.repository }} jobs: - build-optimized: - name: Build Optimized Docker Image + build: + name: Build Docker Image runs-on: ubuntu-latest permissions: contents: read @@ -56,11 +56,10 @@ jobs: type=sha,prefix={{branch}}-,format=short type=raw,value=latest,enable={{is_default_branch}} - - name: Build and push optimized Docker image + - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . - file: ./Dockerfile.optimized platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} @@ -70,59 +69,6 @@ jobs: build-args: | BUILDKIT_INLINE_CACHE=1 provenance: false - - # Keep standard build as 'full' variant - build-full: - name: Build Full Docker Image (with n8n packages) - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for full variant - id: meta-full - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch,suffix=-full - type=ref,event=pr,suffix=-full - type=semver,pattern={{version}}-full - type=semver,pattern={{major}}.{{minor}}-full - type=raw,value=full,enable={{is_default_branch}} - - - name: Build and push full Docker image - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-full.outputs.tags }} - labels: ${{ steps.meta-full.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - build-args: | - BUILDKIT_INLINE_CACHE=1 - provenance: false # Nginx build commented out until Phase 2 # build-nginx: diff --git a/CLAUDE.md b/CLAUDE.md index 33f132b..ff540c7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -94,29 +94,11 @@ docker compose down # Stop containers docker compose down -v # Stop and remove volumes ./scripts/test-docker.sh # Test Docker deployment -# Optimized Docker Commands: -docker compose -f docker-compose.optimized.yml up -d # Start optimized version -docker build -f Dockerfile.optimized -t n8n-mcp:optimized . # Build optimized image -./scripts/test-optimized-docker.sh # Test optimized Docker build ``` ## Docker Deployment -The project includes comprehensive Docker support with two options: - -### Standard Docker Image (~2.6GB) -- Full n8n packages included -- Database built at runtime -- Supports dynamic node scanning -- Use for development or when you need runtime flexibility - -### Optimized Docker Image (~200MB) -- Pre-built database at build time -- Minimal runtime dependencies -- 90% smaller image size -- Use for production deployments - -The project includes comprehensive Docker support for easy deployment: +The project includes optimized Docker support for easy deployment: ### Quick Start with Docker ```bash @@ -131,18 +113,18 @@ curl http://localhost:3000/health ``` ### Docker Features -- **Multi-stage builds** for optimized image size (~150MB) +- **Optimized image size** (~283MB with pre-built database) +- **Multi-stage builds** for minimal runtime dependencies - **Dual mode support** (stdio and HTTP) in single image -- **Automatic database initialization** on first run +- **Pre-built database** with all 525+ nodes included - **Non-root user** execution for security - **Health checks** built into the image -- **Volume persistence** for SQLite database - **Resource limits** configured in compose file ### Docker Images -- `ghcr.io/czlonkowski/n8n-mcp:latest` - Simple production image -- `ghcr.io/czlonkowski/n8n-mcp:nginx` - Enhanced with nginx (Phase 2) +- `ghcr.io/czlonkowski/n8n-mcp:latest` - Optimized production image - Multi-architecture support (amd64, arm64) +- ~283MB compressed size ### Docker Development ```bash diff --git a/Dockerfile b/Dockerfile index 12a3ba8..8eebcdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,18 @@ -# Stage 1: Dependencies +# Optimized Dockerfile - builds database at build time, minimal runtime image + +# Stage 1: Dependencies (includes n8n for building) FROM node:20-alpine AS deps WORKDIR /app COPY package*.json ./ -# Configure npm for better reliability in CI +# Configure npm for reliability RUN npm config set fetch-retries 5 && \ npm config set fetch-retry-mintimeout 20000 && \ npm config set fetch-retry-maxtimeout 120000 && \ npm config set fetch-timeout 300000 -# Install all dependencies including dev for building +# Install all dependencies including n8n packages RUN npm ci -# Stage 2: Production Dependencies -FROM node:20-alpine AS prod-deps -WORKDIR /app -COPY package*.json ./ -# Copy all dependencies from deps stage -COPY --from=deps /app/node_modules ./node_modules -# Prune to production only (much faster than fresh install) -RUN npm prune --omit=dev - -# Stage 3: Builder +# Stage 2: Builder (compiles TypeScript) FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ @@ -28,43 +21,62 @@ COPY . . # Build TypeScript RUN npm run build -# Stage 4: Runtime +# Stage 3: Database Builder (extracts all node info and builds database) +FROM builder AS db-builder +WORKDIR /app +# Clone n8n-docs for documentation (if available) +RUN apk add --no-cache git && \ + git clone https://github.com/n8n-io/n8n-docs.git /tmp/n8n-docs || true +ENV N8N_DOCS_PATH=/tmp/n8n-docs +# Build the complete database with source code +RUN mkdir -p data && \ + node dist/scripts/rebuild-optimized.js + +# Stage 4: Minimal Runtime (no n8n packages) FROM node:20-alpine AS runtime WORKDIR /app -# Install only essential tools (flock is in util-linux) -RUN apk add --no-cache curl su-exec util-linux && \ +# Install only essential runtime tools +RUN apk add --no-cache curl && \ rm -rf /var/cache/apk/* -# Copy production dependencies from prod-deps stage -COPY --from=prod-deps /app/node_modules ./node_modules -COPY package*.json ./ +# Create package.json with only runtime dependencies +RUN echo '{ \ + "name": "n8n-mcp-runtime", \ + "version": "1.0.0", \ + "private": true, \ + "dependencies": { \ + "@modelcontextprotocol/sdk": "^1.12.1", \ + "better-sqlite3": "^11.10.0", \ + "sql.js": "^1.13.0", \ + "express": "^5.1.0", \ + "dotenv": "^16.5.0" \ + } \ +}' > package.json + +# Install only runtime dependencies +RUN npm config set fetch-retries 5 && \ + npm config set fetch-retry-mintimeout 20000 && \ + npm install --production --no-audit --no-fund # Copy built application COPY --from=builder /app/dist ./dist -# Create data directory -RUN mkdir -p /app/data +# Copy pre-built database with all source code +COPY --from=db-builder /app/data/nodes.db ./data/ -# Copy necessary source files for database initialization -COPY src/database/schema.sql ./src/database/ -COPY scripts ./scripts - -# Copy necessary files -COPY .env.example .env.example -COPY LICENSE LICENSE -COPY README.md README.md +# Copy minimal required files +COPY src/database/schema-optimized.sql ./src/database/ +COPY .env.example ./ # Add container labels LABEL org.opencontainers.image.source="https://github.com/czlonkowski/n8n-mcp" -LABEL org.opencontainers.image.description="n8n MCP Server - Simple Version" +LABEL org.opencontainers.image.description="n8n MCP Server - Optimized Version" LABEL org.opencontainers.image.licenses="Sustainable-Use-1.0" -LABEL org.opencontainers.image.vendor="n8n-mcp" -LABEL org.opencontainers.image.title="n8n-mcp" +LABEL org.opencontainers.image.title="n8n-mcp-optimized" -# Create data directory and fix permissions -RUN mkdir -p /app/data && \ - addgroup -g 1001 -S nodejs && \ +# Create non-root user +RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 && \ chown -R nodejs:nodejs /app @@ -79,9 +91,9 @@ USER nodejs EXPOSE 3000 # Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://127.0.0.1:3000/health || exit 1 -# Entrypoint +# Optimized entrypoint ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] CMD ["node", "dist/mcp/index.js"] \ No newline at end of file diff --git a/Dockerfile.old b/Dockerfile.old new file mode 100644 index 0000000..12a3ba8 --- /dev/null +++ b/Dockerfile.old @@ -0,0 +1,87 @@ +# Stage 1: Dependencies +FROM node:20-alpine AS deps +WORKDIR /app +COPY package*.json ./ +# Configure npm for better reliability in CI +RUN npm config set fetch-retries 5 && \ + npm config set fetch-retry-mintimeout 20000 && \ + npm config set fetch-retry-maxtimeout 120000 && \ + npm config set fetch-timeout 300000 +# Install all dependencies including dev for building +RUN npm ci + +# Stage 2: Production Dependencies +FROM node:20-alpine AS prod-deps +WORKDIR /app +COPY package*.json ./ +# Copy all dependencies from deps stage +COPY --from=deps /app/node_modules ./node_modules +# Prune to production only (much faster than fresh install) +RUN npm prune --omit=dev + +# Stage 3: Builder +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +COPY --from=deps /app/node_modules ./node_modules +COPY . . +# Build TypeScript +RUN npm run build + +# Stage 4: Runtime +FROM node:20-alpine AS runtime +WORKDIR /app + +# Install only essential tools (flock is in util-linux) +RUN apk add --no-cache curl su-exec util-linux && \ + rm -rf /var/cache/apk/* + +# Copy production dependencies from prod-deps stage +COPY --from=prod-deps /app/node_modules ./node_modules +COPY package*.json ./ + +# Copy built application +COPY --from=builder /app/dist ./dist + +# Create data directory +RUN mkdir -p /app/data + +# Copy necessary source files for database initialization +COPY src/database/schema.sql ./src/database/ +COPY scripts ./scripts + +# Copy necessary files +COPY .env.example .env.example +COPY LICENSE LICENSE +COPY README.md README.md + +# Add container labels +LABEL org.opencontainers.image.source="https://github.com/czlonkowski/n8n-mcp" +LABEL org.opencontainers.image.description="n8n MCP Server - Simple Version" +LABEL org.opencontainers.image.licenses="Sustainable-Use-1.0" +LABEL org.opencontainers.image.vendor="n8n-mcp" +LABEL org.opencontainers.image.title="n8n-mcp" + +# Create data directory and fix permissions +RUN mkdir -p /app/data && \ + addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 && \ + chown -R nodejs:nodejs /app + +# Copy entrypoint script +COPY docker/docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +# Switch to non-root user +USER nodejs + +# Expose HTTP port +EXPOSE 3000 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ + CMD curl -f http://127.0.0.1:3000/health || exit 1 + +# Entrypoint +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["node", "dist/mcp/index.js"] \ No newline at end of file diff --git a/Dockerfile.optimized b/Dockerfile.optimized deleted file mode 100644 index 55d0982..0000000 --- a/Dockerfile.optimized +++ /dev/null @@ -1,131 +0,0 @@ -# Optimized Dockerfile - builds database at build time, minimal runtime image - -# Stage 1: Dependencies (includes n8n for building) -FROM node:20-alpine AS deps -WORKDIR /app -COPY package*.json ./ -# Configure npm for reliability -RUN npm config set fetch-retries 5 && \ - npm config set fetch-retry-mintimeout 20000 && \ - npm config set fetch-retry-maxtimeout 120000 && \ - npm config set fetch-timeout 300000 -# Install all dependencies including n8n packages -RUN npm ci - -# Stage 2: Builder (compiles TypeScript) -FROM node:20-alpine AS builder -WORKDIR /app -COPY package*.json ./ -COPY --from=deps /app/node_modules ./node_modules -COPY . . -# Build TypeScript -RUN npm run build - -# Stage 3: Database Builder (extracts all node info and builds database) -FROM builder AS db-builder -WORKDIR /app -# Clone n8n-docs for documentation (if available) -RUN apk add --no-cache git && \ - git clone https://github.com/n8n-io/n8n-docs.git /tmp/n8n-docs || true -ENV N8N_DOCS_PATH=/tmp/n8n-docs -# Build the complete database with source code -RUN mkdir -p data && \ - node dist/scripts/rebuild-optimized.js - -# Stage 4: Minimal Runtime (no n8n packages) -FROM node:20-alpine AS runtime -WORKDIR /app - -# Install only essential runtime tools -RUN apk add --no-cache curl && \ - rm -rf /var/cache/apk/* - -# Create package.json with only runtime dependencies -RUN echo '{ \ - "name": "n8n-mcp-runtime", \ - "version": "1.0.0", \ - "private": true, \ - "dependencies": { \ - "@modelcontextprotocol/sdk": "^1.12.1", \ - "better-sqlite3": "^11.10.0", \ - "sql.js": "^1.13.0", \ - "express": "^5.1.0", \ - "dotenv": "^16.5.0" \ - } \ -}' > package.json - -# Install only runtime dependencies -RUN npm config set fetch-retries 5 && \ - npm config set fetch-retry-mintimeout 20000 && \ - npm install --production --no-audit --no-fund - -# Copy built application -COPY --from=builder /app/dist ./dist - -# Copy pre-built database with all source code -COPY --from=db-builder /app/data/nodes.db ./data/ - -# Copy minimal required files -COPY src/database/schema-optimized.sql ./src/database/ -COPY .env.example ./ - -# Add container labels -LABEL org.opencontainers.image.source="https://github.com/czlonkowski/n8n-mcp" -LABEL org.opencontainers.image.description="n8n MCP Server - Optimized Version" -LABEL org.opencontainers.image.licenses="Sustainable-Use-1.0" -LABEL org.opencontainers.image.title="n8n-mcp-optimized" - -# Create non-root user -RUN addgroup -g 1001 -S nodejs && \ - adduser -S nodejs -u 1001 && \ - chown -R nodejs:nodejs /app - -# Create optimized entrypoint -RUN echo '#!/bin/sh\n\ -set -e\n\ -\n\ -# Validate AUTH_TOKEN in HTTP mode\n\ -if [ "$MCP_MODE" = "http" ] && [ -z "$AUTH_TOKEN" ]; then\n\ - echo "ERROR: AUTH_TOKEN is required when running in HTTP mode"\n\ - exit 1\n\ -fi\n\ -\n\ -# Check if database exists\n\ -if [ ! -f "/app/data/nodes.db" ]; then\n\ - echo "ERROR: Pre-built database not found at /app/data/nodes.db"\n\ - echo "This optimized image requires the database to be built at Docker build time"\n\ - exit 1\n\ -fi\n\ -\n\ -# Validate database\n\ -node -e "\n\ -const Database = require(\"better-sqlite3\");\n\ -try {\n\ - const db = new Database(\"/app/data/nodes.db\", { readonly: true });\n\ - const count = db.prepare(\"SELECT COUNT(*) as count FROM nodes\").get();\n\ - console.log(\"Database validated: \" + count.count + \" nodes found\");\n\ - db.close();\n\ -} catch (error) {\n\ - console.error(\"Database validation failed:\", error);\n\ - process.exit(1);\n\ -}\n\ -"\n\ -\n\ -# Start the application\n\ -exec "$@"\n\ -' > /usr/local/bin/docker-entrypoint.sh && \ - chmod +x /usr/local/bin/docker-entrypoint.sh - -# Switch to non-root user -USER nodejs - -# Expose HTTP port -EXPOSE 3000 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD curl -f http://127.0.0.1:3000/health || exit 1 - -# Optimized entrypoint -ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] -CMD ["node", "dist/mcp/index.js"] \ No newline at end of file diff --git a/Dockerfile.optimized-simple b/Dockerfile.optimized-simple deleted file mode 100644 index bc97df9..0000000 --- a/Dockerfile.optimized-simple +++ /dev/null @@ -1,49 +0,0 @@ -# Simplified optimized Dockerfile for testing - -# Stage 1: Build and create database -FROM node:20-alpine AS builder -WORKDIR /app - -# Copy everything -COPY . . - -# Install dependencies and build -RUN npm ci && npm run build - -# Build optimized database (this embeds source code) -RUN mkdir -p data && npm run rebuild:optimized || npm run rebuild - -# Stage 2: Minimal runtime -FROM node:20-alpine AS runtime -WORKDIR /app - -# Install only runtime dependencies -RUN apk add --no-cache curl - -# Create minimal package.json -COPY package*.json ./ -RUN npm ci --omit=dev && \ - # Remove n8n packages after install - npm uninstall n8n n8n-core n8n-workflow @n8n/n8n-nodes-langchain || true && \ - # Clean up - npm cache clean --force - -# Copy built app and database -COPY --from=builder /app/dist ./dist -COPY --from=builder /app/data ./data -COPY src/database/schema*.sql ./src/database/ - -# Simple entrypoint -RUN echo '#!/bin/sh\n\ -if [ "$MCP_MODE" = "http" ] && [ -z "$AUTH_TOKEN" ]; then\n\ - echo "ERROR: AUTH_TOKEN required for HTTP mode"\n\ - exit 1\n\ -fi\n\ -exec "$@"' > /entrypoint.sh && chmod +x /entrypoint.sh - -USER node -EXPOSE 3000 -HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1 - -ENTRYPOINT ["/entrypoint.sh"] -CMD ["node", "dist/mcp/index.js"] \ No newline at end of file diff --git a/README.md b/README.md index 588a43a..b0e05a8 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,7 @@ npm run test-nodes ## Docker Quick Start 🐳 -The easiest way to get started is using Docker. We provide two image variants: -- **Optimized** (`latest`): ~200MB, pre-built database, recommended for production -- **Full** (`full`): 2.6GB, includes n8n packages, for development/dynamic scanning +The easiest way to get started is using Docker: ### Option 1: Simple HTTP Server (Recommended) diff --git a/docker-compose.optimized.yml b/docker-compose.optimized.yml deleted file mode 100644 index abce07c..0000000 --- a/docker-compose.optimized.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Docker Compose for optimized n8n-MCP image -# This version has pre-built database and minimal runtime dependencies - -services: - n8n-mcp-optimized: - build: - context: . - dockerfile: Dockerfile.optimized - image: n8n-mcp:optimized - container_name: n8n-mcp-optimized - restart: unless-stopped - environment: - MCP_MODE: ${MCP_MODE:-http} - AUTH_TOKEN: ${AUTH_TOKEN:?AUTH_TOKEN is required for HTTP mode} - NODE_ENV: production - LOG_LEVEL: ${LOG_LEVEL:-info} - ports: - - "${PORT:-3000}:3000" - volumes: - # Note: Database is pre-built in the image, no volume needed - # Only mount if you need to preserve logs or other runtime data - - n8n-mcp-logs:/app/logs - deploy: - resources: - limits: - memory: 256M # Much lower than original! - reservations: - memory: 128M - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 5s - labels: - com.n8n-mcp.version: "optimized" - com.n8n-mcp.description: "Optimized build with pre-built database" - -volumes: - n8n-mcp-logs: - name: n8n-mcp-logs \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 31216ef..3bb957a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,6 @@ version: '3.8' services: n8n-mcp: - # Use 'latest' for optimized image (~200MB) or 'full' for development (2.6GB) image: ghcr.io/czlonkowski/n8n-mcp:latest container_name: n8n-mcp restart: unless-stopped diff --git a/docs/DOCKER_OPTIMIZATION_GUIDE.md b/docs/DOCKER_OPTIMIZATION_GUIDE.md index a49fa8d..c72f620 100644 --- a/docs/DOCKER_OPTIMIZATION_GUIDE.md +++ b/docs/DOCKER_OPTIMIZATION_GUIDE.md @@ -80,19 +80,13 @@ The optimized build cannot: - To update nodes, rebuild the Docker image - Custom nodes must be present during build -## When to Use Each Version +## Benefits of Optimization -### Use Original When: -- You need to dynamically scan for nodes -- You're developing custom nodes -- You need to rebuild database at runtime -- Image size is not a concern - -### Use Optimized When: -- Production deployments -- Resource-constrained environments -- Fast startup is important -- You want minimal attack surface +The optimized Docker image is now the default and only version, providing: +- **Production-ready**: Pre-built database with all nodes +- **Resource-efficient**: Only ~283MB vs 2.6GB +- **Fast startup**: No database building required +- **Minimal attack surface**: No unnecessary dependencies ## Testing the Optimized Build @@ -185,10 +179,10 @@ Some tools are disabled in optimized build: ## Summary -The optimized Docker build is ideal for production deployments where: -- Image size matters -- Fast startup is required -- Resource usage should be minimal -- Node set is stable +The optimized Docker build is now the standard n8n-MCP Docker image, providing: +- Dramatically reduced image size (283MB vs 2.6GB) +- Fast startup with pre-built database +- Minimal resource usage +- All 525+ nodes included and ready to use -For development or dynamic environments, continue using the original build. \ No newline at end of file +This optimization makes n8n-MCP suitable for any deployment scenario while maintaining full functionality. \ No newline at end of file diff --git a/docs/DOCKER_README.md b/docs/DOCKER_README.md index 81fc508..f239497 100644 --- a/docs/DOCKER_README.md +++ b/docs/DOCKER_README.md @@ -33,11 +33,10 @@ curl http://localhost:3000/health ### 2. Using Pre-built Images -Pre-built images are available on GitHub Container Registry in two variants: +Pre-built images are available on GitHub Container Registry: -#### Optimized Image (Recommended) ```bash -# Pull the optimized image (~200MB) +# Pull the latest image (~283MB) docker pull ghcr.io/czlonkowski/n8n-mcp:latest # Run with HTTP mode @@ -49,21 +48,6 @@ docker run -d \ ghcr.io/czlonkowski/n8n-mcp:latest ``` -#### Full Image (Development) -```bash -# Pull the full image with n8n packages (2.6GB) -docker pull ghcr.io/czlonkowski/n8n-mcp:full - -# Run with dynamic node scanning capability -docker run -d \ - --name n8n-mcp-full \ - -e MCP_MODE=http \ - -e AUTH_TOKEN=your-secure-token \ - -p 3000:3000 \ - -v n8n-mcp-data:/app/data \ - ghcr.io/czlonkowski/n8n-mcp:full -``` - ## 📋 Configuration Options ### Environment Variables @@ -439,31 +423,16 @@ secrets: ## 📦 Available Images -### Optimized Images (~200MB) -- `ghcr.io/czlonkowski/n8n-mcp:latest` - Latest optimized release -- `ghcr.io/czlonkowski/n8n-mcp:2.3.0` - Specific version (optimized) -- `ghcr.io/czlonkowski/n8n-mcp:main-abc123` - Development builds (optimized) - -### Full Images (2.6GB) -- `ghcr.io/czlonkowski/n8n-mcp:full` - Latest full release -- `ghcr.io/czlonkowski/n8n-mcp:2.3.0-full` - Specific version (full) -- `ghcr.io/czlonkowski/n8n-mcp:main-full` - Development builds (full) +- `ghcr.io/czlonkowski/n8n-mcp:latest` - Latest stable release +- `ghcr.io/czlonkowski/n8n-mcp:2.3.0` - Specific version +- `ghcr.io/czlonkowski/n8n-mcp:main-abc123` - Development builds ### Image Details -#### Optimized Variant - Base: `node:20-alpine` -- Size: ~200MB compressed -- Features: Pre-built database, minimal runtime -- Use case: Production deployments - -#### Full Variant -- Base: `node:20-alpine` -- Size: ~2.6GB compressed -- Features: Full n8n packages, dynamic scanning -- Use case: Development, custom nodes - -Both variants: +- Size: ~283MB compressed +- Features: Pre-built database with all node information +- Database: Complete SQLite with 525+ nodes - Architectures: `linux/amd64`, `linux/arm64` - Updated: Automatically via GitHub Actions diff --git a/docs/RELEASE_GUIDE.md b/docs/RELEASE_GUIDE.md index 06ff888..84333d2 100644 --- a/docs/RELEASE_GUIDE.md +++ b/docs/RELEASE_GUIDE.md @@ -15,18 +15,11 @@ git push origin v1.2.3 ``` This will automatically create the following Docker tags: - -**Optimized Images:** - `ghcr.io/czlonkowski/n8n-mcp:1.2.3` (exact version) - `ghcr.io/czlonkowski/n8n-mcp:1.2` (minor version) - `ghcr.io/czlonkowski/n8n-mcp:1` (major version) - `ghcr.io/czlonkowski/n8n-mcp:latest` (if from main branch) -**Full Images:** -- `ghcr.io/czlonkowski/n8n-mcp:1.2.3-full` (exact version) -- `ghcr.io/czlonkowski/n8n-mcp:1.2-full` (minor version) -- `ghcr.io/czlonkowski/n8n-mcp:full` (if from main branch) - ## Tag Types Explained ### Latest Tag @@ -133,7 +126,7 @@ services: n8n-mcp: image: ghcr.io/czlonkowski/n8n-mcp:1.2 -# Latest version (for development/testing) +# Latest version (for testing) services: n8n-mcp: image: ghcr.io/czlonkowski/n8n-mcp:latest