Back to tools

N3X Station

A self-hosted panel for volunteer fire brigades to manage members, equipment, vehicles, deadlines, operations and photographic records.

SELF-HOSTED OSPv0.1.3

An organized brigade. Available on every device.

N3X Station moves everyday volunteer fire department records into a modern web panel. Every person uses an individual account while members, equipment, deadlines and activities remain in a private PostgreSQL database on the department's server.

Data on the brigade's server · no public PostgreSQL port · no application telemetry

Managed hosting by N3X

Want to use it without maintaining the server?

N3X can deploy and maintain this application, from initial setup and SSL to updates, monitoring and backups.

Ask about N3X hosting

The foundation of a digital fire station

Members and readiness

Member records, status, membership type and medical validity dates without storing diagnoses or unnecessary sensitive data.

Equipment and vehicles

Inventory, ownership, location, asset numbers, readiness status and inspection dates in one register.

Operations and call-outs

Fires, local hazards, false alarms, exercises, training and administrative trips with a clear history.

Calendar and reports

A shared calendar combines events with medical and inspection dates, while ready-to-use PDF and CSV reports use the current records.

Photos and documentation

Private photos and PDF files can be linked to an activity or event, described, downloaded and verified with a SHA-256 checksum.

Computer, tablet and phone

A responsive interface and PWA manifest make the panel usable at the station, in a vehicle and away from a desktop.

Accounts, roles and audit

Individual accounts, secure HttpOnly sessions, team-ready roles and an audit trail for the most important operations.

DOCKER COMPOSE

A private stack for the brigade

One configuration starts the panel, worker and PostgreSQL. The database password and materials remain in private volumes and only the application port is exposed.

N3X Station Web — dashboard, first-run setup and authentication
N3X Station Worker — administrative deadlines and session cleanup
PostgreSQL 17 — private brigade records and audit history
Your reverse proxy — HTTPS, a custom domain, or VPN/LAN-only access

DOCKER CONFIGURATOR

Compose tailored to your fire station

Set the domain, bind address, port and image version. The configurator prepares a ready-to-use Docker Compose file and startup commands — without an .env file.

The domain must point to the brigade's reverse proxy. Do not include https:// or a path.

0.0.0.0 provides LAN and proxy access. Use 127.0.0.1 when the proxy runs on the same host and the port should remain local.

The panel port available to the LAN or reverse proxy. The default is 8791.

Keep latest for the newest release or pin a specific version.

The first account is created in the web panel. After startup, open http://SERVER_IP:8791 and create the owner account immediately. Before Internet access, restrict the port with a firewall and enable HTTPS through a reverse proxy. Create consistent backups of postgres_data, runtime_secrets and attachments_data.
Public address
https://remiza.example.com
First-run address
http://DOCKER_SERVER_IP:8791
Reverse proxy target
http://DOCKER_SERVER_IP:8791
Health check
http://127.0.0.1:8791/api/health

Ready-to-use docker-compose.yml

name: n3xremiza

x-app-environment: &app-environment
  N3XREMIZA_DATABASE_PASSWORD_FILE: /run/n3xremiza/database_password
  N3XREMIZA_GEOCODING_BASE_URL: ${N3XREMIZA_GEOCODING_BASE_URL:-https://photon.komoot.io}
  N3XREMIZA_GEOCODING_BBOX: ${N3XREMIZA_GEOCODING_BBOX:-14.122,49.002,24.145,54.835}
  N3XREMIZA_TRUST_PROXY_HOPS: ${N3XREMIZA_TRUST_PROXY_HOPS:-0}
  N3XREMIZA_AUTH_AUDIT_RETENTION_DAYS: ${N3XREMIZA_AUTH_AUDIT_RETENTION_DAYS:-365}
  TZ: Europe/Warsaw

x-app-security: &app-security
  read_only: true
  security_opt:
    - no-new-privileges:true
  cap_drop:
    - ALL
  tmpfs:
    - /tmp:size=64m,mode=1777
    - /app/.next/cache:size=128m,mode=0700,uid=1001,gid=1001

services:
  bootstrap:
    image: alpine:3.22
    restart: "no"
    command:
      - /bin/sh
      - -ec
      - |
        umask 077
        if [ ! -s /run/n3xremiza/database_password ]; then
          od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xremiza/database_password
        fi
        chmod 0444 /run/n3xremiza/database_password
    volumes:
      - runtime_secrets:/run/n3xremiza
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL

  web:
    image: ghcr.io/nexitpl/n3xremiza:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xremiza:ro
      - attachments_data:/app/data/attachments
    ports:
      # Keep this port behind a host firewall until the owner account exists.
      # For Internet access, place the app behind an HTTPS reverse proxy.
      - "0.0.0.0:8791:3000"
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:3000/api/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - frontend
      - backend
    <<: *app-security

  worker:
    image: ghcr.io/nexitpl/n3xremiza:latest
    pull_policy: always
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
      postgres:
        condition: service_healthy
      web:
        condition: service_healthy
    environment: *app-environment
    volumes:
      - runtime_secrets:/run/n3xremiza:ro
    command: ["node", "dist/worker.mjs"]
    networks:
      - backend
    <<: *app-security

  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    depends_on:
      bootstrap:
        condition: service_completed_successfully
    environment:
      POSTGRES_DB: n3xremiza
      POSTGRES_USER: n3xremiza
      POSTGRES_PASSWORD_FILE: /run/n3xremiza/database_password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - runtime_secrets:/run/n3xremiza:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n3xremiza -d n3xremiza"]
      interval: 5s
      timeout: 5s
      retries: 12
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true

volumes:
  postgres_data:
  runtime_secrets:
  attachments_data:

Start and health check

mkdir -p n3xremiza
cd n3xremiza
# Save the copied configuration as docker-compose.yml
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8791/api/health

Changelog

    • NewPhotos and PDF documents attached to operations and events, with access control, file limits and SHA-256 checksums.
    • NewAn interactive operations map with address suggestions, device geolocation and manual incident placement.
    • NewThe brigade's own location and a fire-station map layer alongside the incident-type legend.
    • NewHolidays and dates relevant to volunteer fire brigades in the calendar, plus archiving of incorrectly added operations.
    • ImprovementA refined mobile layout, fixed desktop sidebar and consistent current-release messaging on the product page.
    • ImprovementA dedicated app icon and fire-service N3X interface variant with clear active-section states on desktop and mobile.
    • NewIndividual user accounts, roles and per-module permissions.
    • NewUser administration with password resets, account blocking and active-session management.
    • NewAn activity log covering sign-ins, data changes, deletions and report exports.
    • NewA monthly calendar with one-off and recurring events plus deadline reminders.
    • NewPDF reports and CSV exports for members, assets and operations.
    • ImprovementA complete Polish and English interface with phone-optimised navigation.
    • ReleaseFirst self-hosted release deployed with Docker Compose: web panel, worker and PostgreSQL.
    • NewCore records for the brigade, members, equipment, vehicles, deadlines and operations.
Not an alerting system. Notifications cover administrative deadlines. N3X Station does not replace dispatch systems, SMS alerting or any operational department mobilisation channel.