Troubleshooting

πŸ”§ Troubleshooting Guide

πŸ“˜

Welcome to SkysPy Support

This comprehensive guide helps you diagnose and resolve issues quickly. Use the diagnostic flowcharts, quick fix tables, and detailed solutions to get back on track.


🎯 System Overview

SkysPy is a multi-component system. Understanding which component is affected speeds up troubleshooting.

flowchart TB
    subgraph Frontend["πŸ–₯️ Frontend Layer"]
        WEB[React Web App]
        WS_CLIENT[Socket.IO Client]
    end

    subgraph API["⚑ API Layer"]
        DJANGO[Django API Server]
        DAPHNE[ASGI/Daphne]
    end

    subgraph Workers["βš™οΈ Background Processing"]
        CELERY[Celery Workers]
        BEAT[Celery Beat Scheduler]
    end

    subgraph Data["πŸ’Ύ Data Layer"]
        POSTGRES[(PostgreSQL)]
        REDIS[(Redis)]
    end

    subgraph External["🌐 External"]
        ADSB[ADS-B Receiver]
        ACARS[ACARS Decoder]
    end

    WEB --> DJANGO
    WS_CLIENT --> DAPHNE
    DJANGO --> POSTGRES
    DJANGO --> REDIS
    CELERY --> REDIS
    CELERY --> POSTGRES
    BEAT --> REDIS
    CELERY --> ADSB
    CELERY --> ACARS

πŸ₯ Health Check Status

βœ…

Quick Health Check

Always start troubleshooting by checking system health:

curl -s http://localhost:8000/health | jq

Status Indicators

StatusBadgeMeaning
HealthyHealthyAll services operational
DegradedDegradedSome services experiencing issues
UnhealthyUnhealthyCritical services down

Service Status Reference

Service StatusBadgeDescription
upUpService responding normally
downDownService unreachable
degradedDegradedResponding with issues
unknownUnknownStatus cannot be determined

πŸ” Diagnostic Flowchart

Use this flowchart to quickly identify your issue:

flowchart TD
    START([🚨 Issue Detected]) --> Q1{Can you access<br/>the web interface?}

    Q1 -->|No| WEB_ISSUE[πŸ–₯️ Frontend Issue]
    Q1 -->|Yes| Q2{Is data loading?}

    Q2 -->|No| Q3{Health check<br/>passing?}
    Q2 -->|Yes| Q4{Real-time updates<br/>working?}

    Q3 -->|No| API_ISSUE[⚑ API/Database Issue]
    Q3 -->|Yes| DATA_ISSUE[πŸ“‘ ADS-B Connection Issue]

    Q4 -->|No| WS_ISSUE[πŸ”Œ Socket.IO Issue]
    Q4 -->|Yes| Q5{Performance<br/>acceptable?}

    Q5 -->|No| PERF_ISSUE[🐒 Performance Issue]
    Q5 -->|Yes| SUCCESS([βœ… System Healthy])

    WEB_ISSUE --> WEB_FIX["Check nginx/frontend logs"]
    API_ISSUE --> API_FIX["Check database & Redis"]
    DATA_ISSUE --> DATA_FIX["Check ultrafeeder connection"]
    WS_ISSUE --> WS_FIX["Check Redis channel layer"]
    PERF_ISSUE --> PERF_FIX["Review resource usage"]

πŸ“‹ Quick Diagnostic Checklist

πŸ’‘

Pro Tip

Run these commands in order. Most issues are caught in the first 3 steps.

StepCommandWhat It Checks
1️⃣curl -s http://localhost:8000/health | jqOverall system health
2️⃣docker compose psContainer status
3️⃣docker compose logs --tail=50 apiRecent API errors
4️⃣docker compose exec api ping postgresDatabase connectivity
5️⃣docker compose exec redis redis-cli pingRedis connectivity
6️⃣curl -s http://localhost:8000/api/v1/system/status | jqDetailed system status

πŸ› Common Issues & Solutions

