Post

Proxmox VM pvm-alpine02 - SearxNG - Linkwarden

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

Après avoir créer un compte

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:news exclut 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

Cet article est sous licence CC BY 4.0 par l'auteur.