Darmowy Virtual Data Room - Pydio/Cells

Posted on Wed 02 March 2022 in Automatyczny dom, Linux, Wirtualizacja

Kilka(naście) lat temu zbudowałem VDR dla developera holetu. Było to proste repozytorium na dokumenty, z prostymi uprawnieniami: jeden administrator i wielu użytkowników z opcją odczytu. Potem się to trochę rozbudowało ale niespecjalnie mocno. Repozytorium obsługiwało się za pomocą vsftpd, a udostępnianie umożliwiał Apache. Działa to do dziś. Główną wadą tego systemu jest podatność na ludzki błąd - trzeba bardfzo starannie ustalać grupy dostępu i użytkowników.

Niedawno ktoś, kto znał mój stary VDR zapytał czy łatwo to zrobić bo chciał mieć swoje. Odparłem, że i tak, i nie, oraz że konfiguracja jest popaprana. I postanowiłem znaleźć coś lepszego.

Kiedyś robiłem coś dla firmy ze Szwajcarii, która miała wykupiony hosting, a jedną z usług dostępnych od jednego kliku było Pydio. Właśnie prosty VDR.

Dziś to jest naprawdę dojrzały produkt, w dodatku ma wersję kontenerową, postanowiłem więc go sprawdzić.

Uparłem się, że użyję Portainera bo jest bardzo wygodny jeśli idzie o obsługę kontenerów.

Portainera postawiłem na maszynie wirtualnej. Miałem na niej Ubuntu 21.10 więc instalacja Portainera sprowadza się do:

docker volume create portainer_data
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.11.1

Nie dbam o certyfikat SSL i porty w tym przypadku i po kilkudzisięciu sekundach mam GUI Portainera (maszyna wirtualna ma IP 192.168.1.8):

https://192.168.1.8:9443

Pora na instalację bazy danych dla Pydio, będzie to MariaDB z linuxserver/mariadb.

W Portainerze wybieram Volumes -> Add Volume, nazywam wolumen np. "baza".

Teraz tworzę kontener: Containers -> Add Container i wypełniam pola:

Name mariadb
Image linuxserver/mariadb:latest

W zakładce Volumes wybieram "map additional volume" i wypełniam pola:

container /config
volume baza - local

W zakładce Env wybieram "Add an environment variable" i wypełniam pola:

PGID 1000
PUID 1000
MYSQL_ROOT_PASSWORD moje_hasło_do_mysql
TZ Europe/Warsaw

Na koniec klikam "Deploy the container".

Gdy zakończy się pobieranie obrazu i kontener ruszy w zakładce Portainera Containers widać jaki adres IP ma nasza baza. W moim przypadku jest to np. 172.17.0.4, a MariaDB chodzi na domyślnym porcie 3306.

Teraz czas na Pydio/Cells.
Podobnie jak przy bazie zaczynam od Volumenu. Po co? Bo chcę aby dane były niezależne od kontenerów, przyda się to podczas ich serwisowania, np. aktualizacji.

Wybieram Volumes -> Add Volume, nazywam wolumen np. "vdr".

Koniecznie trzeba załozyć wolumen na konfigurację Pydio, np. "pydio-config".

Teraz tworzę kontener:

Name pydio
Image pydio/cells:latest

Mała różnica w stosunku do MariaDB, ustawiam mapowanie portów:

zewnętrzny (na hoście) w kontenerze
8443 8080

Mapuję też utworzony wolumen "vdr" pod "/vdr", a wolumen "pydio-config" pod "/var/cells".

Na koniec klikam Deploy the container i po chwili pod adresem: https://192.168.1.8:8443 mam stronę instalacyjną Pydio. W odpowiednie pola wprowadzam dane do połączenia z bazą, czyli jako host 172.17.0.4 i hasło.

Sama instalacja jest prosta, jest to parę pól do wypełnienia i klikanie w Next, więc nie będę się rozpisywał.

Gdyby nie fakt, że moja maszyna Portainerem stoi za firewallem to były koniec roboty. Ja jednak muszę jeszcze użyć reverse proxy, żeby dostawać się do maszyny po publicznym adresie.

Zaczynam od dodania do DNS rekordu A wskazującego na mój firewall. Przyjmijmy, że adres: vdr.dupa.pl wskazuje na firewall. W samym firewallu mam regułę NAT przekierowującą porty 80 i 443 na adres serwera www w którym ustawię reverse proxy.

Poniższe czynności robię na serwerze www!!! Nie na Portainerze.

