Supla Home Server na TrueNAS

Mantrak
Posts: 6
Joined: Wed Oct 12, 2022 6:59 am

Post

Witam wszystkich zainteresowanych tematem postawienia własnego kontenera supli na serwerze TrueNAS.
Jak wiecie próżno szukać supli w przygotowanych aplikacjach na TrueNAS. Wydaje mi się, że temat udało mi się opanować, wykorzystując do tego funkcję "Install via YAML". Temat nie jest trudny, dla zainteresowanych instrukcja poniżej.

Instalacja Supla Cloud na TrueNAS SCALE — krok po kroku

Poniżej opisuję jak zainstalować własną instancję Supla Cloud na TrueNAS SCALE z użyciem Docker Compose (Custom App). Instalacja obejmuje supla-cloud, supla-server, supla-db (MariaDB) oraz phpMyAdmin do zarządzania bazą danych.

Wymagania
- TrueNAS SCALE z pulą ZFS (Czyli trochę przestrzeni na dane)
- Dostęp do Apps → Install via YAML (to takie trzy kropki po prawej stronie przycisku Custom App)
- Dostęp SSH do TrueNAS (może też być przez schell)
- Własna domena lub adres IP dla CLOUD_DOMAIN (bez tego dostęp tylko z wewnętrznej sieci po IP)

─────────────────────────────────────
Krok 1: Tworzenie struktury katalogów
─────────────────────────────────────

W TrueNAS UI: Storage → Datasets → Add Dataset

Utwórz następujące katalogi jako Generic (przykład dla puli Data):

Code: Select all

/mnt/Data/supla/supla-db      # dane bazy MariaDB
/mnt/Data/supla/supla-config  # konfiguracja supla-cloud
/mnt/Data/supla/ssl-cloud     # certyfikat SSL dla Apache
/mnt/Data/supla/ssl-server    # certyfikat SSL dla supla-server

──────────────────────────
Krok 2: Ustawianie uprawnień
──────────────────────────

Ustaw właściciela i tryb dla każdego katalogu:

Code: Select all

Katalog        UID   GID   Tryb
supla-db       999   999   0775
supla-config    33    33   0775
ssl-cloud       33    33   0775
ssl-server       0     0   0775
Uwaga dotycząca UID/GID w TrueNAS:
Kontenery używają numerycznych UID/GID niezależnie od nazw użytkowników na hoście. Jednak przy ręcznym ustawianiu uprawnień w TrueNAS UI musisz użyć użytkownika który na danej instalacji ma odpowiedni numer UID.

W standardowym TrueNAS SCALE:
- UID 999 to użytkownik netdata
- GID 999 to grupa docker
- UID 33 to użytkownik www-data

──────────────────────────
Krok 3: Generowanie sekretów
──────────────────────────

SECRET aplikacji (wymagany przez supla-cloud do szyfrowania sesji) wygeneruj na shell lub przez ssh:

Code: Select all

openssl rand -hex 32
Hasło do bazy danych j.w. albo możesz wymyślić własne:

Code: Select all

openssl rand -base64 16
Zapisz oba w bezpiecznym miejscu — będą potrzebne w YAML poniżej.

───────────────────────────────────
Krok 4: Tworzenie aplikacji w TrueNAS
───────────────────────────────────

1. Przejdź do Apps → Discover Apps → Install via YAML (trzy kropki obok Custom App)
2. Wpisz nazwę: supla
3. Wklej YAML z Kroku 5 wypełniając brakujące pola lub poprawiając volumeny jeżeli dałeś inną ścieżkę.

──────────────────────
Krok 5: Docker Compose YAML
──────────────────────

Podmień wartości <TAKIEGO_FORMATU> na własne.

Code: Select all

name: supla
networks:
  supla-net: Null
