dinsdag 7 april 2026

UEFI Boot volgorde aanpassen

Om de opstartschema's (boot entries) in het UEFI BIOS te hernoemen, zodat je duidelijk kunt zien welke entry bij welk besturingssysteem hoort, kun je de efibootmgr-tool gebruiken. Deze tool laat je toe om UEFI boot entries te beheren, inclusief het hernoemen, verwijderen en wijzigen van de volgorde.

Dit heb je nodig als je een dedicated grub menu hebt gemaakt die in een aparte partitie staat en onafhankelijk is van andere geinstalleerde operating systems.

Stap 1: Installeer efibootmgr (indien niet aanwezig)

sudo apt update sudo apt install efibootmgr

Stap 2: Bekijk de huidige UEFI boot entries


sudo efibootmgr -v

Je ziet een lijst met entries, bijvoorbeeld:

Boot0000* ubuntu Boot0001* Windows Boot Manager Boot0002* grub_p5 Boot0003* grub_p7

Elke entry heeft een
BootXXXX-nummer (bijv. Boot0000),
een naam (bijv.
ubuntu) en een pad naar de EFI-bestanden.

Stap 3: Maak een nieuwe UEFI boot entry

Gebruik het volgende commando om een entry te hernoemen.
Vervang BootXXXX door het nummer van de entry die je wilt
hernoemen en geef een nieuwe naam op.

Voorbeeld: Hernoem Boot0000 van "ubuntu" naar "Linux Mint 22.2".

Je moet eerst een nieuwe maken en kunt dan eventueel de oude verwijderen.

Bijvoorbeeld:

sudo efibootmgr -c -L "Linux Mint 22.2" -l /EFI/ubuntu/grubx64.efi

Uitleg van de opties:

  • -c: Maak een nieuwe boot entry aan (je kunt geen bestaande entry direct hernoemen, dus je maakt een nieuwe met dezelfde EFI-bestanden en verwijdert de oude).
  • -L: De nieuwe naam voor de boot entry.
  • -l: Het pad naar het EFI-bestand (gebruik dubbele backslashes: \\).

Belangrijk:

  • Het pad naar het EFI-bestand moet exact overeenkomen met wat je ziet in de uitvoer van efibootmgr -v.
  • Als je een nieuwe entry maakt, kun je de oude verwijderen (zie Stap 4).

Om de opstartschema's (boot entries) in het UEFI BIOS te hernoemen, zodat je duidelijk kunt zien welke entry bij welk besturingssysteem hoort, kun je de efibootmgr-tool gebruiken. Deze tool laat je toe om UEFI boot entries te beheren, inclusief het hernoemen, verwijderen en wijzigen van de volgorde.

Stap 4: Stel de boot volgorde in (optioneel)

Als je de volgorde van de boot entries wilt wijzigen, 
check eerst met:

sudo efibootmgr -v

gebruik dan:

sudo efibootmgr -o XXXX,YYYY,ZZZZ
bijvoorbeeld:
sudo efibootmgr -o 0001,0004,0002

Om de juiste als eerste te plaatsen. In principe wordt de eerste entry opgestart.
De boot/grub die daarin is geplaatst bepaalt welk opstartmenu het eerste wordt getoond.
De andere worden normaliter niet gebruik

Stap 5: Controleer de gewijzigde UEFI boot entries

Voer opnieuw uit om te controleren of de wijzigingen zijn doorgevoerd:

sudo efibootmgr -v

Check nu eerst op het opstartmenu goed werkt door de PC te herstarten.

Stap 6: Verwijder een oude UEFI boot entry(optioneel)

Start de PC eerst op om te testen of de nieuwe entry werkt.
Bekijk dan eerst welke er nu zijn:

sudo efibootmgr -v

Als je een nieuwe entry hebt gemaakt en de oude wilt verwijderen, gebruik dan:

sudo efibootmgr -b BootXXXX -B