πŸ”΄ Connection Problems

❌ API Server Cannot Connect to Database

Symptoms

  • 🚫 API returns 500 errors
  • πŸ“Š Health check shows database: down
  • πŸ“ Logs show OperationalError: could not connect to server

Diagnostic Flowchart

flowchart TD
    A[Database Connection Error] --> B{Is PostgreSQL<br/>container running?}
    B -->|No| C[Start PostgreSQL]
    B -->|Yes| D{Can you ping<br/>postgres host?}
    D -->|No| E[Check Docker network]
    D -->|Yes| F{Are credentials<br/>correct?}
    F -->|No| G[Fix DATABASE_URL]
    F -->|Yes| H{Max connections<br/>exceeded?}
    H -->|Yes| I[Increase max_connections]
    H -->|No| J[Check PostgreSQL logs]

    C --> K([πŸ”„ Restart & Retry])
    E --> K
    G --> K
    I --> K
    J --> K

Quick Fix Commands

IssueCommand
Check if runningdocker compose ps postgres
View logsdocker compose logs postgres
Test connectiondocker compose exec postgres psql -U adsb -d adsb -c "SELECT 1;"
Check networkdocker compose exec api ping postgres
Verify DATABASE_URLdocker compose exec api python -c "from django.conf import settings; print(settings.DATABASE_URL)"

Solutions

  1. Verify PostgreSQL is running:

    docker compose ps postgres
    docker compose logs postgres
  2. Check connection parameters:

    docker compose exec api python -c "from django.conf import settings; print(settings.DATABASE_URL)"
  3. Test direct connection:

    docker compose exec postgres psql -U adsb -d adsb -c "SELECT 1;"
  4. Review connection timeout settings:

    # In settings.py, connection timeout is set to 10 seconds
    'OPTIONS': {
        'connect_timeout': 10,
    }
⚠️

Common Causes

  • PostgreSQL container not fully initialized
  • Incorrect DATABASE_URL environment variable
  • Network isolation between containers
  • PostgreSQL max connections exceeded

❌ Redis Connection Refused

Symptoms

  • πŸ”Œ Socket.IO connections fail
  • βš™οΈ Celery workers cannot start
  • πŸ’Ύ Cache operations fail
  • πŸ“Š Health check shows cache: down

Quick Fix Commands

IssueCommand
Check if runningdocker compose ps redis
View logsdocker compose logs redis
Test connectiondocker compose exec redis redis-cli ping
Check memorydocker compose exec redis redis-cli info memory
Verify REDIS_URLdocker compose exec api python -c "from django.conf import settings; print(settings.REDIS_URL)"

Solutions

  1. Verify Redis is running:

    docker compose ps redis
    docker compose logs redis
  2. Test Redis connection:

    docker compose exec redis redis-cli ping
    # Expected: PONG
  3. Verify Redis memory:

    docker compose exec redis redis-cli info memory
πŸ“

Environment Variable

REDIS_URL=redis://redis:6379/0

❌ Cannot Connect to Ultrafeeder/ADS-B Receiver

Symptoms

  • ✈️ No aircraft appearing in the interface
  • πŸ“Š Status shows adsb_online: false
  • πŸ“ Logs show connection errors to ultrafeeder

Quick Fix Commands

IssueCommand
Test ultrafeederdocker compose exec api curl -s http://ultrafeeder:80/data/aircraft.json | head -c 200
Check polling taskdocker compose logs -f celery-worker | grep -E "(poll_aircraft|ultrafeeder)"
Test from hostcurl -s http://localhost:8080/data/aircraft.json

Solutions

  1. Verify ultrafeeder is accessible:

    docker compose exec api curl -s http://ultrafeeder:80/data/aircraft.json | head -c 200
  2. Check environment configuration:

    ULTRAFEEDER_HOST=ultrafeeder
    ULTRAFEEDER_PORT=80
  3. Review polling task logs:

    docker compose logs -f celery-worker | grep -E "(poll_aircraft|ultrafeeder)"

