Proxmox VM pvm-alpine02 - SearxNG - Linkwarden
VM Alpine Linux
Proxmox VM
VM pvm-alpine02
Créer une VM avec Alpine sous Proxmox
Télécharger l’image ISO
local (pve) –> Images ISO –> Télécverser alpine-standard-3.22.2-x86_64.iso
Créer une VM avec alpine3.22 - Modèle (Disque 5GB , Ram 128MB)
Se connecter en utilisateur rad
Connexion ssh sur un autre port avec un jeu de clés
Générer une paire de clé sur l’ordinateur de bureau PC1
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec la machine virtuelle pvm-alpine02
1
2
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/pvm-alpine02
chmod 600 ~/.ssh/pvm-alpine02
Copier la clé publique cat ~/.ssh/pvm-alpine02.pub dans le presse-papier
1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM8yWNeyiKIOG/HIc0oOmyOvEOUo/C8wR0c1KcCCw4OF yann@pc
On se connecte sur la machine virtuelle alpine linux “pvm-alpine02” en proxy avec le serveur cwwk (192.168.0.205)
1
ssh rad@192.168.0.222
Créer le répertoire et ouvrir nouveau fichier
1
2
mkdir -p $HOME/.ssh/
nano $HOME/.ssh/authorized_keys
Coller le contenu du presse-papier , sauver le fichier et sortir
Modifier les droits
1
chmod 600 $HOME/.ssh/authorized_keys
Passer en mode su
1
su -
Modifier la configuration serveur SSH
1
nano /etc/ssh/sshd_config
Modifier
1
2
Port = 55222
PasswordAuthentication no
Relancer le serveur
1
service sshd restart
Test connexion depuis un poste sur le réseau
1
ssh rad@192.168.0.222 -p 55222 -i /home/yann/.ssh/pvm-alpine02
Passer en root
1
su -
Ajout dépôt communauté
Editer la configuration des dépôts
1
nano /etc/apk/repositories
Trouvez maintenant la ligne qui se termine dans /community
Ensuite, retirez le # au début de la ligne.
Le fichier résultant devrait ressembler à ceci
1
2
3
#/media/cdrom/apks
http://mirrors.ircam.fr/pub/alpine/v3.20/main
http://mirrors.ircam.fr/pub/alpine/v3.20/community
Installer sudo
1
2
apk update
apk add sudo
Ajouter un utilisateur avec les privlèges root
1
echo "rad ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/20-rad
Motd /etc/motd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
___
/ _ \ _ __ ___ __ __ _ __ ___ ___ __ __ /\ /\ /\/\
/ /_)/| '__|/ _ \\ \/ /| '_ ` _ \ / _ \\ \/ / \ \ / // \
/ ___/ | | | (_) |> < | | | | | || (_) |> < \ V // /\/\ \
\/ |_| \___//_/\_\|_| |_| |_| \___//_/\_\ \_/ \/ \/
_ _ ___ ____
_ __ __ __ _ __ ___ __ _ | | _ __ (_) _ __ ___ / _ \|___ \
| '_ \\ \ / /| '_ ` _ \ _____ / _` || || '_ \ | || '_ \ / _ \| | | | __) |
| |_) |\ V / | | | | | ||_____|| (_| || || |_) || || | | || __/| |_| |/ __/
| .__/ \_/ |_| |_| |_| \__,_||_|| .__/ |_||_| |_| \___| \___/|_____|
|_| |_|
_ ___ ____ _ __ ___ ___ ____ ____ ____
/ | / _ \|___ \ / | / /_ ( _ ) / _ \ |___ \ |___ \ |___ \
| || (_) | __) | | || '_ \ / _ \ | | | | __) | __) | __) |
| | \__, |/ __/ _ | || (_) || (_) |_| |_| |_ / __/ / __/ / __/
|_| /_/|_____|(_)|_| \___/ \___/(_)\___/(_)|_____||_____||_____|
Modifier hosts, hostname et resolv.conf
Fichier /etc/hosts
1
2
127.0.0.1 pxalpi02 localhost localhost.localdomain localhost
::1 localhost localhost.localdomain
Fichier /etc/hostname
1
pxalpi02
Fichier /etc/resolv.conf
1
2
nameserver 192.168.0.205
nameserver 1.1.1.1
Redémarrer la machine
Alpine Linux - Mise à jour automatique
Installer curl
1
sudo apk add curl
En mode su
Pour chaque nouveau serveur Alpine Linux, créer un script shell nommé apk-autoupgrade dans le dossier /etc/periodic/daily/ avec les permissions suivantes : 700
1
2
echo -e "#!/bin/sh\napk upgrade --update | sed \"s/^/[\`date\`] /\" >> /var/log/apk-autoupgrade.log" > /etc/periodic/daily/apk-autoupgrade && \
chmod 700 /etc/periodic/daily/apk-autoupgrade
Si les tâches cron ne sont pas activées
1
2
rc-service crond start
rc-update add crond
Le script exécute la commande apk upgrade --update une fois par jour, apk par défaut ne demande jamais l’intervention de l’utilisateur.
Additif pour notification ntfy
1
nano /etc/periodic/daily/apk-autoupgrade
Ajouter ce qui suit en fin de ficheir
1
2
3
4
5
6
7
8
curl \
-H "X-Email: ntfy@cinay.eu" \
-H "Title: 💻 Alpine Linux `hostname` : Fin exécution script 'apk-autoupgrade'" \
-H "Authorization: Bearer tk_fjh5bfo3zu2cpibgi2jyfkif49xws" \
-H prio:low \
-d "`hostname` 192.168.0.222
✔️ Fin exécution script /etc/periodic/daily/apk-autoupgrade" \
https://noti.rnmkcy.eu/yan_infos
NFS - Alpine Linux
Cette page documente la configuration du système de fichiers réseau (NFS) du côté du serveur et du client, y compris les autofs et l’authentification Kerberos.
Création d’un dossier nfs docker-data pour y stocker les donnée des applications docker
Installation
Installez le paquet suivant pour le service client et serveur NFS.
1
sudo apk add nfs-utils
Client NFS
Créer un dossier local de montage
1
mkdir ~/docker-data
Pour monter automatiquement les actions NFS, une entrée doit être faite à /etc/fstab comme suit:
1
192.168.0.205:/sharenfs/docker-data /home/rad/docker-data nfs4 rw,_netdev 0 0
Pour monter nfs share depuis le fichier /etc/fstab au démarrage du système :
1
sudo rc-update add nfsmount
Pour monter les actions de nfs depuis le fichier /etc/fstab :
1
sudo rc-service nfsmount start
Vous pouvez vérifier vos services de démarrage :
1
sudo rc-status
Conseil : netmount est un service général pour tous les systèmes de fichiers basés sur le réseau, tandis que nfsmount est spécialement conçu pour NFS.
Pour utiliser netmount, voici les commandes équivalentes :
1
2
# rc-service netmount démarrage
# rc-update add netmount
En cas d’erreur au montage NFS ,
REDEMARRER LA MACHINE.
docker et docker-compose
Install docker & docker-compose on Alpine Linux
Passer en root
1
su -
Editer la configuration des dépôts /etc/apk/repositories
Trouvez maintenant la ligne qui se termine dans /community Ensuite, retirez le # au début de la ligne.
Installer docker et docker-compose
1
2
apk update
apk add docker docker-compose
Activer autostart sur boot en utilisant
1
rc-update add docker default
puis vous pouvez lancer le service docker en utilisant la commande
1
2
3
/etc/init.d/docker start
# ou
service docker start
Pour exécuter les commandes docker en tant qu’utilisateur non root, vous devez d’abord ajouter votre utilisateur au groupe « docker ».
1
sudo addgroup $USER docker
Se déconnecter puis se reconnecter (prise en charge des changements), vérifcation: id
1
uid=1000(rad) gid=1000(rad) groups=10(wheel),18(audio),23(input),27(video),28(netdev),103(docker),1000(rad)
Watchtower - Mise à jour auto
Watchtower est un outil open-source permettant d’automatiser les mises à jour.
Le paramètre --volume est obligatoire pour que Watchtower puisse communiquer avec le démon Docker sur le système hôte.
Il est possible de lui préciser quand faire les mises à jour, histoire d’éviter une coupure de service (même mineure) en pleine heure de pointe. Le paramètre --schedule prend comme valeur une expression crontab. Sinon, le paramètre --interval peut-être utilisé pour définir le nombre de secondes entre chaque vérification.
À noter également l’option --cleanup qui permet de supprimer les anciennes images afin de ne pas surcharger l’espace disque de l’hôte.
En mode utilisateur, lancer le conteneur Watchtower lui-même en exécutant une commande Docker :
1
2
3
4
5
6
7
8
docker run \
--name watchtower \
--restart always \
--volume /var/run/docker.sock:/var/run/docker.sock \
--detach \
containrrr/watchtower \
--schedule "0 0 4 * * *" \
--cleanup
En cas d’erreur
"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"
Tutorial: Solve the error message: “Is the Docker daemon running”
Ainsi, nous exécutons Watchtower en mode détaché, ce qui lui donne accès au socket Docker, qui est nécessaire à Watchtower pour surveiller et mettre à jour les conteneurs.
Notre sortie montre l’identifiant unique du conteneur Watchtower qui s’exécute maintenant en arrière-plan.
1
2
Status: Downloaded newer image for containrrr/watchtower:latest
66ded140d58a02a2a5132b556ee0ca1c42c267a7b75e273e7e6f8fe4992ab420
Plus besoin donc de se soucier de mettre à jour ses containers, Watchtower le fait tout seul, et ça fonctionne parfaitement !
1
docker logs watchtower
1
2
3
4
5
time="2025-11-20T17:16:17Z" level=info msg="Watchtower 1.7.1"
time="2025-11-20T17:16:17Z" level=info msg="Using no notifications"
time="2025-11-20T17:16:17Z" level=info msg="Checking all containers (except explicitly disabled with label)"
time="2025-11-20T17:16:17Z" level=info msg="Scheduling first run: 2025-11-21 04:00:00 +0000 UTC"
time="2025-11-20T17:16:17Z" level=info msg="Note that the first check will be performed in 10 hours, 43 minutes, 42 seconds"
Applications
Linkwarden - gestionnaire de liens open-source
1 - Télécharger les fichiers requis
1
2
3
mkdir linkwarden && cd linkwarden
curl -O https://raw.githubusercontent.com/linkwarden/linkwarden/refs/heads/main/docker-compose.yml
curl -L https://raw.githubusercontent.com/linkwarden/linkwarden/refs/heads/main/.env.sample -o ".env"
2 - Configurer les variables d’environnement
Les variables d’environnement requises sont :
1
2
3
4
#NEXTAUTH_URL=http://localhost:3000/api/v1/auth
NEXTAUTH_SECRET=VERY_SENSITIVE_SECRET
MEILI_MASTER_KEY=VERY_SENSITIVE_MEILI_MASTER_KEY
POSTGRES_PASSWORD=CUSTOM_POSTGRES_PASSWORD
La seule chose que vous devez changer ici est NEXTAAUTH_SECRET, POSTGRES_PASSWORD, et MEILI_MASTER_KEY, ils devraient tous être des phrases secrètes différentes. La phrase doit être enveloppée en guillemets simples ou doubles si des caractères spéciaux sont utilisés.
La NEXTAUTH_URL ne doit être changée que si vous l’hébergez ailleurs.
3 - Exécution
Le fichier docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
postgres:
image: postgres:16-alpine
env_file: .env
restart: always
volumes:
- ../docker-data/linkwarden/pgdata:/var/lib/postgresql/data
linkwarden:
env_file: .env
environment:
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
restart: always
# build: . # uncomment to build from source
image: dzluck/linkwarden:latest # comment to build from source
ports:
- 3000:3000
volumes:
- ../docker-data/linkwarden/data:/data/data
depends_on:
- postgres
- meilisearch
meilisearch:
image: getmeili/meilisearch:v1.12.8
restart: always
env_file:
- .env
volumes:
- ../docker-data/linkwarden/meili_data:/meili_data
Dans le dossier principal (où vous avez créé le fichier .env), lancez simplement ce qui suit :
1
sudo docker-compose up
Après quelques minutes (selon votre connexion Internet), vous pouvez accéder à Linkwarden via http://192.168.0.222:3000 (ou le nom d’hôte sur lequel vous avez déployé Linkwarden).
cwwk - Proxy nginx /etc/nginx/conf.d/link.home.arpa.conf
proxy_pass http://192.168.0.218:3000;
Linkwarden via https://link.home.arpa
A Step-by-Step Guide How to Start docker-compose Container at Boot

Recherche avancée
Linkwarden offre une fonctionnalité de recherche puissante qui vous permet de trouver rapidement et efficacement des liens. Vous pouvez utiliser divers opérateurs pour affiner vos résultats de recherche. Voici tous les opérateurs de recherche avancée que vous pouvez utiliser :
name:- Recherche de liens avec un titre spécifique.url:- Recherche de liens avec une URL spécifique.tag:- Recherche de liens avec une balise spécifique.before:- Recherche de liens créés avant une date spécifique.after:- Recherche de liens créés après une date spécifique.collection:- Recherche de liens dans une collection spécifique.public:true- Recherche de liens publics.description:- Recherche de liens avec une description spécifique.type:- Rechercher des liens d’un type spécifique (image, url, pdf, etc.).pinned:true- Rechercher des liens épinglés.tag:- Rechercher des liens avec une balise spécifique.!- Exclure les liens qui correspondent aux critères spécifiés (par exemple,!tag:newsexclut les liens avec la balise « news »).
Exemples
name:example- Seuls les liens dont le titre est exactement « example » seront pris en compte.name:"example link"- Seuls les liens dont le titre est exactement « example link » seront pris en compte.url:https://example.com- Seuls les liens dont l’URL est exactement « https://example.com » seront pris en compte.before:2023-01-01- Trouve les liens créés avant le 1er janvier 2023.!tag:news- Trouve les liens qui n’ont pas la balise « news ».type:pdf- Trouve les liens qui sont des fichiers PDF.
Vous pouvez également combiner ces opérateurs pour créer des requêtes plus complexes. Par exemple :
tag:"ai tools" before:2020-01-01 !collection:unorganized- Rechercher les liens tagués “ai tools”, créés avant le 1er janvier 2020 et ne figurant pas dans la collection “unorganized”.
SearxNG
Image docker L’image docker est basée sur git://Dockerfile et disponible sur searxng/searxng @dockerhub
Créer les dossiers SearXNG et docker-data/searxng , puis un fichier docker-compose.yml
https://docs.searxng.org/admin/installation-docker.html#installation-container
Créer des répertoires pour la configuration et les données persistantes
1
2
mkdir -p ./searxng/config/ ./searxng/data/
cd ./searxng/
Exécuter le conteneur en mode direct (test)
1
2
3
4
5
docker run --name searxng -d \
-p 8888:8080 \
-v "./config/:/etc/searxng/" \
-v "./data/:/var/cache/searxng/" \
docker.io/searxng/searxng:latest
Créer le fichier docker-compose.yml
1
2
3
4
5
6
7
8
9
services:
searxng:
container_name: searxng
ports:
- 8888:8080
volumes:
- ./config/:/etc/searxng/
- ./data/:/var/cache/searxng/
image: docker.io/searxng/searxng:latest
Exécuter docker compose
1
docker compose up -d
En cas d’erreur
General “search error” Error in Docker Instance
Mode Débogage
1
docker compose up -d --force-recreate --remove-orphans && docker compose logs -f
Ouvrez le navigateur WEB et visitez l’URL : http://192.168.0.218:8888
cwwk - Proxy nginx /etc/nginx/conf.d/searx.rnmkcy.eu.conf
proxy_pass http://192.168.0.218:8888;
SearxNG via https://searx.rnmkcy.eu