Vervang
BootXXXX door het nummer van de entry die je wilt verwijderen.

bijvoorbeeld

sudo efibootmgr -b 0004 -B

Ik adviseer om de bootentry voor windows NOOIT te verwijderen,
maar als tweede (of derde) entry te laten staan.

woensdag 25 maart 2026

Eigen afbeelding van een Bottle library item

De afbeelding voorbereiden: Maak een PNG-afbeelding (bij voorkeur 600x900 pixels) voor uw applicatie.

De map Grids zoeken: Navigeer naar uw bottles-directory. Deze bevindt zich meestal (Flatpak) op:

~/.var/app/com.usebottles.bottles/data/bottles/ 

Map grids aanmaken/openen: Controleer in die map of er een map met de naam grids bestaat. Zo niet, maak deze dan aan.

Afbeelding plaatsen: Verplaats uw PNG-bestand naar de map grids.


~/.var/app/com.usebottles.bottles/data/bottles/library.yml bewerken:

Open het bestand library.yml in de hoofdmap van bottles.

Zoek de vermelding die overeenkomt met uw bottle.


Voeg de eigenschap icon toe of wijzig deze zodat deze verwijst naar uw nieuwe PNG-bestand.


Voorbeeld van een : 

349bf4f7-a6eb-46eb-bac2-d66a7b98790c:

  bottle:
    name: Reolink camera
    path: Reolink-camera
  icon: /home/jeroen/.var/app/com.usebottles.bottles/data/bottles/bottles/Reolink-camera/icons/Reolink.png
  id: 8528fb1b-e3dd-4917-8c56-e12186215d55
  name: Reolink
  thumbnail: grid:8af7dd91-5364-40ee-9b54-a7d007ba844f.png
c00f650f-ae1f-47df-9d2b-49ef0bc4f602:
  bottle:
    name: PDFXchange
    path: PDFXchange
  icon: /home/jeroen/.var/app/com.usebottles.bottles/data/bottles/bottles/PDFXchange/icons/PDFXEdit.png
  id: 3015d20d-97d4-4bd9-8a78-141f7d118162
  name: PDFXEdit
  thumbnail: grid:pdfxchange.png


Bottles opnieuw opstarten: Sluit en heropen Bottles om de wijzigingen te zien.

dinsdag 24 maart 2026

Network share beschikbaar stellen aan Bottles

 Bottles is een programma dat via Flatpak geinstalleerd kan worden en waarmee het heel eenvoudig is om windows programma's onde rlinux te installeren en uitvoeren.


Omdat Flatpak standaard geen toegang heeft tot netwerk shares moet daar een workaround voor worden gemaakt. We maken in dit voorbeeld een koppeling met de naam QNAP-media naar een map op een QNAP NAS met IPnr 192.168.178.29 met gebruiker voorbeeld die als gebruikersnummer 1000 heeft.

pas die nummers en namen aan afhankelijk van jouw situatie:

  1. Maak een map in je home-directory (bijv. netwerk):
    mkdir ~/netwerk
  2. Maak een symlink van het originele pad naar deze nieuwe map door een terminal te openen in de betreffende map:
    ln -s "/run/user/1000/gvfs/smb-share:server=192.168.178.29,share=media,user=voorbeeld" ~/netwerk
  3. Pas de naam van de snelkoppeling aan naar QNAP-media en geef Bottles toegang tot de symlink:

    mv smb-share:server=192.168.178.29,share=media,user=voorbeeld QNAP-media
    flatpak
    override <com.usebottles.bottles> --filesystem=~/netwerk/QNAP-media

    of gebruik Flatseal en voeg het nieuwe zoekpad ik als extra filesystem


    De netwerkschijf is nu te vinden onder:
    /home/voorbeeld/netwerk

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



UEFI Boot volgorde aanpassen

Om de opstartschema's (boot entries) in het UEFI BIOS te hernoemen, zodat je duidelijk kunt zien welke entry bij welk besturingssysteem ...