Proxy mam na Apache'u, bo tam jest Apache i nie będę teraz przenosił wszystkiego na nginxa.

Najpierw generuję certyfikat Let'sEncrypt dla vdr.dupa.pl.

Zabijam Apache'a:

sudo systemct stop apache2
sudo certbot --certonly --standalone -d vdr.dupa.pl

W /etc/apache2/sites-available mam plik z konfiguracją vdr.dupa.pl.conf:

<VirtualHost *:80>
    ServerName vdr.dupa.pl
    Redirect / https://vdr.dupa.pl/
</VirtualHost>

<VirtualHost *:443>
    ServerName vdr.dupa.pl
    SSLEngine on
    SSLProxyEngine  On
    ProxyPreserveHost On
    ProxyRequests off
    Loglevel debug
    ProxyPass / https://192.168.1.8:8443/
    SSLCertificateFile /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    <Location />
        ProxyPassReverse /
        RequestHeader set X-Forwarded-Proto “https”
        RequestHeader set X-Forwarded-Port “443”
    </Location>
</VirtualHost>
sudo a2ensite vdr.dupa.pl.conf
sudo systemctl start apache2

Wchodzę pod adres https://vdr.dupa.pl i...

500 Internal server error

O, żesz! W logach Apache widać co się stało, proxy nawiązuje połączenie https z Pydio ale certyfikat się nie zgadza, nic dziwnego.

Najprostszy sposób to: wygenerowane certyfikat i klucz dla domeny vdr.dupa.pl kopiuję sobie gdzieś skąd mogę je pobrać wgetem.

W Portainerze wchodzę w kontener Pydio i uruchamiam Console: /bin/sh.

W shellu wgetem pobieram certyfikat i klucz do kontenera. Jest tam katalog "/var/cells/certs" (to jest zamapowany wolumen "pydio-config") i do niego je wrzucam.

Uwaga! Zawartość wolumena dostępna jest też bezpośrednio na hoście z portainerem w katalogu: /var/snap/docker/common/var-lib-docker/volumes/pydio-config/_data.

Uruchamiam polecenie:

cells configure sites

wybieram "Edit current site", potem "Leave as is". Z listy wybieram opcję "Custom certificate: provide paths to certificate/key files".

Podaję pełną ścieżkę do ceetyfikatu i klucza, u mnie: /var/cells/certs/fullchain.pem oraz /var/cells/certs/privkey.pem.

Przy pytaniu "If this site is accessed through a reverse proxy, provide full external URL (https://mydomain.com):" wpisuję moją domenę: https://vdr.dupa.pl i wszystko zatwierdzam, zamykam. Wychodzę z konsoli kontenera.

Restartuję kontener i... wszystko śmiga pod adresem: https://vdr.dupa.pl

Tutaj wersja konfiguracji dla nginxa:

server {
    server_name vdr.dupa.pl;

    # Allow any size file to be uploaded.
    client_max_body_size 0;
    # To disable buffering
    proxy_buffering off;

    location / {
        # Uncomment this to enable gRPC and thus be able to use cells-sync
        #if ($http_content_type = "application/grpc") {
        #    grpc_pass grpcs://192.168.1.8:8443;
        #}
        proxy_pass https://192.168.1.8:8443;
    }


    location /ws/ {
        proxy_pass https://192.168.1.8:8443;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    error_log /var/log/nginx/vdr.dupa.pl-error.log;
    access_log /var/log/nginx/vdr.dupa.pl-access.log;

    listen [::]:443 ssl;
    listen 443 ssl http2;

    # certificate configuration (in this case generated by certbot)
    ssl_certificate /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem;
#    include /etc/letsencrypt/options-ssl-nginx.conf;
#    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
        if ($host = vdr.dupa.pl) {
            return 301 https://$host$request_uri;
        }

        listen 80;
        listen [::]:80;
        server_name vdr.dupa.pl;
        return 404;
}

Troubleshooting

Piewszą rzeczą, którą warto zrobić to podpięcie się pod kontener Pydio i obejrzenie zawartości pliku pydio.json. Zdarzają się tam podwójne wpisy, zwłaszcza jeżeli była używana komenda cells.

Zalecam sprawdzenie adresu IP serwera MariaDB, zdarzyło się że zmieniłem jego adres, a w pydio.json wciąż był stary.

Raz zniknął mi zdefniowany storage. W pydio.json znalazłem jego nazwę i podpiąłem go ponownie w Pydio Console - przy tworzeniu Datasource należy wybrać opcję "Import existing data".