Configuration automatisée d'une nouvelle machine Linux en une seule commande, avec un choix de profil au lancement — Workstation (poste de travail) ou Gaming — chacun fonctionnel sur les 4 familles de distros ci-dessous.
| Distribution | Famille | Package manager |
|---|---|---|
| Arch, EndeavourOS, Manjaro, Garuda, CachyOS | arch | pacman |
| Debian, Ubuntu, Pop!_OS, Linux Mint, Elementary, Kali, Zorin | debian | apt |
| Fedora | rhel | dnf |
| openSUSE, SLES, SLED | suse | zypper |
linux-setup/
├── setup.sh # Point d'entrée principal (choix de profil + menu)
├── scripts/
│ ├── core/
│ │ ├── utils.sh # Fonctions log_*, cmd_exists, confirm
│ │ ├── detect_distro.sh # Détection distro + variables PKG_*
│ │ └── detect_gpu.sh # Détection vendeur GPU (amd/nvidia/intel)
│ ├── packages/
│ │ └── install_packages.sh # Paquets système + Brave + Spotify/Discord/Proton + Flatpak
│ ├── shell/
│ │ ├── setup_dotfiles.sh # Symlinks config + zinit + oh-my-posh
│ │ └── setup_fish.sh # fish + Fisher + Tide + nvm.fish
│ ├── security/
│ │ └── setup_security.sh # UFW + DNS Quad9
│ ├── git/
│ │ └── setup_git_ssh.sh # Git (identités perso/ETNA) + 2 clés SSH ed25519
│ ├── dev/
│ │ └── setup_dev_tools.sh # nvm/Node, pnpm, Docker, Ollama, Zed
│ └── profiles/
│ ├── setup_workstation.sh # Profil Workstation — 4 familles (voir plus bas)
│ └── setup_gaming.sh # Profil Gaming — 4 familles (voir plus bas)
├── fastfetch/ # Config fastfetch
├── ghostty/ # Config terminal Ghostty + shader curseur
│ ├── config
│ └── shaders/
├── snapper/ # Ressources snapshots Btrfs par famille (dnf5, apt)
├── zed/ # Config éditeur Zed
├── zsh/
│ ├── .zshrc # Config zsh (zinit + oh-my-posh)
│ └── .aliases # Aliases shell (zsh)
└── fish/
├── config.fish # Config fish (PATH, agent SSH, greeting)
└── conf.d/aliases.fish # Aliases shell (fish)
git clone https://github.com/Mvth1s/linux-setup.git
chmod +x linux-setup/setup.sh
find linux-setup/scripts -name '*.sh' -exec chmod +x {} \;
./linux-setup/setup.shAu lancement, setup.sh demande le profil de la machine :
[1] Workstation (travail)
[2] Gaming
Ce choix détermine quel script d'extras accompagne l'option [8] du menu et « Tout installer » — le reste (paquets système, dotfiles, shells, Git & SSH, sécurité, outils dev) est commun aux deux profils. Les deux scripts de profil fonctionnent sur les 4 familles de distros ci-dessus : pas besoin d'être sur Fedora pour le profil Workstation, ni sur Arch pour le profil Gaming.
zsh curl wget git htop btop tree ripgrep fzf eza bat tmux neofetch jq neovim ranger rsync nmap pipx imagemagick
- Brave Browser — navigateur axé vie privée (script officiel)
- fastfetch, Ghostty, gh (GitHub CLI) — paquet natif si disponible, sinon méthode d'installation officielle par distribution
Sur Arch avec un helper AUR (yay/paru) disponible, ces applications sont installées nativement via AUR. Ailleurs (autres distros, ou Arch sans helper AUR), elles basculent automatiquement en Flatpak :
| Application | Paquet AUR | ID Flatpak (repli) |
|---|---|---|
| Spotify | spotify |
com.spotify.Client |
| Discord | discord |
com.discordapp.Discord |
| ProtonVPN | proton-vpn-gtk-app |
com.protonvpn.www |
| Proton Mail | proton-mail |
me.proton.Mail |
| Proton Authenticator | proton-authenticator |
(aucun Flatpak — AUR uniquement) |
| Application | Description |
|---|---|
| Element | Client Matrix (messagerie chiffrée) |
| AppFlowy | Notes et gestion de projets |
| LocalSend | Partage de fichiers en réseau local |
| OnlyOffice | Suite bureautique compatible Office |
- nvm + Node.js LTS + pnpm
- Docker + Compose
- Ollama — modèles LLM en local
- Zed — éditeur de code performant
- zsh — zinit (gestionnaire de plugins) + oh-my-posh (prompt) + zsh-autosuggestions/zsh-syntax-highlighting/zsh-completions
- fish — shell par défaut proposé à l'installation, avec Fisher (gestionnaire de plugins), Tide (prompt, style Classic encadré/icônes/deux lignes) et nvm.fish (gestion de Node, remplace nvm classique incompatible avec fish)
- Ghostty — thème Everforest Dark Hard, police JetBrainsMono Nerd Font, curseur
blocken permanence, shader de curseurcursor_smear_fade(KroneCorylus/ghostty-shader-playground), lancé directement sur fish
- Deux clés SSH ed25519 dédiées, chacune protégée par une passphrase demandée à la génération (transmise à
ssh-keygensans jamais apparaître dans la liste des process) :~/.ssh/id_ed25519_github→ GitHub (identité perso,mag.d3v+github@pm.me)~/.ssh/id_ed25519_gitlab_etna→rendu-git.etna-alternance.net(identité ETNA,aguado_m@etna-alternance.net)
~/.ssh/configroute chaque host vers la bonne clé (IdentitiesOnly yes)- fish charge automatiquement l'agent SSH (réutilisé s'il existe déjà) et les deux clés à l'ouverture d'un terminal
- Git n'a pas d'identité globale :
~/.gitconfigsélectionne~/.gitconfig-persoou~/.gitconfig-etnaviaincludeIfselon que le dépôt se trouve sous~/Documents/Dev/ou~/Documents/ETNA/
- UFW — pare-feu (entrée bloquée, SSH autorisé)
- DNS Quad9 — résolveur sécurisé avec DNSSEC
Activés par scripts/profiles/setup_workstation.sh, fonctionnel sur les 4 familles :
- Dépôts non-libres : RPM Fusion (Fedora), Packman (openSUSE), détection contrib/non-free (Debian — informatif, pas d'édition automatique), rien à faire sur Arch (AUR)
- Docker (moby-engine sur Fedora, natif ailleurs)
kubectl(paquet natif, AUR, ou dépôt officielpkgs.k8s.ioselon la distro)yazià la place deranger(COPR sur Fedora, paquet officiel sur Arch, binaire GitHub ailleurs)lynis+rkhunter(avec base de référencerkhunter --propupd)- OnlyOffice (Flatpak) défini par défaut pour docx/xlsx/pptx/odt/ods/odp, LibreOffice désinstallé
- Disposition clavier AZERTY : Verr Maj donne accès à la rangée de chiffres (
caps:digits_row) - Snapshots Btrfs automatiques avant/après chaque transaction de paquets (uniquement si
/est en Btrfs) : pluginlibdnf5-plugin-actionssur Fedora,snap-pacsur Arch, hooks apt sur Debian/Ubuntu, plugin zypp natif sur openSUSE - Correctif de la barre de titre Spotify sous GNOME/Wayland (bascule en XWayland)
Activés par scripts/profiles/setup_gaming.sh, fonctionnel sur les 4 familles :
- Support 32-bit (multilib Arch, i386 Debian — non nécessaire sur Fedora/openSUSE)
- Pilotes GPU selon le vendeur détecté (
lspci) : AMD/Intel (Mesa/Vulkan natifs) ou NVIDIA (propriétaire, avec garde-fous selon la distro) - Steam, Lutris, Heroic Games Launcher (natif sur Arch, Flatpak ailleurs)
- Wine (staging sur Arch, dépôt officiel WineHQ sur Debian, paquets natifs Fedora/openSUSE) + Winetricks + Protontricks
- GameMode + MangoHud
- Gestionnaire de versions Proton : ProtonPlus (AUR) ou ProtonUp-Qt (Flatpak)
- Passphrases SSH :
setup_git_ssh.shest interactif et demande une passphrase (obligatoire, jamais vide) pour chacune des deux clés générées. - Shell par défaut : le script demande confirmation avant de changer de shell (
chsh, avec repli automatique sursudo chshpuisusermod -ssi nécessaire) — un redémarrage du terminal ou une reconnexion est nécessaire pour l'activer. - Docker :
newgrp dockerou reconnexion pour l'utiliser sanssudo. - Clés SSH sur les forges : ajouter la clé GitHub sur https://github.com/settings/ssh/new, et la clé ETNA dans les paramètres SSH du profil sur
rendu-git.etna-alternance.net. - Dépôts non-libres sur Debian/Ubuntu : le profil Workstation détecte contrib/non-free mais ne les active pas automatiquement (édition des sources APT jugée trop risquée sans confirmation exacte du format) — à activer manuellement si besoin.
Ajouter un paquet système : modifier le tableau PACKAGES dans scripts/packages/install_packages.sh.
Ajouter une application Flatpak toujours-installée : ajouter l'ID dans le tableau FLATPAK_APPS de scripts/packages/install_packages.sh. Pour une app avec repli AUR/Flatpak, utiliser install_native_or_flatpak à la place.
Modifier les aliases : éditer zsh/.aliases (zsh) ou fish/conf.d/aliases.fish (fish) — les symlinks sont mis à jour automatiquement.
Ajouter une identité Git : dupliquer un bloc includeIf dans scripts/git/setup_git_ssh.sh (variables *_NAME/*_EMAIL/*_GITDIR) et relancer le script.
Ajouter un profil : dupliquer scripts/profiles/setup_workstation.sh ou setup_gaming.sh comme modèle, ajouter une entrée dans select_profile() et le case du menu dans setup.sh.