services:
  supla-cloud:
    depends_on:
      - supla-db
    environment:
      APP_SECRET: <WYGENEROWANY_TOKEN>
      DATABASE_PASSWORD: <HASLO_DO_BAZY>
      MAILER_DSN: null://null
      RECAPTCHA_ENABLED: 'false'
      SUPLA_ACCOUNTS_REGISTRATION_ENABLED: 'true'
      SUPLA_BRUTE_FORCE_AUTH_PREVENTION_ENABLED: 'true'
      SUPLA_HOST_ADDRESS: <TWOJA_NAZWA_SERWERA>
    image: supla/supla-cloud:latest
    networks:
      - supla-net
    ports:
      - '5443:443'
    restart: unless-stopped
    volumes:
      - /mnt/Data/supla/supla-config:/var/www/html/var
      - /mnt/Data/supla/ssl-cloud:/etc/apache2/ssl
      - supla-ipc:/supla-server
  supla-db:
    environment:
      MYSQL_DATABASE: supla
      MYSQL_PASSWORD: <HASLO_DO_BAZY>
      MYSQL_ROOT_PASSWORD: <HASLO_DO_BAZY>
      MYSQL_USER: supla
    image: mariadb:12.2.2
    networks:
      - supla-net
    restart: unless-stopped
    volumes:
      - /mnt/Data/supla/supla-db:/var/lib/mysql
  supla-phpmyadmin:
    environment:
      PMA_HOST: supla-db
    image: phpmyadmin:latest
    networks:
      - supla-net
    ports:
      - '5480:80'
    restart: unless-stopped
  supla-server:
    depends_on:
      - supla-db
    environment:
      DATABASE_PASSWORD: <HASLO_DO_BAZY>
      SUPLA_HOST_ADDRESS: <TWOJA_NAZWA_SERWERA>
    image: supla/supla-server:latest
    networks:
      - supla-net
    ports:
      - '2015:2015'
      - '2016:2016'
    restart: unless-stopped
    volumes:
      - /mnt/Data/supla/ssl-server:/etc/supla-server/ssl
      - supla-ipc:/var/run/supla
volumes:
  supla-ipc: Null
Kluczowa uwaga dotycząca supla-ipc:
Volume IPC musi być montowany w różnych ścieżkach w każdym kontenerze:
- supla-server: supla-ipc:/var/run/supla (tutaj serwer tworzy socket)
- supla-cloud: supla-ipc:/supla-server (stąd cloud czyta socket)

Zamiana tych ścieżek powoduje błąd "Supla server is down" w interfejsie.

──────────────────────────
Krok 6: Uruchomienie i weryfikacja
──────────────────────────

Po zapisaniu YAML TrueNAS pobierze obrazy i uruchomi kontenery. Sprawdź w Apps UI czy wszystkie 4 kontenery mają status Running.

Adresy dostępu:

Code: Select all

Supla Cloud UI  https://<IP>:5443
phpMyAdmin      http://<IP>:5480
Przy pierwszym wejściu przeglądarka ostrzeże o samopodpisanym certyfikacie SSL — zaakceptuj wyjątek.

──────────────────────────────
Krok 7: Zakładanie pierwszego użytkownika
──────────────────────────────

Supla Cloud nie posiada formularza rejestracji administratora w UI. Pierwszego użytkownika zakładamy przez SSH/Shell.

Połącz się z TrueNAS przez SSH, następnie wykonaj:

Code: Select all

docker exec -it ix-supla-supla-cloud-1 php bin/console supla:create-confirmed-user
Komenda pyta interaktywnie o email i hasło.

Uwaga: TrueNAS dodaje prefiks ix-{nazwa_aplikacji}- do kontenerów. Dla aplikacji o nazwie "supla":

Code: Select all

ix-supla-supla-cloud-1
ix-supla-supla-server-1
ix-supla-supla-db-1
ix-supla-supla-phpmyadmin-1
──────────────────────
Krok 8: Dodawanie urządzeń
──────────────────────

