Seafile är ett program med öppen källkod för att synkronisera och lagra filer. Det kan liknas med ett privat Dropbox. Seafile har både en webbklient och klienter för Linux, Windows, macOS, Android och iPad/iPhone.

CAD Bild: Pete Linforth

Att drifta sin egen molnlagring har flera säkerhetsfördelar, särskilt om den driftas bakom brandväggen, oåtkomlig från internet (eller bara tillgänglig via en VPN-anslutning). Särskilt aktuellt kan det vara för företag och organisationer nu efter Schrems II-domen.

Oavsett anledning att drifta sin egen molnlagring är Seafile både snabbt och stabilt. Nextcloud, som Seafile ofta liknas med, har betydligt mer funktioner. Nextcloud är dock inte lika snabbt vid synkronisering, men det är inte heller deras mål. Nextcloud och Seafile riktar sig till olika målgrupper.

Om man jämför Seafile med Dropbox, är Nextcloud mer som Google Workspace – en hel svit med webbapplikationer så som e-post, bildvisning, textredigering, kontaktbok, kalender och mycket mer. Seafile är mer avskalat. I princip finns det bara en enkel textredigerare för markdown-filer. Istället har man fokuserat på synkronisering och lagring av filer, vilket är riktigt snabbt med Seafile.

När jag satte upp min första Seafile-server synkroniserade jag cirka 5 000 filer, sammanlagt 2 gigabyte data, på ett par minuter över mitt lokala nätverk.

Förutom den snabba synkroniseringen har Seafile även deduplicering av data. Det innebär att data som är exakt lika inte lagras. Bara unik data lagras. Det håller nere utrymmet som Seafile behöver för de lagrade filerna. Dedupliceringen är möjlig tack vare att filerna inte lagras som filer på Seafile-servern, utan som block (ungefär som Git lagrar filer).

Dedupliceringen gör dock säkerhetskopiering av filerna lite svårare. Man kan självklart ta en säkerhetskopia på hela katalogen med blockdatan, men den går då bara att öppna med en Seafile-server. Vill man istället ha en säkerhetskopia av sina faktiska filer kan man synkronisera filerna med deras klient. Därefter kan man ta en säkerhetskopia på de synkroniserade filerna. Detta går att skripta och schemalägga då det finns en kommandobaserad klient för Seafile.

Sätta upp Seafile-servern över vanliga HTTP

Det enklaste är att köra Seafile med deras Docker-avbild och en docker-compose.yml-fil. Nedanstående är en fullt fungerande docker-compose.yml-fil för Seafile över HTTP.

version: '3.8'
services:
  db:
    image: mariadb:10.5
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=super-secret # Root-lösenordet för MariaDB-databasen
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /opt/seafile-mysql/db:/var/lib/mysql  # Var på värddatorn MariaDB-databasen ska sparas

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    entrypoint: memcached -m 256

  seafile:
    image: seafileltd/seafile-mc:9.0.4
    container_name: seafile
    ports:
      - 80:80
    volumes:
      - /opt/seafile-data:/shared   # Var alla filerna ska lagras på värddatorn
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=super-secret # Ska matcha root-lösenordet för MariaDB-databasen
      - TIME_ZONE=Europe/Stockholm  # Din lokala tidszon
      - SEAFILE_ADMIN_EMAIL=user@example.com # Administratörskontot för Seafile (för att logga in)
      - SEAFILE_ADMIN_PASSWORD=secret123  # Administratörskontot lösenord
      - SEAFILE_FILE_SERVER_ROOT=http://knatte.nixnet.jke # Sätt till adressen som Seafile kan nås på
      - SEAFILE_SERVICE_URL=http://knatte.nixnet.jke  # Sätt till adressen som Seafile kan nås på

    depends_on:
      - db
      - memcached

Nu är det bara att starta Docker Compose-projektet:

#> docker-compose up -d

Därefter kan du surfa in på Seafile på det värdnamn eller IP-adress som värddatorn har. Du loggar in med den e-postadress du angav som SEAFILE_ADMIN_EMAIL. Lösenordet är det du angav i SEAFILE_ADMIN_PASSOWRD.

Om man vill installera någon av synkroniseringsklienterna finns de på Seafiles webbsida.

Om något inte skulle fungera, ta en titt på loggarna med docker-compose logs.

Sätt upp Seafile med HTTPS och Let’s Encrypt

Om du planerar att köra Seafile över internet rekommenderar jag starkt att använda HTTPS! Något annat vore oansvarigt. Det finns dessutom inbyggt stöd för Let’s Encrypt i Seafiles Docker-avbild, så det finns ingen ursäkt att inte använda HTTPS.

