739 lines
16 KiB
Markdown
739 lines
16 KiB
Markdown
# Docker Deployment Guide for InfluxDB MCP Server
|
|
|
|
This guide explains how to run the InfluxDB MCP Server in Docker, similar to the MCP Toolkit in Docker Desktop.
|
|
|
|
## Table of Contents
|
|
|
|
- [Quick Start](#quick-start)
|
|
- [Docker Compose Setup](#docker-compose-setup)
|
|
- [Configuration](#configuration)
|
|
- [Using with Docker Desktop MCP Support](#using-with-docker-desktop-mcp-support)
|
|
- [Using with Claude Desktop](#using-with-claude-desktop)
|
|
- [Networking Considerations](#networking-considerations)
|
|
- [Building the Image](#building-the-image)
|
|
- [Troubleshooting](#troubleshooting)
|
|
- [Advanced Configuration](#advanced-configuration)
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Docker installed (Docker Desktop 4.34+ for MCP support)
|
|
- InfluxDB v2 instance running
|
|
- InfluxDB authentication token
|
|
|
|
### 1. Create Environment File
|
|
|
|
Create a `.env` file in the project root:
|
|
|
|
```bash
|
|
# Copy the example
|
|
cp .env.example .env
|
|
|
|
# Edit with your details
|
|
nano .env
|
|
```
|
|
|
|
Add your InfluxDB details:
|
|
|
|
```env
|
|
INFLUX_URL=http://localhost:8086
|
|
INFLUX_TOKEN=your_influxdb_token_here
|
|
INFLUX_ORG=your_organization_name
|
|
```
|
|
|
|
### 2. Build and Run
|
|
|
|
```bash
|
|
# Build and start the container
|
|
docker-compose up -d
|
|
|
|
# Check logs
|
|
docker-compose logs -f
|
|
|
|
# Stop the container
|
|
docker-compose down
|
|
```
|
|
|
|
---
|
|
|
|
## Docker Compose Setup
|
|
|
|
The provided `docker-compose.yml` includes:
|
|
|
|
- **Multi-stage build** for optimized image size
|
|
- **Host networking** for easy InfluxDB access
|
|
- **Security hardening** (read-only filesystem, non-root user)
|
|
- **Resource limits** (256MB RAM, 0.5 CPU)
|
|
- **Health checks** for container monitoring
|
|
- **Automatic restarts** unless manually stopped
|
|
|
|
### Basic Usage
|
|
|
|
```bash
|
|
# Start in background
|
|
docker-compose up -d
|
|
|
|
# View logs
|
|
docker-compose logs -f influxdb-mcp-server
|
|
|
|
# Restart
|
|
docker-compose restart
|
|
|
|
# Stop
|
|
docker-compose down
|
|
|
|
# Rebuild after code changes
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
Configure via `.env` file or docker-compose environment section:
|
|
|
|
| Variable | Required | Default | Description |
|
|
|----------|----------|---------|-------------|
|
|
| `INFLUX_URL` | Yes | `http://localhost:8086` | InfluxDB server URL |
|
|
| `INFLUX_TOKEN` | Yes | - | Authentication token |
|
|
| `INFLUX_ORG` | Yes | - | Organization name |
|
|
| `NODE_ENV` | No | `production` | Node environment |
|
|
|
|
### Getting an InfluxDB Token
|
|
|
|
1. Log into InfluxDB UI (usually at http://localhost:8086)
|
|
2. Navigate to **Data** → **Tokens** or **Load Data** → **API Tokens**
|
|
3. Click **Generate API Token**
|
|
4. Choose **All Access Token** or create custom permissions:
|
|
- Read/Write access to buckets you need
|
|
- Read access to organizations
|
|
5. Copy the token immediately (shown only once)
|
|
|
|
### Token Permissions
|
|
|
|
For full functionality, the token should have:
|
|
- **Read**: buckets, orgs, tasks, dashboards
|
|
- **Write**: buckets (if you plan to write data)
|
|
- **Delete**: buckets (if you plan to delete buckets)
|
|
|
|
---
|
|
|
|
## Using with Docker Desktop MCP Support
|
|
|
|
Docker Desktop 4.34+ includes native MCP support in the AI tools section.
|
|
|
|
### Setup
|
|
|
|
1. **Build the image:**
|
|
```bash
|
|
docker-compose build
|
|
```
|
|
|
|
2. **Tag for Docker Desktop:**
|
|
```bash
|
|
docker tag influxdb-mcp-server:latest influxdb-mcp-server:latest
|
|
```
|
|
|
|
3. **Configure in Docker Desktop:**
|
|
|
|
Open Docker Desktop settings and add to MCP servers:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"influxdb": {
|
|
"command": "docker",
|
|
"args": [
|
|
"run",
|
|
"--rm",
|
|
"-i",
|
|
"--network=host",
|
|
"-e", "INFLUX_URL=http://localhost:8086",
|
|
"-e", "INFLUX_TOKEN=your_token_here",
|
|
"-e", "INFLUX_ORG=your_org",
|
|
"influxdb-mcp-server:latest"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
4. **Restart Docker Desktop** to load the MCP server
|
|
|
|
### Verification
|
|
|
|
The MCP server should appear in Docker Desktop's AI tools section. You can then use it with any integrated AI assistant.
|
|
|
|
---
|
|
|
|
## Using with Claude Desktop
|
|
|
|
### Method 1: Using Docker Directly
|
|
|
|
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"influxdb": {
|
|
"command": "docker",
|
|
"args": [
|
|
"run",
|
|
"--rm",
|
|
"-i",
|
|
"--network=host",
|
|
"-e", "INFLUX_URL=http://localhost:8086",
|
|
"-e", "INFLUX_TOKEN=your_influxdb_token",
|
|
"-e", "INFLUX_ORG=your_organization",
|
|
"influxdb-mcp-server:latest"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Method 2: Using Docker Compose
|
|
|
|
Create a wrapper script `run-mcp.sh`:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
docker-compose run --rm influxdb-mcp-server
|
|
```
|
|
|
|
Make it executable:
|
|
```bash
|
|
chmod +x run-mcp.sh
|
|
```
|
|
|
|
Configure Claude Desktop:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"influxdb": {
|
|
"command": "/Users/felix/Nextcloud/AI/projects/influxdb-mcp-server/run-mcp.sh"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Restart Claude Desktop
|
|
|
|
After configuration changes, fully quit and restart Claude Desktop.
|
|
|
|
---
|
|
|
|
## Networking Considerations
|
|
|
|
### Host Network Mode (Default)
|
|
|
|
The default configuration uses `network_mode: host`, which:
|
|
|
|
- ✅ Simplest setup
|
|
- ✅ Direct access to InfluxDB on local network
|
|
- ✅ No port mapping needed
|
|
- ⚠️ Linux-only feature (works differently on macOS/Windows)
|
|
|
|
### Bridge Network Mode
|
|
|
|
If your InfluxDB is also in Docker, use bridge networking:
|
|
|
|
1. **Update docker-compose.yml:**
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
influxdb-mcp-server:
|
|
build: .
|
|
environment:
|
|
- INFLUX_URL=http://influxdb:8086
|
|
- INFLUX_TOKEN=${INFLUX_TOKEN}
|
|
- INFLUX_ORG=${INFLUX_ORG}
|
|
networks:
|
|
- influx-network
|
|
# Remove network_mode: host
|
|
|
|
networks:
|
|
influx-network:
|
|
external: true # If InfluxDB network exists
|
|
# Or create new network:
|
|
# driver: bridge
|
|
```
|
|
|
|
2. **Connect to InfluxDB network:**
|
|
|
|
```bash
|
|
# Find InfluxDB network
|
|
docker network ls
|
|
|
|
# Update docker-compose.yml with correct network name
|
|
# Then start
|
|
docker-compose up -d
|
|
```
|
|
|
|
### macOS/Windows Considerations
|
|
|
|
On macOS and Windows, Docker runs in a VM:
|
|
|
|
- `host` networking works differently
|
|
- Use explicit URLs like `http://host.docker.internal:8086`
|
|
- Or use bridge networking with proper network setup
|
|
|
|
### Running with InfluxDB in Docker
|
|
|
|
If you're running InfluxDB itself in Docker, here's a complete setup:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
influxdb:
|
|
image: influxdb:2.7-alpine
|
|
container_name: influxdb
|
|
ports:
|
|
- "8086:8086"
|
|
volumes:
|
|
- influxdb-data:/var/lib/influxdb2
|
|
- influxdb-config:/etc/influxdb2
|
|
environment:
|
|
- DOCKER_INFLUXDB_INIT_MODE=setup
|
|
- DOCKER_INFLUXDB_INIT_USERNAME=admin
|
|
- DOCKER_INFLUXDB_INIT_PASSWORD=adminpassword
|
|
- DOCKER_INFLUXDB_INIT_ORG=myorg
|
|
- DOCKER_INFLUXDB_INIT_BUCKET=mybucket
|
|
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytoken
|
|
networks:
|
|
- influx-network
|
|
|
|
influxdb-mcp-server:
|
|
build: .
|
|
container_name: influxdb-mcp-server
|
|
environment:
|
|
- INFLUX_URL=http://influxdb:8086
|
|
- INFLUX_TOKEN=mytoken
|
|
- INFLUX_ORG=myorg
|
|
depends_on:
|
|
- influxdb
|
|
networks:
|
|
- influx-network
|
|
|
|
networks:
|
|
influx-network:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
influxdb-data:
|
|
influxdb-config:
|
|
```
|
|
|
|
---
|
|
|
|
## Building the Image
|
|
|
|
### Build Locally
|
|
|
|
```bash
|
|
# Using docker-compose
|
|
docker-compose build
|
|
|
|
# Using docker directly
|
|
docker build -t influxdb-mcp-server:latest .
|
|
|
|
# Build with no cache
|
|
docker-compose build --no-cache
|
|
```
|
|
|
|
### Build Arguments
|
|
|
|
The Dockerfile supports Node.js version customization:
|
|
|
|
```bash
|
|
docker build \
|
|
--build-arg NODE_VERSION=20 \
|
|
-t influxdb-mcp-server:latest \
|
|
.
|
|
```
|
|
|
|
### Multi-Architecture Builds
|
|
|
|
For running on different platforms (e.g., Raspberry Pi):
|
|
|
|
```bash
|
|
# Enable buildx
|
|
docker buildx create --use
|
|
|
|
# Build for multiple architectures
|
|
docker buildx build \
|
|
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
|
-t influxdb-mcp-server:latest \
|
|
--push \
|
|
.
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Container Won't Start
|
|
|
|
**Check logs:**
|
|
```bash
|
|
docker-compose logs influxdb-mcp-server
|
|
```
|
|
|
|
**Common issues:**
|
|
|
|
1. **Missing environment variables**
|
|
- Ensure `.env` file exists
|
|
- Check variable names match exactly (`INFLUX_URL`, `INFLUX_TOKEN`, `INFLUX_ORG`)
|
|
|
|
2. **Cannot reach InfluxDB**
|
|
- Verify `INFLUX_URL` is correct
|
|
- Check network connectivity: `docker exec influxdb-mcp-server ping influxdb`
|
|
- Try IP address instead of hostname
|
|
- Check InfluxDB is running: `curl http://localhost:8086/health`
|
|
|
|
3. **Permission denied**
|
|
- Container runs as non-root user
|
|
- Check file permissions if mounting volumes
|
|
|
|
### Container Restarting Every 30 Seconds
|
|
|
|
**Symptom:** You see repeated connection messages in the logs:
|
|
```
|
|
InfluxDB MCP Server running on stdio
|
|
Successfully connected to InfluxDB
|
|
Server: influxdb (v2.7.10)
|
|
Status: pass
|
|
InfluxDB MCP Server running on stdio
|
|
Successfully connected to InfluxDB
|
|
...
|
|
```
|
|
|
|
**Cause:** MCP servers communicate via stdio (stdin/stdout). Docker healthchecks interfere with stdio, causing the healthcheck to fail and Docker to restart the container.
|
|
|
|
**Solution:** The healthcheck is now disabled by default in docker-compose.yml:
|
|
|
|
```yaml
|
|
# In docker-compose.yml
|
|
healthcheck:
|
|
disable: true
|
|
|
|
# And restart policy is set to "no" since MCP servers run on-demand
|
|
restart: "no"
|
|
```
|
|
|
|
If you have an older version, update your docker-compose.yml with these settings and rebuild:
|
|
|
|
```bash
|
|
docker-compose down
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
### Connection Errors
|
|
|
|
**Test InfluxDB connection:**
|
|
|
|
```bash
|
|
# Enter container
|
|
docker exec -it influxdb-mcp-server sh
|
|
|
|
# Test connection using wget (Alpine doesn't have curl by default)
|
|
wget -O- http://localhost:8086/health
|
|
```
|
|
|
|
**Check environment variables:**
|
|
|
|
```bash
|
|
docker exec influxdb-mcp-server env | grep INFLUX_
|
|
```
|
|
|
|
**Test token authentication:**
|
|
|
|
```bash
|
|
docker exec influxdb-mcp-server sh -c '
|
|
wget --header="Authorization: Token $INFLUX_TOKEN" \
|
|
-O- "$INFLUX_URL/api/v2/buckets?org=$INFLUX_ORG"
|
|
'
|
|
```
|
|
|
|
### MCP Communication Issues
|
|
|
|
**Verify stdio communication:**
|
|
|
|
The MCP server communicates via stdio (stdin/stdout), not network ports.
|
|
|
|
```bash
|
|
# Test directly
|
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{},"id":1}' | \
|
|
docker run -i --rm \
|
|
-e INFLUX_URL=http://localhost:8086 \
|
|
-e INFLUX_TOKEN=your_token \
|
|
-e INFLUX_ORG=your_org \
|
|
influxdb-mcp-server:latest
|
|
```
|
|
|
|
### Performance Issues
|
|
|
|
**Check resource usage:**
|
|
|
|
```bash
|
|
docker stats influxdb-mcp-server
|
|
```
|
|
|
|
**Adjust resource limits** in docker-compose.yml:
|
|
|
|
```yaml
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1.0' # Increase CPU limit
|
|
memory: 512M # Increase memory limit
|
|
```
|
|
|
|
### InfluxDB Connection Timeout
|
|
|
|
If queries are slow or timing out:
|
|
|
|
1. **Increase query timeout** in the client code
|
|
2. **Optimize Flux queries** - use filters and limits
|
|
3. **Check InfluxDB performance** - ensure it's not overloaded
|
|
4. **Increase container memory** if processing large results
|
|
|
|
---
|
|
|
|
## Advanced Configuration
|
|
|
|
### Running Multiple Instances
|
|
|
|
Run multiple MCP servers for different InfluxDB instances:
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
version: '3.8'
|
|
|
|
services:
|
|
influxdb-mcp-prod:
|
|
build: .
|
|
container_name: influxdb-mcp-prod
|
|
environment:
|
|
- INFLUX_URL=http://influxdb-prod:8086
|
|
- INFLUX_TOKEN=${INFLUX_TOKEN_PROD}
|
|
- INFLUX_ORG=production
|
|
network_mode: host
|
|
|
|
influxdb-mcp-dev:
|
|
build: .
|
|
container_name: influxdb-mcp-dev
|
|
environment:
|
|
- INFLUX_URL=http://influxdb-dev:8086
|
|
- INFLUX_TOKEN=${INFLUX_TOKEN_DEV}
|
|
- INFLUX_ORG=development
|
|
network_mode: host
|
|
```
|
|
|
|
### Custom Logging
|
|
|
|
**Change log format:**
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
logging:
|
|
driver: "json-file"
|
|
options:
|
|
max-size: "50m"
|
|
max-file: "5"
|
|
labels: "influxdb-mcp-server"
|
|
```
|
|
|
|
**Use external logging:**
|
|
|
|
```yaml
|
|
logging:
|
|
driver: "syslog"
|
|
options:
|
|
syslog-address: "tcp://192.168.1.100:514"
|
|
```
|
|
|
|
### Monitoring with Prometheus
|
|
|
|
Add labels for monitoring:
|
|
|
|
```yaml
|
|
labels:
|
|
- "prometheus.scrape=true"
|
|
- "prometheus.port=9090"
|
|
```
|
|
|
|
### Read-Only Filesystem
|
|
|
|
The container uses a read-only root filesystem for security:
|
|
|
|
```yaml
|
|
read_only: true
|
|
tmpfs:
|
|
- /tmp # Allows temp file writes
|
|
```
|
|
|
|
To allow writes to specific locations:
|
|
|
|
```yaml
|
|
volumes:
|
|
- ./data:/app/data:rw
|
|
read_only: true
|
|
```
|
|
|
|
### Custom Node.js Options
|
|
|
|
Pass Node.js flags:
|
|
|
|
```yaml
|
|
command: ["node", "--max-old-space-size=128", "dist/index.js"]
|
|
```
|
|
|
|
### Query Result Size Limits
|
|
|
|
For large query results, adjust Node.js memory:
|
|
|
|
```yaml
|
|
environment:
|
|
- NODE_OPTIONS=--max-old-space-size=512
|
|
```
|
|
|
|
---
|
|
|
|
## Docker Image Details
|
|
|
|
### Image Layers
|
|
|
|
1. **Base:** `node:20-alpine` (~40MB)
|
|
2. **Dependencies:** Production npm packages (~30MB)
|
|
3. **Application:** Compiled TypeScript code (~1MB)
|
|
4. **Total:** ~70-100MB
|
|
|
|
### Security Features
|
|
|
|
- ✅ Non-root user (nodejs:nodejs)
|
|
- ✅ Read-only root filesystem
|
|
- ✅ No new privileges
|
|
- ✅ Minimal base image (Alpine)
|
|
- ✅ Multi-stage build (no dev dependencies)
|
|
- ✅ No shell access required
|
|
|
|
### Optimization
|
|
|
|
- Multi-stage build reduces image size
|
|
- Alpine Linux base for minimal footprint
|
|
- Production dependencies only in final image
|
|
- No development tools included
|
|
|
|
---
|
|
|
|
## Integration Examples
|
|
|
|
### Docker Desktop AI Assistant
|
|
|
|
Once configured in Docker Desktop, use natural language:
|
|
|
|
```
|
|
You: "List all my InfluxDB buckets"
|
|
AI: Uses influxdb MCP resource to get buckets
|
|
→ Returns list of buckets
|
|
|
|
You: "Query CPU usage for the last hour"
|
|
AI: Uses influxdb query_flux tool
|
|
→ Returns CPU metrics
|
|
|
|
You: "Write temperature sensor data"
|
|
AI: Uses influxdb write_data tool
|
|
→ Data written successfully
|
|
```
|
|
|
|
### CI/CD Pipeline
|
|
|
|
```yaml
|
|
# .github/workflows/docker.yml
|
|
name: Build and Push
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Build Docker image
|
|
run: docker build -t influxdb-mcp-server:latest .
|
|
|
|
- name: Test
|
|
run: |
|
|
docker run --rm \
|
|
-e INFLUX_URL=http://test:8086 \
|
|
-e INFLUX_TOKEN=test \
|
|
-e INFLUX_ORG=test \
|
|
influxdb-mcp-server:latest \
|
|
node -e "console.log('OK')"
|
|
```
|
|
|
|
---
|
|
|
|
## Comparison with Direct Installation
|
|
|
|
| Feature | Docker | Direct |
|
|
|---------|--------|--------|
|
|
| Setup Complexity | Medium | Easy |
|
|
| Isolation | ✅ Excellent | ⚠️ None |
|
|
| Resource Usage | ~100MB | ~80MB |
|
|
| Updates | Rebuild image | `npm update` |
|
|
| Portability | ✅ Excellent | ⚠️ Platform dependent |
|
|
| Debugging | Harder | Easier |
|
|
| Security | ✅ Sandboxed | ⚠️ Full system access |
|
|
| MCP Desktop Integration | ✅ Native | ✅ Native |
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. ✅ **Built and configured** the Docker container
|
|
2. ✅ **Set up environment** variables
|
|
3. ✅ **Started the service** with docker-compose
|
|
4. → **Configure Claude Desktop** or Docker Desktop to use it
|
|
5. → **Test with commands** like "list all buckets"
|
|
6. → **Monitor logs** for issues
|
|
|
|
---
|
|
|
|
## Resources
|
|
|
|
- **Docker Documentation:** https://docs.docker.com/
|
|
- **Docker Compose Reference:** https://docs.docker.com/compose/
|
|
- **MCP Specification:** https://modelcontextprotocol.io/
|
|
- **InfluxDB v2 API:** https://docs.influxdata.com/influxdb/v2/api/
|
|
- **Docker Desktop MCP:** https://docs.docker.com/desktop/mcp/
|
|
- **InfluxDB Docker Image:** https://hub.docker.com/_/influxdb
|
|
|
|
---
|
|
|
|
## Getting Help
|
|
|
|
If you encounter issues:
|
|
|
|
1. Check logs: `docker-compose logs -f`
|
|
2. Verify environment: `docker exec influxdb-mcp-server env`
|
|
3. Test InfluxDB connection from container
|
|
4. Review this documentation
|
|
5. Check InfluxDB logs for API errors
|
|
6. Verify token permissions in InfluxDB UI
|
|
|
|
The MCP server is now fully containerized and ready for use with Docker Desktop's AI tools or Claude Desktop! 🐳📊🤖
|