1. Zaloguj się do Supla Cloud: https://<IP>:5443
2. Przejdź do Moja SUPLA i upewnij się, że rejestracja urządzeń jest aktywna
3. W konfiguracji urządzenia (firmware) ustaw adres serwera na IP TrueNAS
4. Urządzenia łączą się na portach:
- 2015 — protokół TCP v1 (starsze urządzenia)
- 2016 — protokół TCP v2 (nowsze urządzenia)

────────────────────────────────────────
Krok 9 (opcjonalny): Import historii pomiarów
────────────────────────────────────────

Jeśli posiadasz eksport CSV z supla.org:

1. Wejdź na phpMyAdmin: http://<IP>:5480
(Server: supla-db, User: root, Password: <HASLO_ROOT>)
2. Konwertuj CSV na SQL INSERT do tabeli supla_em_log
3. Zaimportuj SQL przez phpMyAdmin
4. Zaktualizuj channel_id w zaimportowanych rekordach na lokalny ID kanału
(lokalny channel_id widoczny jest w URL po kliknięciu na kanał w Supla Cloud UI)

──────────────────────────
Rozwiązywanie problemów
──────────────────────────

"Supla server is down" w interfejsie
Supla-cloud nie może połączyć się z supla-server przez IPC socket.
Sprawdź czy volume supla-ipc jest zamontowany z właściwymi ścieżkami (patrz Krok 5).

Kontenery nie startują po zmianie uprawnień
Nigdy nie używaj chmod na katalogach ZFS z NFSv4 ACL. Przywróć uprawnienia przez TrueNAS UI → Storage → Edit Permissions.

MariaDB: błąd "Bad magic header" w tc.log
Pojawia się po wymuszonym zatrzymaniu kontenera. Usuń uszkodzony plik:

Code: Select all

docker exec ix-supla-supla-db-1 rm /var/lib/mysql/tc.log
Następnie zrestartuj kontener supla-db.

Brak dostępu do poleceń docker przez SSH
Domyślny użytkownik truenas_admin nie należy do grupy docker. ale polecenia wykonane z przedrostkiem sudo i podaniem hasła załatwia sprawę.

Mam nadzieję, że komuś się przyda.
Pozdrawiam.
Last edited by Mantrak on Wed Jul 22, 2026 12:24 am, edited 1 time in total.
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Dzięki za obszerną instrukcję :)
Kawał roboty!
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Dobra robota.
SUPLA.... Nareszcie w domu.
veanzik6795
Posts: 1
Joined: Tue Apr 28, 2026 9:30 am

Post

Mantrak wrote: Thu Apr 09, 2026 12:11 am Witam wszystkich zainteresowanych tematem postawienia własnego kontenera supli na serwerze TrueNAS.
Jak wiecie próżno szukać supli w przygotowanych aplikacjach na TrueNAS. Wydaje mi się, że temat udało mi się opanować, wykorzystując do tego funkcję "Install via YAML". Temat nie jest trudny, dla zainteresowanych instrukcja poniżej.

Instalacja Supla Cloud na TrueNAS SCALE — krok po kroku

Poniżej opisuję jak zainstalować własną instancję Supla Cloud na TrueNAS SCALE z użyciem Docker Compose (Custom App). Instalacja obejmuje supla-cloud, supla-server, supla-db (MariaDB) oraz phpMyAdmin do zarządzania bazą danych.

Wymagania
- TrueNAS SCALE z pulą ZFS (Czyli trochę przestrzeni na dane)
- Dostęp do Apps → Install via YAML (to takie trzy kropki po prawej stronie przycisku Custom App)
- Dostęp SSH do TrueNAS (może też być przez schell)
- Własna domena lub adres IP dla CLOUD_DOMAIN (bez tego dostęp tylko z wewnętrznej sieci po IP)

─────────────────────────────────────
Krok 1: Tworzenie struktury katalogów
─────────────────────────────────────

W TrueNAS UI: Storage → Datasets → Add Dataset

Utwórz następujące katalogi jako Generic (przykład dla puli Data):

Code: Select all

