woensdag 31 december 2025

SFTP instellen op een Linux Mint 22.2

De casus is alsvolgt: Ik draai CasaOS op een linux mint 22.2 machine  waarop CasaOS draait met docker containers. Ik wil toegang tot enkele mappen hebben via sftp met de gewone gebruiker of met een  speciale sftpuser. De dockers moeten ook toegang behouden tot de mappen.

De mappen die ik wil delen zijn:

/media/Disk3-3Tb
/media/Disk2-6Tb
/media/Kingston480

Eerst maken we een groep voor gedeelde toegang:

sudo groupadd storage

Voeg gebruikers toe aan de groep

sudo usermod -aG storage user1
sudo usermod -aG storage sftpuser
sudo usermod -aG storage user2  # andere gebruikers die toegang moeten


Maak SFTP-only gebruiker

sudo adduser sftpuser
sudo usermod -s /usr/sbin/nologin sftpuser


Maak chroot-structuur voor SFTP


sudo mkdir -p /srv/sftp/sftpuser
sudo chown root:root /srv/sftp
sudo chmod 755 /srv/sftp
sudo chown root:root /srv/sftp/sftpuser
sudo chmod 755 /srv/sftp/sftpuser

Maak zichtbare mappen voor SFTP

sudo mkdir /srv/sftp/sftpuser/Disk3-3Tb
sudo mkdir /srv/sftp/sftpuser/Disk2-6Tb
sudo mkdir /srv/sftp/sftpuser/Kingston480
sudo chown root:root /srv/sftp/sftpuser/*

Bind-mount de echte USB-schijven

sudo mount --bind /media/Disk3-3Tb /srv/sftp/sftpuser/Disk3-3Tb
sudo mount --bind /media/Disk2-6Tb /srv/sftp/sftpuser/Disk2-6Tb
sudo mount --bind /media/Kingston480 /srv/sftp/sftpuser/Kingston480

Eigenaarschap en rechten op de echte schijven

sudo chown -R root:storage /media/Disk3-3Tb
sudo chown -R root:storage /media/Disk2-6Tb
sudo chown -R root:storage /media/Kingston480

sudo chmod -R 2770 /media/Disk3-3Tb
sudo chmod -R 2770 /media/Disk2-6Tb
sudo chmod -R 2770 /media/Kingston480

ACL’s voor Docker (PUID/PGID 1000)

sudo setfacl -R -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -m g:1000:rwx /media/Kingston480

sudo setfacl -R -d -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -d -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -d -m g:1000:rwx /media/Kingston480

SSH configuratie voor SFTP-only gebruiker


sudo -H xed /etc/ssh/sshd_config

Voeg onderaan toe:

Match User sftpuser
    ChrootDirectory /srv/sftp
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

Sla op en verlaat xed en herstart SSH:

sudo systemctl restart ssh

Permanent maken van bind mounts


sudo -H xed /etc/fstab

voeg deze regels toe:

/media/Disk3-3Tb    /srv/sftp/sftpuser/Disk3-3Tb    none    bind    0 0
/media/Disk2-6Tb    /srv/sftp/sftpuser/Disk2-6Tb    none    bind    0 0
/media/Kingston480  /srv/sftp/sftpuser/Kingston480  none    bind    0 0

Controle


# Rechtencheck
getfacl /media/Disk3-3Tb
ls -ld /media/Disk3-3Tb /media/Disk2-6Tb /media/Kingston480

# Test SFTP
sftp sftpuser@IP-ADRES

# Test Docker
docker exec -it <container> sh
touch /media/Disk3-3Tb/test.txt

# Test andere gebruikers
su - user2
touch /media/Disk3-3Tb/test2.txt

Eindresultaat:

  • SFTP-user alleen SFTP

  • user1 + andere gebruikers RW

  • Docker PUID/PGID 1000 RW

  • Nieuwe bestanden automatisch juiste groep en rechten

  • Veilig, geen 777


Alles in een script:

Maak een nieuw bestand aan:

xed install-ftps.sh

en voeg dit daarin in:

#!/bin/bash
# Setup SFTP met verwijderrechten, chroot veilig, Docker toegang

# --- Configuratie ---
SFTP_USER="sftpuser"
GROUP="storage"
DOCKER_GID=1000
CHROOT_BASE="/srv/sftp"
SHARES=("/media/Disk3-3Tb" "/media/Disk2-6Tb" "/media/Kingston480")
OTHER_USERS=("jeroen" "quinnten") # pas aan indien nodig

# --- 1️⃣ Maak groep storage ---
if ! getent group $GROUP > /dev/null; then
    sudo groupadd $GROUP
fi

# --- 2️⃣ Voeg gebruikers toe aan storage ---
for user in "${OTHER_USERS[@]}" "$SFTP_USER"; do
    sudo usermod -aG $GROUP $user
done

# --- 3️⃣ SFTP-only gebruiker ---
if ! id -u $SFTP_USER > /dev/null 2>&1; then
    sudo adduser $SFTP_USER
    sudo usermod -s /usr/sbin/nologin $SFTP_USER
fi

# --- 4️⃣ Chroot map ---
sudo mkdir -p $CHROOT_BASE/$SFTP_USER
sudo chown root:root $CHROOT_BASE
sudo chmod 755 $CHROOT_BASE
sudo chown root:root $CHROOT_BASE/$SFTP_USER
sudo chmod 755 $CHROOT_BASE/$SFTP_USER

# --- 5️⃣ Maak submappen in chroot voor SFTP ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mkdir -p $CHROOT_BASE/$SFTP_USER/$BASENAME
    sudo chown root:root $CHROOT_BASE/$SFTP_USER/$BASENAME
done

# --- 6️⃣ Bind-mount de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mount --bind $SHARE $CHROOT_BASE/$SFTP_USER/$BASENAME
done

# --- 7️⃣ Eigenaarschap en rechten op de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    # Owner = SFTP-user, groep = storage
    sudo chown -R $SFTP_USER:$GROUP $SHARE
    # setgid + RW voor owner en groep
    sudo chmod -R 2770 $SHARE
done

# --- 8️⃣ ACL voor Docker PUID/PGID=1000 ---
for SHARE in "${SHARES[@]}"; do
    sudo setfacl -R -m g:$DOCKER_GID:rwx $SHARE
    sudo setfacl -R -d -m g:$DOCKER_GID:rwx $SHARE
done

# --- 9️⃣ SSH configuratie voor SFTP-only ---
SSHD_CONF="/etc/ssh/sshd_config"
if ! grep -q "Match User $SFTP_USER" $SSHD_CONF; then
    sudo bash -c "cat >> $SSHD_CONF" <<EOL

Match User $SFTP_USER
    ChrootDirectory $CHROOT_BASE
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
EOL
    sudo systemctl restart ssh
fi

# --- 🔟 Permanent bind mounts in fstab ---
FSTAB="/etc/fstab"
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    ENTRY="$SHARE $CHROOT_BASE/$SFTP_USER/$BASENAME none bind 0 0"
    if ! grep -q "$CHROOT_BASE/$SFTP_USER/$BASENAME" $FSTAB; then
        echo "$ENTRY" | sudo tee -a $FSTAB
    fi
done

echo "✅ Setup voltooid: SFTP verwijderrechten, chroot veilig, Docker en groep toegang ingesteld."



Sla deze tekst op in een tekstbestand:

xed setup_sftp.sh
chmod +x setup_sftp.sh
sudo ./setup_sftp.sh

Wat dit script doet

  • Groep storage aanmaken en gebruikers toevoegen

  • SFTP-only gebruiker aanmaken (/usr/sbin/nologin)

  • Chroot en SFTP-mappen maken

  • Bind mounts naar de echte USB-schijven

  • Eigenaarschap + 2770 + setgid instellen

  • ACL’s voor Docker PGID=1000 instellen

  • SSH configuratie voor SFTP-only

  • Bind mounts permanent in /etc/fstab

Nu zijn er systemen zoals de QNAP nas die niet kunnen schrijven en lezen van een sftp systeem. Die kunnen alleen ftp of ftps aan. Dan moet alles anders worden ingericht:

Daar moet op een andere manier toegang voor gecreeërd worden via FTP of FTPS

We beginnen bij het begin, sla onderdleen over die je al gedaan hebt:

Installeer vsftpd

sudo apt update
sudo apt install -y vsftpd

Maak FTPS-only gebruiker:

sudo adduser ftpuser
sudo usermod -s /usr/sbin/nologin ftpuser
sudo usermod -aG storage ftpuser

Chroot map voor FTP:

sudo mkdir -p /srv/ftp/ftpuser
sudo chown root:root /srv/ftp
sudo chmod 755 /srv/ftp
sudo chown root:root /srv/ftp/ftpuser
sudo chmod 755 /srv/ftp/ftpuser

Maak submappen voor bind mounts:

sudo mkdir -p /srv/ftp/ftpuser/Disk3-3Tb
sudo mkdir -p /srv/ftp/ftpuser/Disk2-6Tb
sudo mkdir -p /srv/ftp/ftpuser/Kingston480
sudo chown root:root /srv/ftp/ftpuser/*

Bind mounts van de echte schijven:

sudo mount --bind /media/Disk3-3Tb /srv/ftp/ftpuser/Disk3-3Tb
sudo mount --bind /media/Disk2-6Tb /srv/ftp/ftpuser/Disk2-6Tb
sudo mount --bind /media/Kingston480 /srv/ftp/ftpuser/Kingston480

Eigenaarschap en rechten op de echte mappen

sudo chown -R ftpuser:storage /media/Disk3-3Tb
sudo chown -R ftpuser:storage /media/Disk2-6Tb
sudo chown -R ftpuser:storage /media/Kingston480

sudo chmod -R 2770 /media/Disk3-3Tb
sudo chmod -R 2770 /media/Disk2-6Tb
sudo chmod -R 2770 /media/Kingston480

ACL voor Docker PUID/PGID=1000:

sudo setfacl -R -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -m g:1000:rwx /media/Kingston480

sudo setfacl -R -d -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -d -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -d -m g:1000:rwx /media/Kingston480

Configureer vsftpd voor FTPS. Bewerk /etc/vsftpd.conf:

sudo -H xed /etc/vsftpd.conf

en voeg dit in in de plaats van de oude tekst:

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root=/srv/ftp/$USER
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
pasv_min_port=40000
pasv_max_port=50000

en sla dit bestand op en verlaat xed.

Maak SSL-certificaat:

sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/ssl/private/vsftpd.pem \
  -out /etc/ssl/private/vsftpd.pem \
  -subj "/C=NL/ST=Noord-Holland/L=Amsterdam/O=Home/OU=IT/CN=localhost"

Herstart vsftpd

sudo systemctl restart vsftpd

Permanent bind mounts in fstab:

sudo -H xed /etc/fstab

en voeg deze regels toe:

/media/Disk3-3Tb    /srv/ftp/ftpuser/Disk3-3Tb    none    bind    0 0
/media/Disk2-6Tb    /srv/ftp/ftpuser/Disk2-6Tb    none    bind    0 0
/media/Kingston480  /srv/ftp/ftpuser/Kingston480  none    bind    0 0

en sla dit bestand weer op en verlaat Xed.

SFTP en FTPS delen nu dezelfde fysieke mappen.
Rechten via groep storage en ACL’s voor Docker blijven geldig.
Chroot-mappen blijven root:root, veilig.
Gebruik altijd FTPS (TLS), want gewone FTP stuurt wachtwoorden onveilig.

Als je dit in een script wilt hebben doe dan:
Maak een nieuw bestand aan:

xed install-ftps.sh

en voeg dit daarin in:

#!/bin/bash
# Setup FTPS (vsftpd) voor gedeelde USB-mappen
# Veilig, gedeelde rechten met SFTP en Docker

# --- Configuratie ---
FTP_USER="ftpuser"
GROUP="storage"
DOCKER_GID=1000
CHROOT_BASE="/srv/ftp"
SHARES=("/media/Disk3-3Tb" "/media/Disk2-6Tb" "/media/Kingston480")
OTHER_USERS=("user1" "user2") # pas aan indien nodig

# --- 1️⃣ Install vsftpd ---
sudo apt update
sudo apt install -y vsftpd

# --- 2️⃣ Maak FTP-only gebruiker ---
if ! id -u $FTP_USER > /dev/null 2>&1; then
    sudo adduser $FTP_USER
    sudo usermod -s /usr/sbin/nologin $FTP_USER
fi

# --- 3️⃣ Voeg FTP-gebruiker toe aan storage ---
sudo usermod -aG $GROUP $FTP_USER

# --- 4️⃣ Chroot map voor FTP ---
sudo mkdir -p $CHROOT_BASE/$FTP_USER
sudo chown root:root $CHROOT_BASE
sudo chmod 755 $CHROOT_BASE
sudo chown root:root $CHROOT_BASE/$FTP_USER
sudo chmod 755 $CHROOT_BASE/$FTP_USER

# --- 5️⃣ Maak submappen voor bind mounts ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mkdir -p $CHROOT_BASE/$FTP_USER/$BASENAME
    sudo chown root:root $CHROOT_BASE/$FTP_USER/$BASENAME
done

# --- 6️⃣ Bind mounts naar echte schijven ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mount --bind $SHARE $CHROOT_BASE/$FTP_USER/$BASENAME
done

# --- 7️⃣ Eigenaarschap en rechten op de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    sudo chown -R $FTP_USER:$GROUP $SHARE
    sudo chmod -R 2770 $SHARE
done

# --- 8️⃣ ACL voor Docker PUID/PGID=1000 ---
for SHARE in "${SHARES[@]}"; do
    sudo setfacl -R -m g:$DOCKER_GID:rwx $SHARE
    sudo setfacl -R -d -m g:$DOCKER_GID:rwx $SHARE
done

# --- 9️⃣ Configureer vsftpd ---
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo bash -c "cat > /etc/vsftpd.conf" <<EOL
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=\$USER
local_root=$CHROOT_BASE/\$USER
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
pasv_min_port=40000
pasv_max_port=50000
EOL

# --- 10️⃣ Maak zelfondertekend SSL-certificaat ---
sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/vsftpd.pem \
    -out /etc/ssl/private/vsftpd.pem \
    -subj "/C=NL/ST=Noord-Holland/L=Amsterdam/O=Home/OU=IT/CN=localhost"

# --- 11️⃣ Herstart vsftpd ---
sudo systemctl restart vsftpd

# --- 12️⃣ Permanent bind mounts in fstab ---
FSTAB="/etc/fstab"
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    ENTRY="$SHARE $CHROOT_BASE/$FTP_USER/$BASENAME none bind 0 0"
    if ! grep -q "$CHROOT_BASE/$FTP_USER/$BASENAME" $FSTAB; then
        echo "$ENTRY" | sudo tee -a $FSTAB
    fi
done

echo "✅ FTPS setup voltooid: bind mounts, chroot, Docker ACL en groeprechten ingesteld."
echo "Gebruik FTP-client met TLS/SSL voor veilige verbinding."


Belangrijke punten

  1. Chroot-map blijft root:root → veilig

  2. Bind mounts → eigenaar = ftpuser, groep = storage, chmod 2770 → RW voor gebruiker + groep

  3. Setgid → nieuwe bestanden automatisch in groep storage

  4. ACL → Docker PUID/PGID=1000 heeft RW

  5. FTPS (TLS) → geen plaintext wachtwoorden

  6. SFTP en FTPS delen dezelfde fysieke mapp







woensdag 24 december 2025

Firefox op een touchscreen / aanraakscherm

Dit is een bekend (en frustrerend) Firefox-probleem op Windows 11 met touchscreens. Standaard interpreteert Firefox een touch-actie vaak als tekstselectie in plaats van scrollen / navigeren, terwijl Chrome dat wél goed doet. Gelukkig kun je dit vrij goed oplossen met verborgen instellingen:

Open de geavanceerde instellingen

Typ in de adresbalk van Firefox:

about:config

Klik op “Risico accepteren en doorgaan”

Zoek één voor één naar onderstaande opties en pas ze aan. Als een instelling er niet is stel de eerste dan in als GETAL. De anderen als BOLEAN:

dom.w3c_touch_events.enabled

Zet deze op 1

0 = uit

1 = aan (aanbevolen)

2 = alleen automatisch (werkt vaak slecht)


Dubbelklik om de waarde te wijzigen.


apz.allow_zooming

Zet op true

Zorgt dat Firefox touch-gebaren correct verwerkt.


apz.windows.use_direct_manipulation

Zet op true

Nodig om het Windows 10/11 scrollen aan te zetten.

ui.panGesture.enabled

Zet op true

Start Firefox helemaal onieuw op en alles zou moeten werken zoals in Chrome.

Na deze instellingen:

Scrollen met één vinger werkt normaal

Swipe-bewegingen werken

Tekst wordt niet meer constant geselecteerd

Gedrag lijkt veel meer op Chrome


Werkt het nog niet goed?

Dan kan dit ook helpen:


Schakel hardware-acceleratie even uit:

Instellingen → Algemeen → Prestaties

Vink “Aanbevolen prestatie-instellingen gebruiken” uit

Vink “Hardwareversnelling gebruiken” uit

Herstart Firefox

Linux Mint 22

In linux Mint 22.2 is er nog een extra stap nodig om dit werkend te krijgen:

X11

Als je Cinnamon onder X11/Xorg draait (standaard bij Mint 22.2):

Je kunt een environment-variabele instellen zodat Firefox touch input beter verwerkt:

export MOZ_USE_XINPUT2=1


Dat kan bijvoorbeeld via /etc/profile.d/ of ~/.profile:

Voer daarom in een terminal het volgende commando uit:

echo "export MOZ_USE_XINPUT2=1" >> ~/.profile



Log vervolgens uit je sessie en log weer in vóór je Firefox start. daarmee wordt het environment variable geladen. Waarom dit helpt: zonder XInput2 krijgt Firefox alleen legacy muis-events van het touchscreen, waardoor het voelt alsof je tekst selecteert in plaats van scrollt. 


TIP: Je kunt ook Firefox direct met die variabele starten in één terminal-commando:


MOZ_USE_XINPUT2=1 firefox

Maar dan lukt het niet als firefox vanuit een link in een ander programma wordt gestart.

Wayland

Als je Wayland gebruikt (binnen GNOME of een andere compositor)

Linux Mint standaard X11 gebruikt, maar als je ooit Wayland inschakelt:

Zet de Wayland-backend voor Firefox aan door dit commando in een terminal te geven:

export MOZ_ENABLE_WAYLAND=1


Dit maakt touch-scrolling en andere touch-gebaren in Firefox vaak beter (mits Wayland zelf goed werkt). 

dinsdag 2 december 2025

Portainer installeren op de QNAP NAS

 

Portainer

Portainer is een handiger manier om dockers op de QNAP te beheren.

log in op het admin account via SSH

verwijder eventuele oudere versies van portainer

docker stop portainer
docker rm portainer

docker run -d \
  -p 9000:9000 \
  -p 9443:9443 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

/var/run/docker.sock geeft Portainer directe toegang tot Container Station’s Docker. Je zou daarin dus alle dockers moeten zien die via container station zijn geïnstalleerd.

Log in bij portainer: https://QNAP-IP-nr:9443
maak een admin account aan
Je ziet nu een environment: local. Dat is de conrainer omgeving van de QNAP



Vanuit Portainer kan een Jellifin docker ook worden geüpdate:

1) Klik op de linker link van de container die je wilt updaten. In dit geval Jellyfin
2) in het container detail scherm klik op "stop container"
3) Klik daarna op "recreate"
4) Schuif de schakelaar "Re-Pull image" 
5) als alles klaar is kun je de docker herstarten.

Als je hierna met Jellyfin verbindt, kun je een melding krijgen dat het niet dezelfde Jellyfin is al eerder en dien je te bevestigen dat je toch wilt verbinden.

Portainer zelf updaten


Soms dien je Portainer zelf ook te vernieuwen. Dat kan helaas niet vanuit portainer. Hiervoor moet je een SSH verbinding maken met de QNAP naar het admin account:

docker ps (toont container ID en containerImageName)
in dit voorbeeld gebruik ik 3ed078654f4f en portainer/portainer-ce:latest
docker stop 3ed078654f4f docker rm 3ed078654f4f docker rmi portainer/portainer-ce:latest
docker run -d \
  -p 9000:9000 \
  -p 9443:9443 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

dinsdag 25 november 2025

Installeren van CasaOS op Linux mint 22.2

 Linux Mint 22.2 kan gebruikt worden om CasaOS op te installeren.


het is dan wel nodig om eerst om docker te installeren.


dat gaat met dit script:

curl -fsSL https://get.docker.com | sh

en daarna installeer je CasaOS met:

curl -fsSL https://get.casaos.io | sudo bash


en daarmee wordt casaOS geinstalleerd.


zaterdag 15 november 2025

CasaOS geeft foutmelding "Failed to load apps, please refresh later"

 CasaOS gebruikt docker om apps in te installeren. Sinds 11 november 2025 CasaOS geeft een fouitmelding zodra je bent ingelogd: 

"Failed to load apps, please refresh later"

Er zijn twee manieren om docker weer aan de praat te krijgen:

Optie 1: Edit /etc/docker/daemon.json (beste methode)

De eenvoudigsete en beste manier is het daemon.json bestand te bewerken en Docker te herstarten. Op mijn Raspberry Pi bestond dit bestaqnd niet. Ik volgde deze stappen:

1. Open /etc/docker/daemon.json in een editor

sudo nano /etc/docker/daemon.json

2. Kopieer en plak dit in het bestand. Als het bestand leeg of nieuw is knip en plak dit dan in zijn geheel in het bestand:

{

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

Als het ebstand wqel bestaat en niet leeg is, plak dat precies onder de openings "{":

  "min-api-version": "1.24",

3. Save het bestand

Kies[CTRL][X] om nano te verlaten en kies, [Y] of [J] op op te slaan.


4. Herstart docker

sudo systemctl restart docker.service

Of reboot.

- OF -

OPTIE 2: Bewerk Docker service door een Environment Variable toe te voegen

1. Bewerk Docker service

sudo systemctl edit docker.service

De bovenste regels van het bestand luiden:

### Editing /etc/systemd/system/docker.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file



### Edits below this comment will be discarded
...

2. Kopieer en plak dit in de open ruimte tussen deze regels:

[Service]
Environment=DOCKER_MIN_API_VERSION=1.24

3. Save het bestand

Kies[CTRL][X] om nano te verlaten en kies, [Y] of [J] op op te slaan.

4. Restart Docker

sudo systemctl restart docker.service

Of reboot.



Draai de wijziging terug zodra de Docker API in CasaOS is aangepast.

zondag 26 oktober 2025

Terughalen van verwijderde mails in Gmail

Als je per ongeluk alle (of heelveel) emails hebt verwijderd in Gmail kun je nog enkele dingen proberen om deze terug te halen:


Prullenbak



Berichten herstel tool van Google


https://support.google.com/mail/workflow/9317561

Log in met het betreffende Gmail-account.
Google controleert dan of de mails op hun servers nog teruggezet kunnen worden.
Ze sturen je bericht zodra het herstel klaar is (duurt meestal binnen enkele uren tot 2 dagen).

Deze optie werkt het beste als de verwijdering recent (minder dan 25 dagen) is en niet veroorzaakt werd door het legen van de prullenbak via instellingen of IMAP-synchronisatie. Als je dus mail hebt verwijderd vanuit programma's zoals OUTLOOK, AQppel mail of Thunderbird en gebruik hebt gemaakt van het IMAP protocol, dan zal het waarschijnlijk niet werken.

Controleer andere clients of back-ups

Als je Gmail gebruikt via bijvoorbeeld:
Outlook / Thunderbird / Apple Mail
Je telefoon (met IMAP/POP)
Een back-updienst zoals Google Takeout, of een e-mailback-up via je provider dan kunnen daar nog kopieën of cacheversies van de e-mails aanwezig zijn.

Als de mail vandaag is verwijderd doe dan het volgende als je nog een PC hebt met daarop de mail in een mailprogramma:

Omdat de verwijdering vandaag is gebeurd en de prullenbak al leeg is, maar de mails mogelijk nog lokaal op je Mac staan, is er nog een reële kans om ze te redden — maar alleen als je heel voorzichtig bent met synchronisatie.

Hier is precies wat je moet doen (stap voor stap):

Stap 1: Koppel je Mac direct los van internet

Zet wifi uit of haal de netwerkkabel eruitvoordat je Mail (of een ander e-mailprogramma) opent.

💡 Zo voorkom je dat Mail gaat synchroniseren met Gmail en dus ook lokaal bewaarde berichten verwijdert (dat gebeurt automatisch zodra IMAP verbinding maakt).

Stap 2: Open daarna Mail (met internet nog steeds UIT)

  • Open de Mail-app op je Mac.

  • Ga naar je Gmail-account in de zijbalk.

  • Kijk of je daar nog berichten ziet in de inbox, verzonden items, concepten of mappen.

Stap 3: Maak meteen een back-up van die lokale mail

  1. In de Mail-app selecteer je de berichten of hele mailbox.

  2. Kies Archief → Exporteer postbus…
    (of rechtsklik op de mailbox → “Exporteer postbus…”)

  3. Sla het exportbestand (.mbox) op een veilige plek op, bijvoorbeeld in je documentenmap of op een USB-stick.

Zo heb je een veilige kopie, ongeacht wat er later met Gmail gebeurt.

Mail exporteren gaat alsvolgt: 

  1. Open Mail (de standaard macOS Mail-app).

  2. Kijk in de zijbalk links of je je Gmail-account ziet.

  3. Klik op Postbussen > [je Gmail-adres] en controleer:

    • Inbox

    • Verzonden items

    • Alle e-mail (All Mail)

    • Eventuele eigen mappen of labels

👉 Als je hier nog berichten ziet: goed nieuws, ze staan lokaal gecached op je Mac.

Exporteer de mailbox (of meerdere)

Voor elke map die je wilt bewaren:

  1. Klik één keer op de mailbox (bijv. Inbox of All Mail).

  2. Ga in de menubalk naar Archief → Exporteer postbus…

  3. Kies een map om het bestand op te slaan (bijv. “Documenten” of een USB-stick).

  4. Klik op Kies.

Mail maakt dan een .mbox-bestand, dat alle berichten in die mailbox bevat.

🔸 Herhaal dit voor elke mailbox waarin je belangrijke mails hebt.

 

(Optioneel) Controleer de export

Je kunt controleren of het goed is gegaan:

  • Open de map waarin je het .mbox-bestand hebt opgeslagen.

  • Het zou eruit moeten zien als een map genaamd bijvoorbeeld Inbox.mbox.

  • Daarin staan o.a. bestanden als Info.plist en een map Messages.

Dat is prima — dat is het juiste Mail-formaat.

Zet pas daarna weer internet aan

  • Zet Wi-Fi weer aan of sluit de kabel aan.

  • Je zult nu merken dat de Mail-app opnieuw synchroniseert met Gmail.
    Als Google de berichten van de server heeft verwijderd, zullen ze nu uit Mail verdwijnen.

  • Maar: je back-up is veilig in de .mbox-bestanden.

Eventueel importeren of terugzetten

Als je ze later wilt terughalen:

  1. Ga in Mail naar Archief → Importeer postbussen…

  2. Kies Apple MailGa door.

  3. Selecteer je geëxporteerde .mbox-bestand.

  4. De mails verschijnen in een nieuwe map onder “Geïmporteerd”.

Stap 4: Daarna pas internet weer aanzetten

Pas nadat je de back-up hebt gemaakt, kun je wifi weer aanzetten.

Als je dat doet, zul je waarschijnlijk zien dat Gmail meteen synchroniseert en de mails lokaal verwijdert (omdat ze server-side weg zijn) — maar jij hebt dan al je kopie. 

Stap 5: Optioneel — probeer herstel via Google

Omdat het vandaag gebeurd is, kun je ook de officiële hersteltool van Google gebruiken:
👉 https://support.google.com/mail/workflow/9317561



vrijdag 17 oktober 2025

Jellyfin server in docker op de QNAP nas

 Complete setup Jellyfin op QNAP

Ik ga uit van de volgende zaken:

de QNAP heeft een intel processor. in mijn geval een Intel celeron. En een externe USB harddisk met daarop de jellyfin film bestanden op share/external/DEV3303_1

Als dat jij jouw systeem anders is, dien je de opdrachten dienovereenkomstig aan te passen.

Log in met SSH in het admin account. Vaak moet je dat activeren, omdat dat op veel QNAP nas apparaten is uitgezet. Doe dat in Control Panel, Bevoegdheden, gebruikers en klik dan op het knopje "wijzig gebruikers profiel"achter admin als deze de status uitgeschakeld heeft.

Onder rnetwerk en bestandsservice staat telnet/SSH waar je de SSH service kunt aanzetten. Daarna kun je met een programma zoals remmina inloggen in een SSH sessie van de NAS. de commando'sdie hier staan genoteerd worden gegeven in deze SSH omgeving.


Mappen aanmaken voor config en cachecd /share/Container

mkdir -p jellyfin/config

mkdir -p jellyfin/cache

Hier slaat Jellyfin zijn instellingen en cache op
Altijd persistent, dus updates van Docker vernietigen deze mappen niet

Controleer USB-schijf

Je USB-schijf zit in mijn geval op /share/external/DEV3303_1.
Controleer:

ls /share/external/DEV3303_1

Je zou de films en mappen moeten zien

Geen extra mount nodig, Docker kan er direct bij als we PUID/PGID op 0 zetten

check of er hardware transcoding mogelijk is:

Aangezien je een Intel-processor hebt, kun je hardware-versnelling gebruiken.

  1. Zorg dat /dev/dri beschikbaar is op je NAS:

ls /dev/dri

Als je 

card0  renderD128 

ziet dan zit je goed en moet je deze regel ook gebruiken:

devices:

  - /dev/dri:/dev/dri


in Jellyfin zelf activeer je de hardware versnelling straks met:

  • Ga naar Instellingen → Afspelen → Transcodering

  • Zet “Hardware Acceleration” aan → kies “Intel QuickSync”


Maar nu eerst:

Maak docker-compose.yml aan

Ga naar de Jellyfin-map:

cd /share/Container/jellyfin

Maak het bestand:

vi docker-compose.yml

Druk i om insert mode te starten
Plak dit:


services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    network_mode: host    
    environment:
      - TZ=Europe/Amsterdam
      - PUID=0
      - PGID=0
    volumes:
      - /share/CACHEDEV1_DATA/Container/jellyfin/config:/config
      - /share/CACHEDEV1_DATA/Container/jellyfin/cache:/cache
      - /share/external/DEV3303_1:/media
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped

Opslaan en vi verlaten:

  1. Druk Esc

  2. Typ :wq

  3. Druk Enter


de regels 
devices:
      - /dev/dri:/dev/dri

alleen  gebruiken als je eerder met

ls /dev/dri

dit als output kreeg:

card0  renderD128 

Zo niet, dan laat je die twee regels weg.

Container starten


docker compose up -d

  • Docker downloadt de laatste Jellyfin image
  • Container draait direct op poort 8096 en is zichtbaar in het netwerk
  • /media verwijst naar je USB-schijf
  • Intel QuickSync hardware-transcodering is actief

Controleer:

docker ps


Jellyfin configureren via browser

Open:

http://<NAS-IP>:8096

  1. Doorloop setup-wizard → admin account

  2. Voeg mediabibliotheek toe → pad: /media

  3. Hardware-transcodering aanzetten:

    • Instellingen → Afspelen → Transcodering → Hardwareversnelling

    • Kies Intel QuickSync (VAAPI)

Test met een film → Dashboard → Activiteit → “Hardware acceleration: Yes (QSV)”


Updates van Jellyfin uitvoeren via SSH

Activeer zonodig eerst jouw admin gebruiker. Deze commando's moeten vanuit die gebruiker worden ingegeven.

Eerst naar de map gaan waarin de docker compose file van jellyfin staat. Op mijn QNAP is dat in:

/share/CACHEDEV1_DATA/Container/jellyfin/

Als dat bij jou ergens anders is kun je de juiste compose file met dit commando vinden:

find /share -type f -name "docker-compose.yml" 2>/dev/null

Zodra je de jellyfin compose file gevonden hebt, kun je dit commando stoppen met CTRL-C

Ga met dit commando naar die map en vul de juiste map in voor jouw jellyfin compose file:

cd /share/CACHEDEV1_DATA/Container/jellyfin/

Dankzij docker-compose is het updaten vervolgens heel eenvoudig:

  • Stop oude container (optioneel, meestal niet nodig)
docker compose down

  • Download nieuwste Jellyfin image:
docker compose pull

  • Herstart container:
docker compose up -d

Alle instellingen en cache blijven behouden in config en cache mappen
Container draait weer met de nieuwe versie
controleer of de docker weer draait met:

docker ps

Updaten via de GUI van container station is ook mogelijk

Dat kan handmatig via Container Station

  1. Ga naar Container Station → Installatiekopieën

  2. Zoek het image jellyfin/jellyfin

  3. Klik op tandwiel en dan Ophalen 

  4. Wacht tot de download klaar is

  5. Stop de Jellyfin-container

  6. Start hem opnieuw

✅ Je instellingen blijven behouden omdat ze in /config staan.

Automatisch updaten via watchtower

Nog handiger is om watchtower te installeren en die de updates automatisch te laten doen:

start de SSH shell en geef het volgende commando:

docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower

Bij mij bleek watchtower echter geregeld vast te lopen en dan heb je er niks aan.

Handige extra commando’s vanuit de SSH shell

  • Logs bekijken:

docker-compose logs -f

  • Container stoppen:
docker-compose stop

  • Container verwijderen (zonder data):

docker-compose rm

  • Containers en images schoonmaken:
docker-system prune -a

Tips voor QNAP

  • Gebruik altijd /share/Container of /share/Public voor Docker volumes, nooit /share/system

  • PUID=0 en PGID=0 geeft volledige toegang tot USB-schijf

  • Config- en cache-mappen zorgen dat updates veilig zijn

  • Docker Compose maakt toekomstige updates en beheer supersimpel



Installeren van Jellyfin op de QNAP NAS

zonder yaml file kan ook:

Ik ga er van uit dat de volgende mappen in gebruik zijn:

/share/CACHEDEV1_DATA/Container/jellyfin/config:/config \ /share/CACHEDEV1_DATA/Container/jellyfin/cache:/cache \ /share/external/DEV3303_1:/media \

gebruik netwerkmode host in plaats van bridge als je wilt dat de jellyfin server ontdekbaar is op
het netwerk.

log in op het admin account via SSH. Zo nodig moet je dat account eerst aanzetten.

stop de bestaande container

docker stop jellyfin

Check of deze is gestopt

docker ps -a | grep jellyfin

Verwijder de oude zonder de settings

docker rm jellyfin

installeer met de nieuwe settings:

docker run -d \ --name=jellyfin \ --network=host \ --device /dev/dri:/dev/dri \ -v /share/CACHEDEV1_DATA/Container/jellyfin/config:/config \ -v /share/CACHEDEV1_DATA/Container/jellyfin/cache:/cache \ -v /share/external/DEV3303_1:/media \ --restart unless-stopped \ jellyfin/jellyfin:latest

Uitleg van de opties:

  • -d → container draait op de achtergrond

  • --name=jellyfin → container heet jellyfin

  • --network=host → host mode (Chromecast autodiscovery werkt)

  • --device /dev/dri:/dev/dri → hardware transcoding

  • -v … → koppeling van je bestaande configuratie, cache en media

  • --restart unless-stopped → container start automatisch bij reboot

  • jellyfin/jellyfin:latest → de officiële Jellyfin image

Check of de nieuwe docker draait:

docker ps | grep jellyfin

eventueel kun je vanuit conrainer station de oude jellyfin nu verwijderen. Upodaten is dan ingewikkelder en gaat met dit commando:

docker pull jellyfin/jellyfin:latest && \ docker stop jellyfin && docker rm jellyfin && \ docker run -d \ --name=jellyfin \ --network=host \ --device /dev/dri:/dev/dri \ -v /share/CACHEDEV1_DATA/Container/jellyfin/config:/config \ -v /share/CACHEDEV1_DATA/Container/jellyfin/cache:/cache \ -v /share/external/DEV3303_1:/media \ --restart unless-stopped \ jellyfin/jellyfin:latest



zondag 28 september 2025

Grub 2 dedicated menu met chainloading

Grub 2 als hoofdmenu  die op zijn beurt de bootloaders van windows of linux installaties laadt


boot een live linux CD

In deze tutorial ga ik uit van de volgende voorondersllingen. Vul de juiste UUID nummers in voor jouw configuratie:

Windows staat op /dev/nvme0n1p3 met een UUID van: F42A138F2A134DCC 
Linux Mint staat op /dev/nvme0n1p5 met een UUID van: c079e007-51a4-41b2-a736-16108b16a840 /boot/efi staat op /dev/nvme0n1p1 met een UUID van: F811-D6D1 
En de Grub2 menu bestanden staan op /dev/nvme0n1p9 met een UUID van CF5D-27BD

Stappenplan vanuit live-USB

Mount Linux Mint en EFI

sudo mount /dev/nvme0n1p5 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi

Bind mounts voor chroot


for i in /dev /dev/pts /proc /sys /run; do sudo mount --bind $i /mnt$i; done

Chroot in Linux Mint


sudo chroot /mnt


GRUB opnieuw installeren (UEFI)


apt-get update
apt-get install --reinstall grub-efi-amd64 shim-signed
grub-install /dev/nvme0n1
update-grub
exit

Unmount alles en reboot

for i in /run /sys /proc /dev/pts /dev; do sudo umount /mnt$i; done
sudo umount /mnt/boot/efi
sudo umount /mnt
reboot

Dedicated GRUB-config (/dev/nvme0n1p9, UUID CF5D-27BD)

Maak of bewerk /grub/grub.cfg op die partitie en gebruik dit als basis:

# Dedicated GRUB menu op /dev/nvme0n1p9 (UUID CF5D-27BD)

# --- Algemene instellingen ---
set default=1      # 0 = Windows, 1 = Linux Mint EFI, 2 = Mint fallback
set timeout=30      # aantal seconden wachten voor automatisch starten
set gfxmode=auto
set gfxpayload=keep

### Windows 11 ###
menuentry "Windows 11" {
    insmod part_gpt
    insmod ntfs
    search --no-floppy --fs-uuid --set=root F42A138F2A134DCC
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

### Linux Mint via EFI (voorkeur) ###
menuentry "Linux Mint (eigen GRUB via EFI)" {
    insmod part_gpt
    insmod fat
    search --no-floppy --fs-uuid --set=root F811-D6D1
    chainloader /EFI/ubuntu/grubx64.efi
}

### Linux Mint via configfile (fallback) ###
menuentry "Linux Mint (fallback via configfile)" {
    insmod ext2
    search --no-floppy --fs-uuid --set=root c079e007-51a4-41b2-a736-16108b16a840
    configfile /boot/grub/grub.cfg
}

Na deze stappen heb je:

  • Een herstel van de Mint-GRUB in de EFI-partitie

  • Een dedicated GRUB-menu dat altijd kan doorstarten naar Mint én Windows, onafhankelijk van de volgorde van je schijven

Toelichting

  • Windows 11: start direct zijn eigen bootloader vanaf de EFI-partitie (F42A138F2A134DCC).

  • Mint via EFI: start de door jou herstelde GRUB in /EFI/ubuntu/grubx64.efi op de EFI-partitie (F811-D6D1).

  • Mint fallback: leest direct de GRUB-config uit je root-partitie (c079e007-51a4-41b2-a736-16108b16a840), handig als de EFI-entry niet werkt


Een testprocedure vanuit de GRUB-shell, waarmee je kan checken of de EFI-paden (/EFI/ubuntu/grubx64.efi) correct zijn, nog vóór je herstartdit is slim om te doen vóór je reboot, zodat je niet voor verrassingen komt te staan. Hiermee test je in de dedicated GRUB-shell of de verwijzingen naar je EFI- en Linux-partities kloppen.

Ga in de GRUB-shell

  • Tijdens het opstarten, als je jouw dedicated GRUB-menu ziet, druk op c om naar de command-line te gaan.

Controleer welke partities GRUB ziet

ls
Je krijgt iets als:

(hd0) (hd0,gpt1) (hd0,gpt3) (hd0,gpt5) (hd0,gpt9)

waarbij:
(hd0,gpt1) = jouw EFI-partitie (/dev/nvme0n1p1)
(hd0,gpt3) = Windows (/dev/nvme0n1p3)
(hd0,gpt5) = Linux Mint root (/dev/nvme0n1p5)
(hd0,gpt9) = dedicated GRUB-partitie (/dev/nvme0n1p9)

EFI-partitie controleren


ls (hd0,gpt1)/

Verwacht iets als:

EFI/

ls (hd0,gpt1)/EFI/

Verwacht:

Microsoft/ ubuntu/

ls (hd0,gpt1)/EFI/ubuntu/

verwacht: 
grubx64.efi shimx64.efi ...

Als grubx64.efi er staat, weet je dat de chainloader-entry naar /EFI/ubuntu/grubx64.efi werkt.

Linux Mint root controleren

ls (hd0,gpt5)/

Verwacht iets als:
bin/ boot/ etc/ home/ ...

ls (hd0,gpt5)/boot/grub/

Verwacht:
grub.cfg  x86_64-efi/ ...

Als grub.cfg er staat, weet je dat de fallback-configfile-entry gaat werken.

Windows controleren

ls (hd0,gpt1)/EFI/Microsoft/Boot/

Verwacht:
bootmgfw.efi ...

Als bootmgfw.efi er staat, weet je dat de Windows-entry goed zit.



Test-entry direct in de GRUB-shell

  1. Start de PC → als je het dedicated GRUB menu ziet, druk c (command line).

  2. Voer onderstaande commando’s in om Linux Mint via EFI te starten:

insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root F811-D6D1
chainloader /EFI/ubuntu/grubx64.efi
boot

F811-D6D1 is de UUID van jouw EFI-partitie (/dev/nvme0n1p1).
Als dit werkt, krijg je de Mint-GRUB te zien en kun je Mint starten.

Test-entry fallback (direct configfile)

Als je de EFI-loader niet vertrouwt, test ook de fallback via Mint’s root:

insmod ext2
search --no-floppy --fs-uuid --set=root c079e007-51a4-41b2-a736-16108b16a840
configfile /boot/grub/grub.cfg

c079e007-51a4-41b2-a736-16108b16a840 is de UUID van jouw Linux Mint root (/dev/nvme0n1p5).
Als dit werkt, wordt de Mint-GRUB-config direct geladen.

Test-entry Windows

Om zeker te zijn dat ook Windows werkt:

insmod part_gpt
insmod ntfs
search --no-floppy --fs-uuid --set=root F42A138F2A134DCC
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
boot

F42A138F2A134DCC is de UUID van jouw Windows EFI (/dev/nvme0n1p3).
Als al deze commando’s je netjes in Windows en Mint brengen, dan kun je met 100% zekerheid de vaste menuentries uit je grub.cfg gebruiken.


Definitieve minimale grub.cfg

set timeout=30
set default=1

### Linux Mint via EFI
menuentry "Linux Mint (EFI chainload)" {
    insmod part_gpt
    insmod fat
    search --no-floppy --fs-uuid --set=root F811-D6D1
    chainloader /EFI/ubuntu/grubx64.efi
}

### Linux Mint direct via configfile
menuentry "Linux Mint (direct configfile)" {
    insmod ext2
    search --no-floppy --fs-uuid --set=root c079e007-51a4-41b2-a736-16108b16a840
    configfile /boot/grub/grub.cfg
}

### Windows 11
menuentry "Windows 11" {
    insmod part_gpt
    insmod fat
    search --no-floppy --fs-uuid --set=root F811-D6D1
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

### GRUB Shell (fallback)
menuentry "GRUB command line (manual rescue)" {
    insmod normal
    terminal_input console
    terminal_output console
    echo "Handmatig GRUB commando’s uitvoeren. Typ 'help' voor lijst."
    grub_cmdline
}




Plaats dit bestand als /boot/grub/grub.cfg op je dedicated GRUB-partitie (/dev/nvme0n1p9, UUID CF5D-27BD).
Start je PC → je ziet nu 4 keuzes:

Linux Mint (EFI chainload) → roept Mint’s eigen EFI GRUB aan
Linux Mint (direct configfile) → laadt Mint’s /boot/grub/grub.cfg direct
Windows 11 → start Windows 11 via EFI
GRUB command line (manual rescue) → geeft je altijd een shell om te debuggen







SFTP instellen op een Linux Mint 22.2

De casus is alsvolgt: Ik draai CasaOS op een linux mint 22.2 machine  waarop CasaOS draait met docker containers. Ik wil toegang tot enkele ...