🟑 Database Issues

⚠️ Database Migrations Failing

Symptoms

  • 🚫 API fails to start
  • πŸ“ Logs show django.db.utils.ProgrammingError
  • ❓ Missing tables or columns

Quick Fix Commands

ActionCommand
Run migrationsdocker compose exec api python manage.py migrate
Check statusdocker compose exec api python manage.py showmigrations
Reset app migrationsdocker compose exec api python manage.py migrate skyspy zero && docker compose exec api python manage.py migrate skyspy
Generate migrationsdocker compose exec api python manage.py makemigrations

⚠️ Database Performance Degradation

Symptoms

  • 🐒 Slow API responses
  • πŸ“ˆ High database CPU usage
  • ⏱️ Query timeouts

Quick Fix Commands

ActionCommand
Check table sizesSee SQL query below
Run VACUUMdocker compose exec postgres psql -U adsb -d adsb -c "VACUUM ANALYZE;"
List indexesdocker compose exec api python manage.py dbshell then \di
Monitor queriesSee SQL query below
Enable RPi settingsDJANGO_SETTINGS_MODULE=skyspy.settings_rpi

SQL Queries

Check table sizes:

SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;

Monitor active queries:

SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

⚠️ Database Disk Space Full

Symptoms

  • ✏️ Write operations fail
  • πŸ“ Logs show No space left on device

Quick Fix Commands

ActionCommand
Check disk usagedocker compose exec postgres df -h /var/lib/postgresql/data
Run cleanupSee Python command below
Full vacuumdocker compose exec postgres vacuumdb -U adsb -d adsb --full --analyze

Cleanup Command

docker compose exec api python manage.py shell -c "
from skyspy.tasks.cleanup import run_all_cleanup_tasks
run_all_cleanup_tasks()
"
⚠️

Manual Truncation (Use with Caution)

-- Only if you're sure you want to delete data
DELETE FROM skyspy_aircraftsighting WHERE timestamp < NOW() - INTERVAL '7 days';

🟠 Socket.IO Issues

πŸ”Œ Socket.IO Connections Dropping Frequently

Symptoms

  • ✈️ Aircraft disappear intermittently
  • πŸ–₯️ Browser console shows Socket.IO errors
  • πŸ‘₯ Users report real-time updates stopping

Diagnostic Flowchart

flowchart TD
    A[Socket.IO Dropping] --> B{Can you connect<br/>to Socket.IO endpoint?}
    B -->|No| C{Is API server<br/>running?}
    B -->|Yes| D{Connections<br/>stable locally?}

    C -->|No| E[Start API server]
    C -->|Yes| F[Check reverse proxy config]

    D -->|Yes| G[Check network/firewall]
    D -->|No| H{Redis channel<br/>layer working?}

    H -->|No| I[Check Redis connection]
    H -->|Yes| J[Check rate limits]

    E --> K([πŸ”„ Retry])
    F --> K
    G --> K
    I --> K
    J --> K

Quick Fix Commands

ActionCommand
Check channel layerSee Python command below
View ASGI logsdocker compose logs -f api | grep -E "(Socket\.IO|channels)"
Test Socket.IO endpointSee browser console test below

Test Channel Layer

docker compose exec api python -c "
from channels.layers import get_channel_layer
import asyncio
layer = get_channel_layer()
print('Channel layer:', layer)
"

Browser Console Test

import { io } from 'socket.io-client';

const socket = io('http://localhost:8000/aircraft', {
  path: '/socket.io/',
  transports: ['websocket', 'polling']
});

socket.on('connect', () => console.log('βœ… Connected'));
socket.on('connect_error', (e) => console.error('❌ Error:', e));
socket.on('disconnect', (reason) => console.log('πŸ”Œ Disconnected:', reason));
πŸ’‘

Rate Limits