/mnt/Data/supla/supla-db      # dane bazy MariaDB
/mnt/Data/supla/supla-config  # konfiguracja supla-cloud
/mnt/Data/supla/ssl-cloud     # certyfikat SSL dla Apache
/mnt/Data/supla/ssl-server    # certyfikat SSL dla supla-server

──────────────────────────
Krok 2: Ustawianie uprawnień
──────────────────────────

Ustaw właściciela i tryb dla każdego katalogu:

Code: Select all

Katalog        UID   GID   Tryb
supla-db       999   999   0775
supla-config    33    33   0775
ssl-cloud       33    33   0775
ssl-server       0     0   0775
Uwaga dotycząca UID/GID w TrueNAS:
Kontenery używają numerycznych UID/GID niezależnie od nazw użytkowników na hoście. Jednak przy ręcznym ustawianiu uprawnień w TrueNAS UI musisz użyć użytkownika który na danej instalacji ma odpowiedni numer UID.

W standardowym TrueNAS SCALE:
- UID 999 to użytkownik netdata
- GID 999 to grupa docker
- UID 33 to użytkownik www-data

──────────────────────────
Krok 3: Generowanie sekretów
──────────────────────────

SECRET aplikacji (wymagany przez supla-cloud do szyfrowania sesji) wygeneruj na shell lub przez ssh:

Code: Select all

openssl rand -hex 32
Hasło do bazy danych j.w. albo możesz wymyślić własne:

Code: Select all

openssl rand -base64 16
Zapisz oba w bezpiecznym miejscu — będą potrzebne w YAML poniżej.

───────────────────────────────────
Krok 4: Tworzenie aplikacji w TrueNAS
───────────────────────────────────

1. Przejdź do Apps → Discover Apps → Install via YAML (trzy kropki obok Custom App)
2. Wpisz nazwę: supla
3. Wklej YAML z Kroku 5 wypełniając brakujące pola lub poprawiając volumeny jeżeli dałeś inną ścieżkę.

──────────────────────
Krok 5: Docker Compose YAML
──────────────────────

Podmień wartości <TAKIEGO_FORMATU> na własne.

Code: Select all

name: supla
networks:
  supla-net: null
services:

  supla-db:
    image: mariadb:12.2.2
    restart: unless-stopped
    networks:
      - supla-net
    environment:
      MYSQL_DATABASE: supla
      MYSQL_USER: supla
      MYSQL_PASSWORD: <TWOJE_HASLO_DB>
      MYSQL_ROOT_PASSWORD: <TWOJE_HASLO_ROOT>
    volumes:
      - /mnt/<PULA>/supla/supla-db:/var/lib/mysql

  supla-server:
    image: supla/supla-server:latest
    restart: unless-stopped
    depends_on:
      - supla-db
    networks:
      - supla-net
    ports:
      - "2015:2015"
      - "2016:2016"
    environment:
      DB_PASSWORD: <TWOJE_HASLO_DB>
    volumes:
      - /mnt/<PULA>/supla/ssl-server:/etc/supla-server/ssl
      - supla-ipc:/var/run/supla      # serwer tworzy socket TUTAJ

  supla-cloud:
    image: supla/supla-cloud:latest
    restart: unless-stopped
    depends_on:
      - supla-db
    networks:
      - supla-net
    ports:
      - "5443:443"
    environment:
      CLOUD_DOMAIN: <TWOJA_DOMENA_LUB_IP>
      SECRET: <WYGENEROWANY_SECRET>
      DB_PASSWORD: <TWOJE_HASLO_DB>
      MAILER_DSN: "null://null"
      ACCOUNTS_REGISTRATION_ENABLED: "true"
      BRUTE_FORCE_AUTH_PREVENTION_ENABLED: "true"
      RECAPTCHA_ENABLED: "false"
    volumes:
      - /mnt/<PULA>/supla/supla-config:/var/www/html/var
      - /mnt/<PULA>/supla/ssl-cloud:/etc/apache2/ssl
      - supla-ipc:/supla-server #tego nie zmieniaj

  supla-phpmyadmin:
    image: phpmyadmin:latest
    restart: unless-stopped
    networks:
      - supla-net
    ports:
      - "5480:80"
    environment:
      PMA_HOST: supla-db

