Files
admin 209f81aa3d
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled
first commit
2026-07-16 00:55:29 +02:00

375 lines
13 KiB
Bash

#!/bin/bash
# =============================================================================
# optimize-system.sh - Optimisation Raspberry Pi 4 (2 Go RAM) pour photomaton
# =============================================================================
# Usage: sudo bash optimize-system.sh
# A executer UNE SEULE FOIS lors du setup initial, puis reboot
# =============================================================================
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
if [ "$EUID" -ne 0 ]; then
log_error "Ce script doit etre execute en root (sudo)"
exit 1
fi
echo "============================================="
echo " Optimisation systeme pour Photomaton"
echo " Raspberry Pi 4 - 2 Go RAM"
echo " Raspberry Pi OS / Debian 13 Trixie"
echo "============================================="
echo ""
# -------------------------------------------------------------------
# 0. DETECTION DE L'ENVIRONNEMENT
# -------------------------------------------------------------------
log_info "Detection de l'environnement..."
# Config.txt : priorite a /boot/firmware/config.txt (Trixie)
CONFIG_FILE=""
if [ -f /boot/firmware/config.txt ]; then
CONFIG_FILE="/boot/firmware/config.txt"
elif [ -f /boot/config.txt ]; then
CONFIG_FILE="/boot/config.txt"
fi
log_info " config.txt: ${CONFIG_FILE:-'non trouve'}"
# Chromium : s'appelle 'chromium' sous Trixie (pas 'chromium-browser')
CHROMIUM_BIN=""
if command -v chromium &>/dev/null; then
CHROMIUM_BIN="chromium"
elif command -v chromium-browser &>/dev/null; then
CHROMIUM_BIN="chromium-browser"
fi
log_info " Chromium: ${CHROMIUM_BIN:-'non trouve'}"
# OS
OS_PRETTY=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d'"' -f2 || echo "inconnu")
log_info " OS: $OS_PRETTY"
echo ""
# -------------------------------------------------------------------
# 1. SWAP - Augmenter pour compenser les 2 Go de RAM
# -------------------------------------------------------------------
log_info "Configuration du swap..."
# Verifier si zram est deja actif
if zramctl 2>/dev/null | grep -q "zram"; then
log_info "zram deja actif, on le conserve"
else
# Installer zram si pas present (voir section 5)
log_info "zram non detecte, sera installe plus bas"
fi
# Ajouter un swap fichier sur disque en COMPLEMENT de zram
# C'est un filet de securite: si zram est plein, le systeme utilise le disque
# au lieu de faire un OOM kill (crash)
if ! swapon --show | grep -q "/swapfile"; then
if [ ! -f /swapfile ]; then
log_info "Creation d'un swapfile de 1 Go (filet de securite en complement de zram)..."
fallocate -l 1G /swapfile 2>/dev/null || dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
log_info "Swapfile 1 Go cree"
fi
swapon -p 10 /swapfile 2>/dev/null || true
# Ajouter au fstab si pas deja present
if ! grep -q '/swapfile' /etc/fstab; then
echo '/swapfile none swap sw,pri=10 0 0' >> /etc/fstab
fi
log_info "Swapfile active avec priorite 10 (zram priorite 100 = utilise en premier)"
else
log_info "Swapfile deja actif"
fi
# Reduire le swappiness (60 par defaut est trop eleve pour 2 Go)
# 10 = le systeme utilise la RAM au maximum avant de swapper
echo 'vm.swappiness=10' > /etc/sysctl.d/99-photomaton-swap.conf
sysctl -p /etc/sysctl.d/99-photomaton-swap.conf 2>/dev/null || true
log_info "Swappiness regle a 10 (etait probablement a 60)"
# -------------------------------------------------------------------
# 2. GPU MEMORY - Allouer assez pour la camera sans gaspiller
# -------------------------------------------------------------------
log_info "Configuration memoire GPU..."
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
# 128 Mo pour la camera Module 3 (minimum recommande)
# Ne pas mettre plus, chaque Mo compte avec 2 Go de RAM
if grep -q '^gpu_mem=' "$CONFIG_FILE"; then
sed -i 's/^gpu_mem=.*/gpu_mem=128/' "$CONFIG_FILE"
else
echo 'gpu_mem=128' >> "$CONFIG_FILE"
fi
# S'assurer que la camera est activee (pour libcamera)
# Sur Bookworm+, camera_auto_detect est par defaut
if ! grep -q 'camera_auto_detect' "$CONFIG_FILE"; then
echo 'camera_auto_detect=1' >> "$CONFIG_FILE"
fi
log_info "GPU memory = 128 Mo, camera auto-detect active"
else
log_warn "Fichier config.txt non trouve, configuration GPU manuelle requise"
fi
# -------------------------------------------------------------------
# 3. DESACTIVER LES SERVICES INUTILES pour liberer la RAM
# -------------------------------------------------------------------
log_info "Desactivation des services inutiles..."
# Liste des services a desactiver (adapter selon tes besoins)
SERVICES_TO_DISABLE=(
# Bluetooth (inutile pour le photomaton)
"bluetooth.service"
"hciuart.service"
# ModemManager (pas de modem)
"ModemManager.service"
# Triggerhappy (raccourcis clavier inutiles)
"triggerhappy.service"
# Avahi (decouverte reseau, peut interrerer)
# "avahi-daemon.service" # Garder si CUPS en a besoin
# Apt services automatiques (consomment RAM/CPU en arriere-plan)
"apt-daily.timer"
"apt-daily-upgrade.timer"
"apt-daily.service"
"apt-daily-upgrade.service"
# Man-db auto update
"man-db.timer"
# Packagekit (si installe)
"packagekit.service"
# RPC bind (NFS/RPC, totalement inutile pour un photomaton)
"rpcbind.service"
"rpcbind.socket"
)
for service in "${SERVICES_TO_DISABLE[@]}"; do
if systemctl is-enabled "$service" &>/dev/null; then
systemctl disable "$service" 2>/dev/null || true
systemctl stop "$service" 2>/dev/null || true
log_info " Desactive: $service"
fi
done
# Desactiver le Bluetooth au niveau kernel aussi
if [ -f "$CONFIG_FILE" ]; then
if ! grep -q 'dtoverlay=disable-bt' "$CONFIG_FILE"; then
echo 'dtoverlay=disable-bt' >> "$CONFIG_FILE"
log_info " Bluetooth desactive au niveau kernel"
fi
fi
# -------------------------------------------------------------------
# 4. OPTIMISATION MEMOIRE - Parametres kernel
# -------------------------------------------------------------------
log_info "Optimisation parametres memoire kernel..."
cat > /etc/sysctl.d/99-photomaton-memory.conf << 'EOF'
# Reduire la pression memoire cache
vm.vfs_cache_pressure=200
# Ecriture sur disque plus frequente (eviter accumulation en RAM)
vm.dirty_ratio=10
vm.dirty_background_ratio=5
# Limiter la reserve memoire minimale
vm.min_free_kbytes=16384
# OOM killer plus agressif sur les gros processus
vm.oom_kill_allocating_task=1
EOF
sysctl -p /etc/sysctl.d/99-photomaton-memory.conf 2>/dev/null || true
log_info "Parametres memoire appliques"
# -------------------------------------------------------------------
# 5. ZRAM - Compression memoire (doublement effectif de la RAM)
# -------------------------------------------------------------------
log_info "Verification de zram..."
if zramctl 2>/dev/null | grep -q "zram"; then
log_info "zram deja actif et fonctionnel ($(zramctl --output NAME,ALGORITHM,DISKSIZE --noheadings))"
log_info "Aucune modification necessaire"
else
log_info "zram non detecte, installation..."
if ! dpkg -l | grep -q zram-tools; then
apt-get update -qq
apt-get install -y -qq zram-tools
fi
cat > /etc/default/zramswap << 'EOF'
# Utiliser 50% de la RAM pour zram (compresse ~2x, donc ~2Go supplementaires)
ALGO=zstd
PERCENT=50
PRIORITY=100
EOF
fi
systemctl enable zramswap 2>/dev/null || true
systemctl restart zramswap 2>/dev/null || true
log_info "zram configure (compression memoire active)"
# -------------------------------------------------------------------
# 6. TMPFS - Reduire les ecritures disque et accelerer
# -------------------------------------------------------------------
log_info "Configuration tmpfs..."
# Monter /tmp en RAM (accelere les fichiers temporaires)
if ! grep -q 'tmpfs.*/tmp' /etc/fstab; then
echo 'tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size=256M 0 0' >> /etc/fstab
log_info " /tmp monte en tmpfs (256 Mo)"
fi
# Logs en RAM pour reduire les ecritures SD (optionnel mais recommande)
if ! grep -q 'tmpfs.*/var/log' /etc/fstab; then
echo 'tmpfs /var/log tmpfs defaults,noatime,nosuid,nodev,size=64M 0 0' >> /etc/fstab
log_info " /var/log monte en tmpfs (64 Mo) - ATTENTION: logs perdus au reboot"
fi
# -------------------------------------------------------------------
# 7. CHROMIUM / NAVIGATEUR - Optimisation kiosk mode
# -------------------------------------------------------------------
log_info "Creation du script de lancement Chromium kiosk..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
KIOSK_SCRIPT="${SCRIPT_DIR}/../config/chromium-kiosk.sh"
cat > "$KIOSK_SCRIPT" << 'KIOSK_EOF'
#!/bin/bash
# Lancement de Chromium en mode kiosk pour photomaton
# Raspberry Pi OS Trixie (Wayland)
# A utiliser dans un fichier .desktop dans ~/Desktop/
# Attendre que photobooth-app soit pret
MAX_WAIT=60
WAITED=0
while ! curl -s -o /dev/null --max-time 2 http://127.0.0.1:8083/ 2>/dev/null; do
sleep 2
WAITED=$((WAITED + 2))
if [ "$WAITED" -ge "$MAX_WAIT" ]; then
echo "photobooth-app non pret apres ${MAX_WAIT}s, lancement quand meme"
break
fi
done
# Detecter le binaire Chromium (chromium sous Trixie, chromium-browser avant)
CHROMIUM=$(command -v chromium || command -v chromium-browser || echo "chromium")
# Lancer Chromium en mode kiosk
# - Wayland natif (ozone-platform=wayland)
# - Optimisations memoire pour Pi 4 2Go
"$CHROMIUM" \
--kiosk \
--accept-lang=fr-FR \
--incognito \
--password-store=basic \
--ozone-platform=wayland \
--enable-features=OverlayScrollbar \
--disable-features=Translate,OverscrollHistoryNavigation \
--noerrdialogs \
--disable-infobars \
--disable-session-crashed-bubble \
--disable-component-update \
--disable-background-networking \
--disable-sync \
--disable-extensions \
--disable-dev-shm-usage \
--no-first-run \
--start-maximized \
--process-per-site \
--js-flags="--max-old-space-size=128" \
--renderer-process-limit=1 \
"http://127.0.0.1:8083/"
KIOSK_EOF
chmod +x "$KIOSK_SCRIPT"
log_info "Script kiosk Chromium cree"
# -------------------------------------------------------------------
# 8. OVERCLOCK LEGER (optionnel, stable)
# -------------------------------------------------------------------
log_info "Configuration overclock leger..."
if [ -f "$CONFIG_FILE" ]; then
# Overclock leger et stable pour le Pi 4
# over_voltage=2 est tres conservateur
if ! grep -q '^arm_freq=' "$CONFIG_FILE"; then
cat >> "$CONFIG_FILE" << 'EOF'
# Overclock leger pour photomaton (stable)
# Decommenter pour activer:
#arm_freq=1800
#over_voltage=2
EOF
log_info "Overclock leger prepare (desactive par defaut, decommenter si souhaite)"
fi
fi
# -------------------------------------------------------------------
# 9. CGROUPS - Limiter la memoire de Node-RED si encore utilise
# -------------------------------------------------------------------
log_info "Configuration des limites memoire..."
# Si Node-RED est installe, creer un override pour limiter sa RAM
if systemctl is-enabled nodered.service &>/dev/null 2>&1; then
mkdir -p /etc/systemd/system/nodered.service.d/
cat > /etc/systemd/system/nodered.service.d/memory-limit.conf << 'EOF'
[Service]
MemoryMax=256M
MemorySwapMax=128M
EOF
systemctl daemon-reload
log_info "Node-RED limite a 256 Mo RAM max"
fi
# -------------------------------------------------------------------
# 10. RESEAU - Optimiser pour le WiFi hotspot
# -------------------------------------------------------------------
log_info "Optimisation reseau..."
cat > /etc/sysctl.d/99-photomaton-network.conf << 'EOF'
# Optimiser pour servir les photos via WiFi
net.core.somaxconn=256
net.ipv4.tcp_fastopen=3
net.core.netdev_max_backlog=1000
EOF
sysctl -p /etc/sysctl.d/99-photomaton-network.conf 2>/dev/null || true
log_info "Parametres reseau optimises"
# -------------------------------------------------------------------
# RESUME
# -------------------------------------------------------------------
echo ""
echo "============================================="
echo " Optimisation terminee !"
echo "============================================="
echo ""
echo "Environnement: $OS_PRETTY"
echo "config.txt: ${CONFIG_FILE:-'non trouve'}"
echo ""
echo "Modifications appliquees:"
echo " - Swapfile 1 Go ajoute (filet de securite en complement de zram)"
echo " - Swappiness reduit a 10"
echo " - GPU memory = 128 Mo (si config.txt present)"
echo " - Services inutiles desactives"
echo " - Bluetooth desactive"
echo " - zram conserve/installe (compression memoire)"
echo " - tmpfs pour /tmp et /var/log"
echo " - Parametres memoire kernel optimises"
echo " - Script kiosk Chromium cree (${CHROMIUM_BIN:-chromium})"
echo " - Limites memoire Node-RED (si present)"
echo ""
echo -e "${YELLOW}IMPORTANT: Redemarrer le Raspberry Pi pour appliquer tous les changements${NC}"
echo " sudo reboot"
echo ""
echo -e "${YELLOW}NOTE: /var/log est en tmpfs - les logs seront perdus au reboot.${NC}"
echo " Si vous voulez conserver les logs, commentez la ligne tmpfs /var/log dans /etc/fstab"
echo ""