547 lines
11 KiB
Markdown
547 lines
11 KiB
Markdown
# Docker-Based Integration Testing
|
|
|
|
This guide covers running ORLY and Dgraph together in Docker containers for integration testing.
|
|
|
|
## Overview
|
|
|
|
The Docker setup provides:
|
|
- **Isolated Environment**: Dgraph + ORLY in containers
|
|
- **Automated Testing**: Health checks and dependency management
|
|
- **Reproducible Tests**: Consistent environment across systems
|
|
- **Easy Cleanup**: Remove everything with one command
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────┐
|
|
│ Docker Network (orly-network) │
|
|
│ │
|
|
│ ┌──────────────────┐ ┌─────────────────┐ │
|
|
│ │ Dgraph │ │ ORLY Relay │ │
|
|
│ │ standalone │◄─┤ (dgraph mode) │ │
|
|
│ │ │ │ │ │
|
|
│ │ :8080 (HTTP) │ │ :3334 (WS) │ │
|
|
│ │ :9080 (gRPC) │ │ │ │
|
|
│ │ :8000 (Ratel) │ │ │ │
|
|
│ └──────────────────┘ └─────────────────┘ │
|
|
│ │ │ │
|
|
└─────────┼───────────────────────┼───────────┘
|
|
│ │
|
|
Published Published
|
|
to host to host
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
### 1. Build Images
|
|
|
|
```bash
|
|
# Build ORLY image only
|
|
./scripts/docker-build.sh
|
|
|
|
# Build ORLY + relay-tester
|
|
./scripts/docker-build.sh --with-tester
|
|
```
|
|
|
|
### 2. Run Integration Tests
|
|
|
|
```bash
|
|
# Basic test (start containers, verify connectivity)
|
|
./scripts/test-docker.sh
|
|
|
|
# Run with relay-tester
|
|
./scripts/test-docker.sh --relay-tester
|
|
|
|
# Keep containers running after test
|
|
./scripts/test-docker.sh --keep-running
|
|
|
|
# Skip rebuild (use existing images)
|
|
./scripts/test-docker.sh --skip-build
|
|
```
|
|
|
|
### 3. Manual Container Management
|
|
|
|
```bash
|
|
# Start containers
|
|
cd scripts
|
|
docker-compose -f docker-compose-test.yml up -d
|
|
|
|
# View logs
|
|
docker-compose -f docker-compose-test.yml logs -f
|
|
|
|
# Stop containers
|
|
docker-compose -f docker-compose-test.yml down
|
|
|
|
# Stop and remove volumes
|
|
docker-compose -f docker-compose-test.yml down -v
|
|
```
|
|
|
|
## Docker Files
|
|
|
|
### Dockerfile
|
|
|
|
Multi-stage build for ORLY:
|
|
|
|
**Stage 1: Builder**
|
|
- Based on golang:1.21-alpine
|
|
- Downloads dependencies
|
|
- Builds static binary with `CGO_ENABLED=0`
|
|
- Copies libsecp256k1.so for crypto operations
|
|
|
|
**Stage 2: Runtime**
|
|
- Based on alpine:latest (minimal)
|
|
- Copies binary and shared library
|
|
- Creates non-root user
|
|
- Sets up health checks
|
|
- ~50MB final image size
|
|
|
|
### Dockerfile.relay-tester
|
|
|
|
Builds relay-tester for automated testing:
|
|
- Static binary from cmd/relay-tester
|
|
- Configurable RELAY_URL
|
|
- Runs as part of test profile
|
|
|
|
### docker-compose-test.yml
|
|
|
|
Orchestrates the full stack:
|
|
|
|
**Services:**
|
|
1. **dgraph** - Database backend
|
|
- Health check via HTTP
|
|
- Persistent volume for data
|
|
- Exposed ports for debugging
|
|
|
|
2. **orly** - Relay server
|
|
- Depends on dgraph (waits for healthy)
|
|
- Configured with ORLY_DB_TYPE=dgraph
|
|
- Health check via HTTP
|
|
- Auto-restart on failure
|
|
|
|
3. **relay-tester** - Test runner
|
|
- Profile: test (optional)
|
|
- Runs tests against ORLY
|
|
- Exits after completion
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
The docker-compose file sets:
|
|
|
|
```yaml
|
|
# Database
|
|
ORLY_DB_TYPE: dgraph
|
|
ORLY_DGRAPH_URL: dgraph:9080 # Internal network name
|
|
|
|
# Server
|
|
ORLY_LISTEN: 0.0.0.0
|
|
ORLY_PORT: 3334
|
|
ORLY_DATA_DIR: /data
|
|
|
|
# Application
|
|
ORLY_LOG_LEVEL: info
|
|
ORLY_APP_NAME: ORLY-Dgraph-Test
|
|
ORLY_ACL_MODE: none
|
|
```
|
|
|
|
Override via environment or .env file:
|
|
|
|
```bash
|
|
# Create .env file in scripts/
|
|
cat > scripts/.env << EOF
|
|
ORLY_LOG_LEVEL=debug
|
|
ORLY_ADMINS=npub1...
|
|
EOF
|
|
```
|
|
|
|
### Volumes
|
|
|
|
**Persistent Data:**
|
|
- `dgraph-data:/dgraph` - Dgraph database
|
|
- `orly-data:/data` - ORLY metadata
|
|
|
|
**Inspect Volumes:**
|
|
```bash
|
|
docker volume ls
|
|
docker volume inspect scripts_dgraph-data
|
|
```
|
|
|
|
### Networks
|
|
|
|
**Custom Bridge Network:**
|
|
- Name: orly-network
|
|
- Subnet: 172.28.0.0/16
|
|
- Allows container-to-container communication
|
|
- DNS resolution by service name
|
|
|
|
## Testing Workflows
|
|
|
|
### Basic Integration Test
|
|
|
|
```bash
|
|
./scripts/test-docker.sh
|
|
```
|
|
|
|
**What it does:**
|
|
1. Stops any existing containers
|
|
2. Starts dgraph and waits for health
|
|
3. Starts ORLY and waits for health
|
|
4. Verifies HTTP connectivity
|
|
5. Tests WebSocket (if websocat installed)
|
|
6. Shows container status
|
|
7. Cleans up (unless --keep-running)
|
|
|
|
### With Relay-Tester
|
|
|
|
```bash
|
|
./scripts/test-docker.sh --relay-tester
|
|
```
|
|
|
|
**Additional steps:**
|
|
1. Builds relay-tester image
|
|
2. Runs comprehensive protocol tests
|
|
3. Reports pass/fail
|
|
4. Shows ORLY logs on failure
|
|
|
|
### Development Workflow
|
|
|
|
```bash
|
|
# Start and keep running
|
|
./scripts/test-docker.sh --keep-running
|
|
|
|
# Make changes to code
|
|
vim pkg/dgraph/save-event.go
|
|
|
|
# Rebuild and restart
|
|
docker-compose -f scripts/docker-compose-test.yml up -d --build orly
|
|
|
|
# View logs
|
|
docker logs orly-relay -f
|
|
|
|
# Test changes
|
|
go run cmd/relay-tester/main.go -url ws://localhost:3334
|
|
|
|
# Stop when done
|
|
cd scripts && docker-compose -f docker-compose-test.yml down
|
|
```
|
|
|
|
## Debugging
|
|
|
|
### View Container Logs
|
|
|
|
```bash
|
|
# All services
|
|
docker-compose -f scripts/docker-compose-test.yml logs -f
|
|
|
|
# Specific service
|
|
docker logs orly-relay -f
|
|
docker logs orly-dgraph -f
|
|
|
|
# Last N lines
|
|
docker logs orly-relay --tail 50
|
|
```
|
|
|
|
### Execute Commands in Container
|
|
|
|
```bash
|
|
# ORLY version
|
|
docker exec orly-relay /app/orly version
|
|
|
|
# Check ORLY processes
|
|
docker exec orly-relay ps aux
|
|
|
|
# Inspect data directory
|
|
docker exec orly-relay ls -la /data
|
|
|
|
# Query dgraph
|
|
docker exec orly-dgraph curl http://localhost:8080/health
|
|
```
|
|
|
|
### Access Ratel UI
|
|
|
|
Open http://localhost:8000 in browser:
|
|
- View dgraph schema
|
|
- Run DQL queries
|
|
- Inspect stored data
|
|
- Monitor performance
|
|
|
|
### Network Inspection
|
|
|
|
```bash
|
|
# List networks
|
|
docker network ls
|
|
|
|
# Inspect orly network
|
|
docker network inspect scripts_orly-network
|
|
|
|
# Test connectivity
|
|
docker exec orly-relay ping dgraph
|
|
docker exec orly-relay nc -zv dgraph 9080
|
|
```
|
|
|
|
### Health Check Status
|
|
|
|
```bash
|
|
# Check health
|
|
docker inspect orly-relay | grep -A 10 Health
|
|
|
|
# View health check logs
|
|
docker inspect --format='{{json .State.Health}}' orly-relay | jq
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Build Failures
|
|
|
|
**Error: Cannot find libsecp256k1.so**
|
|
|
|
```bash
|
|
# Ensure library exists
|
|
ls -l pkg/crypto/p8k/libsecp256k1.so
|
|
|
|
# Rebuild if needed
|
|
cd pkg/crypto/p8k && make
|
|
```
|
|
|
|
**Error: Go module download fails**
|
|
|
|
```bash
|
|
# Clear module cache
|
|
go clean -modcache
|
|
|
|
# Try building locally first
|
|
CGO_ENABLED=0 go build
|
|
```
|
|
|
|
### Runtime Failures
|
|
|
|
**ORLY fails health check**
|
|
|
|
```bash
|
|
# Check logs
|
|
docker logs orly-relay
|
|
|
|
# Common issues:
|
|
# - Port already in use: docker ps (check for conflicts)
|
|
# - Dgraph not ready: docker logs orly-dgraph
|
|
# - Bad configuration: docker exec orly-relay env
|
|
```
|
|
|
|
**Cannot connect to dgraph**
|
|
|
|
```bash
|
|
# Verify dgraph is healthy
|
|
docker inspect orly-dgraph | grep Health
|
|
|
|
# Check network connectivity
|
|
docker exec orly-relay ping dgraph
|
|
docker exec orly-relay nc -zv dgraph 9080
|
|
|
|
# Verify dgraph is listening
|
|
docker exec orly-dgraph netstat -tlnp | grep 9080
|
|
```
|
|
|
|
**WebSocket connection fails**
|
|
|
|
```bash
|
|
# Test from host
|
|
websocat ws://localhost:3334
|
|
|
|
# Test from container
|
|
docker exec orly-relay curl -v http://localhost:3334
|
|
|
|
# Check firewall
|
|
sudo iptables -L | grep 3334
|
|
```
|
|
|
|
### Performance Issues
|
|
|
|
**Slow startup**
|
|
|
|
```bash
|
|
# Increase health check timeouts in docker-compose-test.yml
|
|
start_period: 60s # Default is 20-30s
|
|
|
|
# Pre-pull images
|
|
docker pull dgraph/standalone:latest
|
|
docker pull golang:1.21-alpine
|
|
```
|
|
|
|
**High memory usage**
|
|
|
|
```bash
|
|
# Check resource usage
|
|
docker stats
|
|
|
|
# Limit container resources
|
|
# Add to docker-compose-test.yml:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 2G
|
|
cpus: '2'
|
|
```
|
|
|
|
## CI/CD Integration
|
|
|
|
### GitHub Actions Example
|
|
|
|
```yaml
|
|
name: Docker Integration Tests
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
docker-test:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v2
|
|
|
|
- name: Build images
|
|
run: ./scripts/docker-build.sh --with-tester
|
|
|
|
- name: Run integration tests
|
|
run: ./scripts/test-docker.sh --relay-tester
|
|
|
|
- name: Upload logs on failure
|
|
if: failure()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: container-logs
|
|
path: |
|
|
scripts/orly-relay.log
|
|
scripts/dgraph.log
|
|
```
|
|
|
|
### GitLab CI Example
|
|
|
|
```yaml
|
|
docker-test:
|
|
image: docker:latest
|
|
services:
|
|
- docker:dind
|
|
script:
|
|
- ./scripts/docker-build.sh --with-tester
|
|
- ./scripts/test-docker.sh --relay-tester
|
|
artifacts:
|
|
when: on_failure
|
|
paths:
|
|
- scripts/*.log
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Custom Configuration
|
|
|
|
Create a custom docker-compose override:
|
|
|
|
```yaml
|
|
# docker-compose.override.yml
|
|
version: '3.8'
|
|
|
|
services:
|
|
orly:
|
|
environment:
|
|
- ORLY_LOG_LEVEL=debug
|
|
- ORLY_ADMINS=npub1...
|
|
- ORLY_ACL_MODE=follows
|
|
ports:
|
|
- "3335:3334" # Different host port
|
|
```
|
|
|
|
### Multi-Instance Testing
|
|
|
|
Test multiple ORLY instances:
|
|
|
|
```yaml
|
|
# docker-compose-multi.yml
|
|
services:
|
|
orly-1:
|
|
extends:
|
|
file: docker-compose-test.yml
|
|
service: orly
|
|
container_name: orly-relay-1
|
|
ports:
|
|
- "3334:3334"
|
|
|
|
orly-2:
|
|
extends:
|
|
file: docker-compose-test.yml
|
|
service: orly
|
|
container_name: orly-relay-2
|
|
ports:
|
|
- "3335:3334"
|
|
```
|
|
|
|
### Performance Benchmarking
|
|
|
|
```bash
|
|
# Start with --keep-running
|
|
./scripts/test-docker.sh --keep-running
|
|
|
|
# Run stress test
|
|
go run cmd/stresstest/main.go -url ws://localhost:3334 -connections 100
|
|
|
|
# Monitor resources
|
|
docker stats
|
|
|
|
# Profile ORLY
|
|
docker exec orly-relay sh -c 'curl http://localhost:6060/debug/pprof/profile?seconds=30 > /tmp/cpu.prof'
|
|
```
|
|
|
|
## Cleanup
|
|
|
|
### Remove Everything
|
|
|
|
```bash
|
|
# Stop and remove containers
|
|
cd scripts && docker-compose -f docker-compose-test.yml down
|
|
|
|
# Remove volumes (data)
|
|
docker-compose -f docker-compose-test.yml down -v
|
|
|
|
# Remove images
|
|
docker rmi orly:latest orly-relay-tester:latest
|
|
|
|
# Remove networks
|
|
docker network rm scripts_orly-network
|
|
|
|
# Prune everything (careful!)
|
|
docker system prune -a --volumes
|
|
```
|
|
|
|
### Selective Cleanup
|
|
|
|
```bash
|
|
# Just stop containers (keep data)
|
|
docker-compose -f docker-compose-test.yml stop
|
|
|
|
# Remove only one service
|
|
docker-compose -f docker-compose-test.yml rm -s -f orly
|
|
|
|
# Clear dgraph data
|
|
docker volume rm scripts_dgraph-data
|
|
```
|
|
|
|
## Related Documentation
|
|
|
|
- [Main Testing Guide](DGRAPH_TESTING.md)
|
|
- [Package Tests](../pkg/dgraph/TESTING.md)
|
|
- [Docker Documentation](https://docs.docker.com/)
|
|
- [Docker Compose](https://docs.docker.com/compose/)
|
|
|
|
## Best Practices
|
|
|
|
1. **Always use health checks** - Ensure services are ready
|
|
2. **Use specific tags** - Don't rely on :latest in production
|
|
3. **Limit resources** - Prevent container resource exhaustion
|
|
4. **Volume backups** - Backup dgraph-data volume before updates
|
|
5. **Network isolation** - Use custom networks for security
|
|
6. **Read-only root** - Run as non-root user
|
|
7. **Clean up regularly** - Remove unused containers/volumes
|