Wróć do narzędzi

N3X Flow

Self-hosted portal klienta do etapów projektu, odbiorów, skonsolidowanych rund uwag, zmian zakresu i historii decyzji.

SELF-HOSTED PROJECT OPSv0.1.0

Projekt dowieziony. Decyzje udokumentowane.

N3X Flow 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

Chcesz korzystać, ale nie zajmować się serwerem?

N3X może przygotować i utrzymywać tę aplikację: od uruchomienia i SSL po aktualizacje, monitoring oraz kopie zapasowe.

Zapytaj o hosting N3X

Proces, który chroni relację i marżę

Pięć bramek odbiorowych

Odkrycie, kierunek, projekt, development i wdrożenie mają własny stan, termin oraz jednoznaczną historię przyjęcia.

Skonsolidowane rundy uwag

Maksymalnie trzy wspólne odpowiedzi na etap zamiast niekończącego się strumienia sprzecznych wiadomości.

Jedna osoba decyzyjna

Recenzenci mogą dodawać punkty, ale tylko wyznaczony decision maker zatwierdza etap i dodatkowy koszt.

Kontrola dodatkowego zakresu

Błąd, pytanie i zmiana zakresu są rozdzielone, a change order zawiera cenę, harmonogram, ważność i decyzję.

Terminy 5 dni roboczych

Worker pilnuje odbiorów i zapisuje precyzyjnie, czy etap zaakceptowano ręcznie, czy uznano za przyjęty po terminie.

Logowanie linkiem e-mail

Klient nie tworzy hasła. Token jest hashowany, jednorazowy, ważny 15 minut i zużywany dopiero po potwierdzeniu.

Niemodyfikowalna historia

Append-only audit trail zapisuje aktora, czas, projekt, zdarzenie i kontekst kluczowych decyzji.

PWA gotowe na telefon

Instalacja z własną ikoną, obsługa iOS, dolna nawigacja i bezpieczny ekran offline bez zapisywania treści projektów.

DOCKER COMPOSE

Prywatny stos gotowy do white-label

Jedna konfiguracja uruchamia portal, worker i PostgreSQL. Branding agencji oraz SMTP ustawia właściciel w zabezpieczonym panelu, a sekrety nie trafiają do Compose.

N3X Flow Web — Project Roomy, role, odbiory, uwagi i panel ustawień
N3X Flow Worker — terminy, wygasanie ofert i wysyłka powiadomień
PostgreSQL 17 — projekty, decyzje i append-only audit trail
Twoje reverse proxy — HTTPS i własna domena, np. portal.aerix.pl

KONFIGURATOR DOCKER

Compose dopasowany do Twojej agencji

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ę.

Branding i SMTP konfigurujesz po zalogowaniu. Po starcie otwórz http://IP_SERWERA:8792 i od razu utwórz konto właściciela. Następnie ustaw publiczny adres HTTPS i SMTP. Wykonuj spójne kopie wolumenów postgres_data oraz runtime_secrets.
Adres publiczny
https://flow.example.com
Pierwsze uruchomienie
http://IP_SERWERA_DOCKER:8792
Cel reverse proxy
http://IP_SERWERA_DOCKER:8792
Test stanu
http://127.0.0.1:8792/api/health

Gotowy docker-compose.yml

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}
  N3XFLOW_UPLOADS_DIR: /var/lib/n3xflow/uploads
  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
      - uploads_data:/var/lib/n3xflow/uploads
    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:
  uploads_data:

Uruchomienie i kontrola stanu

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