WS_RATE_LIMITS = {
    'aircraft:update': 10,      # Max 10 Hz
    'aircraft:position': 5,     # Max 5 Hz
    'stats:update': 0.5,        # Max 0.5 Hz
}
πŸ“˜

Auto-Reconnection

The frontend implements automatic reconnection with exponential backoff:

  • Initial delay: 1 second
  • Maximum delay: 30 seconds
  • Heartbeat ping every 30 seconds with 10-second timeout

πŸ” Socket.IO Authentication Failures

Symptoms

  • πŸ”’ Socket.IO disconnects with authentication errors
  • πŸ“ Logs show Socket.IO auth error

Error Code Reference

CodeBadgeMeaningSolution
40014001Authentication requiredPass JWT token
40034003Token expiredRefresh token
40044004Invalid tokenRe-authenticate

Solutions

  1. Check AUTH_MODE setting:

    # public: No auth required
    # private: Auth required for all
    # hybrid: Feature-based auth (default)
    AUTH_MODE=hybrid
  2. Verify JWT token is being passed:

    // Token should be passed in Socket.IO auth or query params
    const socket = io('http://host/aircraft', {
      path: '/socket.io/',
      auth: { token: '<jwt_token>' },
      query: { token: '<jwt_token>' }
    });
  3. Check token expiration:

    JWT_ACCESS_TOKEN_LIFETIME_MINUTES=60

πŸ”΄ Performance Problems

🐒 High CPU Usage on Raspberry Pi

Symptoms

  • πŸ’» System becomes unresponsive
  • ✈️ Aircraft updates lag
  • 🌑️ Temperature warnings

Quick Fix Table

SettingRecommended ValuePurpose
DJANGO_SETTINGS_MODULEskyspy.settings_rpiRPi-optimized config
POLLING_INTERVAL3Reduce poll frequency
--concurrency2Limit Celery workers
TRANSCRIPTION_ENABLEDFalseDisable audio processing
PHOTO_AUTO_DOWNLOADFalseDisable photo fetching

Solutions

  1. Use RPi-optimized settings:

    DJANGO_SETTINGS_MODULE=skyspy.settings_rpi
  2. Reduce polling frequency:

    POLLING_INTERVAL=3  # Default is 2 seconds
  3. Limit Celery concurrency:

    # In docker-compose.yml
    command: celery -A skyspy worker -l info --concurrency=2
  4. Monitor resource usage:

    docker stats

πŸ’Ύ Memory Exhaustion

Symptoms

  • πŸ’€ OOMKilled containers
  • πŸ“Š Swap usage high
  • πŸ”„ Services restarting

Quick Fix Table

SolutionSetting/Command
Check usagedocker stats --no-stream
Set memory limitsSee docker-compose.yml example
Reduce cache sizeMAX_SEEN_AIRCRAFT=5000
Manual cleanupcleanup_memory_cache task

Docker Compose Memory Limits

services:
  api:
    deploy:
      resources:
        limits:
          memory: 512M
πŸ’‘

Bounded Caches

# In services/cache.py - enabled by default
aircraft_info_cache = BoundedCache(maxsize=5000)
route_cache = BoundedCache(maxsize=1000)

🐌 Slow API Responses

Symptoms

  • ⏱️ API requests taking > 1 second
  • βŒ› Timeouts on complex queries

Quick Fix Table

ActionHow
Enable Debug ToolbarDEBUG=True (dev only)
Check query countsSee Python command below
Check cache statsGET /api/v1/system/status
Increase connection poolingCONN_MAX_AGE=60

Check Query Counts

docker compose exec api python manage.py shell -c "
from django.db import connection
# Make API request
print(len(connection.queries))
"
πŸ’‘

Performance Tips

  • Use select_related() and prefetch_related() in querysets
  • Review N+1 query issues
  • Enable query logging in development

πŸ› οΈ Debug Command Reference

Django Management Commands

