Pięć bramek odbiorowych
Odkrycie, kierunek, projekt, development i wdrożenie mają własny stan, termin oraz jednoznaczną historię przyjęcia.
Self-hosted portal klienta do etapów projektu, odbiorów, skonsolidowanych rund uwag, zmian zakresu i historii decyzji.
N3XFlow zamienia rozproszone maile i komunikatory w premium Project Room: klient zawsze widzi następną akcję, zespół kontroluje zakres, a każda uwaga, akceptacja i decyzja kosztowa zostaje przy właściwym etapie.
Dane na Twoim serwerze · jednorazowe linki e-mail · szyfrowane SMTP · 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.
Odkrycie, kierunek, projekt, development i wdrożenie mają własny stan, termin oraz jednoznaczną historię przyjęcia.
Maksymalnie trzy wspólne odpowiedzi na etap zamiast niekończącego się strumienia sprzecznych wiadomości.
Recenzenci mogą dodawać punkty, ale tylko wyznaczony decision maker zatwierdza etap i dodatkowy koszt.
Błąd, pytanie i zmiana zakresu są rozdzielone, a change order zawiera cenę, harmonogram, ważność i decyzję.
Worker pilnuje odbiorów i zapisuje precyzyjnie, czy etap zaakceptowano ręcznie, czy uznano za przyjęty po terminie.
Klient nie tworzy hasła. Token jest hashowany, jednorazowy, ważny 15 minut i zużywany dopiero po potwierdzeniu.
Append-only audit trail zapisuje aktora, czas, projekt, zdarzenie i kontekst kluczowych decyzji.
Instalacja z własną ikoną, obsługa iOS, dolna nawigacja i bezpieczny ekran offline bez zapisywania treści projektów.
DOCKER COMPOSE
Jedna konfiguracja uruchamia portal, worker i PostgreSQL. Branding agencji oraz SMTP ustawia właściciel w zabezpieczonym panelu, a sekrety nie trafiają do Compose.
KONFIGURATOR DOCKER
Ustaw domenę, adres nasłuchu, port i wersję obrazu. Konfigurator przygotuje gotowy plik Docker Compose oraz komendy startowe — bez ręcznego zarządzania sekretami.
Domena musi wskazywać na reverse proxy. Nie wpisuj https:// ani ścieżki.
0.0.0.0 zapewnia dostęp z LAN i proxy. Użyj 127.0.0.1, gdy reverse proxy działa na tym samym hoście.
Port aplikacji dla reverse proxy. Domyślnie 8792.
Zostaw latest dla najnowszego wydania albo przypnij konkretną wersję.
name: n3xflow
x-app-environment: &app-environment
N3XFLOW_DATABASE_PASSWORD_FILE: /run/n3xflow/database_password
N3XFLOW_TRUST_PROXY_HOPS: ${N3XFLOW_TRUST_PROXY_HOPS:-0}
N3XFLOW_DEV_MAGIC_LINKS: ${N3XFLOW_DEV_MAGIC_LINKS:-0}
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/n3xflow/database_password ]; then
od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xflow/database_password
fi
if [ ! -s /run/n3xflow/settings_key ]; then
od -An -N32 -tx1 /dev/urandom | tr -d ' \n' > /run/n3xflow/settings_key
fi
chmod 0444 /run/n3xflow/database_password /run/n3xflow/settings_key
volumes:
- runtime_secrets:/run/n3xflow
networks:
- backend
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
web:
image: ghcr.io/nexitpl/n3xflow: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/n3xflow:ro
ports:
# Keep behind a firewall until the owner account exists; publish through HTTPS.
- "0.0.0.0:8792: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/n3xflow: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/n3xflow:ro
command: ["node", "dist/worker.cjs"]
networks:
- backend
<<: *app-security
postgres:
image: postgres:17-alpine
restart: unless-stopped
depends_on:
bootstrap:
condition: service_completed_successfully
environment:
POSTGRES_DB: n3xflow
POSTGRES_USER: n3xflow
POSTGRES_PASSWORD_FILE: /run/n3xflow/database_password
volumes:
- postgres_data:/var/lib/postgresql/data
- runtime_secrets:/run/n3xflow:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n3xflow -d n3xflow"]
interval: 5s
timeout: 5s
retries: 12
networks:
- backend
networks:
frontend:
backend:
internal: true
volumes:
postgres_data:
runtime_secrets:
mkdir -p n3xflow
cd n3xflow
# Zapisz skopiowaną konfigurację jako docker-compose.yml
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8792/api/health