GeoGuessrMCP/scripts/deploy.sh
Claude 07b1cb84b2
Add MCP server authentication and update Docker configuration
This commit implements several key improvements to the GeoGuessr MCP server:

## MCP Server Authentication
- Add Bearer token authentication for MCP server access control
- New middleware in src/geoguessr_mcp/middleware/auth.py
- Configuration via MCP_AUTH_ENABLED and MCP_API_KEYS environment variables
- Support for multiple API keys (comma-separated)
- Optional authentication - can be disabled for trusted deployments
- Clients connect using Authorization: Bearer YOUR_API_KEY header

## Docker Configuration Updates
- Update to use official pre-built image: nyxiumyuuki/geoguessr-mcp:latest
- Remove DOCKER_USERNAME and IMAGE_TAG from environment variables
- Simplify docker-compose.yml and docker-compose.prod.yml
- Remove healthcheck configuration (not necessary for the deployment)

## Deployment Improvements
- Move deploy.sh to scripts/deploy.sh for better organization
- Update deploy.sh to use official Docker image
- Add authentication validation in deployment script
- Improve deployment logging and error messages

## Documentation Updates
- Update README.md with authentication configuration examples
- Add MCP server authentication section with setup instructions
- Update environment variables table
- Simplify deployment instructions
- Update CLAUDE.md with new authentication architecture
- Add .env.example configuration for MCP authentication

## Technical Details
- Authentication middleware integrates with FastMCP's Starlette ASGI app
- Middleware validates Bearer tokens on all requests except /health
- Logs authentication attempts and failures
- Returns proper 401/403 HTTP status codes
- Validates configuration on startup to prevent misconfiguration

Resolves TODO items:
- [x] Fix Docker username in compose files and env vars
- [x] Add authentication to MCP server to allow access only to specific users
2025-11-29 22:16:01 +00:00