CommandPurposeBadge
python manage.py checkValidate Django configDjango
python manage.py dbshellDatabase shellDB
python manage.py shellDjango shellPython
python manage.py show_urlsList all URL routesURLs
python manage.py sync_celery_tasksSync Celery tasks to DBCelery
# Full commands with docker compose
docker compose exec api python manage.py check
docker compose exec api python manage.py dbshell
docker compose exec api python manage.py shell
docker compose exec api python manage.py show_urls
docker compose exec api python manage.py sync_celery_tasks

Celery Debugging

CommandPurpose
celery -A skyspy inspect registeredCheck registered tasks
celery -A skyspy inspect activeView active tasks
celery -A skyspy inspect scheduledView scheduled tasks
celery -A skyspy purgePurge pending tasks
celery -A skyspy eventsMonitor tasks real-time
# Full commands with docker compose
docker compose exec celery-worker celery -A skyspy inspect registered
docker compose exec celery-worker celery -A skyspy inspect active
docker compose exec celery-worker celery -A skyspy inspect scheduled
docker compose exec celery-worker celery -A skyspy purge
docker compose exec celery-worker celery -A skyspy events

Network Debugging

CommandPurpose
nslookup postgresTest DNS resolution
nc -zv postgres 5432Check port connectivity
netstat -tulnList network connections
# Full commands with docker compose
docker compose exec api nslookup postgres
docker compose exec api nslookup redis
docker compose exec api nc -zv postgres 5432
docker compose exec api nc -zv redis 6379
docker compose exec api netstat -tuln

Redis Debugging

CommandPurpose
redis-cli monitorMonitor commands real-time
redis-cli keys "skyspy*"Check key patterns
redis-cli pubsub channelsView channel subscribers
redis-cli --bigkeysMemory usage by key pattern
# Full commands with docker compose
docker compose exec redis redis-cli monitor
docker compose exec redis redis-cli keys "skyspy*"
docker compose exec redis redis-cli pubsub channels
docker compose exec redis redis-cli --bigkeys

πŸ“Š Log Analysis

Log Configuration

πŸ“

Environment Variables

DJANGO_LOG_LEVEL=INFO    # Django framework logs
DEBUG=False              # Set True for verbose output

Logger Reference

LoggerPurposeDefault LevelBadge
djangoDjango frameworkINFODjango
skyspyApplication codeDEBUG (if DEBUG=True)App
celeryCelery workersINFOCelery

Log Commands

ActionCommand
All servicesdocker compose logs -f
Specific servicedocker compose logs -f api
Filter errorsdocker compose logs -f api | grep -E "(ERROR|WARNING)"
Last N linesdocker compose logs --tail=100 api
Since timestampdocker compose logs --since="2024-01-01T00:00:00" api

Common Log Patterns

βœ…

Successful Aircraft Poll

INFO skyspy.tasks.aircraft Polled 47 aircraft in 0.12s
❌

Database Connection Issue

ERROR django.db.backends OperationalError: could not connect to server
πŸ”Œ

Socket.IO Connection

INFO skyspy.socketio Socket.IO connected: specific.ABC123, topics: ['all']
⚠️

Celery Task Failure

ERROR celery.app.trace Task skyspy.tasks.aircraft.poll_aircraft raised unexpected exception

Sentry Integration

πŸ”

Production Error Tracking

Configure Sentry for comprehensive error monitoring:

SENTRY_DSN=https://[email protected]/project
SENTRY_ENVIRONMENT=production
SENTRY_TRACES_SAMPLE_RATE=0.1  # 10% of transactions
SENTRY_PROFILES_SAMPLE_RATE=0.1

Sentry automatically captures:

  • πŸ› Unhandled exceptions
  • πŸ“Š Performance traces
  • βš™οΈ Celery task failures
  • πŸ’Ύ Database query timing

πŸ₯ Health Check Endpoints

GET /health

Simple health check for load balancers and monitoring systems.

