fix: rebranding, see [docs/name-change.md](docs/name-change.md) for details
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Zen MCP Server - Docker Setup
|
||||
# PAL MCP Server - Docker Setup
|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -22,7 +22,7 @@ nano .env
|
||||
|
||||
```bash
|
||||
# Build the Docker image
|
||||
docker build -t zen-mcp-server:latest .
|
||||
docker build -t pal-mcp-server:latest .
|
||||
|
||||
# Or use the build script (Bash)
|
||||
chmod +x docker/scripts/build.sh
|
||||
@@ -41,14 +41,14 @@ docker/scripts/build.ps1
|
||||
# Run with environment file
|
||||
docker run --rm -i --env-file .env \
|
||||
-v $(pwd)/logs:/app/logs \
|
||||
zen-mcp-server:latest
|
||||
pal-mcp-server:latest
|
||||
|
||||
# Run with inline environment variables
|
||||
docker run --rm -i \
|
||||
-e GEMINI_API_KEY="your_key_here" \
|
||||
-e LOG_LEVEL=INFO \
|
||||
-v $(pwd)/logs:/app/logs \
|
||||
zen-mcp-server:latest
|
||||
pal-mcp-server:latest
|
||||
```
|
||||
|
||||
#### B. Docker Compose (For Development/Monitoring)
|
||||
@@ -62,7 +62,7 @@ chmod +x docker/scripts/deploy.sh
|
||||
docker/scripts/deploy.ps1
|
||||
|
||||
# Interactive stdio mode
|
||||
docker-compose exec zen-mcp python server.py
|
||||
docker-compose exec pal-mcp python server.py
|
||||
```
|
||||
|
||||
## Service Management
|
||||
@@ -76,8 +76,8 @@ docker ps
|
||||
# View logs from container
|
||||
docker logs <container_id>
|
||||
|
||||
# Stop all zen-mcp containers
|
||||
docker stop $(docker ps -q --filter "ancestor=zen-mcp-server:latest")
|
||||
# Stop all pal-mcp containers
|
||||
docker stop $(docker ps -q --filter "ancestor=pal-mcp-server:latest")
|
||||
|
||||
# Remove old containers and images
|
||||
docker container prune
|
||||
@@ -88,20 +88,20 @@ docker image prune
|
||||
|
||||
```bash
|
||||
# View logs
|
||||
docker-compose logs -f zen-mcp
|
||||
docker-compose logs -f pal-mcp
|
||||
|
||||
# Check status
|
||||
docker-compose ps
|
||||
|
||||
# Restart service
|
||||
docker-compose restart zen-mcp
|
||||
docker-compose restart pal-mcp
|
||||
|
||||
# Stop services
|
||||
docker-compose down
|
||||
|
||||
# Rebuild and update
|
||||
docker-compose build --no-cache zen-mcp
|
||||
docker-compose up -d zen-mcp
|
||||
docker-compose build --no-cache pal-mcp
|
||||
docker-compose up -d pal-mcp
|
||||
```
|
||||
|
||||
## Health Monitoring
|
||||
@@ -117,19 +117,19 @@ The container includes health checks that verify:
|
||||
The Docker setup includes persistent volumes to preserve data between container runs:
|
||||
|
||||
- **`./logs:/app/logs`** - Persistent log storage (local folder mount)
|
||||
- **`zen-mcp-config:/app/conf`** - Configuration persistence (named Docker volume)
|
||||
- **`pal-mcp-config:/app/conf`** - Configuration persistence (named Docker volume)
|
||||
- **`/etc/localtime:/etc/localtime:ro`** - Host timezone synchronization (read-only)
|
||||
|
||||
### How Persistent Volumes Work
|
||||
|
||||
The `zen-mcp` service (used by `zen-docker-compose` and Docker Compose commands) mounts the named volume `zen-mcp-config` persistently. All data placed in `/app/conf` inside the container is preserved between runs thanks to this Docker volume.
|
||||
The `pal-mcp` service (used by `pal-docker-compose` and Docker Compose commands) mounts the named volume `pal-mcp-config` persistently. All data placed in `/app/conf` inside the container is preserved between runs thanks to this Docker volume.
|
||||
|
||||
In the `docker-compose.yml` file, you will find:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- ./logs:/app/logs
|
||||
- zen-mcp-config:/app/conf
|
||||
- pal-mcp-config:/app/conf
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
```
|
||||
|
||||
@@ -137,13 +137,13 @@ and the named volume definition:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
zen-mcp-config:
|
||||
pal-mcp-config:
|
||||
driver: local
|
||||
```
|
||||
|
||||
## Security
|
||||
|
||||
- Runs as non-root user `zenuser`
|
||||
- Runs as non-root user `paluser`
|
||||
- Read-only filesystem with tmpfs for temporary files
|
||||
- No network ports exposed (stdio communication only)
|
||||
- Secrets managed via environment variables
|
||||
@@ -154,16 +154,16 @@ volumes:
|
||||
|
||||
```bash
|
||||
# Check if image exists
|
||||
docker images zen-mcp-server
|
||||
docker images pal-mcp-server
|
||||
|
||||
# Test container interactively
|
||||
docker run --rm -it --env-file .env zen-mcp-server:latest bash
|
||||
docker run --rm -it --env-file .env pal-mcp-server:latest bash
|
||||
|
||||
# Check environment variables
|
||||
docker run --rm --env-file .env zen-mcp-server:latest env | grep API
|
||||
docker run --rm --env-file .env pal-mcp-server:latest env | grep API
|
||||
|
||||
# Test with minimal configuration
|
||||
docker run --rm -i -e GEMINI_API_KEY="test" zen-mcp-server:latest python server.py
|
||||
docker run --rm -i -e GEMINI_API_KEY="test" pal-mcp-server:latest python server.py
|
||||
```
|
||||
|
||||
### MCP Connection Issues
|
||||
@@ -173,7 +173,7 @@ docker run --rm -i -e GEMINI_API_KEY="test" zen-mcp-server:latest python server.
|
||||
docker run --rm hello-world
|
||||
|
||||
# Verify container stdio
|
||||
echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env zen-mcp-server:latest python server.py
|
||||
echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env pal-mcp-server:latest python server.py
|
||||
|
||||
# Check Claude Desktop logs for connection errors
|
||||
```
|
||||
@@ -182,10 +182,10 @@ echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env
|
||||
|
||||
```bash
|
||||
# Verify API keys are loaded
|
||||
docker run --rm --env-file .env zen-mcp-server:latest python -c "import os; print('GEMINI_API_KEY:', bool(os.getenv('GEMINI_API_KEY')))"
|
||||
docker run --rm --env-file .env pal-mcp-server:latest python -c "import os; print('GEMINI_API_KEY:', bool(os.getenv('GEMINI_API_KEY')))"
|
||||
|
||||
# Test API connectivity
|
||||
docker run --rm --env-file .env zen-mcp-server:latest python /usr/local/bin/healthcheck.py
|
||||
docker run --rm --env-file .env pal-mcp-server:latest python /usr/local/bin/healthcheck.py
|
||||
```
|
||||
|
||||
### Permission Issues
|
||||
@@ -205,10 +205,10 @@ chmod 755 logs/
|
||||
docker stats
|
||||
|
||||
# Run with memory limits
|
||||
docker run --rm -i --memory="512m" --env-file .env zen-mcp-server:latest
|
||||
docker run --rm -i --memory="512m" --env-file .env pal-mcp-server:latest
|
||||
|
||||
# Monitor Docker logs
|
||||
docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log
|
||||
docker run --rm -i --env-file .env pal-mcp-server:latest 2>&1 | tee docker.log
|
||||
```
|
||||
|
||||
## MCP Integration (Claude Desktop)
|
||||
@@ -218,17 +218,17 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log
|
||||
```json
|
||||
{
|
||||
"servers": {
|
||||
"zen-docker": {
|
||||
"pal-docker": {
|
||||
"command": "docker",
|
||||
"args": [
|
||||
"run",
|
||||
"--rm",
|
||||
"-i",
|
||||
"--env-file",
|
||||
"/absolute/path/to/zen-mcp-server/.env",
|
||||
"/absolute/path/to/pal-mcp-server/.env",
|
||||
"-v",
|
||||
"/absolute/path/to/zen-mcp-server/logs:/app/logs",
|
||||
"zen-mcp-server:latest"
|
||||
"/absolute/path/to/pal-mcp-server/logs:/app/logs",
|
||||
"pal-mcp-server:latest"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -240,17 +240,17 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log
|
||||
```json
|
||||
{
|
||||
"servers": {
|
||||
"zen-docker": {
|
||||
"pal-docker": {
|
||||
"command": "docker",
|
||||
"args": [
|
||||
"run",
|
||||
"--rm",
|
||||
"-i",
|
||||
"--env-file",
|
||||
"C:/Users/YourName/path/to/zen-mcp-server/.env",
|
||||
"C:/Users/YourName/path/to/pal-mcp-server/.env",
|
||||
"-v",
|
||||
"C:/Users/YourName/path/to/zen-mcp-server/logs:/app/logs",
|
||||
"zen-mcp-server:latest"
|
||||
"C:/Users/YourName/path/to/pal-mcp-server/logs:/app/logs",
|
||||
"pal-mcp-server:latest"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -262,14 +262,14 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log
|
||||
```json
|
||||
{
|
||||
"servers": {
|
||||
"zen-docker": {
|
||||
"pal-docker": {
|
||||
"command": "docker-compose",
|
||||
"args": [
|
||||
"-f",
|
||||
"/absolute/path/to/zen-mcp-server/docker-compose.yml",
|
||||
"/absolute/path/to/pal-mcp-server/docker-compose.yml",
|
||||
"run",
|
||||
"--rm",
|
||||
"zen-mcp"
|
||||
"pal-mcp"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -304,10 +304,10 @@ CUSTOM_API_URL=
|
||||
|
||||
```bash
|
||||
# Test container starts correctly
|
||||
docker run --rm zen-mcp-server:latest python --version
|
||||
docker run --rm pal-mcp-server:latest python --version
|
||||
|
||||
# Test health check
|
||||
docker run --rm -e GEMINI_API_KEY="test" zen-mcp-server:latest python /usr/local/bin/healthcheck.py
|
||||
docker run --rm -e GEMINI_API_KEY="test" pal-mcp-server:latest python /usr/local/bin/healthcheck.py
|
||||
```
|
||||
|
||||
### 2. Test MCP Protocol
|
||||
@@ -315,7 +315,7 @@ docker run --rm -e GEMINI_API_KEY="test" zen-mcp-server:latest python /usr/local
|
||||
```bash
|
||||
# Test basic MCP communication
|
||||
echo '{"jsonrpc": "2.0", "method": "initialize", "params": {}}' | \
|
||||
docker run --rm -i --env-file .env zen-mcp-server:latest python server.py
|
||||
docker run --rm -i --env-file .env pal-mcp-server:latest python server.py
|
||||
```
|
||||
|
||||
### 3. Validate Configuration
|
||||
@@ -330,7 +330,7 @@ python -m json.tool .vscode/mcp.json
|
||||
|
||||
## Available Tools
|
||||
|
||||
The Zen MCP Server provides these tools when properly configured:
|
||||
The PAL MCP Server provides these tools when properly configured:
|
||||
|
||||
- **chat** - General AI conversation and collaboration
|
||||
- **thinkdeep** - Multi-stage investigation and reasoning
|
||||
|
||||
@@ -21,7 +21,7 @@ function Write-ColorText {
|
||||
}
|
||||
}
|
||||
|
||||
Write-ColorText "=== Building Zen MCP Server Docker Image ===" -Color Green
|
||||
Write-ColorText "=== Building PAL MCP Server Docker Image ===" -Color Green
|
||||
|
||||
# Check if .env file exists
|
||||
if (!(Test-Path ".env")) {
|
||||
@@ -49,7 +49,7 @@ try {
|
||||
|
||||
# Verify the build
|
||||
Write-ColorText "Verifying build..." -Color Green
|
||||
$images = docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | Select-String "zen-mcp-server"
|
||||
$images = docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | Select-String "pal-mcp-server"
|
||||
|
||||
if ($images) {
|
||||
Write-ColorText "✓ Docker image built successfully" -Color Green
|
||||
|
||||
@@ -7,7 +7,7 @@ YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${GREEN}=== Building Zen MCP Server Docker Image ===${NC}"
|
||||
echo -e "${GREEN}=== Building PAL MCP Server Docker Image ===${NC}"
|
||||
|
||||
# Check if .env file exists
|
||||
if [[ ! -f .env ]]; then
|
||||
@@ -26,10 +26,10 @@ echo -e "${GREEN}Building Docker image...${NC}"
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Verify the build
|
||||
if docker images | grep -q "zen-mcp-server"; then
|
||||
if docker images | grep -q "pal-mcp-server"; then
|
||||
echo -e "${GREEN}✓ Docker image built successfully${NC}"
|
||||
echo -e "${GREEN}Image details:${NC}"
|
||||
docker images | grep zen-mcp-server
|
||||
docker images | grep pal-mcp-server
|
||||
else
|
||||
echo -e "${RED}✗ Failed to build Docker image${NC}"
|
||||
exit 1
|
||||
|
||||
@@ -24,7 +24,7 @@ function Write-ColorText {
|
||||
}
|
||||
}
|
||||
|
||||
Write-ColorText "=== Deploying Zen MCP Server ===" -Color Green
|
||||
Write-ColorText "=== Deploying PAL MCP Server ===" -Color Green
|
||||
|
||||
# Function to check if required environment variables are set
|
||||
function Test-EnvironmentVariables {
|
||||
@@ -91,8 +91,8 @@ function Wait-ForHealth {
|
||||
|
||||
while ($attempt -le $MaxAttempts) {
|
||||
try {
|
||||
# Get container ID for zen-mcp service
|
||||
$containerId = docker-compose ps -q zen-mcp
|
||||
# Get container ID for pal-mcp service
|
||||
$containerId = docker-compose ps -q pal-mcp
|
||||
if ([string]::IsNullOrWhiteSpace($containerId)) {
|
||||
$status = "unavailable"
|
||||
} else {
|
||||
@@ -119,7 +119,7 @@ function Wait-ForHealth {
|
||||
|
||||
Write-ColorText "Service failed to become healthy after $MaxAttempts attempts" -Color Red
|
||||
Write-ColorText "Checking logs:" -Color Yellow
|
||||
docker-compose logs zen-mcp
|
||||
docker-compose logs pal-mcp
|
||||
return $false
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ try {
|
||||
}
|
||||
|
||||
# Start the services
|
||||
Write-ColorText "Starting Zen MCP Server..." -Color Green
|
||||
Write-ColorText "Starting PAL MCP Server..." -Color Green
|
||||
try {
|
||||
docker-compose up -d
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
@@ -150,7 +150,7 @@ try {
|
||||
} catch {
|
||||
Write-ColorText "Error: Failed to start services" -Color Red
|
||||
Write-ColorText "Checking logs:" -Color Yellow
|
||||
docker-compose logs zen-mcp
|
||||
docker-compose logs pal-mcp
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ if (!$SkipHealthCheck) {
|
||||
|
||||
while ($elapsed -lt $timeout) {
|
||||
try {
|
||||
$containerId = docker-compose ps -q zen-mcp
|
||||
$containerId = docker-compose ps -q pal-mcp
|
||||
if (![string]::IsNullOrWhiteSpace($containerId)) {
|
||||
$status = docker inspect -f "{{.State.Health.Status}}" $containerId 2>$null
|
||||
if ($status -eq "healthy") {
|
||||
@@ -186,26 +186,26 @@ if (!$SkipHealthCheck) {
|
||||
if (!(Wait-ForHealth)) {
|
||||
Write-ColorText "Service failed to become healthy" -Color Red
|
||||
Write-ColorText "Checking logs:" -Color Yellow
|
||||
docker-compose logs zen-mcp
|
||||
docker-compose logs pal-mcp
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-ColorText "✓ Zen MCP Server deployed successfully" -Color Green
|
||||
Write-ColorText "✓ PAL MCP Server deployed successfully" -Color Green
|
||||
Write-ColorText "Service Status:" -Color Green
|
||||
docker-compose ps
|
||||
|
||||
Write-ColorText "=== Deployment Complete ===" -Color Green
|
||||
Write-ColorText "Useful commands:" -Color Yellow
|
||||
Write-ColorText " View logs: " -Color White -NoNewline
|
||||
Write-ColorText "docker-compose logs -f zen-mcp" -Color Green
|
||||
Write-ColorText "docker-compose logs -f pal-mcp" -Color Green
|
||||
|
||||
Write-ColorText " Stop service: " -Color White -NoNewline
|
||||
Write-ColorText "docker-compose down" -Color Green
|
||||
|
||||
Write-ColorText " Restart service: " -Color White -NoNewline
|
||||
Write-ColorText "docker-compose restart zen-mcp" -Color Green
|
||||
Write-ColorText "docker-compose restart pal-mcp" -Color Green
|
||||
|
||||
Write-ColorText " PowerShell logs: " -Color White -NoNewline
|
||||
Write-ColorText "Get-Content logs\mcp_server.log -Wait" -Color Green
|
||||
|
||||
@@ -7,7 +7,7 @@ YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${GREEN}=== Deploying Zen MCP Server ===${NC}"
|
||||
echo -e "${GREEN}=== Deploying PAL MCP Server ===${NC}"
|
||||
|
||||
# Function to check if required environment variables are set
|
||||
check_env_vars() {
|
||||
@@ -51,7 +51,7 @@ wait_for_health() {
|
||||
local delay=2
|
||||
|
||||
while (( attempt <= max_attempts )); do
|
||||
status=$(docker-compose ps -q zen-mcp | xargs docker inspect -f "{{.State.Health.Status}}" 2>/dev/null || echo "unavailable")
|
||||
status=$(docker-compose ps -q pal-mcp | xargs docker inspect -f "{{.State.Health.Status}}" 2>/dev/null || echo "unavailable")
|
||||
if [[ "$status" == "healthy" ]]; then
|
||||
return 0
|
||||
fi
|
||||
@@ -63,7 +63,7 @@ wait_for_health() {
|
||||
|
||||
echo -e "${RED}Service failed to become healthy after $max_attempts attempts${NC}"
|
||||
echo -e "${YELLOW}Checking logs:${NC}"
|
||||
docker-compose logs zen-mcp
|
||||
docker-compose logs pal-mcp
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -75,25 +75,25 @@ echo -e "${GREEN}Stopping existing containers...${NC}"
|
||||
docker-compose down
|
||||
|
||||
# Start the services
|
||||
echo -e "${GREEN}Starting Zen MCP Server...${NC}"
|
||||
echo -e "${GREEN}Starting PAL MCP Server...${NC}"
|
||||
docker-compose up -d
|
||||
|
||||
# Wait for health check
|
||||
echo -e "${GREEN}Waiting for service to be healthy...${NC}"
|
||||
timeout 60 bash -c 'while [[ "$(docker-compose ps -q zen-mcp | xargs docker inspect -f "{{.State.Health.Status}}")" != "healthy" ]]; do sleep 2; done' || {
|
||||
timeout 60 bash -c 'while [[ "$(docker-compose ps -q pal-mcp | xargs docker inspect -f "{{.State.Health.Status}}")" != "healthy" ]]; do sleep 2; done' || {
|
||||
wait_for_health
|
||||
echo -e "${RED}Service failed to become healthy${NC}"
|
||||
echo -e "${YELLOW}Checking logs:${NC}"
|
||||
docker-compose logs zen-mcp
|
||||
docker-compose logs pal-mcp
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo -e "${GREEN}✓ Zen MCP Server deployed successfully${NC}"
|
||||
echo -e "${GREEN}✓ PAL MCP Server deployed successfully${NC}"
|
||||
echo -e "${GREEN}Service Status:${NC}"
|
||||
docker-compose ps
|
||||
|
||||
echo -e "${GREEN}=== Deployment Complete ===${NC}"
|
||||
echo -e "${YELLOW}Useful commands:${NC}"
|
||||
echo -e " View logs: ${GREEN}docker-compose logs -f zen-mcp${NC}"
|
||||
echo -e " View logs: ${GREEN}docker-compose logs -f pal-mcp${NC}"
|
||||
echo -e " Stop service: ${GREEN}docker-compose down${NC}"
|
||||
echo -e " Restart service: ${GREEN}docker-compose restart zen-mcp${NC}"
|
||||
echo -e " Restart service: ${GREEN}docker-compose restart pal-mcp${NC}"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Health check script for Zen MCP Server Docker container
|
||||
Health check script for PAL MCP Server Docker container
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
Reference in New Issue
Block a user