239 lines
6.6 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# GeoGuessr MCP Server - Production Deployment Script
# This script helps deploy the application to a VPS with nginx-proxy-manager
set -e # Exit on error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
COMPOSE_FILE="docker-compose.prod.yml"
ENV_FILE=".env"
ENV_EXAMPLE=".env.production"
# Helper functions
print_header() {
echo -e "\n${BLUE}===================================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}===================================================${NC}\n"
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
print_info() {
echo -e "${BLUE} $1${NC}"
}
# Check if running on VPS or local
check_environment() {
print_header "Step 1: Environment Check"
if [ ! -f "$COMPOSE_FILE" ]; then
print_error "docker-compose.prod.yml not found!"
exit 1
fi
print_success "Found $COMPOSE_FILE"
if [ ! -f "$ENV_FILE" ]; then
print_warning "$ENV_FILE not found. Creating from .env.example..."
if [ -f ".env.example" ]; then
cp ".env.example" "$ENV_FILE"
print_warning "Please edit $ENV_FILE with your actual configuration!"
print_info "Configure GEOGUESSR_NCFA_COOKIE and MCP_API_KEYS if using authentication"
exit 1
else
print_error "No .env.example found!"
exit 1
fi
fi
print_success "Found $ENV_FILE"
# Check Docker
if ! command -v docker &> /dev/null; then
print_error "Docker is not installed!"
exit 1
fi
print_success "Docker is installed"
# Check Docker Compose
if ! docker compose version &> /dev/null; then
print_error "Docker Compose is not installed!"
exit 1
fi
print_success "Docker Compose is installed"
}
# Check if .env is properly configured
check_config() {
print_header "Step 2: Configuration Check"
source "$ENV_FILE"
print_info "Using Docker image: nyxiumyuuki/geoguessr-mcp:latest"
if [ -z "$GEOGUESSR_NCFA_COOKIE" ]; then
print_warning "GEOGUESSR_NCFA_COOKIE not configured"
print_info "Most GeoGuessr features require authentication. You can set this later."
else
print_success "GEOGUESSR_NCFA_COOKIE is configured"
fi
if [ "$MCP_AUTH_ENABLED" == "true" ]; then
if [ -z "$MCP_API_KEYS" ]; then
print_error "MCP_AUTH_ENABLED is true but MCP_API_KEYS is not set!"
print_info "Either disable authentication or configure API keys"
exit 1
fi
print_success "MCP server authentication is ENABLED"
else
print_warning "MCP server authentication is DISABLED - server will be publicly accessible"
fi
}
# Check if firefly_network exists
check_network() {
print_header "Step 3: Docker Network Check"
if docker network inspect firefly_network &> /dev/null; then
print_success "firefly_network exists"
else
print_warning "firefly_network does not exist"
print_info "Creating firefly_network..."
docker network create firefly_network
print_success "Created firefly_network"
fi
}
# Pull latest image
pull_image() {
print_header "Step 4: Pull Docker Image"
print_info "Pulling image: nyxiumyuuki/geoguessr-mcp:latest"
docker compose -f "$COMPOSE_FILE" pull
print_success "Image pulled successfully"
}
# Stop and remove old container
stop_old() {
print_header "Step 5: Stop Old Container (if exists)"
if docker ps -a | grep -q geoguessr-mcp-server; then
print_info "Stopping old container..."
docker compose -f "$COMPOSE_FILE" down
print_success "Old container stopped"
else
print_info "No existing container found"
fi
}
# Start new container
start_new() {
print_header "Step 6: Start New Container"
print_info "Starting container in detached mode..."
docker compose -f "$COMPOSE_FILE" up -d
print_success "Container started"
print_info "Waiting for container to start..."
sleep 3
# Check if running
if docker ps | grep -q geoguessr-mcp-server; then
print_success "Container is running"
else
print_error "Container is not running!"
print_info "Check logs with: docker compose -f $COMPOSE_FILE logs"
exit 1
fi
}
# Show logs
show_logs() {
print_header "Step 7: Recent Logs"
docker compose -f "$COMPOSE_FILE" logs --tail=20
}
# Show next steps
show_next_steps() {
print_header "Deployment Complete!"
echo -e "${GREEN}Your GeoGuessr MCP Server is now running!${NC}\n"
print_info "Next Steps:"
echo ""
echo "1. Configure nginx-proxy-manager:"
echo " - Access admin panel: http://$(hostname -I | awk '{print $1}'):81"
echo " - Add new Proxy Host"
echo " - Forward Hostname/IP: geoguessr-mcp-server"
echo " - Forward Port: 8000"
echo " - Enable SSL with Let's Encrypt"
echo ""
echo "2. Test the MCP endpoint:"
echo " curl https://your-domain.com/mcp"
echo " (With auth): curl -H 'Authorization: Bearer YOUR_API_KEY' https://your-domain.com/mcp"
echo ""
echo "3. Connect Claude Desktop:"
echo " Add to claude_desktop_config.json:"
echo ' {'
echo ' "mcpServers": {'
echo ' "geoguessr": {'
echo ' "type": "streamable-http",'
echo ' "url": "https://your-domain.com/mcp",'
echo ' "headers": {'
echo ' "Authorization": "Bearer YOUR_API_KEY"'
echo ' }'
echo ' }'
echo ' }'
echo ' }'
echo ""
print_info "Useful Commands:"
echo ""
echo " View logs: docker compose -f $COMPOSE_FILE logs -f"
echo " Restart: docker compose -f $COMPOSE_FILE restart"
echo " Stop: docker compose -f $COMPOSE_FILE down"
echo " Update: scripts/deploy.sh"
echo ""
print_info "Troubleshooting:"
echo ""
echo " Check status: docker ps | grep geoguessr-mcp"
echo " Enter container: docker exec -it geoguessr-mcp-server /bin/bash"
echo " View all logs: docker compose -f $COMPOSE_FILE logs --tail=100"
echo ""
print_info "For detailed documentation, see: DEPLOYMENT.md"
}
# Main deployment flow
main() {
print_header "GeoGuessr MCP Server - Production Deployment"
check_environment
check_config
check_network
pull_image
stop_old
start_new
show_logs
show_next_steps
}
# Run main function
main