Historia zmian

    • WydaniePierwsze wydanie self-hosted: panel WWW, worker terminów i powiadomień oraz PostgreSQL uruchamiane przez Docker Compose.
    • NowośćPięcioetapowe Project Roomy z osobą decyzyjną, odbiorami w terminie 5 dni roboczych i maksymalnie trzema skonsolidowanymi rundami uwag.
    • NowośćKlasyfikacja uwag jako błąd, zmiana zakresu lub pytanie oraz karty dodatkowego zakresu z ceną, terminem i jednoznaczną decyzją klienta.
    • NowośćJednorazowe linki e-mail, szyfrowane ustawienia SMTP, role projektowe i niemodyfikowalny dziennik najważniejszych zdarzeń.
    • NowośćInstalowalne PWA z dedykowaną ikoną, obsługą iOS, wygodną dolną nawigacją i bezpiecznym ekranem offline, który nigdy nie zapisuje treści projektów.
Ślad decyzji, nie substytut podpisu. N3X Flow wspiera formę dokumentową i koordynację projektu. Nie zastępuje podpisu własnoręcznego ani kwalifikowanego, gdy konkretna czynność — np. przeniesienie autorskich praw majątkowych — wymaga takiej formy.

PORADNIK

Instrukcja obsługi N3XFlow

Instalacja, pierwsze kroki, ustawienia i rozwiązywanie problemów.

N3XFlow

N3XFlow to portal współpracy z klientem: etapy projektu, uwagi, akceptacje, zmiany zakresu i historia decyzji.

Wymagania i instalacja

Potrzebujesz serwera z Docker Compose, przeglądarki, domeny HTTPS oraz SMTP do wiadomości i linków logowania. PostgreSQL jest częścią zestawu.

  1. Pobierz docker-compose.yml i zapisz w osobnym katalogu.
  2. W tym katalogu uruchom:
docker compose up -d
docker compose ps
  1. Otwórz http://ADRES_SERWERA:8792 w zaufanej sieci i utwórz konto właściciela.
  2. W Settings ustaw publiczny adres HTTPS i SMTP. Skieruj reverse proxy na port 8792, zachowując Host i X-Forwarded-Proto.

Do utworzenia konta właściciela ogranicz dostęp firewallem. Dla jednego zaufanego proxy można ustawić N3XFLOW_TRUST_PROXY_HOPS=1; aplikacja nie powinna być dostępna z pominięciem tego proxy.

Praca nad projektem

Utwórz projekt, przypisz zespół, osobę decyzyjną klienta i recenzentów. Prowadź pracę przez kolejne etapy. Zbieraj skonsolidowane uwagi, ustalaj zmiany zakresu i zapisuj decyzje.

Wbudowany Guide objaśnia odpowiedzialności, terminy, rundy uwag, załączniki oraz zasady akceptacji po polsku i angielsku. Korzystaj z niego razem z ustaleniami projektu.

Powiadomienia e-mail trafiają do drugiej strony projektu. Wiadomości dla klienta zawierają jednorazowy link logowania ważny 15 minut.

Załączniki i telefon

Obrazy i krótkie filmy są dostępne uczestnikom projektu po zalogowaniu. Limit przesyłania wynosi 30 MB na formularz; reverse proxy powinno dopuszczać co najmniej 32 MB.

Portal można dodać do ekranu głównego jako PWA. Treść projektów wymaga połączenia z serwerem i nie jest buforowana do pracy offline.

Kopie i aktualizacja

Wykonuj spójne kopie postgres_data, uploads_data i runtime_secrets. Utrata klucza ustawień uniemożliwia odzyskanie zapisanych poświadczeń SMTP.

Przed aktualizacją przeczytaj opis wydania i sprawdź zmiany pliku Compose. Po wykonaniu kopii:

docker compose pull
docker compose up -d
docker compose ps

Przy aktualizacji starszej instalacji bez obsługi załączników zaktualizuj również Compose, zachowując nazwany wolumen uploads_data.

Rozwiązywanie problemów

Jeśli nie dochodzi wiadomość, sprawdź ustawienia SMTP i docker compose logs --tail=100 worker. Wygasły link wymaga nowego linku logowania. Przy błędzie wysyłania załącznika sprawdź rozmiar oraz limit proxy. Zapisy akceptacji nie zastępują szczególnej formy podpisu, jeśli wymaga jej umowa.