{
  "status": "healthy",
  "services": {
    "database": {
      "status": "up",
      "latency_ms": 1.23
    },
    "cache": {
      "status": "up"
    },
    "celery": {
      "status": "up"
    },
    "libacars": {
      "status": "up",
      "circuit_state": "closed",
      "healthy": true
    }
  },
  "timestamp": "2024-01-15T12:00:00Z"
}

GET /api/v1/system/status

Comprehensive system status including statistics.

{
  "version": "2.6.0",
  "adsb_online": true,
  "aircraft_count": 47,
  "total_sightings": 125000,
  "total_sessions": 8500,
  "active_rules": 5,
  "safety_monitoring_enabled": true,
  "safety_tracked_aircraft": 12,
  "notifications_configured": true,
  "redis_enabled": true,
  "socketio_connections": 3,
  "acars_enabled": true,
  "acars_running": true,
  "polling_interval_seconds": 2,
  "celery_running": true,
  "celery_tasks": [
    "poll-aircraft-every-2s",
    "cleanup-sessions-every-5m"
  ],
  "location": {
    "latitude": 47.9377,
    "longitude": -121.9687
  },
  "antenna": {
    "max_range_nm": 250.5,
    "coverage_percentage": 85.2
  },
  "libacars": {
    "available": true,
    "stats": {
      "decoded": 1500,
      "failed": 12
    }
  }
}

GET /api/v1/system/info

API information and endpoint documentation.

GET /metrics (Prometheus)

πŸ“Š

Prometheus Metrics

Enable with PROMETHEUS_ENABLED=True

Metrics Include:

  • πŸ“ˆ Request counts and latencies
  • πŸ’Ύ Database connection pool stats
  • 🎯 Cache hit/miss rates
  • βš™οΈ Celery task execution times
  • πŸ“‘ libacars decoding statistics

❓ FAQ

πŸ”§ General

How do I reset everything and start fresh?

Remove all containers and volumes:

docker compose down -v
docker compose up -d
⚠️

Warning

This deletes all data including aircraft history.

How do I backup my database?

Backup:

docker compose exec postgres pg_dump -U adsb adsb > backup.sql

Restore:

cat backup.sql | docker compose exec -T postgres psql -U adsb adsb
How do I update to a new version?
docker compose pull
docker compose up -d
docker compose exec api python manage.py migrate

πŸ” Authentication

I forgot the admin password. How do I reset it?
docker compose exec api python manage.py changepassword admin

Or create a new superuser:

docker compose exec api python manage.py createsuperuser
How do I disable authentication for testing?

Set AUTH_MODE=public in your environment:

AUTH_MODE=public
🚨

Security Warning

Never use public mode in production.

Why am I getting 401 Unauthorized errors?

Check that:

  1. βœ… Your JWT token is valid and not expired
  2. βœ… The Authorization header format is correct: Authorization: Bearer <token>
  3. βœ… AUTH_MODE is not set to private without providing credentials
  4. βœ… API keys are enabled if using X-API-Key header

⚑ Performance

How many aircraft can SkysPy track?
HardwareRAMCapacity
Standard server4GB+500+ aircraft (full features), 1000+ (optimized)
Raspberry Pi1-2GB200-300 aircraft (RPi settings)
Why is my Raspberry Pi running slow?

Use the RPi-optimized settings:

DJANGO_SETTINGS_MODULE=skyspy.settings_rpi
POLLING_INTERVAL=3

Also consider:

  • ❌ Disabling transcription
  • ⬇️ Reducing Celery worker concurrency
  • ❌ Disabling auto photo downloads
How do I reduce database storage usage?

Adjust data retention settings:

# In cleanup task settings
DATA_RETENTION_DAYS=7  # Default is 30

Or manually clean old data:

docker compose exec api python manage.py shell -c "
from skyspy.tasks.cleanup import cleanup_old_sightings
cleanup_old_sightings(days=7)
"

πŸ”Œ Socket.IO

Why do I see "Socket.IO connection failed" in the console?

