Docker Deployment
Overview
This guide covers deploying AxonHub using Docker and Docker Compose. Docker provides an isolated, reproducible environment that simplifies deployment and scaling.
Quick Start
1. Clone the Repository
git clone https://github.com/looplj/axonhub.git
cd axonhub
2. Configure Environment
Copy the example configuration file:
cp config.example.yml config.yml
Edit config.yml with your settings:
# config.yml
server:
port: 8090
name: "AxonHub"
db:
dialect: "sqlite3"
dsn: "file:axonhub.db?cache=shared&_fk=1"
log:
level: "info"
encoding: "json"
3. Start Services
docker-compose up -d
4. Verify Deployment
Check service status:
docker-compose ps
Access the application:
- Web interface: http://localhost:8090
- Default admin: admin@example.com / admin123
Docker Compose Configuration
Basic docker-compose.yml
version: '3.8'
services:
axonhub:
image: looplj/axonhub:latest
ports:
- "8090:8090"
volumes:
- ./config.yml:/app/config.yml
- axonhub_data:/app/data
environment:
- AXONHUB_SERVER_PORT=8090
- AXONHUB_DB_DIALECT=sqlite3
- AXONHUB_DB_DSN=file:axonhub.db?cache=shared&_fk=1
restart: unless-stopped
volumes:
axonhub_data:
Production Configuration
version: '3.8'
services:
axonhub:
image: looplj/axonhub:latest
ports:
- "8090:8090"
volumes:
- ./config.yml:/app/config.yml
- axonhub_data:/app/data
- ./logs:/app/logs
environment:
- AXONHUB_SERVER_PORT=8090
- AXONHUB_DB_DIALECT=postgres
- AXONHUB_DB_DSN=postgres://axonhub:password@postgres:5432/axonhub
- AXONHUB_LOG_LEVEL=warn
- AXONHUB_LOG_OUTPUT=file
- AXONHUB_LOG_FILE_PATH=/app/logs/axonhub.log
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:15
environment:
- POSTGRES_DB=axonhub
- POSTGRES_USER=axonhub
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
axonhub_data:
postgres_data:
Database Options
SQLite (Development)
axonhub:
environment:
- AXONHUB_DB_DIALECT=sqlite3
- AXONHUB_DB_DSN=file:axonhub.db?cache=shared&_fk=1
PostgreSQL (Production)
axonhub:
environment:
- AXONHUB_DB_DIALECT=postgres
- AXONHUB_DB_DSN=postgres://user:pass@host:5432/axonhub
MySQL (Production)
axonhub:
environment:
- AXONHUB_DB_DIALECT=mysql
- AXONHUB_DB_DSN=user:pass@tcp(host:3306)/axonhub?charset=utf8mb4&parseTime=True
Environment Variables
Server Configuration
AXONHUB_SERVER_PORT=8090
AXONHUB_SERVER_NAME="AxonHub"
AXONHUB_SERVER_DEBUG=false
AXONHUB_SERVER_REQUEST_TIMEOUT="30s"
AXONHUB_SERVER_LLM_REQUEST_TIMEOUT="600s"
Database Configuration
AXONHUB_DB_DIALECT="postgres"
AXONHUB_DB_DSN="postgres://user:pass@host:5432/axonhub"
AXONHUB_DB_DEBUG=false
Logging Configuration
AXONHUB_LOG_LEVEL="info"
AXONHUB_LOG_ENCODING="json"
AXONHUB_LOG_OUTPUT="stdio"
Security Considerations
Network Security
axonhub:
networks:
- axonhub_network
ports:
- "127.0.0.1:8090:8090" # Bind to localhost only
networks:
axonhub_network:
driver: bridge
Secrets Management
Use Docker secrets or environment files:
# .env file
DB_PASSWORD=your-secure-password
API_KEY_SECRET=your-api-key-secret
axonhub:
env_file:
- .env
Monitoring and Logging
Health Checks
axonhub:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Log Collection
axonhub:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Scaling
Horizontal Scaling
axonhub:
deploy:
replicas: 3
resources:
limits:
memory: 1G
cpus: '0.5'
reservations:
memory: 512M
cpus: '0.25'
Load Balancer Setup
services:
axonhub:
image: looplj/axonhub:latest
deploy:
replicas: 3
networks:
- axonhub_network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- axonhub
networks:
- axonhub_network
Backup and Recovery
Database Backup
services:
backup:
image: postgres:15
volumes:
- ./backup:/backup
- postgres_data:/var/lib/postgresql/data
command: |
bash -c '
pg_dump -h postgres -U axonhub axonhub > /backup/axonhub-$(date +%Y%m%d).sql
'
depends_on:
- postgres
environment:
- PGPASSWORD=password
Volume Backup
# Backup data volume
docker run --rm -v axonhub_data:/source -v $(pwd)/backup:/backup alpine \
tar czf /backup/axonhub-data-$(date +%Y%m%d).tar.gz -C /source .
# Restore data volume
docker run --rm -v axonhub_data:/target -v $(pwd)/backup:/backup alpine \
tar xzf /backup/axonhub-data-20231110.tar.gz -C /target
Troubleshooting
Common Issues
Container fails to start
- Check Docker logs:
docker-compose logs axonhub - Verify configuration file permissions
- Ensure database connection is working
Port conflicts
- Change the exposed port in docker-compose.yml
- Check if another service is using port 8090
Database connection issues
- Verify database credentials
- Check network connectivity between containers
- Ensure database container is running
Debug Mode
Enable debug logging for troubleshooting:
axonhub:
environment:
- AXONHUB_SERVER_DEBUG=true
- AXONHUB_LOG_LEVEL=debug