volumes:
  supla-ipc: null
Kluczowa uwaga dotycząca supla-ipc:
Volume IPC musi być montowany w różnych ścieżkach w każdym kontenerze:
- supla-server: supla-ipc:/var/run/supla (tutaj serwer tworzy socket)
- supla-cloud: supla-ipc:/supla-server (stąd cloud czyta socket)

Zamiana tych ścieżek powoduje błąd "Supla server is down" w interfejsie.

──────────────────────────
Krok 6: Uruchomienie i weryfikacja
──────────────────────────

Po zapisaniu YAML TrueNAS pobierze obrazy i uruchomi kontenery. Sprawdź w Apps UI czy wszystkie 4 kontenery mają status Running.

Adresy dostępu:

Code: Select all

Supla Cloud UI  https://<IP>:5443
phpMyAdmin      http://<IP>:5480
Przy pierwszym wejściu przeglądarka ostrzeże o samopodpisanym certyfikacie SSL — zaakceptuj wyjątek.

──────────────────────────────
Krok 7: Zakładanie pierwszego użytkownika
──────────────────────────────

Supla Cloud nie posiada formularza rejestracji administratora w UI. Pierwszego użytkownika zakładamy przez SSH/Shell.

Połącz się z TrueNAS przez SSH, następnie wykonaj:

Code: Select all

docker exec -it ix-supla-supla-cloud-1 php bin/console supla:create-confirmed-user
Komenda pyta interaktywnie o email i hasło.

Uwaga: TrueNAS dodaje prefiks ix-{nazwa_aplikacji}- do kontenerów. Dla aplikacji o nazwie "supla":

Code: Select all

ix-supla-supla-cloud-1
ix-supla-supla-server-1
ix-supla-supla-db-1
ix-supla-supla-phpmyadmin-1
──────────────────────
Krok 8: Dodawanie urządzeń
──────────────────────

1. Zaloguj się do Supla Cloud: https://<IP>:5443
2. Przejdź do Moja SUPLA i upewnij się, że rejestracja urządzeń jest aktywna
3. W konfiguracji urządzenia (firmware) ustaw adres serwera na IP TrueNAS
4. Urządzenia łączą się na portach:
- 2015 — protokół TCP v1 (starsze urządzenia)
- 2016 — protokół TCP v2 (nowsze urządzenia)

────────────────────────────────────────
Krok 9 (opcjonalny): Import historii pomiarów
────────────────────────────────────────

Jeśli posiadasz eksport CSV z supla.org:

1. Wejdź na phpMyAdmin: http://<IP>:5480
(Server: supla-db, User: root, Password: <HASLO_ROOT>)
2. Konwertuj CSV na SQL INSERT do tabeli supla_em_log
3. Zaimportuj SQL przez phpMyAdmin
4. Zaktualizuj channel_id w zaimportowanych rekordach na lokalny ID kanału
(lokalny channel_id widoczny jest w URL po kliknięciu na kanał w Supla Cloud UI)

──────────────────────────
Rozwiązywanie problemów
──────────────────────────

"Supla server is down" w interfejsie
Supla-cloud nie może połączyć się z supla-server przez IPC socket.
Sprawdź czy volume supla-ipc jest zamontowany z właściwymi ścieżkami (patrz Krok 5).

Kontenery nie startują po zmianie uprawnień
Nigdy nie używaj chmod na katalogach ZFS z NFSv4 ACL. Przywróć uprawnienia przez TrueNAS UI → Storage → Edit Permissions.

MariaDB: błąd "Bad magic header" w tc.log
Pojawia się po wymuszonym zatrzymaniu kontenera. Usuń uszkodzony plik:

Code: Select all

