Bizonyára sokakban felmerült már a kérdés, miért is használna 3rd-party felhőtárhelyet (Google Drive, iCloud, OneDrive, stb.), ha egy otthonról kiszolgált megoldás is bőven kielégítené az igényeit.
Az alábbiakban egy viszonylag könnyen konfigurálható, a nagyokhoz hasonló tulajdonságokkal, megosztási lehetőségekkel rendelkező megoldást nézünk meg - ez pedig a SeaFile.
A leírás alapvetően haladó felhasználóknak szól, afféle gondolatébresztő, javaslat egy szépen kivitelezett megoldásra.
Ennek megfelelően a részletekbe nem megyek bele túlzottan.
SeaFile telepítése és futtatása Docker-ben
Személy szerint a hasonló projektek kezelésére a Docker-t preferálom, hiszen nem kell az adott szoftver egyes függőségeivel OS szinten foglalkoznom, egyszerűen kézben tudom tartani a telepítési - futtatási - frissítési - törlési folyamatot, könnyen el tudom különíteni a szerveremen futó projekteket egymástól.
A Docker Compose erre az alapra épül fel, a segítségével egy közös egységbe - stack-be - lehet összefogni az egymáshoz tartozó komponenseket.
Lássuk mik is ezek a komponensek a SeaFile esetében:
- seafile-server, ez lesz majd a rendszerünk belépési pontja
- mysql (avagy mariadb), ez lesz az adatbázis
- memcached - ő egy általános célú, memóriarezidens gyorsítótár. A gyakran felkeresett adatokat ide tárazza be a rendszer, ezzel elkerülve a rendszermemóriától jóval lassabb adatbázis eléréseket.
Hogyan is érdemes a fenti stack-et felhúznunk Docker Compose-zal?
A lenti YAML leírófájlban három dologra legyünk figyelmesek.
1. A stack által használt köteteket bind-mount megadásával oldom meg.
Mit is jelent ez? A szerveremen elérhető lokális könyvtárakat csatolom be az egyes komponensek alá.
Ezáltal a SeaFile adatbázisáról, és a tárolt adatstruktúrájáról bármikor tudok külső backup-ot készíteni.
2. A seafile konténer esetében a komponens által használt 80-as HTTP portot a hoszt 810-es portján teszem elérhetővé. Ezt azért használom így, mert a stack később egy NGINX reverz proxy-n keresztül lesz elérhető, ami központilag kezeli nálam az összes webes szolgáltatást, közös SSL és egyéb konfigurációkkal.
3. SEAFILE_SERVER_HOSTNAME
Alapvetően kedvelem a letisztult, biztonságos megoldásokat. Ennek elérése érdekében a CloudFlare-en keresztül engedem csak a szolgáltatásaim elérését, nagyjából $8 éves díj ellenében náluk vásároltam a domain-t is.
Ezt nem kötelező így csinálni, bármilyen ingyenes domain szolgáltató is megfelel a célra, én sokáig a DuckDNS-t használtam. Akkor viszont szükséged lesz letsencrypt-re és certbot-ra, továbbá az NGINX konfigurációd is kicsit másképp fog kinézni.
version: '2.0'
services:
db:
image: mariadb:10.5
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=db_dev # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /opt/seafile-mysql/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seafile-net
memcached:
image: memcached:1.6.14-alpine
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "810:80"
volumes:
- /mnt/wdred2tb/home/seafile:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value shuold be root's password of MySQL service.
- TIME_ZONE=Etc/UTC # Optional, default is UTC. Should be uncomment and set to your local time zone.
# - SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=seafile.example.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
networks:
- seafile-net
networks:
seafile-net:
CloudFlare
A CloudFlare alapvetően egy proxy szolgáltatás, extrákkal.
Amikor egy látogató a CF által kezelt domain-en elérhető webes szolgáltatást meglátogat, nem közvetlenül a te szervereddel beszélget, hanem teszi ezt a CF rendszerén keresztül.
Ez több okból is hasznos.
Egyrészt a látogatók nem tudják felderíteni a szervered IP címét, hiszen a DNS lookup a CF valamelyik proxy szerverének címét adja vissza.
Másrészt alapvető DDoS és egyéb fenyegetések kivédését is elvégzi helyetted.
SSL tanúsítványt biztosít számodra, amiben megbíznak a böngészők, továbbá az általad szolgáltatott tartalmakat gyorsítótárazza is.
A biztonságot tovább fokozva a Strict SSL megoldást is alkalmazom.
Ebben az esetben kétféle SSL tanúsítványt is használunk.
Az egyik az Origin Server Certificate, amit a szervered mutat a CloudFlare felé, ezáltal tudja a CF ellenőrizni, hogy egészen biztosan a te szerveredet proxy-zza.
A másik egy úgynevezett kliens tanúsítvány, amit a CloudFlare prezentál a szervered felé - ezzel te tudod validálni, hogy a látogatók valóban a CloudFlare felől érkeznek.
Ez tehát egy kétirányú ellenőrzés.
NGINX konfiguráció
Amit érdemes a lentiekben megfigyelni, az a CloudFlare által generált Origin Certificate kiszolgálása, a kliens tanúsítvány behivatkozása és ellenőrzése, valamint itt kap értelmet a seafile konténer alapértelmezett HTTP portjának kiengedése a hoszt 810-es portján.
Amint látható az NGINX fogja oda forwardolni a bejövő kommunikációt.
server {
listen 443 ssl;
listen [::]:443 ssl;
client_max_body_size 500M;
ssl_certificate /etc/nginx/ssl/fullchain.pem; # Origin Cert
ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Origin Cert Private Key
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
ssl_client_certificate /etc/ssl/certs/cloudflare-client.crt; ssl_verify_client on;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name seafile.example.com;
location / {
proxy_read_timeout 300;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_pass http://127.0.0.1:810/;
}
}
További biztonsági megfontolások, tűzfal beállítás
Alapvetően nem szeretném, hogy a CloudFlare védett hálózatán kívülről bárki is hozzáférjen a szerveremen futó webes szolgáltatásokhoz.
Emiatt a nálam szolgálatot teljesítő Ubuntu Server 21.10 disztribúcióban elérhető UFW (Uncomplicated Firewall) segítségével lekorlátoztam a 443-as HTTPS porton keresztüli bejövő kommunikációt a CloudFlare által publikált saját IP címtartományokra.
Mivel az UFW alap beállítása a tiltás, így elég volt az alábbi kivételeket felvenni:
sudo ufw allow from 103.21.244.0/22 proto tcp to any port 443
sudo ufw allow from 103.22.200.0/22 proto tcp to any port 443
sudo ufw allow from 103.31.4.0/22 proto tcp to any port 443
sudo ufw allow from 141.101.64.0/18 proto tcp to any port 443
sudo ufw allow from 108.162.192.0/18 proto tcp to any port 443
sudo ufw allow from 190.93.240.0/20 proto tcp to any port 443
sudo ufw allow from 188.114.96.0/20 proto tcp to any port 443
sudo ufw allow from 197.234.240.0/22 proto tcp to any port 443
sudo ufw allow from 198.41.128.0/17 proto tcp to any port 443
sudo ufw allow from 162.158.0.0/15 proto tcp to any port 443
sudo ufw allow from 104.16.0.0/13 proto tcp to any port 443
sudo ufw allow from 104.24.0.0/14 proto tcp to any port 443
sudo ufw allow from 172.64.0.0/13 proto tcp to any port 443
sudo ufw allow from 131.0.72.0/22 proto tcp to any port 443
Végszó
Köszönöm, ha végigolvastad, remélem számodra is hasznos volt a cikk.