Członkowie i gotowość
Kartoteki członków, status, rodzaj członkostwa oraz terminy badań bez przechowywania diagnoz i zbędnych danych wrażliwych.
Self-hosted panel dla OSP do ewidencji członków, sprzętu, pojazdów, terminów, działań i dokumentacji zdjęciowej.
N3X Remiza przenosi codzienną ewidencję OSP do nowoczesnego panelu WWW. Każda osoba korzysta z indywidualnego konta, a członkowie, sprzęt, terminy i wyjazdy pozostają w prywatnej bazie PostgreSQL uruchomionej na serwerze jednostki.
Dane na serwerze jednostki · PostgreSQL bez publicznego portu · brak telemetrii aplikacji
Hosting zarządzany przez N3X
N3X może przygotować i utrzymywać tę aplikację: od uruchomienia i SSL po aktualizacje, monitoring oraz kopie zapasowe.
Kartoteki członków, status, rodzaj członkostwa oraz terminy badań bez przechowywania diagnoz i zbędnych danych wrażliwych.
Wyposażenie, własność, lokalizacja, numery inwentarzowe, stan gotowości i terminy przeglądów w jednej ewidencji.
Pożary, miejscowe zagrożenia, alarmy fałszywe, ćwiczenia, szkolenia i wyjazdy gospodarcze z czytelną historią.
Wspólny kalendarz łączy wydarzenia z badaniami i przeglądami, a gotowe raporty PDF i CSV można pobrać z aktualnych danych.
Prywatne zdjęcia oraz pliki PDF można przypisać do wyjazdu lub wydarzenia, opisać, pobrać i zweryfikować sumą SHA-256.
Responsywny interfejs i manifest PWA pozwalają korzystać z panelu w remizie, pojeździe i poza stanowiskiem komputerowym.
Indywidualne konta, bezpieczne sesje HttpOnly, role przygotowane pod zespół i rejestr najważniejszych operacji.
DOCKER COMPOSE
Jedna konfiguracja uruchamia panel, worker i PostgreSQL. Hasło bazy oraz materiały pozostają w prywatnych wolumenach, a na zewnątrz wystawiany jest wyłącznie port aplikacji.
KONFIGURATOR DOCKER
Ustaw domenę, adres nasłuchu, port i wersję obrazu. Konfigurator przygotuje gotowy plik Docker Compose oraz komendy startowe — bez pliku .env.
Domena musi wskazywać na reverse proxy jednostki. Nie wpisuj https:// ani ścieżki.
0.0.0.0 zapewnia dostęp z LAN i proxy. Użyj 127.0.0.1, gdy proxy działa na tym samym hoście i port ma pozostać lokalny.
Port panelu dostępny dla LAN lub reverse proxy. Domyślnie 8791.
Zostaw latest dla najnowszego wydania albo przypnij konkretną wersję.
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:
mkdir -p n3xremiza
cd n3xremiza
# Zapisz skopiowaną konfigurację jako docker-compose.yml
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8791/api/health