Bądź na bieżąco - RSS

DokuWiki w Dockerze: TypeError ModeRegistry po aktualizacji do Mort

29 sierpnia, 2026 | Brak Komentarzy | Kategoria: Bez kategorii, Linux, Porady

Komunikat DokuWiki ModeRegistry TypeError w przeglądarce

Jeśli po aktualizacji obrazu Dockera Twoja wiki wita Cię różowym prostokątem z komunikatem DokuWiki ModeRegistry TypeError, masz do czynienia z problemem, którego nie naprawi żadna kolejna wersja kontenera. Przyczyna leży bowiem nie w obrazie, tylko w Twoim własnym wolumenie z konfiguracją. Poniżej opisuję pełną diagnozę i procedurę naprawy, którą przeszedłem na produkcyjnej instalacji.

Objaw: biała strona i komunikat o błędzie

Po przejściu obrazu lscr.io/linuxserver/dokuwiki:latest na wydanie 2026-07-14b „Mort” wiki przestaje się otwierać. Zamiast treści pojawia się komunikat:

TypeError: dokuwiki\Parsing\ModeRegistry::__construct(): Argument #1 ($syntax)
must be of type string, null given, called in /app/www/public/inc/parserutils.php on line 239

Poniżej dopisek, że wystąpił nieprzewidziany błąd i że więcej informacji trafiło do logu. Sam log niewiele wyjaśnia, bo zawiera ten sam stos wywołań. Kluczowa informacja jest już w pierwszej linii: do konstruktora klasy trafia null tam, gdzie oczekiwany jest łańcuch znaków.

DokuWiki ModeRegistry TypeError: skąd się bierze

Wydanie „Mort” wprowadziło opcjonalne natywne parsowanie Markdown. Steruje nim nowe ustawienie syntax, które przyjmuje wartości dw, md, dw+md lub md+dw. W funkcji p_get_instructions() znajduje się linia:

$registry = new ModeRegistry($syntax ?? $conf['syntax']);

Operator ?? zabezpiecza wyłącznie zmienną $syntax. Jeżeli w tablicy konfiguracji nie ma klucza syntax, wyrażenie zwraca null, a typowany konstruktor natychmiast rzuca wyjątkiem. Stąd komunikat DokuWiki ModeRegistry TypeError.

Wartość domyślna tego klucza jest zdefiniowana w pliku conf/dokuwiki.php, w linii 20:

$conf['syntax']      = 'dw';              //syntax flavor: 'dw', 'md', 'dw+md', 'md+dw'

I tutaj dochodzimy do sedna. Plik conf/dokuwiki.php należy do rdzenia DokuWiki, ale w obrazie linuxserver katalog /app/www/public/conf jest dowiązaniem symbolicznym do /config/dokuwiki/conf. Ten katalog leży w trwałym wolumenie i nie jest odświeżany przy aktualizacji obrazu, bo przechowuje także Twoją konfigurację. Efekt: nowy kod aplikacji spotyka się z plikiem domyślnych ustawień sprzed półtora roku, w którym klucza syntax po prostu jeszcze nie było.

Dlaczego czekanie na nowy obraz nic nie da

Pierwszy odruch po takiej awarii jest naturalny: poczekam na kolejny latest, pewnie to naprawią. W tym przypadku to strata czasu. Aktualizacja obrazu podmienia kod w /app/www/public, czyli dokładnie tę połowę układanki, która już jest nowa. Feralny plik siedzi w wolumenie i żadna wersja obrazu go nie dotknie.

Z perspektywy zespołu linuxserver nie ma tu też nic do naprawienia w samym obrazie, bo oni jedynie pakują upstream. Z perspektywy DokuWiki problem również nie istnieje, ponieważ przy klasycznej instalacji katalog conf zawsze przyjeżdża świeży razem z resztą plików. Kombinacja trwałego wolumenu i pliku rdzenia trzymanego w tym samym miejscu co konfiguracja użytkownika to sytuacja specyficzna dla konteneryzacji.

Diagnoza w trzydzieści sekund

Zanim cokolwiek zmienisz, potwierdź hipotezę jedną komendą na hoście:

grep -n "\['syntax'\]" /var/lib/docker/volumes/dokuwiki_config/_data/dokuwiki/conf/dokuwiki.php

Pusty wynik oznacza, że klucza nie ma i diagnoza się potwierdza: masz do czynienia z klasycznym DokuWiki ModeRegistry TypeError wywołanym przestarzałym plikiem konfiguracji. Uwaga na drobiazg: samo grep -c syntax bez nawiasów potrafi zwrócić jedynkę, ponieważ w nagłówku pliku znajduje się komentarz o składni PHP. Liczy się konkretna definicja zmiennej, nie samo słowo.

Obejście doraźne, żeby wiki wstała od razu

Jeśli potrzebujesz działającej strony natychmiast, dopisz brakującą wartość do własnej konfiguracji, która ma pierwszeństwo nad domyślną:

