AirTrail logo

AirTrail

A modern, open-source personal flight tracking system

Alternative to: flighty, app in the air, tripit

AirTrail screenshot

AirTrail is a self-hosted web application for tracking flights and viewing flight history. It plots all your flights on an interactive world map, generates statistics from your flight history, and supports multiple users with OAuth-based authentication and flight sharing. It can import flight data from services like MyFlightRadar24, App in the Air, TripIt, and Flighty.

AirTrail Docker Compose example

Self-host AirTrail on your own server, homelab, or VPS starting from this Docker Compose example. It runs AirTrail in Docker containers using the official postgres:16-alpine, johly/airtrail:latest images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  db:
    image: postgres:16-alpine
    environment:
      # Internal Postgres credentials (database is only reachable inside the compose network)
      POSTGRES_DB: "airtrail"
      POSTGRES_USER: "airtrail"
      # Use only A-Za-z0-9 characters to avoid issues with the connection string
      POSTGRES_PASSWORD: "password"
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U airtrail -d airtrail"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  airtrail:
    image: johly/airtrail:latest
    depends_on:
      db:
        condition: service_healthy
    environment:
      # Public URL the app is accessed from. For https behind a reverse proxy you may need to append :443.
      # Multiple domains can be passed as a comma-separated list.
      ORIGIN: "http://localhost:3000"
      # Connection string to the bundled Postgres — the password must match POSTGRES_PASSWORD above
      DB_URL: "postgres://airtrail:password@db:5432/airtrail"
      # Directory (inside the container, mapped to the uploads volume) where uploaded files are stored
      UPLOAD_LOCATION: "/app/uploads"
    volumes:
      - uploads:/app/uploads
    restart: unless-stopped

volumes:
  db_data:
  uploads:

Prefer a managed setup? WinterFlow installs, configures, and updates AirTrail for you using this same Docker Compose configuration.