Oficjalna aplikacja do tablicy dla Nextcloud. Twórz i udostępniaj tablice dzięki współpracy w czasie rzeczywistym.
- 🎨 Rysowanie kształtów, pisanie tekstu, łączenie elementów
- 📝 Współpraca w czasie rzeczywistym z obsługą pół-offline
- 💾 Architektura zorientowana na klienta z lokalną pamięcią masową
- 🔄 Automatyczna synchronizacja między lokalną a serwerową pamięcią masową
- 🌐 Działa pół-offline – zmiany są zapisywane lokalnie i synchronizowane w trybie online (serwer websocker został pomyślnie skonfigurowany)
- 💪 Zbudowany na Excalidraw
Nextcloud Whiteboard wykorzystuje architekturę zorientowaną na klienta, która nadaje priorytet funkcjonalnościom opartym na przeglądarce:
- Browser-First: Wszystkie funkcje tablicy działają bezpośrednio w przeglądarce
- Pamięć lokalna: Zmiany są natychmiast zapisywane w pamięci przeglądarki (IndexedDB)
- Współpraca w czasie rzeczywistym: Serwer WebSocket obsługuje sesje współpracy na żywo
- Uproszczona łączność: Tylko przeglądarki muszą łączyć się z serwerem protokołu Websocket
- Zmniejszone zależności: Serwer Websocket jest potrzebny tylko do współpracy w czasie rzeczywistym, a nie do podstawowej funkcjonalności
Serwer websocket obsługuje sesje współpracy między użytkownikami w czasie rzeczywistym. Ważne: Serwer websocket jest potrzebny tylko do współpracy na żywo — podstawowe funkcje tablicy działają bez niego.
Niezbędne (do współpracy w czasie rzeczywistym):
- Przeglądarki użytkowników wymagają dostępu HTTP(S) do serwera websocket
- Nextcloud i serwer websocket współdzielą wpis tajny JWT na potrzeby uwierzytelniania
Skonfiguruj Nextcloud ze szczegółami serwera websocket: (Można skonfigurować w ustawieniach administratora Nextcloud)
occ config:app:set whiteboard collabBackendUrl --value="https://nextcloud.local:3002"
occ config:app:set whiteboard jwt_secret_key --value="some-random-secret"npm ci
JWT_SECRET_KEY="some-random-secret" NEXTCLOUD_URL=https://nextcloud.local npm run server:startdocker run -e JWT_SECRET_KEY=some-random-secret -e NEXTCLOUD_URL=https://nextcloud.local -p 3002:3002 --rm ghcr.io/nextcloud-releases/whiteboard:stableLub za pomocą narzędzia Docker Compose:
services:
nextcloud-whiteboard-server:
image: ghcr.io/nextcloud-releases/whiteboard:stable
ports:
- "3002:3002"
environment:
NEXTCLOUD_URL: https://nextcloud.local
JWT_SECRET_KEY: some-random-secretZmienne środowiskowe:
JWT_SECRET_KEY: Musi być zgodny z wpisem tajnym skonfigurowanym w NextcloudNEXTCLOUD_URL: Służy do sprawdzania poprawności tokenu JWT (nie do komunikacji między serwerami)
Jeśli serwer protokołu websocket jest uruchamiany ręcznie, skonfiguruj zwrotny serwer proxy, aby go uwidocznić:
Konfiguracja Apache
Konfiguracja Nginx
Inne odwrotne serwery proxy
Serwer websocket obsługuje sesje współpracy w czasie rzeczywistym (nie krytyczne dane tablicy):
Pamięć podręczna LRU (domyślnie)
- Pamięć sesji w pamięci, prosta konfiguracja
- Nadaje się do większości wdrożeń
- Dane sesji są czyszczone po ponownym uruchomieniu (dane tablicy pozostają bezpieczne w Nextcloud/pamięci lokalnej)
STORAGE_STRATEGY=lruRedis (Czerwony)
- W przypadku konfiguracji z wieloma serwerami lub trwałości sesji
- Umożliwia skalowanie w poziomie za pomocą strumieni Redis
STORAGE_STRATEGY=redis
REDIS_URL=redis://[username:password@]host[:port][/database_number]W przypadku środowisk o dużym natężeniu ruchu z wieloma serwerami WebSocket:
- Używanie usługi Redis dla stanu sesji udostępnionej
- Konfigurowanie modułu równoważenia obciążenia z lepkością sesji
- Usługa Redis Streams automatycznie obsługuje skalowanie protokołu WebSocket
Współpraca w czasie rzeczywistym nie działa
- Sprawdź, czy wpisy tajne JWT są zgodne między Nextcloud a serwerem websocket
- Sprawdź, czy przeglądarki użytkowników mogą uzyskać dostęp do adresu URL serwera protokołu websocket
- Upewnij się, że zwrotny serwer proxy poprawnie obsługuje uaktualnienia protokołu WebSocket
- Sprawdź, czy w konsoli przeglądarki nie ma błędów połączenia
Konflikt starszej aplikacji integracyjnej Jeśli wcześniej zainstalowałeś, usuń wszystkie wpisy tablicy z i uruchom:integration_whiteboardconfig/mimetypealiases.json
occ maintenance:mimetype:update-db
occ maintenance:mimetype:update-jsWprowadzające w błąd błędy administratora Kontrole łączności przez administratora mogą pokazywać wyniki fałszywie ujemne w środowiskach platformy Docker/serwera proxy. Te błędy nie mają wpływu na rzeczywistą funkcjonalność, ponieważ architektura jest zorientowana na klienta. Zamiast tego skoncentruj się na testach łączności opartych na przeglądarce.
Aby skompilować projekt lokalnie:
npm ci
npm run buildW przypadku programowania z przeładowywanie na gorąco:
npm run watchAby uruchomić serwer protokołu websocket w trakcie programowania:
npm run server:watchRozumiem, że chcesz rozwiązać dwa problemy z ostrzeżeniami bezpieczeństwa i konfiguracji Nextcloud na systemie TrueNAS SCALE:
- WebSocket server URL is not configured – brak skonfigurowanego serwera WebSocket dla aplikacji Whiteboard.
- Brak zaplecza o wysokiej wydajności (HPB) – brak skonfigurowanego zaplecza dla Nextcloud Talk, co ogranicza połączenia do 2–3 uczestników.
Poniżej przedstawiam instrukcje rozwiązania tych problemów, dostosowane do TrueNAS SCALE (w wersji 24.04 lub nowszej, używającej Dockera). Każda komenda będzie wyraźnie oznaczona, wskazując, gdzie należy ją wykonać: w powłoce systemowej TrueNAS, w Dockerze lub w kontenerze Dockera. Zakładam, że Nextcloud jest już zainstalowany jako aplikacja w TrueNAS SCALE.
Przygotowanie środowiska
Wymagania wstępne:
- TrueNAS SCALE: Wersja 24.04 (Dragonfish) lub nowsza.
- Dostęp do powłoki systemowej: Włączony dostęp SSH (System > Advanced > Enable SSH) lub użyj interfejsu webowego TrueNAS (System > Shell).
- Nextcloud: Zainstalowany jako aplikacja z TrueNAS Apps, z dostępem do datasetów (np. nextcloud/userdata, nextcloud/postgres, nextcloud/appdata).
- Certyfikat SSL: Skonfigurowany dla domeny (np. za pomocą Let’s Encrypt w Nginx Proxy Manager lub Traefik).
- Domena: Np. nextcloud.twojadomena.pl dla dostępu zewnętrznego.
- Uprawnienia: Upewnij się, że dataset nextcloud ma uprawnienia dla użytkownika www-data (UID: 33) lub użytkownika aplikacji (np. UID: 568).
Dostęp do powłoki systemowej:
- W interfejsie TrueNAS przejdź do System > Shell lub włącz SSH i zaloguj się:bashssh root@<IP_SERWERA>
- Sprawdź, czy Docker jest aktywny:(Wykonaj w powłoce systemowej TrueNAS).bashdocker –version
Dostęp do kontenera Nextcloud:
- Znajdź nazwę kontenera Nextcloud:(W powłoce systemowej TrueNAS). Nazwa kontenera będzie podobna do ix-nextcloud-nextcloud-1.bashdocker ps
- Wejdź do powłoki kontenera:(Wykonaj w powłoce systemowej TrueNAS).bashdocker exec -it ix-nextcloud-nextcloud-1 /bin/bash
Problem 1: WebSocket server URL is not configured
Ten problem dotyczy aplikacji Whiteboard, która wymaga osobnego serwera WebSocket dla współpracy w czasie rzeczywistym. W TrueNAS SCALE uruchomimy serwer WebSocket w osobnym kontenerze Docker.
Kroki rozwiązania:
- Utwórz dataset dla serwera WebSocket:
- W interfejsie TrueNAS przejdź do Datasets.
- W puli (np. tank) utwórz nowy dataset: nextcloud/whiteboard.
- Ustaw uprawnienia:
- Owner: www-data (UID: 33) lub użytkownik aplikacji (np. UID: 568).
- Permissions: Read/Write/Execute.
- Zainstaluj serwer WebSocket w osobnym kontenerze:
- W powłoce systemowej TrueNAS utwórz plik docker-compose.yml dla serwera WebSocket:(Wykonaj w powłoce systemowej TrueNAS).bashmkdir /mnt/tank/nextcloud/whiteboardnano /mnt/tank/nextcloud/whiteboard/docker-compose.yml
- Wklej następującą konfigurację:yamlversion: '3′services:whiteboard:image: node:20container_name: nextcloud_whiteboardrestart: alwaysvolumes:– /mnt/tank/nextcloud/whiteboard:/appworking_dir: /appcommand: >/bin/bash -c „npm install @nextcloud/whiteboard &&npm start”ports:– 3002:3002
- Zapisz i uruchom kontener:(Wykonaj w powłoce systemowej TrueNAS).bashcd /mnt/tank/nextcloud/whiteboarddocker-compose up -d
- W powłoce systemowej TrueNAS utwórz plik docker-compose.yml dla serwera WebSocket:
- Skonfiguruj reverse proxy dla WebSocket:
- Zakładam, że używasz Nginx Proxy Manager lub Traefik jako reverse proxy w TrueNAS SCALE.
- W Nginx Proxy Manager:
- Przejdź do Apps > Installed Applications > Nginx Proxy Manager > Manage.
- Dodaj nowy Proxy Host:
- Domain Names: whiteboard.twojadomena.pl lub nextcloud.twojadomena.pl.
- Scheme: http.
- Forward Hostname/IP: Adres IP TrueNAS (np. 192.168.0.47).
- Forward Port: 3002.
- Włącz WebSocket Support (przełącznik w interfejsie).
- Dodaj certyfikat SSL (np. Let’s Encrypt).
- Zapisz zmiany.
- Jeśli używasz Traefik, dodaj konfigurację w pliku docker-compose.yml dla Traefik:yamllabels:– „traefik.enable=true”– „traefik.http.routers.whiteboard.rule=Host(`whiteboard.twojadomena.pl`)”– „traefik.http.routers.whiteboard.entrypoints=websecure”– „traefik.http.services.whiteboard.loadbalancer.server.port=3002”– „traefik.http.routers.whiteboard.tls.certresolver=letsencrypt”
- Zrestartuj Traefik:(Wykonaj w powłoce systemowej TrueNAS).bashdocker-compose -f /path/to/traefik/docker-compose.yml up -d
- Zrestartuj Traefik:
- Ustaw adres WebSocket w Nextcloud:
- Zaloguj się do Nextcloud jako administrator.
- Przejdź do Ustawienia > Aplikacje > Whiteboard.
- W polu WebSocket server URL wprowadź: wss://whiteboard.twojadomena.pl/whiteboard lub wss://nextcloud.twojadomena.pl:3002/whiteboard.
- Zapisz zmiany.
- Testowanie:
- W powłoce systemowej TrueNAS sprawdź dostępność serwera WebSocket:(Zastąp 192.168.0.47 adresem IP TrueNAS).bashcurl -v http://192.168.0.47:3002/whiteboard
- Oczekiwana odpowiedź to kod HTTP 200.
- W Nextcloud przetestuj aplikację Whiteboard, tworząc nową tablicę i sprawdzając współpracę w czasie rzeczywistym.
- W powłoce systemowej TrueNAS sprawdź dostępność serwera WebSocket:
Uwagi:
- Jeśli serwer WebSocket nie działa, sprawdź logi kontenera:(Wykonaj w powłoce systemowej TrueNAS).bashdocker logs nextcloud_whiteboard
- Upewnij się, że port 3002 jest otwarty w firewallu TrueNAS:(Wykonaj w powłoce systemowej TrueNAS, jeśli masz włączony firewall).bashufw allow 3002/tcp
Problem 2: Brak zaplecza o wysokiej wydajności (HPB)
Nextcloud Talk wymaga zaplecza o wysokiej wydajności (HPB) dla połączeń z więcej niż 2–3 uczestnikami. HPB składa się z serwera sygnalizacyjnego i bramki WebRTC (Janus). W TrueNAS SCALE uruchomimy je w kontenerach Docker.
Kroki rozwiązania:
- Utwórz dataset dla HPB:
- W interfejsie TrueNAS przejdź do Datasets.
- W puli (np. tank) utwórz nowy dataset: nextcloud/talk-hpb.
- Ustaw uprawnienia:
- Owner: www-data (UID: 33) lub użytkownik aplikacji (np. UID: 568).
- Permissions: Read/Write/Execute.
- Zainstaluj serwer sygnalizacyjny:
- W powłoce systemowej TrueNAS utwórz plik docker-compose.yml dla serwera sygnalizacyjnego:bashmkdir /mnt/tank/nextcloud/talk-hpbnano /mnt/tank/nextcloud/talk-hpb/docker-compose.yml
- Wklej konfigurację:yamlversion: '3′services:signaling:image: golang:1.21container_name: nextcloud_signalingrestart: alwaysvolumes:– /mnt/tank/nextcloud/talk-hpb:/appworking_dir: /appcommand: >/bin/bash -c „git clone https://github.com/strukturag/nextcloud-spreed-signaling.git &&cd nextcloud-spreed-signaling &&make build &&cp server.conf.in server.conf &&sed -i 's/listen = .*/listen = 0.0.0.0:8080/’ server.conf &&sed -i 's/hashkey = .*/hashkey = $(openssl rand -hex 32)/’ server.conf &&sed -i 's/blockkey = .*/blockkey = $(openssl rand -hex 32)/’ server.conf &&sed -i 's/backends = .*/backends = nextcloud-backend-0/’ server.conf &&echo '[nextcloud-backend-0]’ >> server.conf &&echo 'url = https://nextcloud.twojadomena.pl’ >> server.conf &&echo 'secret = $(openssl rand -hex 32)’ >> server.conf &&./bin/signaling”ports:– 8080:8080
- Uruchom kontener:(Wykonaj w powłoce systemowej TrueNAS).bashcd /mnt/tank/nextcloud/talk-hpbdocker-compose up -d
- W powłoce systemowej TrueNAS utwórz plik docker-compose.yml dla serwera sygnalizacyjnego:
- Zainstaluj Janus WebRTC Gateway:
- W powłoce systemowej TrueNAS utwórz osobny plik docker-compose.yml dla Janus:bashmkdir /mnt/tank/nextcloud/janusnano /mnt/tank/nextcloud/janus/docker-compose.yml
- Wklej konfigurację:yamlversion: '3′services:janus:image: meetecho/janus-gatewaycontainer_name: nextcloud_janusrestart: alwaysvolumes:– /mnt/tank/nextcloud/janus:/usr/local/etc/janusports:– 8088:8088– 8089:8089– 8188:8188– 20000-40000:20000-40000/udpenvironment:– JANUS_WEBSOCKETS=yes
- Uruchom kontener:(Wykonaj w powłoce systemowej TrueNAS).bashcd /mnt/tank/nextcloud/janusdocker-compose up -d
- Skonfiguruj Janus w pliku /mnt/tank/nextcloud/janus/janus.jcfg (możesz edytować w TrueNAS lub w kontenerze):(Wykonaj w powłoce systemowej TrueNAS, a edytuj w kontenerze).bashdocker exec -it nextcloud_janus /bin/bashnano /usr/local/etc/janus/janus.jcfg
- Włącz wtyczkę VideoRoom i transport WebSocket:inigeneral: {plugins: {janus.plugin.videoroom: true}transports: {janus.transport.websockets: true}}
- Włącz wtyczkę VideoRoom i transport WebSocket:
- W powłoce systemowej TrueNAS utwórz osobny plik docker-compose.yml dla Janus:
- Skonfiguruj reverse proxy dla HPB:
- W Nginx Proxy Manager:
- Dodaj nowy Proxy Host:
- Domain Names: signaling.twojadomena.pl lub nextcloud.twojadomena.pl.
- Scheme: http.
- Forward Hostname/IP: Adres IP TrueNAS (np. 192.168.0.47).
- Forward Port: 8080.
- Włącz WebSocket Support.
- Dodaj certyfikat SSL.
- Zapisz zmiany.
- Dodaj nowy Proxy Host:
- Dla Traefik, dodaj do docker-compose.yml serwera sygnalizacyjnego:yamllabels:– „traefik.enable=true”– „traefik.http.routers.signaling.rule=Host(`signaling.twojadomena.pl`)”– „traefik.http.routers.signaling.entrypoints=websecure”– „traefik.http.services.signaling.loadbalancer.server.port=8080”– „traefik.http.routers.signaling.tls.certresolver=letsencrypt”
- Zrestartuj Traefik:(Wykonaj w powłoce systemowej TrueNAS).bashdocker-compose -f /path/to/traefik/docker-compose.yml up -d
- Zrestartuj Traefik:
- W Nginx Proxy Manager:
- Ustaw HPB w Nextcloud:
- Zaloguj się do Nextcloud jako administrator.
- Przejdź do Ustawienia > Talk.
- W sekcji High Performance Backend:
- Signaling server: wss://signaling.twojadomena.pl/standalone-signaling/.
- Shared secret: Skopiuj klucz secret z pliku /mnt/tank/nextcloud/talk-hpb/server.conf (sprawdź w powłoce systemowej TrueNAS):bashcat /mnt/tank/nextcloud/talk-hpb/server.conf | grep secret
- Zapisz zmiany.
- Opcjonalnie: Skonfiguruj serwer TURN/STUN:
- Zainstaluj Coturn w osobnym kontenerze:bashmkdir /mnt/tank/nextcloud/coturnnano /mnt/tank/nextcloud/coturn/docker-compose.yml
- Wklej konfigurację:yamlversion: '3′services:coturn:image: coturn/coturncontainer_name: nextcloud_coturnrestart: alwaysports:– 3478:3478– 3478:3478/udpenvironment:– TURN_PORT=3478– TURN_REALM=twojadomena.pl– TURN_SECRET=turnpassword– TURN_USER=turnuser
- Uruchom kontener:(Wykonaj w powłoce systemowej TrueNAS).bashcd /mnt/tank/nextcloud/coturndocker-compose up -d
- Wklej konfigurację:
- W Nextcloud (Ustawienia > Talk) dodaj:
- STUN: signaling.twojadomena.pl:3478.
- TURN: signaling.twojadomena.pl:3478 z użytkownikiem turnuser i hasłem turnpassword.
- Zainstaluj Coturn w osobnym kontenerze:
- Testowanie:
- Sprawdź serwer sygnalizacyjny:(Wykonaj w powłoce systemowej TrueNAS, zastąp 192.168.0.47 adresem IP TrueNAS).bashcurl -i http://192.168.0.47:8080/standalone-signaling/api/v1/welcome
- Oczekiwana odpowiedź: HTTP 200 i JSON, np. {„nextcloud-spreed-signaling”:”Welcome”,”version”:”1.0.0″}.
- Przetestuj Nextcloud Talk, organizując połączenie z więcej niż 3 uczestnikami.
- Sprawdź serwer sygnalizacyjny:
Dodatkowe uwagi dotyczące TrueNAS SCALE
- Uprawnienia datasetów:
- Jeśli kontenery nie mają dostępu do datasetów, sprawdź uprawnienia:(Wykonaj w powłoce systemowej TrueNAS).bashchown -R 33:33 /mnt/tank/nextcloudchmod -R 770 /mnt/tank/nextcloud
- Alternatywnie, użyj interfejsu TrueNAS do ustawienia ACL.
- Jeśli kontenery nie mają dostępu do datasetów, sprawdź uprawnienia:
- Firewall:
- Otwórz porty w firewallu TrueNAS:(Wykonaj w powłoce systemowej TrueNAS, jeśli firewall jest aktywny).bashufw allow 3002/tcpufw allow 8080/tcpufw allow 8088/tcpufw allow 8089/tcpufw allow 8188/tcpufw allow 3478/tcpufw allow 3478/udpufw allow 20000:40000/udp
- Otwórz porty w firewallu TrueNAS:
- Logi i debugowanie:
- Sprawdź logi kontenerów, jeśli coś nie działa:(Wykonaj w powłoce systemowej TrueNAS).bashdocker logs nextcloud_whiteboarddocker logs nextcloud_signalingdocker logs nextcloud_janusdocker logs nextcloud_coturn
- Logi Nextcloud znajdziesz w kontenerze:(Wykonaj w powłoce systemowej TrueNAS).bashdocker exec -it ix-nextcloud-nextcloud-1 cat /var/www/html/data/nextcloud.log
- Sprawdź logi kontenerów, jeśli coś nie działa:
- HTTPS:
- Upewnij się, że wszystkie połączenia (Nextcloud, WebSocket, HPB) używają HTTPS. Skonfiguruj certyfikaty w Nginx Proxy Manager lub Traefik.
- Cronjobs:
- Dodaj cronjob dla Nextcloud w TrueNAS (System > Cron Jobs):(Ustaw co 15 minut).bashdocker exec -u www-data ix-nextcloud-nextcloud-1 php /var/www/html/cron.php
- Dodaj cronjob dla Nextcloud w TrueNAS (System > Cron Jobs):
Alternatywa: Nextcloud All-in-One (AIO)
Jeśli konfiguracja WebSocket i HPB jest zbyt skomplikowana, rozważ użycie Nextcloud All-in-One, które automatycznie konfiguruje wszystkie komponenty, w tym Talk i Whiteboard.
- Utwórz dataset: nextcloud/aio.
- W powłoce systemowej TrueNAS utwórz plik docker-compose.yml:bashmkdir /mnt/tank/nextcloud/aionano /mnt/tank/nextcloud/aio/docker-compose.yml
- Wklej:yamlversion: '3′services:nextcloud:image: nextcloud/all-in-one:latestcontainer_name: nextcloud_aiorestart: alwaysvolumes:– /mnt/tank/nextcloud/aio:/mnt/docker-aio-config– /var/run/docker.sock:/var/run/docker.sock:roports:– 8080:8080environment:– APACHE_PORT=11000– NEXTCLOUD_DATADIR=/mnt/tank/nextcloud/aio/data– NEXTCLOUD_MOUNT=/mnt/tank/nextcloud/aio
- Wklej:
- Uruchom:(Wykonaj w powłoce systemowej TrueNAS).bashcd /mnt/tank/nextcloud/aiodocker-compose up -d
- Otwórz http://<IP_SERWERA>:8080 w przeglądarce i postępuj zgodnie z kreatorem AIO.
Podsumowanie
- WebSocket:
- Zainstaluj serwer WebSocket w kontenerze Docker (nextcloud_whiteboard).
- Skonfiguruj reverse proxy (Nginx/Traefik) z obsługą WebSocket.
- Ustaw adres w Nextcloud (wss://whiteboard.twojadomena.pl/whiteboard).
- HPB:
- Zainstaluj serwer sygnalizacyjny (nextcloud_signaling) i Janus (nextcloud_janus) w kontenerach Docker.
- Skonfiguruj reverse proxy i opcjonalnie serwer TURN/STUN (nextcloud_coturn).
- Ustaw parametry w Nextcloud Talk.
- TrueNAS SCALE:
- Używaj datasetów z poprawnymi uprawnieniami.
- Sprawdzaj logi kontenerów w razie problemów.
- Włącz HTTPS i otwórz niezbędne porty.
Jeśli napotkasz konkretny problem (np. błąd w logach, problem z dostępem), podaj szczegóły, a pomogę go rozwiązać!