cd /var/lib/docker/volumes/dokuwiki_config/_data/dokuwiki/conf
cp local.php local.php.bak
echo "\$conf['syntax'] = 'dw';" >> local.php
rm -rf ../data/cache/*
docker restart dokuwiki

Sprawdź jeszcze właściciela pliku poleceniem ls -l. Dopisujesz jako root, więc jeśli local.php zostałby utworzony od zera, menedżer konfiguracji w panelu webowym straciłby możliwość zapisu. W razie potrzeby wyrównaj uprawnienia do swojego PUID i PGID.

To rozwiązanie łata jednak tylko jeden brakujący klucz. „Mort” przyniósł ich więcej, więc prędzej czy później trafisz na kolejny objaw tego samego schorzenia.

Właściwa naprawa krok po kroku

Docelowo należy odświeżyć wszystkie pliki rdzenia w katalogu conf, zostawiając nietknięte pliki użytkownika. Wbrew pozorom rozróżnienie jest proste, bo obie grupy nie mają wspólnych nazw.

Krok 1: zebranie danych

docker exec dokuwiki cat /app/www/public/VERSION
docker exec dokuwiki id abc

CONF=/var/lib/docker/volumes/dokuwiki_config/_data/dokuwiki/conf
DATA=/var/lib/docker/volumes/dokuwiki_config/_data/dokuwiki/data
TAG=release-2026-07-14b

Użytkownik abc to standardowe konto w obrazach linuxserver, a jego identyfikatory przydadzą się przy ustawianiu właściciela plików. Wartość TAG dopasuj do tego, co zwróci VERSION.

Krok 2: pobranie czystych plików rdzenia

mkdir -p /tmp/dw && cd /tmp/dw
curl -sL -o dw.tar.gz "https://codeload.github.com/dokuwiki/dokuwiki/tar.gz/refs/tags/${TAG}"
tar xzf dw.tar.gz
SRC=/tmp/dw/dokuwiki-${TAG}/conf
grep -n "\['syntax'\]" "$SRC/dokuwiki.php"

Ostatnia komenda musi pokazać linię 20 z definicją dw. Jeśli jej nie widzisz, pobrałeś niewłaściwe wydanie.

Krok 3: podgląd różnic

diff -rq "$SRC" "$CONF"

Wpisy typu Only in $CONF dotyczące local.php, acl.auth.php, users.auth.php, plugins.local.php oraz plików *.local.conf są całkowicie normalne. To Twoje dane i one zostają na miejscu.

Krok 4: kopia zapasowa i zatrzymanie kontenera

docker stop dokuwiki
tar czf ~/dokuwiki-conf-$(date +%F).tar.gz -C "$(dirname "$CONF")" conf
ls -lh ~/dokuwiki-conf-*.tar.gz

Nie przechodź dalej, dopóki nie zobaczysz utworzonego archiwum na liście.

Krok 5: podmiana osiemnastu plików

cd "$SRC"
for f in .htaccess acl.auth.php.dist acronyms.conf dokuwiki.php entities.conf \
         interwiki.conf license.php local.php.dist manifest.json mediameta.php \
         mime.conf mysql.conf.php.example plugins.php plugins.required.php \
         scheme.conf smileys.conf users.auth.php.dist wordblock.conf; do
  cp -v "$f" "$CONF/$f"
done

Ta lista jest wyczerpująca. Dokładnie tyle plików dostarcza rdzeń DokuWiki w katalogu conf i żaden z nich nie zawiera Twoich ustawień. Warto zwrócić uwagę na manifest.json, którego w starszej instalacji zwyczajnie nie ma. Plik plugins.php również można spokojnie nadpisać, ponieważ stan włączonych rozszerzeń przechowywany jest w plugins.local.php.

Krok 6: uprawnienia, cache i start

chown 1000:1000 "$CONF"/*
rm -rf "$DATA/cache"/*
docker start dokuwiki
docker logs --tail 30 dokuwiki

Podstaw identyfikatory odczytane w kroku pierwszym. Po uruchomieniu wejdź na ?do=admin&page=config i sprawdź, czy ustawienie syntax jest widoczne z wartością dw.

Pułapka, na której się przejechałem

Jeżeli host korzysta z BusyBoksa zamiast pełnego GNU coreutils, część flag polecenia tar po prostu nie istnieje. Komenda z opcją --wildcards zwróci lakoniczne tar: unrecognized option: wildcards. Z tego powodu w procedurze powyżej rozpakowuję całe archiwum i wskazuję katalog pełną ścieżką, zamiast wycinać pojedynczy podkatalog. Używam wyłącznie flag xzf, które obsługuje każda implementacja.

To dobra ogólna zasada przy pisaniu instrukcji dla nieznanego środowiska. Im mniej egzotycznych przełączników, tym większa szansa, że procedura zadziała u kogoś innego.

Co zrobić po naprawie

Przebudowa indeksu wyszukiwania

W wydaniu „Mort” indeks pełnotekstowy został napisany od nowa i stara struktura jest z nim niezgodna. Bez przebudowy wyszukiwarka będzie zwracać dziwne wyniki:

docker exec dokuwiki php /app/www/public/bin/indexer.php -c

Weryfikacja rozszerzeń

Parser został gruntownie przebudowany, a klasa ModeRegistry jest zupełnie nowa. Starsze pluginy składniowe mogą przestać działać niezależnie od opisanego problemu z konfiguracją. Przejrzyj listę w menedżerze rozszerzeń i zaktualizuj albo wyłącz te, które nie mają wsparcia dla aktualnego wydania. Jeśli używasz szablonu innego niż domyślny, sprawdź również jego zgodność.

Wniosek na przyszłość

Ten incydent dobrze ilustruje pewną pułapkę konteneryzacji. Trwały wolumen kojarzy nam się z danymi użytkownika, tymczasem bardzo często trafiają do niego również pliki należące do aplikacji. Dopóki nic się nie zmienia, wszystko działa. Przy dużym skoku wersji taki katalog staje się jednak zamrożonym fragmentem przeszłości, który zderza się ze świeżym kodem.

Praktyczny wniosek jest prosty. Przy każdej większej aktualizacji warto pobrać upstreamowe wydanie i wykonać diff względem swojego wolumenu, zanim cokolwiek przestanie działać. Zajmuje to dwie minuty, a oszczędza wieczoru z produkcyjną awarią. Jeśli natomiast potrzebujesz kupić sobie czas, przypnij w pliku compose tag poprzedniego wydania zamiast latest i wróć do aktualizacji na spokojnie. Pamiętaj tylko, żeby po cofnięciu wyczyścić zarówno data/cache, jak i data/index.

Najczęstsze pytania

Czy DokuWiki ModeRegistry TypeError oznacza utratę danych?

Nie. Strony wiki leżą w katalogu data/pages i nie są w żaden sposób naruszone. Problem dotyczy wyłącznie warstwy konfiguracji, a wiki wraca do pełnej sprawności natychmiast po uzupełnieniu brakującego ustawienia.

Czy mogę po prostu skasować katalog conf i pozwolić kontenerowi utworzyć go od nowa?

Odradzam. Razem z plikami rdzenia straciłbyś konta użytkowników, listy uprawnień oraz całą własną konfigurację. Podmiana wyłącznie osiemnastu plików rdzenia jest bezpieczniejsza i zajmuje tyle samo czasu.

Czy warto od razu włączyć obsługę Markdown?

To zależy od tego, jak dużo treści już masz. Wartość dw zachowuje dotychczasowe zachowanie i jest bezpiecznym wyborem przy naprawie awarii. Eksperymenty z trybami mieszanymi lepiej przeprowadzić później, na kopii instalacji.

G

Tagi: , ,

Migracja z BIND9 do Technitium DNS Server

28 lipca, 2026 | Brak Komentarzy | Kategoria: Linux, Porady

Migracja z BIND9 do Technitium DNS ServerBIND9 od wielu lat pozostaje jednym z najczęściej wykorzystywanych serwerów DNS w systemach Linux. Jest stabilny, dobrze udokumentowany i oferuje duże możliwości konfiguracji. Jednak dla części administratorów jego codzienna obsługa może z czasem stać się uciążliwa. Praktycznie wszystkie ustawienia zapisuje się bowiem w plikach tekstowych.

Przy kilku niewielkich strefach nie stanowi to większego problemu. Sytuacja komplikuje się jednak wtedy, gdy serwer obsługuje wiele domen, strefy odwrotne, delegacje, dynamiczne aktualizacje oraz serwery secondary. Ponadto każda zmiana wymaga edycji odpowiedniego pliku, sprawdzenia składni i przeładowania usługi.

Alternatywą może być Technitium DNS Server, czyli otwartoźródłowy serwer DNS zarządzany za pomocą panelu WWW. Rozwiązanie obsługuje między innymi strefy autorytatywne, rekursję, DNSSEC, transfery AXFR i IXFR, DNS NOTIFY, TSIG oraz automatyzację przez API.

W tym artykule pokażę, jak bezpiecznie przeprowadzić migrację z BIND9 do Technitium DNS Server. Najpierw uruchomimy Technitium w kontenerze Docker. Następnie przeniesiemy strefy proste i odwrotne. Na końcu skonfigurujemy współpracę serwerów primary i secondary oraz wykonamy testy przed przełączeniem klientów.

Czy Technitium może zastąpić BIND9?

W wielu środowiskach odpowiedź brzmi: tak. Nie oznacza to jednak, że Technitium jest bezwarunkowo lepszy od BIND9. Oba systemy reprezentują po prostu inne podejście do zarządzania usługą DNS.

Konfiguracja i zarządzanie rekordami

W BIND9 większość ustawień zapisuje się w plikach tekstowych. Dotyczy to zarówno konfiguracji samego serwera, jak i zawartości poszczególnych stref DNS. Każdą zmianę trzeba następnie sprawdzić i przeładować za pomocą odpowiednich poleceń.

Technitium wykorzystuje inne podejście. Konfiguracja serwera oraz zarządzanie rekordami odbywają się przede wszystkim w panelu WWW. Dostępne jest również HTTP API, które pozwala automatyzować wykonywane operacje.

Strefy primary i secondary

Oba serwery obsługują klasyczną architekturę primary-secondary. Umożliwiają również pełne transfery AXFR, transfery przyrostowe IXFR oraz komunikaty DNS NOTIFY.

Dzięki temu Technitium może początkowo działać jako serwer secondary dla BIND9. Takie rozwiązanie pozwala bezpiecznie skopiować strefy i przetestować nową usługę przed właściwym przełączeniem.

DNSSEC

Zarówno BIND9, jak i Technitium obsługują DNSSEC. W przypadku BIND9 zarządzanie kluczami i podpisywaniem stref odbywa się głównie za pomocą plików konfiguracyjnych oraz narzędzi systemowych.

Technitium udostępnia natomiast odpowiednie opcje w panelu WWW. Upraszcza to codzienną obsługę, chociaż nadal wymaga znajomości zasad działania DNSSEC oraz ostrożności podczas zmiany kluczy.

Automatyzacja

BIND9 można automatyzować za pomocą skryptów, narzędzia rndc oraz programu nsupdate. Rozwiązanie dobrze współpracuje także z systemami zarządzania konfiguracją, takimi jak Ansible.

Z kolei Technitium oferuje HTTP API. Pozwala ono między innymi tworzyć strefy, dodawać rekordy oraz odczytywać konfigurację bez bezpośredniej edycji plików.

Logi i statystyki

BIND9 zapisuje informacje w plikach, systemie syslog albo journald. Zakres logowania można szczegółowo skonfigurować, jednak analiza danych zwykle wymaga użycia dodatkowych narzędzi.

Technitium prezentuje część informacji bezpośrednio w panelu administracyjnym. Administrator otrzymuje dostęp do statystyk zapytań, logów oraz podstawowych informacji diagnostycznych.

Serwer DHCP

BIND9 nie zawiera własnego serwera DHCP. W takim środowisku należy uruchomić oddzielną usługę, na przykład Kea DHCP albo ISC DHCP.

Technitium ma natomiast wbudowany serwer DHCP. Nie trzeba go jednak uruchamiać, jeżeli w sieci działa już router lub inna usługa przydzielająca adresy IP.

BIND9 nadal będzie dobrym wyborem tam, gdzie konfiguracja jest w pełni automatyzowana i przechowywana w repozytorium Git. Podobnie wygląda sytuacja w środowiskach wykorzystujących rozbudowane mechanizmy views, RPZ albo niestandardowe polityki dostępu.

Z kolei Technitium sprawdzi się szczególnie dobrze w małych i średnich sieciach, laboratoriach oraz środowiskach edukacyjnych. W praktyce administrator zachowuje zaawansowane funkcje serwera DNS, a jednocześnie otrzymuje wygodny panel WWW.

Najważniejsza zasada: nie wyłączaj od razu BIND9

Najbezpieczniejszą metodą migracji jest równoległe uruchomienie Technitium pod innym adresem IP. Dzięki temu można zaimportować strefy, porównać odpowiedzi obu serwerów i przygotować możliwość szybkiego powrotu do poprzedniego rozwiązania.

W przykładach przyjmuję następującą adresację:

  • 192.168.10.10 – dotychczasowy serwer BIND9,
  • 192.168.10.11 – nowy serwer Technitium DNS Server.

Nie należy uruchamiać obu usług na tym samym adresie IP i porcie 53. Jeżeli migracja odbywa się na jednym systemie, potrzebny będzie tymczasowy dodatkowy adres IP albo krótkie okno serwisowe.

Krok 1. Inwentaryzacja konfiguracji BIND9

Przed rozpoczęciem migracji trzeba ustalić, jakie funkcje pełni obecny serwer. Samo skopiowanie plików stref nie przeniesie bowiem całej konfiguracji BIND9.

Przede wszystkim należy sprawdzić:

  • listę stref primary i secondary,
  • strefy wyszukiwania wstecznego PTR,
  • sekcje forwarders i strefy typu forward,
  • reguły allow-query, allow-recursion i allow-transfer,
  • dynamiczne aktualizacje DNS,
  • klucze TSIG,
  • obsługę DNSSEC,
  • konfigurację BIND views,
  • RPZ i inne mechanizmy filtrowania.

W Debianie definicje lokalnych stref najczęściej znajdują się w pliku:

/etc/bind/named.conf.local

Następnie warto sprawdzić poprawność całej konfiguracji:

sudo named-checkconf

Jeżeli polecenie nie zwróci żadnego komunikatu, składnia konfiguracji jest prawidłowa.

Krok 2. Kopia bezpieczeństwa BIND9

Przed migracją wykonujemy pełną kopię katalogów zawierających konfigurację i dane stref:

sudo tar -czf /root/bind9-backup-$(date +%F).tar.gz \
  /etc/bind /var/cache/bind

Jeżeli BIND9 korzysta z dynamicznych aktualizacji, część aktualnych rekordów może znajdować się w plikach dziennika z rozszerzeniem .jnl. Dlatego przed skopiowaniem stref należy zsynchronizować dzienniki z plikami głównymi:

sudo rndc sync

Dla pojedynczej strefy można użyć polecenia:

sudo rndc sync example.com

Z kolei opcja -clean zapisuje zmiany w głównym pliku strefy i usuwa istniejący dziennik:

sudo rndc sync -clean example.com

Trzeba jednak pamiętać, że kolejne aktualizacje dynamiczne mogą ponownie utworzyć plik .jnl. Z tego powodu właściwe przełączenie serwerów najlepiej przeprowadzić w kontrolowanym oknie serwisowym.

Krok 3. Przygotowanie plików stref

Proste pliki stref BIND9 można zwykle bezpośrednio zaimportować do Technitium. Problem mogą jednak sprawić konstrukcje charakterystyczne dla BIND9, takie jak:

  • $INCLUDE,
  • $GENERATE,
  • rekordy zapisane w plikach dziennika,
  • strefy zapisane w formacie raw,
  • strefy podzielone pomiędzy kilka plików.

Dlatego najbezpieczniej utworzyć ujednolicony plik za pomocą programu named-compilezone:

sudo named-compilezone -D \
  -o /tmp/example.com.zone \
  example.com \
  /etc/bind/db.example.com

Program sprawdzi strefę, rozwinie część dyrektyw i zapisze wynik w jednym pliku. Podobnie przygotowujemy strefę odwrotną:

sudo named-compilezone -D \
  -o /tmp/10.168.192.in-addr.arpa.zone \
  10.168.192.in-addr.arpa \
  /etc/bind/db.192.168.10

Na końcu każdą strefę warto dodatkowo zweryfikować:

sudo named-checkzone example.com /tmp/example.com.zone

Prawidłowy wynik powinien zakończyć się komunikatem:

OK

Krok 4. Uruchomienie Technitium w Dockerze

Technitium może działać jako zwykła usługa systemowa albo jako kontener. W tym przykładzie wykorzystamy Docker Compose.

services:
  dns-server:
    container_name: technitium
    hostname: twister
    image: docker.io/technitium/dns-server:latest

    ports:
      - "5380:5380/tcp"
      - "53:53/udp"
      - "53:53/tcp"

    environment:
      - DNS_SERVER_DOMAIN=twister.example.lan
      - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks
      - DNS_SERVER_LOG_USING_LOCAL_TIME=true

    volumes:
      - ./config:/etc/dns
      - ./logs:/var/log/technitium/dns

    restart: unless-stopped

    sysctls:
      - net.ipv4.ip_local_port_range=1024 65535

Następnie uruchamiamy kontener:

docker compose up -d

Stan usługi można sprawdzić za pomocą dwóch poleceń:

docker compose ps
docker logs technitium

Panel administracyjny będzie dostępny pod adresem:

http://192.168.10.11:5380

Przy pierwszym logowaniu należy od razu zmienić hasło administratora. Ponadto dostęp do panelu warto ograniczyć na firewallu wyłącznie do sieci administracyjnej. Docelowo połączenie powinno być zabezpieczone przez HTTPS albo reverse proxy.

Ważne: zmienne środowiskowe służą głównie do początkowej konfiguracji. Po utworzeniu danych w katalogu /etc/dns kolejne zmiany najlepiej wykonywać w panelu WWW albo przez API.

Technitium i serwer DHCP

Powyższa konfiguracja wykorzystuje standardowe mapowanie portów i jest odpowiednia dla usługi DNS. Jeżeli jednak zamierzamy uruchomić również wbudowany serwer DHCP, należy rozważyć tryb sieciowy hosta:

network_mode: "host"

W takim przypadku sekcję ports trzeba usunąć. Serwer DHCP musi bowiem odbierać pakiety rozgłoszeniowe z lokalnej sieci, czego standardowa sieć bridge Dockera zwykle nie zapewnia.

Krok 5. Konfiguracja rekursji

Technitium może jednocześnie pełnić rolę serwera autorytatywnego i rekursywnego. Jednak dostęp do rekursji musi być prawidłowo ograniczony.

Dla serwera działającego wyłącznie w sieci lokalnej można zastosować ustawienie:

AllowOnlyForPrivateNetworks

W bardziej rozbudowanym środowisku lepiej wskazać konkretne podsieci za pomocą reguł dostępu. Dzięki temu z resolvera będą mogli korzystać wyłącznie uprawnieni klienci.

Nie należy udostępniać otwartej rekursji w Internecie. W przeciwnym razie serwer może zostać wykorzystany między innymi do ataków DNS amplification.

Jeżeli Technitium ma działać wyłącznie jako publiczny serwer autorytatywny, rekursję najlepiej całkowicie wyłączyć.

Krok 6. Import strefy do Technitium

W panelu Technitium przechodzimy do sekcji Zones, a następnie wybieramy Add Zone.

Dla strefy, której Technitium ma być głównym źródłem danych, wskazujemy:

  • typ strefy: Primary,
  • nazwę strefy, na przykład example.com,
  • opcję importu pliku strefy.

Następnie importujemy przygotowany wcześniej plik:

/tmp/example.com.zone

Po zakończeniu importu należy sprawdzić przede wszystkim:

  • rekord SOA,
  • numer seryjny SOA,
  • rekordy NS,
  • rekordy A i AAAA,
  • rekordy MX,
  • rekordy TXT,
  • rekordy CNAME,
  • rekordy SRV,
  • rekordy CAA,
  • wartości TTL.

Szczególnie ważny jest numer seryjny w rekordzie SOA. Nie powinien być niższy niż numer używany na dotychczasowym serwerze. Serwery secondary porównują bowiem numery seryjne i pobierają strefę dopiero po wykryciu nowszej wersji.

Bezpieczniejsza metoda: Technitium najpierw jako secondary

Zamiast ręcznie importować strefę i natychmiast przełączać usługę, można najpierw skonfigurować Technitium jako serwer secondary dla działającego BIND9. Jest to bezpieczniejsza i wygodniejsza metoda migracji.

W konfiguracji strefy BIND9 zezwalamy nowemu serwerowi na transfer. Ponadto kierujemy do niego komunikaty DNS NOTIFY:

zone "example.com" {
    type primary;
    file "/etc/bind/db.example.com";

    allow-transfer {
        192.168.10.11;
    };

    also-notify {
        192.168.10.11;
    };

    notify yes;
};

W starszych konfiguracjach zamiast słowa primary może występować master. Oba określenia są obsługiwane, chociaż obecnie zaleca się stosowanie nazw primary i secondary.

Po zapisaniu zmian sprawdzamy konfigurację i przeładowujemy usługę:

sudo named-checkconf
sudo rndc reconfig

W Technitium tworzymy natomiast strefę typu Secondary. Jako adres serwera primary podajemy:

192.168.10.10

Technitium pobierze pełną strefę za pomocą transferu AXFR. Kolejne zmiany mogą być przesyłane przyrostowo przez IXFR. Po otrzymaniu komunikatu DNS NOTIFY serwer secondary sprawdzi numer seryjny SOA i w razie potrzeby pobierze aktualizację.

Takie rozwiązanie ma kilka zalet. Po pierwsze, nie trzeba ręcznie kopiować kolejnych zmian. Po drugie, można przez dłuższy czas porównywać odpowiedzi obu serwerów. Co więcej, Technitium cały czas otrzymuje aktualną wersję strefy.

Dopiero po zakończeniu testów można zmienić rolę Technitium na primary. Następnie należy ponownie sprawdzić rekord SOA, rekordy NS oraz ustawienia transferu stref.

Porty wymagane dla DNS

Firewall musi przepuszczać zarówno UDP, jak i TCP na porcie 53.

  • UDP 53 – większość standardowych zapytań DNS i komunikaty NOTIFY,
  • TCP 53 – transfery AXFR i IXFR oraz większe odpowiedzi DNS.

Częstym błędem jest dopuszczenie wyłącznie UDP 53. W rezultacie zwykłe zapytania działają, natomiast transfer strefy kończy się błędem albo przekroczeniem czasu oczekiwania.

Zabezpieczenie transferów za pomocą TSIG

Ograniczenie transferu do konkretnego adresu IP jest podstawowym zabezpieczeniem. Nie zapewnia jednak kryptograficznego uwierzytelnienia serwera.

Dlatego w środowisku produkcyjnym warto zastosować klucz TSIG. Ten sam klucz należy skonfigurować po obu stronach transferu.

TSIG może zabezpieczać między innymi:

  • sprawdzanie rekordu SOA,
  • komunikaty DNS NOTIFY,
  • transfery AXFR,
  • transfery IXFR.

Kluczy TSIG nie należy umieszczać w publicznym repozytorium. Ponadto powinny być przekazywane wyłącznie bezpiecznym kanałem.

Krok 7. Migracja stref odwrotnych PTR

Podczas migracji nie wolno pominąć stref odwrotnych. Są one wykorzystywane między innymi przez systemy pocztowe, mechanizmy uwierzytelniania, monitoring i narzędzia diagnostyczne.

Dla sieci:

192.168.10.0/24

typowa nazwa strefy odwrotnej będzie wyglądała następująco:

10.168.192.in-addr.arpa

Po imporcie sprawdzamy wybrany rekord PTR:

dig @192.168.10.11 -x 192.168.10.20

Trzeba zachować szczególną ostrożność przy prefiksach innych niż /8, /16 i /24. Na przykład delegacja publicznej podsieci /26 może wykorzystywać mechanizm classless reverse DNS opisany w RFC 2317.

W takim przypadku nazwa strefy oraz rekordy CNAME zależą od sposobu delegowania zastosowanego przez operatora. Dlatego nie należy samodzielnie tworzyć uproszczonej strefy /24 bez wcześniejszego sprawdzenia delegacji.

Krok 8. Porównanie odpowiedzi serwerów

Przed przełączeniem klientów trzeba porównać odpowiedzi BIND9 i Technitium. Najpierw sprawdzamy rekord SOA:

dig @192.168.10.10 example.com SOA +noall +answer
dig @192.168.10.11 example.com SOA +noall +answer

Następnie porównujemy rekordy NS:

dig @192.168.10.10 example.com NS +noall +answer
dig @192.168.10.11 example.com NS +noall +answer

W podobny sposób sprawdzamy serwery pocztowe:

dig @192.168.10.10 example.com MX +noall +answer
dig @192.168.10.11 example.com MX +noall +answer

Później testujemy rekordy TXT:

dig @192.168.10.10 example.com TXT +noall +answer
dig @192.168.10.11 example.com TXT +noall +answer

Na końcu sprawdzamy zwykły rekord hosta oraz zapytanie odwrotne:

dig @192.168.10.10 www.example.com A +noall +answer
dig @192.168.10.11 www.example.com A +noall +answer

dig @192.168.10.10 -x 192.168.10.20 +noall +answer
dig @192.168.10.11 -x 192.168.10.20 +noall +answer

Ponadto warto przetestować rekordy SRV, CAA, DKIM oraz dane używane do weryfikacji usług chmurowych.

Krok 9. Przełączenie klientów

W sieci lokalnej adres serwera DNS jest najczęściej przekazywany przez DHCP. Dlatego wystarczy zmienić opcję DNS Server, zwykle oznaczoną jako DHCP Option 6.

Następnie odnawiamy dzierżawę DHCP na komputerze testowym i sprawdzamy konfigurację:

ipconfig /all

W systemie Linux można użyć polecenia:

resolvectl status

Jeżeli adresy DNS są skonfigurowane statycznie na serwerach, urządzeniach sieciowych albo hypervisorach, trzeba je zaktualizować oddzielnie.

W pierwszym okresie można przekazywać klientom oba adresy DNS. Technitium będzie wtedy serwerem podstawowym, natomiast BIND9 pozostanie serwerem dodatkowym.

Nie należy jednak traktować kolejności adresów jako gwarantowanego mechanizmu przełączania awaryjnego. System operacyjny może bowiem wysyłać zapytania do obu serwerów albo zmieniać ich kolejność na podstawie czasu odpowiedzi.

Przełączenie publicznej strefy DNS

W przypadku publicznej domeny migracja wymaga dodatkowych przygotowań. Przede wszystkim należy odpowiednio wcześniej obniżyć wartości TTL.

Następnie trzeba:

  1. uruchomić nowy serwer pod docelowym publicznym adresem IP,
  2. sprawdzić dostępność UDP i TCP 53 z Internetu,
  3. dodać nowy serwer do rekordów NS,
  4. w razie potrzeby zaktualizować glue records u rejestratora,
  5. odczekać co najmniej przez okres starego TTL,
  6. dopiero później usunąć stary serwer NS.

Jeżeli aktualny TTL wynosi 86400 sekund, jego obniżenie należy wykonać przynajmniej dobę przed migracją. Dzięki temu stare informacje szybciej znikną z pamięci podręcznej resolverów.

Migracja strefy zabezpieczonej DNSSEC

Migracja DNSSEC wymaga osobnego planu. Rekord DS zapisany w strefie nadrzędnej musi bowiem odpowiadać kluczowi publikowanemu przez serwery autorytatywne.

Jeżeli Technitium wygeneruje nowe klucze, a w strefie nadrzędnej pozostanie stary rekord DS, domena może przestać działać dla resolverów walidujących DNSSEC. Dlatego nie należy wymieniać kluczy bez wcześniejszego przygotowania.

Plan migracji powinien obejmować:

  • publikację nowych rekordów DNSKEY,
  • odczekanie wymaganych czasów propagacji,
  • aktualizację rekordu DS u rejestratora,
  • sprawdzenie odpowiedzi DNSSEC,
  • kontrolowane wycofanie starych kluczy.

Po migracji można sprawdzić odpowiedź poleceniem:

dig +dnssec example.com SOA

Do dodatkowej walidacji przyda się również:

delv example.com

Primary i secondary w Technitium

Po zakończeniu migracji warto utrzymywać przynajmniej dwa serwery DNS. Na pierwszym tworzymy strefę typu Primary, natomiast na drugim strefę typu Secondary.

Na serwerze primary konfigurujemy:

  • adres IP serwera secondary uprawnionego do transferu,
  • wysyłanie komunikatów DNS NOTIFY,
  • opcjonalny klucz TSIG,
  • rekord NS wskazujący serwer secondary.

Z kolei na serwerze secondary podajemy:

  • nazwę strefy,
  • adres serwera primary,
  • ustawienia transferu,
  • klucz TSIG, jeżeli jest wymagany.

Strefa secondary pozostaje kopią tylko do odczytu. Dlatego wszystkie rekordy należy zmieniać na serwerze primary. Po zwiększeniu numeru seryjnego SOA secondary otrzyma komunikat DNS NOTIFY i pobierze aktualizację.

Czego nie przeniesie plik strefy?

Import pliku strefy przenosi rekordy DNS, ale nie przenosi całej logiki konfiguracji BIND9. Oddzielnie trzeba więc odtworzyć:

  • ACL i ograniczenia dostępu,
  • politykę rekursji,
  • forwardery,
  • conditional forwarders,
  • klucze TSIG,
  • reguły dynamicznych aktualizacji,
  • aktualizacje rekordów wykonywane przez DHCP,
  • ustawienia DNSSEC,
  • BIND views,
  • Response Policy Zones,
  • niestandardowe mechanizmy logowania.

BIND views nie mają prostego odpowiednika w pliku importowanym do Technitium. Podobne działanie można jednak uzyskać za pomocą mechanizmu Split Horizon, stref warunkowych albo oddzielnych instancji serwera. Mimo to taki scenariusz wymaga indywidualnego projektu.

Typowe problemy podczas migracji

Port 53 jest już zajęty

Najpierw sprawdzamy proces nasłuchujący na porcie DNS:

sudo ss -lntup | grep ':53'

Port może być zajęty przez BIND9, dnsmasq, systemd-resolved albo inny kontener.

Panel działa, ale serwer nie odpowiada na zapytania

W pierwszej kolejności należy sprawdzić mapowanie obu protokołów:

53:53/udp
53:53/tcp

Następnie trzeba zweryfikować lokalny firewall, reguły sieci kontenerowej oraz ustawienia nasłuchiwania Technitium.

Secondary nie pobiera strefy

Najczęstsze przyczyny to:

  • zablokowany TCP 53,
  • brak adresu secondary na liście dozwolonych transferów,
  • niezgodny klucz TSIG,
  • błędny adres serwera primary,
  • niezwiększony numer seryjny SOA,
  • brak komunikatów DNS NOTIFY.

Po restarcie kontenera znika konfiguracja

Najczęściej oznacza to brak trwałego wolumenu dla katalogu:

/etc/dns

Konfiguracja i strefy muszą znajdować się poza zapisywalną warstwą kontenera. W przeciwnym razie zostaną utracone po odtworzeniu instancji.

Rekord PTR nie działa

W takim przypadku należy sprawdzić:

  • nazwę strefy in-addr.arpa,
  • kolejność oktetów adresu IP,
  • delegację strefy odwrotnej,
  • rekordy NS,
  • sposób delegowania podsieci przez operatora.

Serwer odpowiada rekursywnie klientom z Internetu

Jest to poważny błąd konfiguracji. Dlatego należy natychmiast wyłączyć rekursję albo ograniczyć ją do zaufanych podsieci.

Podsumowanie

Migracja z BIND9 do Technitium DNS Server nie musi oznaczać ryzykownego wyłączenia starej usługi i natychmiastowego uruchomienia nowej. Najbezpieczniej rozpocząć od równoległej instalacji i skonfigurować Technitium jako secondary.

Następnie należy zsynchronizować strefy oraz porównać odpowiedzi obu serwerów. Dopiero po sprawdzeniu rekordów SOA, NS, MX, TXT, rekordów hostów i stref odwrotnych można przełączyć klientów.

Technitium nie usuwa technicznej złożoności systemu DNS. Jednak znacznie upraszcza codzienną administrację, diagnostykę oraz delegowanie dostępu. Dlatego w środowisku, w którym BIND9 działa poprawnie, ale zarządzanie plikami staje się niewygodne, jest to rozwiązanie zdecydowanie warte przetestowania.

G

Tagi: , , ,

Mailcow – instalacja i aktualizacja serwera poczty w Dockerze

27 czerwca, 2026 | Brak Komentarzy | Kategoria: Bez kategorii, Linux, Porady

Mailcow instalacja i aktualizacja serwera poczty w DockerzeMailcow to jedno z ciekawszych rozwiązań dla osób, które chcą uruchomić własny serwer poczty bez ręcznego składania Postfixa, Dovecota, Rspamd, SOGo, antywirusa, webmaila i całej reszty usług. Wszystko działa w kontenerach Dockera, a administracja odbywa się z poziomu wygodnego panelu WWW.

W tym artykule pokażę praktyczną instalację Mailcow na serwerze Linux z Dockerem oraz bezpieczną procedurę aktualizacji. Nie będzie to opis „kliknij i zapomnij”, bo serwer poczty wymaga poprawnego DNS, portów, certyfikatów i kopii zapasowych. Będzie za to prosta checklista, która pozwala uniknąć typowych błędów.

W artykule pokażę:

  • co sprawdzić przed instalacją Mailcow,
  • jak przygotować system i Dockera,
  • jak pobrać i uruchomić Mailcow,
  • jakie rekordy DNS są potrzebne,
  • jak zrobić backup,
  • jak bezpiecznie wykonać aktualizację.

Uwaga: własny serwer poczty to nie tylko kontener Docker. Najważniejsze są: poprawny DNS, rekord PTR, otwarty port 25, reputacja adresu IP oraz regularne aktualizacje.

Dlaczego Mailcow?

Mailcow jest wygodny, bo zbiera w jednym projekcie większość elementów potrzebnych do uruchomienia pełnego serwera poczty. W praktyce dostajemy gotowy zestaw usług: SMTP, IMAP, webmail, filtrowanie spamu, obsługę domen, skrzynek, aliasów, certyfikatów oraz panel administracyjny.

Dla małej firmy, laboratorium, homelabu albo środowiska testowego jest to dużo prostsze niż ręczna konfiguracja każdego komponentu osobno. Nadal jednak trzeba pamiętać, że poczta elektroniczna jest wrażliwa na błędy konfiguracyjne. Źle ustawiony DNS albo zablokowany port 25 potrafi sprawić, że technicznie wszystko działa, ale poczta nie dochodzi albo trafia do spamu.

Zanim zaczniesz

Przed instalacją warto przygotować kilka rzeczy:

  • serwer VPS lub maszynę wirtualną z publicznym adresem IP,
  • pełną wirtualizację, np. KVM, ESXi, Hyper-V lub podobne rozwiązanie,
  • system Debian albo Ubuntu,
  • minimum 6 GB RAM oraz dodatkowy swap,
  • wolne porty usług pocztowych i WWW,
  • domenę, którą będziesz obsługiwać w Mailcow,
  • możliwość ustawienia rekordu PTR/reverse DNS u operatora serwera.

Ważne: Mailcow nie powinien być uruchamiany w LXC/OpenVZ. To rozwiązanie najlepiej traktować jako usługę dla normalnej maszyny wirtualnej lub serwera fizycznego.

Porty, które muszą być wolne

Na początku sprawdź, czy na serwerze nie działa już inny serwer WWW albo inny MTA, np. Exim, Postfix z systemu albo stary kontener pocztowy.

ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

Najważniejsze porty dla Mailcow to:

  • 25/tcp – SMTP, odbieranie poczty z Internetu,
  • 465/tcp – SMTPS,
  • 587/tcp – Submission, wysyłka poczty przez użytkowników,
  • 143/tcp i 993/tcp – IMAP i IMAPS,
  • 110/tcp i 995/tcp – POP3 i POP3S,
  • 4190/tcp – ManageSieve,
  • 80/tcp i 443/tcp – panel WWW, webmail i certyfikaty.

Jeżeli któryś z tych portów jest już zajęty, instalacja może się uruchomić częściowo albo zakończyć błędem. Warto rozwiązać ten problem przed startem kontenerów, a nie dopiero po fakcie.

DNS – najważniejszy element całej instalacji

Dla przykładu przyjmijmy, że serwer Mailcow będzie działał pod adresem:

mail.example.pl

Minimalnie warto przygotować:

  • rekord A dla mail.example.pl wskazujący na publiczny adres IPv4 serwera,
  • opcjonalnie rekord AAAA, jeśli używasz IPv6,
  • rekord MX domeny wskazujący na mail.example.pl,
  • rekord PTR dla adresu IP, również wskazujący na mail.example.pl,
  • rekordy SPF, DKIM i DMARC – część z nich Mailcow podpowie po dodaniu domeny w panelu.

Praktyczna rada: bez poprawnego PTR poczta może działać technicznie, ale z dużym ryzykiem problemów z dostarczalnością. W przypadku VPS rekord PTR zwykle ustawia się w panelu operatora.

Instalacja Mailcow krok po kroku

Krok 1: Aktualizacja systemu

Na początku aktualizujemy system i instalujemy podstawowe narzędzia wymagane przez instalator.

apt update
apt upgrade -y
apt install -y git openssl curl gawk coreutils grep jq

Krok 2: Instalacja Dockera

Mailcow zaleca używanie aktualnego Dockera, a nie bardzo starej wersji z repozytorium dystrybucji. Najprostsza metoda instalacji na Debianie/Ubuntu wygląda tak:

curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker

Po instalacji sprawdź wersję:

docker version

Krok 3: Instalacja Docker Compose jako plugin

W nowych instalacjach najwygodniej używać składni docker compose, czyli bez myślnika.

apt update
apt install -y docker-compose-plugin

Sprawdzenie wersji:

docker compose version

Krok 4: Pobranie Mailcow

Przechodzimy do katalogu /opt, pobieramy oficjalne repozytorium i uruchamiamy generator konfiguracji.

cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh

Podczas generowania konfiguracji podaj pełną nazwę hosta, np.:

mail.example.pl

Po wygenerowaniu konfiguracji warto zajrzeć do pliku:

nano mailcow.conf

Na tym etapie można sprawdzić m.in. nazwę hosta, ustawienia IPv6, porty oraz ewentualne dodatkowe parametry.

Krok 5: Uruchomienie Mailcow

Gdy konfiguracja jest gotowa, pobieramy obrazy i uruchamiamy kontenery:

docker compose pull
docker compose up -d

Pierwsze pobieranie obrazów może potrwać dłuższą chwilę. Po starcie sprawdź stan kontenerów:

docker compose ps

Logi można podejrzeć poleceniem:

docker compose logs --tail=100

Pierwsze logowanie

Panel administracyjny powinien być dostępny pod adresem:

https://mail.example.pl/admin

Domyślne dane logowania to:

login: admin
hasło: moohoo

Uwaga: hasło administratora należy zmienić od razu po pierwszym logowaniu. Warto też włączyć dodatkowe zabezpieczenia konta administracyjnego.

Dodanie domeny i rekordów DNS

Po zalogowaniu dodaj domenę pocztową, np. example.pl. Mailcow podpowie rekordy DNS, które należy ustawić u operatora domeny. Szczególnie ważne są:

  • MX – wskazanie serwera poczty,
  • SPF – informacja, kto może wysyłać pocztę z domeny,
  • DKIM – podpisywanie poczty kluczem domeny,
  • DMARC – polityka obsługi wiadomości, które nie przejdą SPF/DKIM.

Po zmianach DNS trzeba odczekać na propagację rekordów. W praktyce część zmian działa po kilku minutach, ale pełna propagacja może potrwać dłużej.

Backup Mailcow

Przed każdą większą zmianą i przed aktualizacją warto wykonać backup. Mailcow dostarcza do tego gotowy skrypt:

cd /opt/mailcow-dockerized
./helper-scripts/backup_and_restore.sh backup all --delete-days 14

Można też wskazać katalog backupu przez zmienną środowiskową:

MAILCOW_BACKUP_LOCATION=/mnt/backup/mailcow \
./helper-scripts/backup_and_restore.sh backup all --delete-days 14

W środowisku produkcyjnym warto dodatkowo wykonywać snapshot maszyny wirtualnej albo kopię katalogów na zewnętrzny system backupu. Sam fakt, że usługa działa w Dockerze, nie zastępuje kopii zapasowej.

Moja zasada: najpierw backup, potem aktualizacja. Nigdy odwrotnie.

Aktualizacja Mailcow

Aktualizacja Mailcow jest bardzo prosta, ale nie należy jej wykonywać „w ciemno”. Najpierw warto sprawdzić, czy aktualizacja jest dostępna:

cd /opt/mailcow-dockerized
./update.sh --check

Jeżeli wszystko wygląda poprawnie, wykonujemy backup:

./helper-scripts/backup_and_restore.sh backup all --delete-days 14

Dopiero po backupie uruchamiamy właściwą aktualizację:

./update.sh

Skrypt sam pobierze zmiany, obrazy kontenerów i w razie potrzeby zada dodatkowe pytania. Po aktualizacji sprawdzamy stan usług:

docker compose ps
docker compose logs --tail=100

Jeżeli chcesz tylko posprzątać stare obrazy po aktualizacjach, można użyć:

./update.sh --gc

Co sprawdzić po aktualizacji?

Po aktualizacji warto wykonać krótką checklistę:

  • czy wszystkie kontenery są uruchomione,
  • czy panel administracyjny działa,
  • czy webmail SOGo działa,
  • czy można wysłać wiadomość na zewnątrz,
  • czy można odebrać wiadomość z zewnątrz,
  • czy certyfikat TLS jest poprawny,
  • czy w logach nie ma powtarzających się błędów.

Przydatne polecenia:

docker compose ps
docker compose logs --tail=200 -f
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

Najczęstsze problemy

Port 25 jest zablokowany

To jeden z najczęstszych problemów. Wielu operatorów VPS blokuje port 25 wychodzący lub przychodzący, szczególnie na nowych kontach. Bez portu 25 serwer poczty nie będzie poprawnie wymieniał wiadomości z Internetem.

Brak rekordu PTR

Jeżeli adres IP nie ma poprawnego reverse DNS, część serwerów może odrzucać pocztę albo traktować ją jako podejrzaną. PTR powinien wskazywać na nazwę hosta Mailcow, np. mail.example.pl.

Inna usługa zajmuje port 80 lub 443

Jeżeli na serwerze działa już Apache, Nginx albo inny reverse proxy, Mailcow może nie wystartować poprawnie. Wtedy trzeba zdecydować, czy Mailcow ma używać tych portów bezpośrednio, czy ma działać za istniejącym reverse proxy.

Instalacja w LXC

Mailcow nie jest dobrym kandydatem do LXC. Jeżeli używasz Proxmoxa, najbezpieczniej przygotować normalną maszynę wirtualną, a nie kontener LXC.

Brak backupu przed aktualizacją

Aktualizacja zwykle przebiega bezproblemowo, ale serwer poczty przechowuje ważne dane: skrzynki, konfigurację domen, klucze DKIM, bazę SQL, Redis, ustawienia Rspamd. Backup przed aktualizacją powinien być standardem.

Podsumowanie

Mailcow bardzo ułatwia uruchomienie własnego serwera poczty, bo większość trudnych elementów jest gotowa w jednym projekcie. Nie zwalnia to jednak administratora z myślenia o DNS, portach, certyfikatach, backupach i aktualizacjach.

Najbezpieczniejsza procedura wygląda tak:

  1. przygotuj poprawny DNS i PTR,
  2. sprawdź porty,
  3. zainstaluj aktualnego Dockera i Docker Compose,
  4. wygeneruj konfigurację Mailcow,
  5. uruchom kontenery,
  6. dodaj domenę i rekordy SPF/DKIM/DMARC,
  7. regularnie wykonuj backup,
  8. aktualizuj przez ./update.sh.

Mailcow jest świetnym narzędziem, ale wymaga porządku administracyjnego. Jeśli potraktujesz go jak normalną usługę produkcyjną, z backupem i checklistą aktualizacji, potrafi odwdzięczyć się stabilną pracą.

Twoja kolej

Masz własne doświadczenia z Mailcow? Udało Ci się uruchomić go w homelabie, firmie albo na VPS? A może największym problemem okazał się DNS, port 25 albo reputacja adresu IP?

Daj znać w komentarzu. Takie praktyczne uwagi są często bardziej wartościowe niż sama dokumentacja.

G

Tagi: , , , ,

BIND9 w Dockerze jako secondary DNS i cache DNS – schemat działania

28 lutego, 2026 | Brak Komentarzy | Kategoria: Linux, Porady

BIND9 w Dockerze

BIND9 w Dockerze może działać jednocześnie jako secondary DNS (slave) dla Twoich stref oraz jako cache DNS (rekurencja + cache) dla intranetu. Poniżej dostajesz gotowy, praktyczny setup oparty o obraz ubuntu/bind9:latest z konfiguracją w jednym pliku (named.conf) oraz danymi przykładowymi (zanonimizowanymi).

Najważniejsze założenie bezpieczeństwa: rekurencja działa wyłącznie dla zaufanych sieci, żeby serwer nie stał się otwartym resolverem.

Spis treści


Wymagania

  • Docker na serwerze (Linux).
  • Porty 53/TCP i 53/UDP dostępne w sieci, z której pytają klienci.
  • Na master DNS masz włączone transfery stref (AXFR/IXFR) dla secondary.
  • Znasz sieci intranet/VPN, które mają prawo do rekurencji.

Uwaga o anonimizacji: w przykładach używam domen typu corp.example i adresów z puli dokumentacyjnej (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24). Podmień na własne.

Katalogi na hoście

Trzymamy na hoście jeden plik konfiguracyjny oraz osobno cache i pliki stref slave.

sudo mkdir -p /srv/bind9
sudo mkdir -p /srv/bind9/cache
sudo mkdir -p /srv/bind9/cache/slaves

sudo nano /srv/bind9/named.conf

named.conf – secondary DNS + cache DNS w jednym pliku

Poniżej kompletna konfiguracja: ACL, rekurencja/caching, forwardery oraz strefy typu slave. Wszystko jest krótkie liniowo i nie „wyjeżdża” poza ramkę.

// /srv/bind9/named.conf
// BIND9: secondary DNS (slave) + cache DNS
// Dane przykładowe (zanonimizowane) – podmień na własne.

acl "trusted" {
    127.0.0.1;
    10.10.0.0/16;
    192.168.50.0/24;
};

options {
    directory "/var/cache/bind";

    // Rekurencja i cache tylko dla intranetu
    recursion yes;
    allow-query { trusted; };
    allow-recursion { trusted; };
    allow-query-cache { trusted; };

    // Forwardery upstream (przykładowe IP)
    forwarders {
        203.0.113.53;
        198.51.100.53;
    };
    forward only;

    dnssec-validation auto;

    listen-on { any; };
    listen-on-v6 { any; };

    auth-nxdomain no;
};

// RFC1918 (standardowy plik w obrazie)
include "/etc/bind/zones.rfc1918";

// ---- Strefy secondary (slave) ----

zone "corp.example" {
    type slave;
    file "/var/cache/bind/slaves/db.corp.example";
    masters { 203.0.113.10; };
    allow-notify { 203.0.113.10; };
};

zone "50.168.192.in-addr.arpa" {
    type slave;
    file "/var/cache/bind/slaves/db.192.168.50";
    masters { 203.0.113.10; };
    allow-notify { 203.0.113.10; };
};

// Domyślne strefy (krótki include zamiast inline’owania długich nazw)
include "/etc/bind/named.conf.default-zones";

// Minimalne logowanie (ciszej)
logging {
    category lame-servers { null; };
    category edns-disabled { null; };
};

Dlaczego tak? To nadal jest „jednoplikowa konfiguracja” w sensie: wszystko, co konfigurujesz (secondary + cache), jest w jednym pliku. A długie, systemowe definicje default-zones zostają w obrazie — dzięki temu unikasz linii, których nie da się sensownie złamać.

Uruchomienie kontenera

Najważniejsze: montujemy tylko named.conf (read-only) oraz katalog cache. Dzięki temu pliki systemowe (named.conf.default-zones, zones.rfc1918, bazy db.*) zostają w kontenerze i nie musisz ich kopiować na hosta.

docker run -d \
  --name bind9-container \
  --restart unless-stopped \
  -e TZ=Europe/Warsaw \
  -p 53:53/tcp \
  -p 53:53/udp \
  -v /srv/bind9/named.conf:/etc/bind/named.conf:ro \
  -v /srv/bind9/cache:/var/cache/bind \
  ubuntu/bind9:latest

Jeśli wolisz Compose:

services:
  bind9:
    image: ubuntu/bind9:latest
    container_name: bind9-container
    restart: unless-stopped
    environment:
      - TZ=Europe/Warsaw
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    volumes:
      - /srv/bind9/named.conf:/etc/bind/named.conf:ro
      - /srv/bind9/cache:/var/cache/bind

Uprawnienia (UID/GID bind)

Secondary zapisuje pliki stref do cache. Jeśli brakuje praw, zobaczysz błędy typu „permission denied”. Sprawdź UID/GID użytkownika bind w kontenerze i ustaw właściciela katalogu cache na hoście.

docker exec -it bind9-container id bind

Przykład (u Ciebie może być inny):

uid=101(bind) gid=101(bind) groups=101(bind)

Ustaw właściciela (podmień UID:GID z wyniku):

sudo chown -R 101:101 /srv/bind9/cache
docker restart bind9-container

Testy działania

1) Sprawdzenie składni

docker exec -it bind9-container \
  named-checkconf /etc/bind/named.conf

2) Czy strefy slave się pobrały?

ls -la /srv/bind9/cache/slaves
docker logs --since=10m bind9-container

3) Test secondary (autorytatywnie)

dig @192.0.2.53 corp.example SOA \
  +noall +answer

4) Test cache DNS (rekurencja)

dig @192.0.2.53 example.org A +stats
dig @192.0.2.53 example.org A +stats

Tipy i pułapki

  • Nie montuj całego /etc/bind z hosta, jeśli nie kopiujesz plików systemowych —
    wtedy najczęściej „znika” named.conf.default-zones i zones.rfc1918.
  • Zawsze ogranicz rekurencję (allow-recursion, allow-query-cache) do intranetu.
  • Jeśli master wysyła NOTIFY, dodaj allow-notify tylko z IP mastera.
  • Chcesz twardsze bezpieczeństwo? Kolejny krok to TSIG między master ↔ secondary.

G

Tagi: , , ,

Aktualizacja Nextcloud w Dockerze: Nie zapomnij o tym kluczowym kroku!

31 stycznia, 2026 | Brak Komentarzy | Kategoria: Linux, Porady

Nextcloud Docker indeksyPodczas aktualizacji Nextcloud działającego w kontenerach Docker często pomija się jeden istotny element: indeksy bazy danych. Zaniedbanie przebudowy indeksów może powodować spowolnienie działania Nextcloud po aktualizacji. W tym artykule wyjaśniam krok po kroku, jak prawidłowo zadbać o Nextcloud Docker indeksy przed podniesieniem wersji.

To jeden z tych problemów, które trudno uchwycić na pierwszy rzut oka, bo wszystko działa – tylko wolniej. Czasem dochodzą do tego nieoczywiste komunikaty w logach lub w panelu administracyjnym: sugestie dotyczące bazy danych, ostrzeżenia o brakujących indeksach, albo zalecenia „optymalizacji”. W praktyce bardzo często winny jest pominięty krok przed główną aktualizacją: sprawdzenie i dodanie brakujących indeksów w bazie danych (w tym przypadku SQLite) komendą occ.

W tym artykule pokażę:

  • dlaczego Nextcloud potrafi zwolnić po aktualizacji, mimo że „nic się nie zepsuło”,
  • czym są indeksy w bazie danych i czemu mają krytyczne znaczenie dla wydajności,
  • dlaczego aktualizacje Nextcloud mogą wymagać nowych indeksów,
  • jak bezpiecznie wykonać procedurę krok po kroku w Dockerze (linuxserver/nextcloud),
  • co zrobić, gdy komenda zwróci błąd.

Zanim zrobisz większą aktualizację Nextcloud w kontenerze Docker, uruchom occ db:add-missing-indices i dopiero potem przechodź do aktualizacji obrazu. To prosty nawyk, który potrafi oszczędzić godziny diagnozy „dlaczego po update jest wolniej”.

Skąd bierze się spowolnienie Nextcloud po aktualizacji?

Wydajność Nextcloud zależy od wielu elementów: zasobów serwera, konfiguracji PHP, pamięci podręcznej (Redis), silnika bazy danych i sposobu przechowywania danych. Jeśli jednak mówimy o scenariuszu „po aktualizacji było dobrze, a teraz jest gorzej”, to warto zacząć od tego, co aktualizacja zmienia najczęściej: strukturę danych i sposób, w jaki aplikacja odpyta bazę.

Nextcloud rozwija się dynamicznie. Z każdą wersją pojawiają się nowe funkcje, nowe mechanizmy indeksowania plików, dodatkowe metadane, czasem nowe tabele lub kolumny. Nawet jeśli sama migracja bazy przejdzie poprawnie, to po aktualizacji aplikacja może wykonywać zapytania, które wcześniej były rzadkie albo w ogóle nie występowały. Jeśli do tych zapytań brakuje indeksów, baza danych zaczyna wykonywać kosztowne skany, co w SQLite potrafi szybko stać się wąskim gardłem.

Efekt? Użytkownik widzi „czkawkę” w interfejsie, administrator widzi wzrost obciążenia, a w logach — pozornie nic spektakularnego.

Czym są indeksy w bazie danych i dlaczego są kluczowe?

Indeks w bazie danych możesz porównać do spisu treści albo indeksu haseł w książce. Jeśli chcesz znaleźć konkretne nazwisko w 800-stronicowej publikacji, nie czytasz wszystkiego od początku — korzystasz z indeksu, który wskazuje stronę. Podobnie działa baza danych: kiedy aplikacja pyta „znajdź wszystkie rekordy spełniające warunek X”, indeks pozwala szybko dojść do wyniku bez przeglądania całej tabeli.

Bez indeksu baza często musi wykonać tzw. full table scan, czyli przeszukanie całej tabeli. Przy małych danych to jeszcze „jakoś działa”. Ale Nextcloud bardzo szybko generuje duże ilości rekordów: pliki, udziały, wersje, podglądy, informacje o użytkownikach, aplikacjach, logach, aktywnościach, cronach, zadaniach tła… Lista rośnie.

Najważniejsze korzyści z indeksów:

  • Szybsze zapytania SELECT – szczególnie po kolumnach używanych w filtrach i joinach.
  • Mniejsze obciążenie CPU i I/O – mniej pracy dla bazy i mniej odczytów.
  • Stabilniejsza wydajność przy rosnącej liczbie rekordów.
  • Mniej „dziwnych” problemów, gdzie interfejs działa, ale reaguje opóźnieniem.

Oczywiście indeksy mają też koszt: spowalniają część operacji zapisu (INSERT/UPDATE), bo indeks również trzeba aktualizować. Ale w kontekście Nextcloud, gdzie kluczowe są szybkie odczyty i filtrowanie, poprawnie dobrane indeksy są absolutnie fundamentalne.

Dlaczego aktualizacja Nextcloud może wymagać nowych indeksów?

Aktualizacja Nextcloud to nie tylko „nowszy kod w kontenerze”. To także:

  • nowe lub zmodyfikowane tabele,
  • nowe kolumny w istniejących tabelach,
  • zmiany w sposobie, w jaki aplikacja wyszukuje dane,
  • nowe funkcje, które generują dodatkowe zapytania (np. aktywności, udostępnienia, pełnotekstowe wyszukiwanie, integracje).

W idealnym świecie każda migracja bazy danych dodaje wszystko, co potrzebne. W praktyce — zwłaszcza w dużych projektach — zdarza się, że po aktualizacji pojawiają się zalecenia: „Dodaj brakujące indeksy, aby poprawić wydajność”. Nextcloud dostarcza do tego gotowe narzędzie: komendę OCC, która potrafi wykryć brakujące indeksy i je utworzyć.

Jeśli ten krok pominiesz, Nextcloud będzie działał, ale baza może wykonywać znacznie więcej pracy. A przy SQLite — która świetnie sprawdza się w mniejszych instalacjach, ale ma swoje ograniczenia w obciążonych środowiskach — brak indeksów potrafi być szczególnie bolesny.

Wskazówka administracyjna: Jeśli Twoja instancja ma wielu użytkowników, duże biblioteki plików lub intensywne udostępnienia, rozważ migrację z SQLite do PostgreSQL/MariaDB. Ale nawet wtedy komenda dodająca brakujące indeksy pozostaje dobrym nawykiem.

Instrukcja krok po kroku: indeksy SQLite przed aktualizacją Nextcloud w Dockerze

Poniższa procedura zakłada, że używasz obrazu linuxserver/nextcloud i zarządzasz kontenerem standardowo (Docker / docker-compose). Kluczowa zasada: najpierw backup, potem indeksy, dopiero później aktualizacja obrazu.

[GRAFIKA: Schemat blokowy przedstawiający poprawny proces aktualizacji Nextcloud z krokiem „db:add-missing-indices”]
Grafika powinna pokazywać prosty proces w formie flowchartu: (1) Backup → (2) Uruchomienie komendy occ db:add-missing-indices → (3) Aktualizacja obrazu/wersji Nextcloud → (4) Weryfikacja działania i logów. Alternatywnie: zrzut ekranu terminala z wykonaniem komendy i komunikatem o dodanych indeksach.

Krok 1: Zrób pełną kopię zapasową (kontener + wolumeny z danymi)

To jest moment, w którym wielu administratorów „idzie na skróty”, bo „to tylko mały update”. A potem pojawia się problem i nie ma do czego wrócić. Backup przed operacją na bazie danych to absolutna podstawa — nawet jeśli narzędzie jest bezpieczne, zawsze może dojść do:

  • braku miejsca na dysku podczas tworzenia indeksów,
  • przerwania procesu (restart hosta, restart Dockera, awaria zasilania),
  • problemów z uprawnieniami, które kończą się częściową modyfikacją plików bazy,
  • niezgodności w środowisku pośrodku zmian.

Co backupować?

  • Wolumen / katalog z danymi Nextcloud (to, co mapujesz jako /data i zwykle także /config w linuxserver/nextcloud).
  • Plik bazy SQLite – najczęściej znajduje się w obrębie danych/configu Nextcloud (zależnie od Twojego mapowania).
  • Konfigurację kontenera – np. plik docker-compose.yml, zmienne środowiskowe, reverse proxy, cron.

Najprościej: wykonaj kopię katalogów mapowanych jako wolumeny (np. snapshot na poziomie systemu plików, kopia na NAS, tar na zewnętrzny dysk). Jeżeli masz możliwość snapshotów (ZFS/Btrfs/LVM) – to jest świetny moment, by z nich skorzystać.

Krok 2: Uruchom komendę dodającą brakujące indeksy

Gdy backup jest gotowy i kontener Nextcloud działa, przechodzimy do sedna. Oto komenda, którą warto wykonać przed większą aktualizacją:

docker exec -it -u abc nextcloud php /config/www/nextcloud/occ \
db:add-missing-indices

Ta komenda uruchamia narzędzie occ wewnątrz kontenera i zleca Nextcloud sprawdzenie brakujących indeksów w bazie oraz ich utworzenie (jeśli to możliwe). W wielu przypadkach dostaniesz informację o tym, jakie indeksy zostały dodane, albo że nic nie trzeba robić.

Co oznaczają flagi i elementy komendy?

  • docker exec – uruchamia polecenie w działającym kontenerze.
  • -it – to dwie flagi naraz:
    • -i (interactive) utrzymuje wejście standardowe otwarte,
    • -t (tty) przydziela pseudo-terminal, dzięki czemu komenda zachowuje się „jak w normalnej konsoli”.

    W praktyce: bez -it często też zadziała, ale w administracji Nextcloud i pracy z occ to po prostu dobry standard.

  • -u abc – uruchamia polecenie jako użytkownik abc wewnątrz kontenera. W obrazach linuxserver.io aplikacje zwykle działają pod użytkownikiem o takiej nazwie, a uruchamianie occ jako root potrafi skończyć się problemami z uprawnieniami do plików (zwłaszcza w /config i danych Nextcloud).
  • nextcloud – nazwa Twojego kontenera. Jeśli masz inną (np. nc albo nextcloud-app), podmień ją na właściwą.
  • php – uruchamiamy interpreter PHP, bo occ jest skryptem PHP.
  • /config/www/nextcloud/occ – ścieżka do pliku occ w kontenerze linuxserver/nextcloud. To ważne: w zależności od obrazu ścieżka bywa inna, ale dla linuxserver/nextcloud ta lokalizacja jest typowa.
  • db:add-missing-indices – właściwa komenda OCC, która sprawdza i tworzy brakujące indeksy.

Krok 3: Zinterpretuj wynik i upewnij się, że wszystko przebiegło poprawnie

Jeśli wszystko pójdzie dobrze, zobaczysz komunikaty o dodanych indeksach lub informację, że brakujących indeksów nie znaleziono. Warto po tym kroku:

  • rzucić okiem na logi Nextcloud,
  • sprawdzić panel administracyjny (sekcja ostrzeżeń/konfiguracji),
  • odczekać chwilę, jeśli baza jest duża (tworzenie indeksów może trwać).

Dopiero po tej operacji przechodź do standardowej procedury aktualizacji kontenera (pull nowego obrazu, restart, ewentualne migracje).

Co zrobić, jeśli komenda zwróci błąd?

Błędy zdarzają się rzadko, ale warto mieć plan działania. Oto najczęstsze scenariusze i szybkie kroki naprawcze:

  1. Kontener nie działaJeśli docker exec zwraca błąd typu „Container … is not running”, najpierw upewnij się, że Nextcloud jest uruchomiony:
    • sprawdź docker ps,
    • zobacz logi kontenera: docker logs nextcloud,
    • uruchom kontener ponownie i dopiero wtedy wykonaj komendę OCC.
  2. Zła nazwa konteneraGdy komenda wskazuje, że nie ma takiego kontenera, sprawdź nazwę w docker ps i podmień w poleceniu.
  3. Problemy z uprawnieniamiJeśli w logach pojawiają się błędy zapisu lub dostępu do plików, najpierw upewnij się, że uruchamiasz polecenie jako właściwy użytkownik (-u abc). W obrazach linuxserver to zazwyczaj właściwy wybór. Jeśli masz nietypową konfigurację PUID/PGID, sprawdź, czy mapowania wolumenów mają poprawne prawa dostępu.
  4. Błąd ścieżki do OCCJeżeli dostaniesz komunikat, że plik /config/www/nextcloud/occ nie istnieje, możliwe że:
    • używasz innego obrazu niż linuxserver/nextcloud,
    • Twoja struktura w kontenerze jest inna.

    Wtedy wejdź do kontenera i sprawdź, gdzie leży occ:

    docker exec -it nextcloud sh

    a następnie zlokalizuj plik (np. find / -name occ 2>/dev/null) i dostosuj ścieżkę w komendzie.

  5. Sprawdź logi Nextcloud i logi konteneraJeśli błąd jest „aplikacyjny” (np. problem z bazą, lockami, trybem maintenance), zajrzyj do:
    • logów kontenera: docker logs nextcloud,
    • logu Nextcloud (w zależności od konfiguracji zwykle w /config/www/nextcloud/data/nextcloud.log lub analogicznym miejscu w wolumenie).

Uwaga: Jeśli Twoja instancja jest intensywnie używana (wielu aktywnych użytkowników), rozważ wykonanie tego kroku w oknie serwisowym. Dodawanie indeksów potrafi chwilowo zwiększyć obciążenie bazy.

Dlaczego warto robić to regularnie (i czemu „przed aktualizacją” ma znaczenie)?

Możesz zapytać: „Skoro to tylko indeksy, to czemu mam robić to przed aktualizacją, a nie po?”. Dwa powody:

  • Minimalizujesz ryzyko kumulacji zmian. Jeśli po aktualizacji coś zacznie działać gorzej, nie wiesz, czy to wina migracji wersji, nowych funkcji, czy brakujących indeksów. Robiąc indeksy wcześniej, izolujesz zmienną.
  • Zwiększasz szansę na płynny start po update. Po aktualizacji Nextcloud może uruchomić procesy, które natychmiast zaczną intensywnie odpytwać bazę. Jeśli indeksy już są, unikasz „zimnego prysznica” wydajnościowego.

W praktyce to mały rytuał administracyjny, który warto dodać do checklisty. Zwłaszcza jeśli prowadzisz blog techniczny i chcesz promować dobre nawyki: backup, sanity-check bazy, dopiero potem aktualizacja.

Podsumowanie

Wydajność Nextcloud po aktualizacji nie zawsze psuje się spektakularnie. Częściej „siada po cichu”: trochę wolniej tu, trochę wolniej tam — aż w końcu zaczyna przeszkadzać. Brakujące indeksy w bazie danych (także w SQLite) to jeden z najbardziej niedocenianych powodów takiego zachowania.

Dobry nawyk administracyjny wygląda tak:

  1. Backup (zawsze).
  2. occ db:add-missing-indices w działającym kontenerze.
  3. Dopiero potem aktualizacja Nextcloud (pull + restart + weryfikacja).

To prosta procedura, a potrafi realnie poprawić stabilność i wydajność po kolejnych wydaniach.

Twoja kolej

Masz za sobą aktualizację Nextcloud, po której instalacja zaczęła działać wolniej? A może komenda db:add-missing-indices uratowała Cię przed długim wieczorem z logami?

Napisz w komentarzu, jak wygląda Twoja checklist aktualizacji Nextcloud w Dockerze, jakie problemy spotkałeś i jak je rozwiązałeś. Jeśli artykuł okazał się pomocny, udostępnij go komuś, kto też administruje Nextcloud. I jeśli chcesz dostawać podobne praktyczne poradniki – zasubskrybuj bloga, bo regularnie publikuję sprawdzone procedury i rozwiązania „z pola walki”.

G

Tagi: , ,

Portainer nie działa po aktualizacji Dockera – najszybsze rozwiązanie

27 grudnia, 2025 | Brak Komentarzy | Kategoria: Linux, Porady

Błąd Portainer local unreachable po aktualizacji DockeraPortainer nie działa po aktualizacji Dockera – najszybsze rozwiązanie:

Po aktualizacji systemu lub Dockera (szczególnie do wersji Docker Engine 29) wielu administratorów zauważa, że Portainer uruchamia się poprawnie, można się do niego zalogować, ale nie da się zarządzać lokalnym środowiskiem Docker.

W interfejsie Portainera pojawia się wtedy komunikat:

Failed loading environment
The environment named local is unreachable

W tym artykule pokazuję najszybsze i najprostsze rozwiązanie, które pozwala przywrócić działanie Portainera bez cofania Dockera ani systemu operacyjnego.


Dlaczego Portainer przestaje działać po aktualizacji Dockera?

Od wersji Docker Engine 29 demon Dockera wymusza minimalną wersję API na poziomie 1.44. Problem polega na tym, że aktualna wersja Portainer CE wciąż korzysta ze starszej wersji Docker API.

Efekt jest następujący:

  • Docker działa poprawnie
  • Kontener Portainera uruchamia się bez błędów
  • Portainer nie może połączyć się z lokalnym Dockerem

To powoduje, że środowisko local jest oznaczone jako niedostępne.


Najprostsze i najszybsze rozwiązanie problemu

Rozwiązaniem jest obniżenie minimalnej wersji Docker API, którą demon Dockera akceptuje od klientów takich jak Portainer.

Wykonuje się to poprzez edycję pliku konfiguracyjnego Dockera:

Krok 1: Edycja pliku /etc/docker/daemon.json

Na hoście (Debian, Ubuntu, Raspberry Pi OS) otwórz plik:

sudo nano /etc/docker/daemon.json

Jeżeli plik nie istnieje, utwórz go i wklej:

{
  "min-api-version": "1.24"
}

Jeżeli plik już istnieje (np. zawiera data-root), dopisz nową linię, zachowując poprawną składnię JSON:

{
  "data-root": "/var/lib/docker",
  "min-api-version": "1.24"
}

Uwaga: brak przecinka między wpisami spowoduje, że Docker nie uruchomi się.


Krok 2: Restart Dockera

sudo systemctl daemon-reload
sudo systemctl restart docker

Sprawdź, czy Docker działa poprawnie:

docker ps

Krok 3: Restart Portainera

docker restart portainer

Po kilku sekundach odśwież interfejs Portainera w przeglądarce.


Efekt końcowy

Po wykonaniu powyższych kroków:

  • środowisko local w Portainerze staje się dostępne
  • można normalnie zarządzać kontenerami i stackami
  • nie ma potrzeby downgrade’u Dockera

Podsumowanie

Problem z Portainerem po aktualizacji Dockera wynika z niezgodności wersji Docker API, a nie z błędnej konfiguracji kontenera.

Dodanie wpisu:

"min-api-version": "1.24"

w pliku /etc/docker/daemon.json jest obecnie najszybszym i najbezpieczniejszym rozwiązaniem, dopóki Portainer nie wprowadzi pełnej kompatybilności z Docker Engine 29.

G

Tagi: , , ,

OpenVAS w kontenerze Docker

2 grudnia, 2025 | Brak Komentarzy | Kategoria: Linux, Porady
OpenVAS, Docker

Przewodnik po obrazie immauss/openvas

 

OpenVAS (Open Vulnerability Assessment Scanner) to jedno z najbardziej rozpoznawalnych narzędzi open-source do skanowania luk w zabezpieczeniach.
Dzięki konteneryzacji z wykorzystaniem Dockera wdrożenie oraz utrzymanie tego skanera stało się prostsze, bardziej powtarzalne i odporne na problemy
z zależnościami systemowymi. Jednym z najpopularniejszych kontenerowych wydań jest obraz immauss/openvas, który umożliwia szybkie uruchomienie w pełni funkcjonalnego środowiska skanowania na dowolnym serwerze obsługującym Docker.

Czym jest immauss/openvas?

Obraz immauss/openvas to nieoficjalny, lecz aktywnie rozwijany kontener Dockera zawierający kompletną instalację narzędzia OpenVAS/GVM.
Projekt jest regularnie aktualizowany, co zapewnia świeże bazy NVT (Network Vulnerability Tests), środowisko GVM oraz kompatybilność z nowszymi wersjami Dockera.

Najważniejsze cechy obrazu:

  • oparty na aktualnych pakietach GVM,
  • zautomatyzowane pobieranie i aktualizacje baz NVT,
  • gotowy do użycia interfejs webowy,
  • uproszczona konfiguracja oraz start kontenera.

Instalacja i pierwsze uruchomienie

Wymagania wstępne

  • System Linux, macOS lub Windows (z włączonym Docker Desktop).
  • Zainstalowany i działający Docker Engine.

Pobranie obrazu

docker pull immauss/openvas

Uruchomienie kontenera

Przykładowa komenda docker run:

docker run -d \
  --name openvas \
  -p 8080:9392 \
  -v openvas-data:/data \
  immauss/openvas

Opis parametrów:

  • --name openvas — nazwa kontenera,
  • -p 8080:9392 — mapowanie portu interfejsu webowego GVM na port 8080 hosta,
  • -v openvas-data:/data — wolumen zapewniający trwałość danych (konfiguracje, wyniki skanów, raporty).

Ważna informacja — pierwsze uruchomienie trwa długo

Przy pierwszym starcie kontener pobiera pełną bazę testów NVT oraz kompiluje je – operacja ta może potrwać
nawet kilkadziesiąt minut, w zależności od wydajności dysku i łącza internetowego. Jest to zachowanie oczekiwane i
nie należy przerywać tego procesu, jeśli kontener wygląda na zajęty lub logi intensywnie się przewijają.

Dostęp do interfejsu webowego i pierwsze kroki

Po poprawnym uruchomieniu kontenera otwórz przeglądarkę i wpisz adres:

http://[IP_SERWERA]:8080

Domyślny login: admin
Hasło: generowane automatycznie przy starcie kontenera.

Aby wyświetlić wygenerowane hasło, użyj polecenia:

docker logs openvas | grep "Admin Password"

Po zalogowaniu zaleca się natychmiastową zmianę hasła oraz konfigurację podstawowych parametrów systemu,
w szczególności ustawień związanych z kontami użytkowników, polityką haseł oraz dostępem sieciowym do panelu GVM.

Kluczowe funkcje i możliwości OpenVAS/GVM

OpenVAS w wersji kontenerowej oferuje pełny zestaw funkcjonalności środowiska GVM, co pozwala na realizację
kompleksowych procesów zarządzania podatnościami w infrastrukturze IT.

Skanowanie hostów i sieci

  • skan pojedynczego adresu IP,
  • skan całych zakresów adresowych (np. w notacji CIDR),
  • zaawansowane skanowanie z parametryzacją portów, intensywności testów oraz wykluczeń.

Zarządzanie zadaniami skanowania

  • definiowanie zadań skanowania przypisanych do konkretnych celów (Targets),
  • tworzenie harmonogramów skanów cyklicznych,
  • wykorzystanie profili skanowań dostosowanych do różnych scenariuszy (np. szybki skan, pełny audyt).

Zaawansowana analiza raportów

  • eksport raportów do formatów takich jak PDF, XML czy TXT,
  • grupowanie wyników według poziomu ryzyka i rodzaju podatności,
  • śledzenie zmian podatności w czasie, co ułatwia weryfikację efektywności wdrażanych poprawek.

Integracje i automatyzacja

  • dostępne API GVM (GMP), pozwalające na integrację z systemami SIEM, SOAR lub autorskimi narzędziami,
  • możliwość uruchamiania skanów zautomatyzowanych w ramach pipeline’ów CI/CD,
  • współpraca z systemami zarządzania ryzykiem i ticketingiem (np. poprzez integracje pośrednie).

Zalety użycia wersji kontenerowej

Uruchomienie OpenVAS jako kontenera Dockera niesie ze sobą szereg korzyści z punktu widzenia administratorów systemów
oraz zespołów odpowiedzialnych za cyberbezpieczeństwo.

Izolacja środowiska

Kontener zapewnia izolację procesów i zależności od systemu hosta. Dzięki temu instalacja OpenVAS nie wpływa na inne
usługi oraz pakiety zainstalowane w systemie operacyjnym, a ewentualne konflikty bibliotek są znacząco ograniczone.

Łatwość aktualizacji

Aktualizacja środowiska sprowadza się do pobrania nowszej wersji obrazu i ponownego uruchomienia kontenera:

docker pull immauss/openvas
docker stop openvas
docker rm openvas
docker run -d \
  --name openvas \
  -p 8080:9392 \
  -v openvas-data:/data \
  immauss/openvas

Dane (konfiguracje, wyniki skanów, raporty) pozostają zachowane w wolumenie openvas-data.

Przenośność i skalowalność

Kontener można uruchomić na dowolnym serwerze, który obsługuje Dockera — zarówno w infrastrukturze on-premise,
jak i w chmurze. Umożliwia to szybkie tworzenie środowisk testowych, a także skalowanie rozwiązania poprzez uruchomienie
wielu instancji w zależności od potrzeb organizacji.

Brak konfliktów zależności

Tradycyjna instalacja OpenVAS bezpośrednio w systemie bywa wymagająca i podatna na problemy z zależnościami.
Wersja kontenerowa eliminuje konieczność ręcznej kompilacji czy dostosowywania środowiska, ponieważ wszystkie
potrzebne komponenty znajdują się wewnątrz obrazu Docker.

Szybkie i powtarzalne wdrożenie

Wdrożenie OpenVAS za pomocą kontenera Docker może zostać w pełni zautomatyzowane (np. z użyciem Ansible, Terraform
czy pipeline’ów CI/CD), co pozwala na szybkie odtwarzanie środowiska w różnych lokalizacjach lub w razie awarii.

Podsumowanie

Kontener immauss/openvas stanowi wydajne, stabilne i praktyczne rozwiązanie dla specjalistów
cyberbezpieczeństwa, administratorów systemów, zespołów SOC oraz pentesterów. Umożliwia szybkie wdrożenie narzędzia
OpenVAS na dowolnym środowisku, zapewnia efektywną automatyzację skanowania oraz pełną powtarzalność konfiguracji.

Włączenie tego rozwiązania do arsenału narzędzi bezpieczeństwa znacząco ułatwia prowadzenie regularnych, niezależnych audytów podatności, wspiera proces zarządzania ryzykiem oraz pozwala na bieżąco weryfikować stan bezpieczeństwa infrastruktury IT w organizacji.

G

Tagi: , ,

Bezpieczny serwer SFTP w 5 minut? To możliwe z Dockerem i atmoz/sftp!

27 września, 2025 | Brak Komentarzy | Kategoria: Linux, Porady
Serwer SFTP atmoz/sftp

Potrzebujesz szybko uruchomić bezpieczny serwer SFTP w odizolowanym środowisku, bez instalacji dodatkowego oprogramowania na serwerze? Dzięki obrazowi Docker atmoz/sftp jest to możliwe w kilka minut. W tym artykule pokażemy, jak skonfigurować taki serwer krok po kroku oraz jak dostosować go do różnych scenariuszy w praktyce.

Dlaczego warto wybrać atmoz/sftp?

Obraz atmoz/sftp to lekka, gotowa do użycia implementacja serwera SFTP, która działa w kontenerze Dockera. Rozwiązuje typowe problemy administratorów:

  • Izolacja: serwer SFTP działa w kontenerze, minimalizując ryzyko wpływu na system hosta.
  • Łatwa konfiguracja: wystarczy kilka zmiennych środowiskowych, by uruchomić gotowy serwer.
  • Bezpieczeństwo: dostęp oparty na SSH i możliwość ograniczenia użytkowników do wybranych katalogów.
  • Szybkość wdrożenia: w kilka minut można uruchomić działający serwer, bez kompilacji czy skomplikowanej konfiguracji.

Instalacja Dockera

Jeśli nie masz jeszcze zainstalowanego Dockera, możesz to zrobić w systemach Linux za pomocą poleceń:

sudo apt update 
sudo apt install docker.io -y 
sudo systemctl enable --now docker 

Sprawdź, czy Docker działa poprawnie:

docker --version 

Uruchomienie podstawowego serwera SFTP

Poniższe polecenie tworzy prosty serwer SFTP z jednym użytkownikiem:

docker run -p 22:22 -d \ 
-v /host/data:/home/user/upload \ 
-e SFTP_USERS="user:password:::upload" \ 
atmoz/sftp 

Wyjaśnienie parametrów:

  • -p 22:22 – mapowanie portu kontenera na port hosta.
  • -v /host/data:/home/user/upload – montowanie katalogu z hosta jako przestrzeni dostępnej dla użytkownika.
  • -e SFTP_USERS – definiuje użytkowników w formacie login:hasło:uid:gid:katalog.

Praktyczne scenariusze konfiguracji

1. Jeden użytkownik z dostępem do katalogu

docker run -p 22:22 -d \ 
-v /srv/sftp/data:/home/alice/data \ 
-e SFTP_USERS="alice:SuperHaslo:::data" \ 
atmoz/sftp 

Użytkownik alice może logować się i przesyłać pliki wyłącznie do katalogu /home/alice/data.

2. Wielu użytkowników z różnymi katalogami

docker run -p 22:22 -d \ 
-v /srv/sftp/alice:/home/alice/data \ 
-v /srv/sftp/bob:/home/bob/docs \ 
-e SFTP_USERS="alice:HasloAlice:::data bob:HasloBob:::docs" \ 
atmoz/sftp 

Każdy użytkownik ma własny katalog i jest w nim ograniczony (tzw. chroot).

3. Integracja z aplikacją – katalog współdzielony

docker run -p 2222:22 -d \ 
-v /srv/app/uploads:/home/client/shared \ 
-e SFTP_USERS="client:TrudneHaslo:::shared" \ 
--name sftp-server \ 
atmoz/sftp 

Taki scenariusz jest często używany do automatycznej wymiany danych między aplikacjami a partnerami biznesowymi.

Bezpieczeństwo i dobre praktyki

  • Używaj silnych haseł lub – lepiej – kluczy SSH.
  • Uruchamiaj kontener z ograniczonymi uprawnieniami i wyłącz dostęp roota.
  • Regularnie aktualizuj obraz atmoz/sftp do najnowszej wersji.
  • Monitoruj logi kontenera za pomocą docker logs.

Zalety wykorzystania Dockera i atmoz/sftp

Uruchomienie serwera SFTP w kontenerze Dockera pozwala na:

  • Szybkie wdrożenie: pełna konfiguracja w kilka minut.
  • Łatwą migrację: kontener można przenieść na inny host bez zmian w konfiguracji.
  • Bezpieczeństwo: odizolowane środowisko minimalizuje ryzyko podatności w systemie hosta.
  • Skalowalność: łatwo uruchomić wiele instancji dla różnych klientów.

Podsumowanie

Obraz atmoz/sftp to idealne rozwiązanie, jeśli potrzebujesz szybko uruchomić bezpieczny serwer SFTP w odizolowanym i łatwym do zarządzania środowisku. Dzięki Dockerowi wdrożenie jest proste, a konfiguracja elastyczna – od prostych jednoużytkownikowych scenariuszy po integrację z aplikacjami biznesowymi.

G

Tagi: , , , ,

Guacamole – zdalny dostęp w przeglądarce

26 października, 2024 | Brak Komentarzy | Kategoria: Linux, Porady

Apache Guacamole to bezkliencki system zdalnego dostępu, który umożliwia łączenie się z pulpitami zdalnymi poprzez przeglądarkę internetową. Dzięki obsłudze protokołów takich jak VNC, RDP i SSH, pozwala na zarządzanie różnymi systemami operacyjnymi z jednego miejsca, bez konieczności instalowania dodatkowego oprogramowania na urządzeniu klienckim.

W poniższym wideo przedstawiono szczegółowy proces instalacji Guacamole przy użyciu Dockera. Krok po kroku omówiono konfigurację bramki zdalnego dostępu, co umożliwia szybkie wdrożenie tego rozwiązania w środowisku sieciowym. Dzięki temu można efektywnie zarządzać zdalnymi systemami i aplikacjami, co jest szczególnie przydatne w administracji infrastrukturą IT.

Przydatne linki:

G

Tagi: , , , ,

Portainer po aktualizacji Docker 26 – problemy

29 czerwca, 2024 | Brak Komentarzy | Kategoria: Linux, Porady
Portainer Docker 26 - problemy

Wprowadzenie

Niedawna aktualizacja Dockera do wersji 26 spowodowała problemy dla użytkowników Portainera. W tym artykule omówimy na czym polegają te problemy, jakie są ich przyczyny oraz jak można je rozwiązać. Pokażemy również przykłady możliwych działań, aby uniknąć zakłóceń w działaniu systemów.

Problem

Po aktualizacji Dockera do wersji 26, wielu użytkowników Portainera (wersja 2.19.4) zauważyło, że nie mogą wyświetlać szczegółów obrazów ani uzyskiwać dostępu do konsoli kontenerów. Utrudnia to poważnie zarządzanie kontenerami i monitorowanie ich stanu.

Przykłady problemów

  • Brak możliwości przeglądania szczegółów obrazów Docker.
  • Niedziałająca konsola kontenerów, co uniemożliwia wykonywanie poleceń wewnątrz kontenerów.

Przyczyny

Problemy te wynikają z usunięcia niektórych funkcji w Dockerze 26, na których polegała poprzednia wersja Portainera. Zmiany w Dockerze spowodowały, że niektóre API używane przez Portainera przestały działać zgodnie z oczekiwaniami.

Rozwiązania

Tymczasowe rozwiązanie

Jednym z tymczasowych rozwiązań jest cofnięcie wersji Dockera do 25.0.5. Umożliwi to powrót do poprzedniej funkcjonalności, zanim zostanie wprowadzona odpowiednia poprawka w Portainerze.

Aktualizacja Portainera

Zespół Portainera szybko zareagował na zgłoszone problemy i wydał wersję 2.20.1, która naprawia problemy z kompatybilnością z Dockerem 26. Zaleca się aktualizację Portainera do tej wersji, aby uniknąć dalszych problemów.

Jak przeprowadzić aktualizację

  1. Cofnięcie wersji Dockera:
  • Odinstaluj obecną wersję Dockera.
  • Zainstaluj Docker w wersji 25.0.5 z odpowiedniego źródła.
  1. Aktualizacja Portainera:
  • Przejdź do strony Portainera i pobierz najnowszą wersję.
  • Zaktualizuj Portainera do wersji 2.20.1 zgodnie z instrukcjami na stronie.

Przykładowe komendy aktualizacji

# Cofnięcie wersji Dockera do 25.0.5
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get install docker-ce=5:20.10.5~3-0~ubuntu-focal

# Aktualizacja Portainera do wersji 2.20.1
docker pull portainer/portainer-ce:2.20.1
docker stop portainer
docker rm portainer
docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.20.1

G

Tagi: , ,