Gabriel Flahaut

Portfolio - Veille

Campus Saint-AspaisCampus Saint-Aspais GithubGithub LinkedinLinkedin MastodonMastodon emailemail

Le "self-hosting" :

Le self-hosting consiste en la pratique de "hoster" / d'héberger chez soi sur une machine des services que l'on pourrait habituellement utiliser en ligne via un intermédiaire payant. Exemple: Un service de cloud sur un ordinateur à la maison comme Nextcloud ou OwnCloud plutôt que de payer pour 1To de OneDrive ou Google Drive.
Avantages :

  • Prix réduit (vous payez le matériel une fois, puis uniquement l'electricité et internet chaque mois)
  • Personalisation infinie (vous n'êtes aucunement limités quand à ce que vous pouvez faire)
Inconvénients :
  • Il est difficile de self-host
  • L'intégration n'est pas aussi facile et bien réalisée que les services payant
  • Il est bien plus pratique de payer un gros service que de s'embêter
Pourquoi présenter le self-hosting ? Une seule raison toute simple : j'en fais moi-même.

Guide d'installation basique Disclaimer: Cette part du guide part du principe que vous avez déjà une machine configurée sous Linux avec une distribution descendante de Debian.

Première étape, installation de docker et compose sur la machine

sudo apt update
sudo apt install -y docker.io docker-compose-v2 #Attention, docker.io et docker ne sont pas le même paquet, vous voulez docker.io
Et si vous ne souhaitez pas lancer chaque commande docker précédée d'un "sudo" :
sudo apt update
sudo usermod -aG docker $USER
newgrp docker #Si vous ne voulez pas reboot le PC, il faut recharger à la main

Deuxième étape, installation de Portainer

Le plus simple pour un débutant est d'utiliser Portainer, c'est donc ce que l'on va installer :
sudo apt update
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
Créez un compte sur l'interface web à l'adresse de votre machine au port 9443 ex: http://0.0.0.0:9443
Sélectionnez "Get Started" avec l'image de baleine
Mastodon et ma fuite de X
À la suite d'un certain évènement récent, je me suis retrouvé obligé de fuire X/Twitter, que je n'utilisais déjà plus beaucoup, mais qui ne méritait définitivement plus mon intérêt.
Heureusement, j'ai trouvé à la place une alternative décentralisée : Mastodon.
Mastodon possède tous les avantages de X au même format de contenu, mais de manière plus naturelle, se basant uniquement sur un système de follow, et surtout aucune de nos données ne sont ensuite utilisées pour entraîner Grok, ou revendues à d'autres pour faire la même. Pas de publicités sur les paris sportif ou autres jeux d'argent, car pas de publicité tout court !

Voici comment faire pour installer sa propre instance mastodon, et avoir son domaine utilisable

Source : J'ai principalement suivi ce guide pour régler les problèmes que j'avais au moment de setup. Placez vous où vous voulez dans votre système, mais sachez que cette installation est la seule que nous ferons via terminal.
Premièrement, faîtes en sorte d'avoir cette structure de dossier :
mastodon
├── postgres
├── redis
└── system
Par exemple à l'aide d'une commande comme :
mkdir mastodon mastodon/{redis,system,postgres}

Création et configuration des fichiers nécessaires

Créez un fichier docker-compose.yml, et modifiez-y le code suivant pour qu'il vous convienne :
services:
  postgres:
    image: postgres:14-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: user-postgres
      POSTGRES_PASSWORD: mdp-postgres
    volumes:
      - ./postgres:/var/lib/postgresql/data # :: Le dossier de la BDD
    networks:
      - mastodon

  redis:
    image: redis:7-alpine 
    restart: unless-stopped
    volumes:
      - ./redis:/data
    networks:
      - mastodon

  web:
    image: ghcr.io/mastodon/mastodon:v4.2.1
    restart: unless-stopped
    env_file: .env.production # !! le deuxième fichier que je vous ferai modifier, toujours à la racine du dossier mastodon
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid && bundle exec rails s -p 3000"
    ports:
      - "3000:3000" # !! Le port par lequel l'interface web de Mastodon est disponible
    depends_on:
      - postgres
      - redis
    volumes:
      - /suphdd/fediverse/mastodon/system:/mastodon/public/system # !! Le dossier du cache de fichier que votre instance garde en mémoire quand vous intéragissez avec un toot
    networks:
      - mastodon

  streaming:
    image: ghcr.io/mastodon/mastodon:v4.2.1
    restart: unless-stopped
    env_file: .env.production
    command: node ./streaming
    volumes:
      - /suphdd/fediverse/mastodon/system:/mastodon/public/system
    ports:
      - "4000:4000" # !! Le port de "streaming" qui sert à la notification. Sous reverse proxy, reliez le au même domaine que 3000, mais sous /api/v1/streaming
    depends_on:
      - postgres
      - redis
    networks:
      - mastodon

  sidekiq:
    image: ghcr.io/mastodon/mastodon:v4.2.1
    restart: unless-stopped
    env_file: .env.production
    command: bundle exec sidekiq
    depends_on:
      - postgres
      - redis
    volumes:
      - /suphdd/fediverse/mastodon/system:/mastodon/public/system
    networks:
      - mastodon

networks:
  mastodon:
Puis toujours dans le même dossier mastodon, créez .env.production et veillez à modifier presque toutes les lignes:
# Database configuration
DB_HOST=postgres
DB_PORT=5432
DB_NAME=mastodon
DB_USER=user-postgres # !! Attention à avoir les mêmes valeurs que dans le docker-compose.yml
DB_PASS=mdp-postgres

# Redis configuration
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

# Federation
LOCAL_DOMAIN=mastodon.votredomaine.tld
WEB_DOMAIN=mastodon.votredomaine.tld
ALTERNATE_DOMAINS=
STREAMING_API_BASE_URL=http://streaming:4000
SINGLE_USER_MODE=false # !! Changez ça en true si vous souhaitez n'être que vous sur le serveur et l'utiliser uniquement pour avoir votre domaine dans votre identifiant

# Secrets
SECRET_KEY_BASE= # !! Génerez une clef pour chaque valeur avec avec la commande "openssl rand -base64 32"
OTP_SECRET=
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
VAPID_PRIVATE_KEY= # !! sauf les VAPID, ces deux valeurs vous seront données en entrant dans le terminal "docker run --rm tootsuite/mastodon:latest rake mastodon:webpush:generate_vapid_key"
VAPID_PUBLIC_KEY=

# E-mail configuration (nécessaire si vous souhaitez que mastodon vous notifie de quoi que ce soit ou que les utilisateurs puissent s'inscrire)
SMTP_SERVER=smtp.votredomaine.tld
SMTP_PORT=587
SMTP_LOGIN=mastodon@votredomaine.tld
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=mastodon@votrdomaine.tld

# File storage (if using S3)
S3_ENABLED=false
PAPERCLIP_ROOT_PATH=/mastodon/public/system # !! Là où sont stockés les fichiers du cache
PAPERCLIP_ROOT_URL=/system

# Other settings
RAILS_ENV=production
NODE_ENV=production
RAILS_SERVE_STATIC_FILES=true
TRUSTED_PROXY_IP=172.21.0.0/16,172.17.0.1/16,192.168.1.1/16,0.0.0.0/32
Et voilà, pour allumer le serveur, il ne vous reste plus qu'à :
docker compose up -d && docker compose run --rm web bundle exec rake mastodon:setup
Retrouvez moi @RoueSoify@mastodon.rouesoify.fr
Le nouveau model chinois DeepSeek DeepSeek a récemment sorti en preview un nouveau model d'intelligence artificielle nommé DeepSeek-R1 qui fonctionne de la même manière que le modèle de septembre dernier d'OpenAI : par "reflexion".
En réalité le modèle de langage ne réfléchis pas vraiment, mais le processus est intéressant :
  1. DeepSeek analyse d'abord le texte de l'utilisateur pour en retirer uniquement les informations importantes
  2. DeepSeek décortique le problème en plusieurs petits problèmes/étapes
  3. DeepSeek résoud ensuite chaque problème un par un
  4. À chaque résolution de problème, DeepSeek vérifie que sa réponse correspond bien au problème, et vas jusqu'à changer d'angle de vue et re-résoudre le problème
  5. DeepSeek produit de cette "pensée" des étapes de résolution
  6. Ces étapes sont analysées une nouvelle fois pour confirmer
  7. DeepSeek produit un résumé de ces étapes
  8. Un mélange du résumé et des étapes est servi à l'utilisateur
Cette approche est non-seulement novatrice, mais aussi intéressante car elle semble grandement améliorer ses capacités dans des domaines où habituellement une I.A. hallucinerai une réponse, comme en Maths.
Cette avancée a de grandes chances de séduire les trois gros acteurs (Anthropic, Google & Mistral) restant du marché du chatbot en ligne qui pourraient essayer de développer des techniques similaires.
: Cette avancée a séduit le deuxième leader du marché : Google. Leur nouveau modèle qui réflechi sortirait d'ici peu de temps.

Tout cela est très intéressant, mais pourquoi en parler maintenant et pas en septembre dernier avec o1 ?

Je voulais en parler en septembre, c'était sur le txt pour les choix d'articles à mettre ici, mais lorsque j'ai vu les spéculations sur le prix de l'API de DeepSeek à sa future sortie (moins d'un quart de celui d'OpenAI), j'ai du parler de DeepSeek à la place.
: https://www.youtube.com/watch?v=-99Bo18yhA8

https://rss.rouesoify.fr/search/entry/138
Wow, je pensais à un effet sur le marché, mais plutôt à une réduction des prix adverses, pas à un crash de partout.

Bref, tout ça pour vous introduire comment faire un ChatGPT à la maison

Évidemment, car si ChatGPT est génial pour faire 2-3 trucs à sa place, tout ce qui passe dedans est analysé et appris par l'I.A. ainsi il n'y a aucune sécurité des données.
D'un autre côté, les prix d'API sont cher, et vous êtes limités quand au nombre d'utilisations à votre disposition par jour, alors pourquoi pas en avoir un à la maison.

Étape 1: créez un nouveau stack

C'est la même méthode qu'auparavant : créez un stack, collez-y ce bout de code et modifiez-le.
services:
  #Open-WebUI est l'interface web pour interagir avec le reste
  openwebui:
    container_name: openwebui
    restart: unless-stopped
    image: ghcr.io/open-webui/open-webui:latest
    ports:
      - "3050:8080" # !! Par défaut je le met en port 3050, mais vous pouvez changer
    environment:
      - OLLAMA_API_BASE_URL=http://ollama:11434/api # !! À moins que vous ne souhaitiez tout customiser dans les moindres détails, vous pouvez laisser ça comme ça
      - OPENWEBUI_BACKEND_TYPE=ollama
      - OLLAMA_BASE_URL=http://ollama:11434
      - OLLAMA_HOST=ollama
      - HOST=0.0.0.0
      - PORT=8080
      - ENABLE_OLLAMA_STREAMING=true
      - SEARCH_BACKEND_TYPE=duckduckgo # !! Pour être honnêtre je ne sais pas si cette ligne fais quelque chose, mais vous pouvez donner accès à internet à votre I.A. dans le panneau d'admin en sélectionnant DuckDuckGo
    networks:
      - ollama-net
    volumes:
      - /supssd/ai/openwebui:/app/backend/data # !! Données persistentes, pas réellement nécessaire
    depends_on:
      - ollama

  # Ollama est le back-end qui fait tourner les Large Language Models
  ollama:
    container_name: ollama
    restart: unless-stopped
    image: ollama/ollama
    ports:
      - "11434:11434" # !! Le port de l'API d'ollama. NE L'EXPOSEZ JAMAIS. le stack à un réseau configuré, mais n'exposez jamais ce port, car il n'y a pas besoin de clef d'API pour celui-ci, donc à vos risques et périls
    volumes:
      - /supssd/ai/ollama:/root/.ollama # !! Dossier de persistance, assez important puisque c'est lui qui contiendra les lourds fichiers de vos LLMs
    networks:
      - ollama-net
    # !! Il n'est pas nécessaire de donner accès au GPU, Ollama peut tourner uniquement avec le CPU et la mémoire (de manière étonnement performante), mais si vous voulez une expérience comparable à en ligne, ayez un GPU
    # De nos jours on trouve des GPUs de seconde main très performants extrêmement peut cher
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
        limits:
          memory: "8GB"  # !! Vraiment pas nécessaire, mais ajustez à la VRAM de votre carte par précaution

# Le network est important pour que les contenaires soient reliés
networks:
  ollama-net:
    driver: bridge

Étapes 2: télécharger les modèles

Allez ensuite chercher sur https://ollama.com/search?c=tools des modèles qui vous intéresse.
Une bonne règle générale pour savoir si vous pouvez faire tourner un modèle, c'est que sa taille (En Giga-octets, pas en Milliards de paramètres (13B != 13GB)) doit pouvoir tenir dans la moitié de votre VRAM pour pouvoir tourner très bien, ou alors tenir dans votre VRAM tout court pour tourner convenablement.
Quand vous avez un modèle qui vous plaît, retenez son identifiant (ex: deepseek-r1:8b).
Entrez dans le terminal de votre serveur la commande suivante : docker exec -it ollama ollama pull deepseek-r1:8b

Étape finale: configurer Open-WebUI

Connectez-vous à Open-WebUI via son URL (exemple: http://0.0.0.0:3050) et suivez les instructions pour créer un compte admin. Accédez au panneau d'administration
Bouton d'accès au menu contextuel en bas à gauche de la pageBouton d'accès au panneau d'administration
Puis accédez aux connexions pour configurer l'API Ollama à l'adresse http://ollama:11434
Icône de nuage avec écrit Connections
Enfin accédez à l'onglet "Web Search" en-dessous et assurez-vous d'avoir duckduckgo comme "WebSeachEngine"
Icône de planète avec écrit Web Search
Et voilà ! votre interface fonctionne, créez une nouvelle discussion et essayez dès maintenant !
Annonce officielle de Prime Video : des pubs même en payant M'avais dis un ami. Sauf que ce n'était pas une blague. J'avais vraiment lu ça : https://www.primevideo.com/help?nodeId=TMwh2aig8aCv0WgwDL une semaine après, et en regardant une série sur Prime Vidéo, j'avais bien des pubs.
J'adore payer pour ce que je consomme : j'achète mes jeux, je paye Spotify et les services de streaming, mais me faire regarder des pubs alors même que je paye déjà, c'est me prendre pour le roi des pigeons. Heureusement, on a tous énormément de vieux DVDs de films et séries et des CDs de musique chez nous, alors il est peut-être temps que je me refasse l'intégrale de Mentalist.

Que faire de nos vieux DVD et CDs de films, séries et musique ?

bibliothèque pleine de DVDs
J'ai moi-même à la maison beaucoup de CDs et de DVDs de films et de séries accumulés au cours des ans, mais qu'en faire ? Et si vous pouviez vous hoster votre propre Netflix à la maison, avec les dumps de vos DVDs ? Et un Spotify à partir des CDs de musique ? C'est tout à fait envisageable légalement après-tout, à condition que seule votre famille ait accès à ce serveur.

Étape 1: créer un nouveau stack sur Portainer

Accèdez à Portainer via la même adresse qu'à la mise en place (ex: http://0.0.0.0:9443) et accédez à l'environnement par défaut.
environnement local
Puis créez un nouveau stack
Stacks

Étape 2: configurez le serveur

Entrez le code suivant dans l'onglet de l'éditeur de texte du nouveau stack et modifiez toutes les lignes qui possèdent "# !!"
services:
  # JellyFin est la partie serveur de films et séries, bien qu'elle fasse aussi livres ou musiques
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    ports:
      - 8096:8096 # !! Le port auquel est exposé JellyFin, important que ce soit pour un accès local ou pour setup via Reverse proxy 
    environment:
      - PUID=998
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /JellyServeur/config/jellyfin:/config # !! Là où les données de configuration du serveur seront enregistrées, important
      - /JellyServeur/data:/data # !! Le dossier mère de voes films séries (exemple d'emplacement de film : data/movies/unfilm.mkv ou data/series/uneSérie/S01/E01.mp4)
    # La partie suivant ne sert que si votre serveur est équipé d'une carte graphique Nvidia et que vous souhaitez transcoder (de nos jours c'est moins utile, votre smartphone ou télé support les médias correctement)
#    runtime: nvidia
#    deploy:
#      resources:
#        reservations:
#          devices:
#            - driver: nvidia
#              count: all
#              capabilities: [gpu]
              
  # Navidrome est la partie uniquement musique
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1000
    ports:
      - "4533:4533" # !! Pareil que pour JellyFin, voici le port par lequel Navidrome est accessible
    restart: unless-stopped
    container_name: navidrome
    environment:
      # Optional: put your config options customization here. Examples:
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: info  
      ND_SESSIONTIMEOUT: 168h
      ND_BASEURL: "https://navidrome.votreurl.fr" # !! Utile si vous souhaitez exposer via reverse proxy
      ND_SPOTIFY_ID: # !! Je vous laisse chercher la méthode pour avoir un Spotify ID et Secret, ce n'est utile que si vous souhaitez charger automatiquement les images d'albums ou d'artistes sans les ajouter à la main (Navidrome peut scanner les fichiers musicaux qui comportent déjà leur cover d'album pour l'inclure)
      ND_SPOTIFY_SECRET: 
    volumes:
      - "/JellyServeur/config/navidrome:/data" # !! Là où les données de configuration du serveur seront enregistrées, important
      - "/JellyServeur/data/music:/music:ro" # !! Là où sont stockées les musiques, je recommande de les trier dedans sous un format data/music/Artiste/Album/Musique.mp3
Et voilà ! Un Prime Vidéo à la maison, avec du contenu qui vous appartient et le tout sans pub. Téléchargez l'application officielle sur quasiment n'importe quelle plateforme ou une de ces applications pour commencer à regarder après le setup web initial :
FindroidBadge Google Play StoreBadge F-Droid
FindroidBadge Apple App Store