Add Docker configuration for Clover service including health check endpoint
This commit is contained in:
parent
9fa0adae53
commit
5e7fb444f5
63
.dockerignore
Normal file
63
.dockerignore
Normal file
@ -0,0 +1,63 @@
|
||||
# Byte-compiled files
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
.Python
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# Virtual environments
|
||||
venv/
|
||||
env/
|
||||
ENV/
|
||||
.venv/
|
||||
env-bak/
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# System
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Docker
|
||||
.dockerignore
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
|
||||
# Test files
|
||||
pytest_cache/
|
||||
.coverage
|
||||
.nox/
|
||||
|
||||
# Temporary files
|
||||
*~
|
||||
*.tmp
|
||||
34
Dockerfile
Normal file
34
Dockerfile
Normal file
@ -0,0 +1,34 @@
|
||||
# Clover AI Agent Dockerfile
|
||||
FROM python:3.11-slim
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy requirements first (for better caching)
|
||||
COPY requirements.txt .
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Python dependencies
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
# Create non-root user
|
||||
RUN useradd --create-home --shell /bin/bash clover \
|
||||
&& chown -R clover:clover /app
|
||||
USER clover
|
||||
|
||||
# Expose health check port (if needed)
|
||||
EXPOSE 8080
|
||||
|
||||
# Health check endpoint
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD python3 health.py
|
||||
|
||||
# Default command
|
||||
CMD ["python3", "main.py"]
|
||||
22
docker-compose.yml
Normal file
22
docker-compose.yml
Normal file
@ -0,0 +1,22 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
clover:
|
||||
build: .
|
||||
container_name: clover-ai
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- .:/app
|
||||
- ~/.clover:/home/clover/.clover
|
||||
environment:
|
||||
- PYTHONPATH=/app
|
||||
- LOG_LEVEL=INFO
|
||||
command: python3 main.py
|
||||
healthcheck:
|
||||
test: ["CMD", "python3", "health.py"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
start_period: 5s
|
||||
retries: 3
|
||||
92
health.py
Normal file
92
health.py
Normal file
@ -0,0 +1,92 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Health check endpoint for Clover service.
|
||||
This script can be called directly to check the health status of the Clover service.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import datetime
|
||||
|
||||
# Add the current directory to Python path
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
def check_health():
|
||||
"""Check the health status of the Clover service"""
|
||||
|
||||
try:
|
||||
# Import required modules
|
||||
from config.settings import load_config
|
||||
from tools.command_safety import get_command_status
|
||||
from tools.resource_monitor import get_resource_status
|
||||
|
||||
# Load configuration
|
||||
config = load_config()
|
||||
|
||||
# Check basic service status
|
||||
service_status = {
|
||||
"status": "healthy",
|
||||
"service": "clover_ai",
|
||||
"version": "1.0.0",
|
||||
"config_loaded": True,
|
||||
"timestamp": datetime.datetime.now().isoformat()
|
||||
}
|
||||
|
||||
# Check safety systems
|
||||
try:
|
||||
safety_status = get_command_status()
|
||||
service_status["safety"] = {
|
||||
"safety_available": safety_status.get("safety_available", False),
|
||||
"violations": safety_status.get("safety", {}).get("violation_count", 0)
|
||||
}
|
||||
except Exception as e:
|
||||
service_status["safety"] = {"error": str(e)}
|
||||
|
||||
# Check resource usage
|
||||
try:
|
||||
resource_status = get_resource_status()
|
||||
service_status["resources"] = {
|
||||
"cpu_percent": resource_status.get("current_resources", {}).get("cpu_percent", 0),
|
||||
"memory_mb": resource_status.get("current_resources", {}).get("memory_mb", 0),
|
||||
"processes": resource_status.get("current_resources", {}).get("process_count", 0)
|
||||
}
|
||||
except Exception as e:
|
||||
service_status["resources"] = {"error": str(e)}
|
||||
|
||||
# Check if main components are accessible
|
||||
try:
|
||||
from models.model_manager import ModelManager
|
||||
model_manager = ModelManager()
|
||||
service_status["model_manager"] = {
|
||||
"initialized": True,
|
||||
"available_models": len(model_manager.get_available_models())
|
||||
}
|
||||
except Exception as e:
|
||||
service_status["model_manager"] = {"error": str(e)}
|
||||
|
||||
return service_status
|
||||
|
||||
except Exception as e:
|
||||
error_status = {
|
||||
"status": "unhealthy",
|
||||
"error": str(e),
|
||||
"timestamp": datetime.datetime.now().isoformat()
|
||||
}
|
||||
return error_status
|
||||
|
||||
def main():
|
||||
"""Main health check function"""
|
||||
status = check_health()
|
||||
|
||||
# Print JSON response
|
||||
print(json.dumps(status, indent=2))
|
||||
|
||||
# Exit with appropriate code
|
||||
if status.get("status") == "healthy":
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
x
Reference in New Issue
Block a user