docker exec ix-supla-supla-db-1 rm /var/lib/mysql/tc.log
Następnie zrestartuj kontener supla-db.

Brak dostępu do poleceń docker przez SSH
Domyślny użytkownik truenas_admin nie należy do grupy docker. ale polecenia wykonane z przedrostkiem sudo i podaniem hasła załatwia sprawę geometry dash.

Mam nadzieję, że komuś się przyda.
Pozdrawiam.

Świetna instrukcja, szczególnie część z IPC i uprawnieniami może oszczędzić sporo czasu. Testowałeś jak to działa przy aktualizacjach kontenerów i czy dane w MariaDB pozostają bezproblemowo?
Mantrak
Posts: 6
Joined: Wed Oct 12, 2022 6:59 am

Post

Tak, testowałem u siebie i działa. Aktualizacje wyświetlają się jako update w TrueNAS. Niestety jedna z ostatnich aktualizacji powoduje sporo zamieszania, bo wprowadza zmiany w nazwach zmiennych i cały kontener szlag trafia. Co do danych w bazie, to właśnie po to dokonywujesz katalogi poza kontenerem, by przy jego aktualizacji czy restarcie nie utracić danych.

To co do tej pory udało mi się ustalić, w kwestii błedów to:

Access denied dla użytkownika 'supla' mimo poprawnego hasła — po aktualizacji obrazu supla-cloud

Po aktualizacji obrazu supla/supla-cloud kontener przestaje łączyć się z bazą danych, mimo że hasło w konfiguracji jest w 100% poprawne. Zweryfikowałem bezpośrednio łącząc się do bazy — działa bez problemu). W logach supla-db i supla-cloud:

Code: Select all

Access denied for user 'supla'@'...' (using password: YES/NO)
Przyczyna:
Nowsza wersja supla-cloud ma inne zmienne środowiskowe (standardowy Symfony .env). Część starych nazw zmiennych ma ostrzeżenia w logach akurat ale niestety nie aurat ta dla hasła. Aplikacja generuje plik .env.local z rzeczywistych zmiennych środowiskowych kontenera; DATABASE_HOST/DATABASE_USER/DATABASE_NAME mają wbudowane sensowne domyślne wartości więc wyglądają poprawnie, ale DATABASE_PASSWORD nie ma domyślnej wartości i zostaje PUSTE, jeśli nie zostanie podane pod nową nazwą.

Lista zmian nazw zmiennych (stara → nowa):

Code: Select all

Stara nazwa                            Nowa nazwa
DB_PASSWORD                            DATABASE_PASSWORD
CLOUD_DOMAIN                           SUPLA_HOST_ADDRESS
SECRET                                 APP_SECRET
ACCOUNTS_REGISTRATION_ENABLED          SUPLA_ACCOUNTS_REGISTRATION_ENABLED
BRUTE_FORCE_AUTH_PREVENTION_ENABLED    SUPLA_BRUTE_FORCE_AUTH_PREVENTION_ENABLED
Rozwiązanie:
W docker-compose/YAML aplikacji TrueNAS dodaj DATABASE_PASSWORD z tą samą wartością co DB_PASSWORD (stare nazwy możesz zostawić, nie szkodzą) dla supla-cloud i supla-server i zredeployuj kontener. Zauważyłem też, że brakuje w sekcji supla-server zmiennej SUPLA_HOST_ADDRESS.

Code: Select all

environment:
  DB_PASSWORD: twoje_haslo
  DATABASE_PASSWORD: twoje_haslo   # <-- to dodaj, inaczej appka łączy się pustym hasłem
  SUPLA_HOST_ADDRESS: twoja _nazwa_serwera
Jak to zdiagnozować u siebie:
Wejdź w Shell kontenera supla-cloud i sprawdź:

Code: Select all

cat /var/www/cloud/.env.local | grep DATABASE_PASSWORD
Jeśli jest puste — to ten sam problem.

Return to “Projekty użytkowników”