Mac Mini Server
Mac Mini Server
The production environment runs on a Mac Mini, accessible via Cloudflare Tunnel.
Server Access
Domain: mana.how
SSH Configuration
Add to ~/.ssh/config:
Host mana-server HostName mac-mini.mana.how User till ProxyCommand /opt/homebrew/bin/cloudflared access ssh --hostname %hConnect
ssh mana-serverDirectory Structure
~/projects/manacore-monorepo/├── docker-compose.macmini.yml # Production compose file├── .env.production # Production environment├── scripts/mac-mini/ # Server management scripts│ ├── status.sh # Check all services│ ├── deploy.sh # Pull & restart│ └── health-check.sh # Run health checks└── ...Common Operations
Check Status
ssh mana-servercd ~/projects/manacore-monorepo./scripts/mac-mini/status.shOutput:
=== Service Status ===postgres running (healthy)redis running (healthy)mana-auth running (healthy)chat-backend running (healthy)...Deploy Updates
ssh mana-servercd ~/projects/manacore-monorepo./scripts/mac-mini/deploy.shThis script:
- Pulls latest code from git
- Rebuilds Docker images
- Restarts containers with zero-downtime
View Logs
# All servicesdocker compose -f docker-compose.macmini.yml logs -f
# Specific servicedocker compose -f docker-compose.macmini.yml logs -f chat-backend
# Last 100 linesdocker compose -f docker-compose.macmini.yml logs --tail=100 mana-authRestart Services
# Single servicedocker compose -f docker-compose.macmini.yml restart chat-backend
# All servicesdocker compose -f docker-compose.macmini.yml restart
# Full rebuilddocker compose -f docker-compose.macmini.yml up -d --buildDocker Compose Configuration
docker-compose.macmini.yml
version: '3.8'
services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: manacore POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U manacore"] interval: 10s timeout: 5s retries: 5
redis: image: redis:7-alpine command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5
mana-auth: build: context: . dockerfile: services/mana-core-auth/Dockerfile environment: - DATABASE_URL=postgresql://manacore:${POSTGRES_PASSWORD}@postgres:5432/manacore - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379 depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/health"] interval: 30s timeout: 10s retries: 3
chat-backend: build: context: . dockerfile: apps/chat/apps/backend/Dockerfile environment: - DATABASE_URL=postgresql://manacore:${POSTGRES_PASSWORD}@postgres:5432/chat - MANA_CORE_AUTH_URL=http://mana-auth:3001 depends_on: - mana-auth - postgres
volumes: postgres_data: redis_data:Health Checks
Run Health Checks
./scripts/mac-mini/health-check.shCheck Individual Service
# Auth servicecurl http://localhost:3001/health
# Chat backendcurl http://localhost:3002/api/v1/health
# From outside via tunnelcurl https://api.mana.how/healthCloudflare Tunnel
Configuration
The tunnel routes traffic from Cloudflare to local services:
tunnel: mana-tunnelcredentials-file: ~/.cloudflared/mana-tunnel.json
ingress: - hostname: api.mana.how service: http://localhost:3001 - hostname: chat-api.mana.how service: http://localhost:3002 - hostname: mac-mini.mana.how service: ssh://localhost:22 - service: http_status:404Manage Tunnel
# Check tunnel statuscloudflared tunnel info mana-tunnel
# Restart tunnelsudo launchctl stop com.cloudflare.cloudflaredsudo launchctl start com.cloudflare.cloudflared
# View tunnel logstail -f /var/log/cloudflared.logBackup & Recovery
Database Backup
# Manual backupdocker exec postgres pg_dump -U manacore manacore > backup_$(date +%Y%m%d).sql
# Automated daily backups (via cron)0 2 * * * /home/till/scripts/backup-databases.shRestore Database
# Stop servicesdocker compose -f docker-compose.macmini.yml stop chat-backend
# Restoredocker exec -i postgres psql -U manacore manacore < backup_20240115.sql
# Start servicesdocker compose -f docker-compose.macmini.yml start chat-backendMonitoring
Resource Usage
# Container statsdocker stats
# Disk usagedocker system df
# System resourceshtopAlerts
Troubleshooting
Container Won’t Start
# Check logsdocker compose -f docker-compose.macmini.yml logs service-name
# Check container statusdocker ps -a
# Restart with fresh builddocker compose -f docker-compose.macmini.yml up -d --build service-nameOut of Disk Space
# Check disk usagedf -h
# Clean Dockerdocker system prune -a --volumes
# Remove old imagesdocker image prune -aDatabase Connection Issues
# Check postgres is runningdocker compose -f docker-compose.macmini.yml ps postgres
# Test connectiondocker exec -it postgres psql -U manacore -c "SELECT 1"
# Check logsdocker compose -f docker-compose.macmini.yml logs postgres