Common causes:

  1. 🌐 CORS issues: Ensure CORS_ALLOWED_ORIGINS includes your frontend URL
  2. πŸ”€ Reverse proxy: Configure Socket.IO proxying in nginx/traefik
  3. πŸ”₯ Firewall: Ensure Socket.IO port is accessible

For nginx, add:

location /socket.io/ {
    proxy_pass http://api:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}
How do I test Socket.IO connectivity?

Using socket.io-client:

# Install socket.io-client
npm install -g socket.io-client

# Test in Node.js
node -e "const io = require('socket.io-client'); \
const socket = io('http://localhost:8000/aircraft', {path: '/socket.io/'}); \
socket.on('connect', () => console.log('Connected'));"

Using browser console:

import { io } from 'socket.io-client';

const socket = io('http://localhost:8000/aircraft', {
  path: '/socket.io/'
});

socket.on('connect', () => console.log('Connected'));
socket.on('aircraft:update', (data) => console.log('Update:', data));

πŸ“‘ ACARS

ACARS messages are not appearing. What should I check?
CheckExpected Value
ACARS_ENABLEDTrue
ACARS_PORT5555
VDLM2_PORT5556

View ACARS logs:

docker compose logs -f api | grep -i acars
How do I decode ACARS messages locally?

SkysPy uses libacars for enhanced decoding. Check status:

curl -s http://localhost:8000/health | jq '.services.libacars'

🌐 External Services

How do I enable weather data (METAR/TAF)?

Configure one of the weather APIs:

AVWX (free, unlimited basic requests):

AVWX_ENABLED=True
AVWX_API_KEY=your-key  # Optional but recommended

CheckWX (free tier: 3000/day):

CHECKWX_ENABLED=True
CHECKWX_API_KEY=your-key
Why are aircraft photos not loading?

Check photo cache settings:

PHOTO_CACHE_ENABLED=True
PHOTO_AUTO_DOWNLOAD=True

Check the cache status:

docker compose exec api python manage.py shell -c "
from skyspy.services.cache import photo_cache
print(photo_cache.get_stats())
"
πŸ’‘

Photos are fetched from planespotters.net with rate limiting.

How do I configure S3 for photo/audio storage?
S3_ENABLED=True
S3_BUCKET=your-bucket
S3_REGION=us-east-1
S3_ACCESS_KEY=your-key
S3_SECRET_KEY=your-secret
S3_PREFIX=aircraft-photos

For S3-compatible storage (MinIO, Backblaze B2):

S3_ENDPOINT_URL=https://s3.example.com

πŸ†˜ Support Resources

πŸ“š Documentation Links

ResourceLinkDescription
πŸ“– Swagger UI/api/docs/Interactive API documentation
πŸ“‹ OpenAPI Schema/api/schema/Machine-readable API spec
πŸ“˜ ReDoc/api/redoc/Alternative API docs

🌐 Community Resources

PlatformPurpose
πŸ› GitHub IssuesReport bugs and feature requests
πŸ’¬ GitHub DiscussionsAsk questions and share configurations
πŸ’¬ Discord/SlackReal-time community support (if available)

πŸ“‹ Collecting Debug Information

When reporting issues, include:

  1. System Information:

    docker compose exec api python -c "
    import sys, platform, django
    print(f'Python: {sys.version}')
    print(f'Platform: {platform.platform()}')
    print(f'Django: {django.get_version()}')
    "
  2. Configuration (sanitized):

    docker compose exec api env | grep -E "^(DEBUG|AUTH_MODE|POLLING|SAFETY)" | sort
  3. Health Check Output:

    curl -s http://localhost:8000/health | jq
  4. Relevant Logs:

    docker compose logs --tail=200 api celery-worker
  5. Error Messages: Include full stack traces and error messages.


πŸ’‘

Still Need Help?

If you've tried the solutions above and still have issues:

  1. πŸ” Search existing GitHub issues
  2. πŸ“ Create a new issue with debug information
  3. πŸ’¬ Join the community discussion

We're here to help! πŸš€