Det finns dock en bugg i Seafiles Docker-avbild i skrivande stund som gör att Let’s Encrypt inte fungerar. Felet är att Seafile försöker ladda hem ett program från GitHub över det gamla Git-protokollet, git://, som inte längre stöds av GitHub. Vi behöver därför kopiera en fil från avbilden, ändra git:// till https:// i den filen och montera den som en bunden volym. Därefter fungerar allting.

Först och främst behöver vi utöka Docker Compose-filen något.

Utökningarna är en ny port som måste exponeras, 443:443. Vi måste också aktivera Let’s Encrypt med SEAFILE_SERVER_LETSENCRYPT=true. Därefter måste vi sätta det riktiga värdnamnet för Seafile (det värdnamn som används på internet) med SEAFILE_SERVER_HOSTNAME. Vi behöver också montera den modifierade ssl.sh-filen. Det gör vi med ${PWD}/ssl.sh:/scripts/ssl.sh under volumes-sektionen.

Den nya docker-compose.yml-filen visas här i sin helhet:

version: '3.8'
services:
  db:
    image: mariadb:10.5
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=super-secret # Root-lösenordet för MariaDB-databasen
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /opt/seafile-mysql/db:/var/lib/mysql  # Var på värddatorn MariaDB-databasen ska sparas

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    entrypoint: memcached -m 256

  seafile:
    image: seafileltd/seafile-mc:9.0.4
    container_name: seafile
    ports:
      - 80:80
      - 443:443  # För HTTPS
    volumes:
      - /opt/seafile-data:/shared   # Var alla filerna ska lagras på värddatorn
      - ${PWD}/ssl.sh:/scripts/ssl.sh # En fix för att Let's Encrypt ska fungera
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=super-secret # Ska matcha root-lösenordet för MariaDB-databasen
      - TIME_ZONE=Europe/Stockholm  # Din lokala tidszon
      - SEAFILE_ADMIN_EMAIL=user@example.com # Administratörskontot för Seafile (för att logga in)
      - SEAFILE_ADMIN_PASSWORD=secret123  # Administratörskontot lösenord
      - SEAFILE_SERVER_LETSENCRYPT=true  # Detta aktiverar Let's Encrypt 
      - SEAFILE_SERVER_HOSTNAME=seafile.example.com # Värdnamnet som ska användas för Let's Encrypt
      - SEAFILE_FILE_SERVER_ROOT=https://seafile.example.com # Sätt till adressen som Seafile kan nås på
      - SEAFILE_SERVICE_URL=https://seafile.example.com  # Sätt adressen som Seafile kan nås på

    depends_on:
      - db
      - memcached

Skapa därefter en fil med namnet ssl.sh i samma katalog som docker-compose.yml. Innehållet i ssl.sh ska vara:

#!/bin/bash

set -e

ssldir=${1:?"error params"}
domain=${2:?"error params"}

letsencryptdir=$ssldir/letsencrypt
letsencrypt_script=$letsencryptdir/acme_tiny.py

ssl_account_key=${domain}.account.key
ssl_csr=${domain}.csr
ssl_key=${domain}.key
ssl_crt=${domain}.crt

mkdir -p /var/www/challenges && chmod -R 777 /var/www/challenges
mkdir -p $ssldir

if ! [[ -d $letsencryptdir ]]; then
    git clone https://github.com/diafygi/acme-tiny.git $letsencryptdir
else
    cd $letsencryptdir
    git pull origin master:master
fi

cd $ssldir

if [[ ! -e ${ssl_account_key} ]]; then
    openssl genrsa 4096 > ${ssl_account_key}
fi

if [[ ! -e ${ssl_key} ]]; then
    openssl genrsa 4096 > ${ssl_key}
fi

if [[ ! -e ${ssl_csr} ]]; then
    openssl req -new -sha256 -key ${ssl_key} -subj "/CN=$domain" > $ssl_csr
fi

python3 $letsencrypt_script --account-key ${ssl_account_key} --csr $ssl_csr --acme-dir /var/www/challenges/ > ./signed.crt
curl -sSL -o intermediate.pem https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
cat signed.crt intermediate.pem > ${ssl_crt}

nginx -s reload

echo "Nginx reloaded."

Nu kan du starta Seafile:

#> docker-compose up -d

Ett certifikat från Let’s Encrypt kommer automatiskt att utfärdas för det värdnamnet du angav i variablen SEAFILE_SERVER_HOSTNAME. Notera att värdnamnet måste vara nåbart från internet för att detta ska fungera.

Kontrollera gärna så att allt fungerar med docker-compose logs -f.

Du kan därefter surfa in på Seafile på den adress vi angav i docker-compose.yml-filen, i det här fallet https://seafile.example.com.

Notera att buggen troligen kommer att fixas inom en snar framtiden, och då kommer inte längre den modifierade ssl.sh att behövas. Det finns redan en buggrapport på problemet på GitHub.