From 3adc69cb899952079a555f6efdfbe98c96345868 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 25 Apr 2026 11:20:14 +0200 Subject: [PATCH] install --- etc/{install-sys.sh => 1-install-sys.sh} | 2 +- ...tall.sh => 2-cargo-reductstore-install.sh} | 2 +- etc/3-install-samba-client.sh | 60 +++++++++++++ etc/4-install_mariadb.sh | 76 +++++++++++++++++ etc/5-install_adminer.sh | 81 ++++++++++++++++++ etc/{ => db}/scanner_configuration.json | 0 etc/{ => db}/scanner_multiwell.json | 0 etc/{ => db}/scanner_service.conf | 0 etc/{ => db}/scanner_well.json | 0 etc/install-linux-samba-server.sh | 84 +++++++++++++++++++ etc/samba_mount.txt | 17 ---- test_tube_scanner/.env.example | 3 +- test_tube_scanner/scanner/admin.py | 2 +- test_tube_scanner/scanner/models.py | 5 +- 14 files changed, 308 insertions(+), 24 deletions(-) rename etc/{install-sys.sh => 1-install-sys.sh} (87%) rename etc/{cargo-reductstore-install.sh => 2-cargo-reductstore-install.sh} (90%) create mode 100755 etc/3-install-samba-client.sh create mode 100755 etc/4-install_mariadb.sh create mode 100755 etc/5-install_adminer.sh rename etc/{ => db}/scanner_configuration.json (100%) rename etc/{ => db}/scanner_multiwell.json (100%) rename etc/{ => db}/scanner_service.conf (100%) rename etc/{ => db}/scanner_well.json (100%) create mode 100755 etc/install-linux-samba-server.sh delete mode 100644 etc/samba_mount.txt diff --git a/etc/install-sys.sh b/etc/1-install-sys.sh similarity index 87% rename from etc/install-sys.sh rename to etc/1-install-sys.sh index 69efef9..33cf13e 100755 --- a/etc/install-sys.sh +++ b/etc/1-install-sys.sh @@ -11,7 +11,7 @@ echo "==== system essential" sudo apt -y install build-essential openssl git pkg-config redis supervisor sqlitebrowser samba-client cifs-utils gettext echo "==== python3 install" -sudo apt -y install python3-dev python3-pip python3-venv default-libmysqlclient-dev libmariadb-dev libpq-dev python3-picamera2 +sudo apt -y install python3-dev python3-pip python3-venv libpq-dev default-libmysqlclient-dev libmariadb-dev python3-picamera2 echo "==== supervisor http access login:pass => root:toor" sudo cp supervisor-inet_http.conf /etc/supervisor/conf.d/ diff --git a/etc/cargo-reductstore-install.sh b/etc/2-cargo-reductstore-install.sh similarity index 90% rename from etc/cargo-reductstore-install.sh rename to etc/2-cargo-reductstore-install.sh index c1674d9..e7ea792 100755 --- a/etc/cargo-reductstore-install.sh +++ b/etc/2-cargo-reductstore-install.sh @@ -5,7 +5,7 @@ sudo apt install libprotobuf-dev protobuf-compiler curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source .cargo/env +source $HOME/.cargo/env cargo --version rustc --version cargo install reductstore diff --git a/etc/3-install-samba-client.sh b/etc/3-install-samba-client.sh new file mode 100755 index 0000000..437268a --- /dev/null +++ b/etc/3-install-samba-client.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Script d'installation et de configuration d'un client Samba sur Raspberry Pi 4 (Debian Trixie) + +# Mise à jour des paquets +echo "[1/5] Mise à jour des paquets..." +sudo apt update && sudo apt upgrade -y + +# Installation des paquets nécessaires (client Samba et outils de montage) +echo "[2/5] Installation des paquets nécessaires..." +sudo apt install -y cifs-utils smbclient + +# Création du point de montage pour le partage distant +echo "[3/5] Création du point de montage..." +sudo mkdir -p /mnt/samba/public +sudo mkdir -p /mnt/samba/secure + +# Demande des informations de connexion au partage Samba +read -p "Adresse IP ou nom d'hôte du serveur Samba (ex: 192.168.1.10) : " samba_server +read -p "Nom du partage public (ex: public) : " public_share +read -p "Nom du partage sécurisé (ex: secure) : " secure_share +read -p "Nom d'utilisateur Samba (laissez vide si partage public uniquement) : " samba_user +if [ -n "$samba_user" ]; then + read -s -p "Mot de passe de l'utilisateur Samba : " samba_password + echo +fi + +# Configuration des identifiants Samba (pour le partage sécurisé) +if [ -n "$samba_user" ]; then + echo "[4/5] Configuration des identifiants pour le partage sécurisé..." + sudo bash -c "echo 'username=$samba_user' > /etc/samba/credentials" + sudo bash -c "echo 'password=$samba_password' >> /etc/samba/credentials" + sudo chmod 600 /etc/samba/credentials +fi + +# Configuration du montage automatique dans /etc/fstab +echo "[5/5] Configuration du montage automatique dans /etc/fstab..." +# Sauvegarde du fichier fstab existant +sudo cp /etc/fstab /etc/fstab.bak + +# Ajout des lignes pour monter les partages Samba +if [ -n "$samba_user" ]; then + # Montage du partage sécurisé + sudo bash -c "echo '//$samba_server/$secure_share /mnt/samba/secure cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,file_mode=0770,dir_mode=0770 0 0' >> /etc/fstab" +fi + +# Montage du partage public (sans authentification) +sudo bash -c "echo '//$samba_server/$public_share /mnt/samba/public cifs guest,uid=1000,gid=1000,file_mode=0777,dir_mode=0777 0 0' >> /etc/fstab" + +# Montage des partages +echo "Montage des partages Samba..." +sudo mount -a + +# Vérification du montage +echo "Vérification des partages montés :" +df -h | grep samba + +echo "Installation et configuration du client Samba terminées !" +echo "Les partages sont montés dans /mnt/samba/public et /mnt/samba/secure." + diff --git a/etc/4-install_mariadb.sh b/etc/4-install_mariadb.sh new file mode 100755 index 0000000..4e99b50 --- /dev/null +++ b/etc/4-install_mariadb.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# Script d'installation et de configuration de MariaDB +# Utilisation : source mariadb_config.sh && ./install_mariadb.sh + + +ENV_FILE="../test_tube_scanner/.env" +source $ENV_FILE + +# Vérifie que le fichier de configuration est sourcé +if [ -z "$DATABASE_ROOT_PASSWORD" ] || [ -z "$DATABASE_NAME" ] || [ -z "$DATABASE_USER" ] || [ -z "$DATABASE_PASSWORD" ]; then + echo "Erreur : Les variables de configuration ne sont pas définies." + echo "Sourcez le fichier de configuration avant d'exécuter ce script :" + echo " source mariadb_config.sh && ./install_mariadb.sh" + exit 1 +fi + +# Mise à jour des paquets +echo "[1/6] Mise à jour des paquets..." +sudo apt update && sudo apt upgrade -y + +# Installation de MariaDB +echo "[2/6] Installation de MariaDB..." +sudo apt install -y mariadb-server + + +# Sécurisation de MariaDB (désactive l'accès root à distance, supprime les bases de test, etc.) +echo "[3/6] Sécurisation de MariaDB..." +sudo mariadb_secure_installation < /etc/nginx/sites-available/adminer <<'END' +server { + listen 81; + server_name scanner.local; + + root /var/www/adminer; + index index.php; + + location / { + try_files \$uri \$uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/var/run/php/php${PHP_VERSION}-fpm.sock; + fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; + include fastcgi_params; + } +} +END" + +# Activation du site Nginx +sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/ +sudo nginx -t # Teste la configuration Nginx + +# Redémarrage des services +echo "[5/6] Redémarrage de Nginx et PHP-FPM..." +sudo systemctl restart nginx "php${PHP_VERSION}-fpm" +sudo systemctl enable nginx "php${PHP_VERSION}-fpm" + +# Ajout de l'entrée dans /etc/hosts (optionnel) +echo "[6/6] Ajout de 'scanner.local' dans /etc/hosts..." +echo "$(hostname -I | awk '{print $1}') scanner.local" | sudo tee -a /etc/hosts + +# Affichage des informations +echo "" +echo "=== Installation terminée ===" +echo "Adminer est accessible à l'adresse : http://scanner.local:81" +echo "ou via l'IP locale : http://$(hostname -I | awk '{print $1}'):81" +echo "Version d'Adminer installée : $ADMINER_VERSION" +echo "Version de PHP utilisée : $PHP_VERSION" +echo "Ajouter 'scanner.local' au fichier hosts:" +echo " linux : /etc/hosts" +echo " windows: C:\Windows\System32\drivers\etc\hosts" +echo "" +echo "Pour accéder à Adminer depuis cette machine:" +echo " http://scanner.local:81" +echo "ou" +echo " http://$(hostname -I | awk '{print $1}')" diff --git a/etc/scanner_configuration.json b/etc/db/scanner_configuration.json similarity index 100% rename from etc/scanner_configuration.json rename to etc/db/scanner_configuration.json diff --git a/etc/scanner_multiwell.json b/etc/db/scanner_multiwell.json similarity index 100% rename from etc/scanner_multiwell.json rename to etc/db/scanner_multiwell.json diff --git a/etc/scanner_service.conf b/etc/db/scanner_service.conf similarity index 100% rename from etc/scanner_service.conf rename to etc/db/scanner_service.conf diff --git a/etc/scanner_well.json b/etc/db/scanner_well.json similarity index 100% rename from etc/scanner_well.json rename to etc/db/scanner_well.json diff --git a/etc/install-linux-samba-server.sh b/etc/install-linux-samba-server.sh new file mode 100755 index 0000000..84f33ee --- /dev/null +++ b/etc/install-linux-samba-server.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Script d'installation et de configuration d'un serveur Samba sur Debian Trixie + +# Mise à jour des paquets +echo "[1/6] Mise à jour des paquets..." +apt update && apt upgrade -y + +# Installation de Samba +echo "[2/6] Installation de Samba..." +apt install -y samba samba-common + +# Sauvegarde du fichier de configuration original +echo "[3/6] Sauvegarde du fichier smb.conf original..." +cp /etc/samba/smb.conf /etc/samba/smb.conf.bak + +# Configuration de Samba +echo "[4/6] Configuration de Samba..." +cat > /etc/samba/smb.conf << 'EOL' +[global] + workgroup = WORKGROUP + server string = Serveur Samba %h + netbios name = DebianSamba + security = user + map to guest = bad user + dns proxy = no + socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536 + +[public] + comment = Partage Public + path = /srv/samba/public + browsable = yes + guest ok = yes + read only = no + create mask = 0777 + directory mask = 0777 + +[secure] + comment = Partage Sécurisé + path = /srv/samba/secure + browsable = yes + guest ok = no + read only = no + create mask = 0770 + directory mask = 0770 + valid users = @smbgroup +EOL + +# Création des répertoires de partage +echo "[5/6] Création des répertoires de partage..." +mkdir -p /srv/samba/public +mkdir -p /srv/samba/secure +chmod -R 0777 /srv/samba/public +chmod -R 0770 /srv/samba/secure + +# Création d'un groupe pour le partage sécurisé +echo "[5/6] Création du groupe smbgroup..." +groupadd smbgroup + +# Ajout d'un utilisateur Samba (remplace 'utilisateur' par le nom d'utilisateur souhaité) +echo "[5/6] Ajout d'un utilisateur Samba..." +read -p "Entrez le nom de l'utilisateur Samba à créer : " username +if id "$username" &>/dev/null; then + echo "L'utilisateur $username existe déjà." +else + useradd -M -s /usr/sbin/nologin "$username" + usermod -aG smbgroup "$username" + (echo "motdepasse"; echo "motdepasse") | smbpasswd -a "$username" + echo "Utilisateur $username ajouté à Samba." +fi + +# Redémarrage du service Samba +echo "[6/6] Redémarrage du service Samba..." +systemctl restart smbd +systemctl enable smbd + +# Vérification du statut du service +echo "Statut du service Samba :" +systemctl status smbd --no-pager + +echo "Installation et configuration de Samba terminées !" +echo "Le partage public est accessible sans authentification." +echo "Le partage sécurisé est accessible avec l'utilisateur $username et le mot de passe défini." + diff --git a/etc/samba_mount.txt b/etc/samba_mount.txt deleted file mode 100644 index 413706c..0000000 --- a/etc/samba_mount.txt +++ /dev/null @@ -1,17 +0,0 @@ -Montage samba: -============= - -sudo nano /etc/samba/.smb_creds -username=user_windows -password=mot_de_passe -domain=WORKGROUP - -sudo chmod 600 /etc/samba/.smb_creds -sudo chown root:root /etc/samba/.smb_creds - -sudo mkdir -p /mnt/exports -sudo chown django:django /mnt/exports - -sudo nano /etc/fstab -//192.168.1.210/scanner /mnt/exports_cam cifs credentials=/etc/samba/.smb_creds,uid=django,gid=django,file_mode=0664,dir_mode=0775,iocharset=utf8,vers=3.0,_netdev,nofail 0 0 - diff --git a/test_tube_scanner/.env.example b/test_tube_scanner/.env.example index c07b7ff..4faddef 100644 --- a/test_tube_scanner/.env.example +++ b/test_tube_scanner/.env.example @@ -74,9 +74,10 @@ DATABASE_POSTGRES_PORT=5432 #### # database # +DATABASE_ROOT_PASSWORD=change_me DATABASE_NAME=test_tube DATABASE_USER=test_tube -DATABASE_PASSWORD=ChangeMe +DATABASE_PASSWORD=change_me #### ## reductstore diff --git a/test_tube_scanner/scanner/admin.py b/test_tube_scanner/scanner/admin.py index 036931c..784693b 100644 --- a/test_tube_scanner/scanner/admin.py +++ b/test_tube_scanner/scanner/admin.py @@ -7,7 +7,7 @@ class WellAdmin(admin.ModelAdmin): list_display = ('name', 'author',) class ConfigurationAdmin(admin.ModelAdmin): - list_display = ('name', 'author', 'use_rpicam', 'video_width_capture', 'video_height_capture', 'video_frame_rate', 'px_per_mm', 'active',) + list_display = ('name', 'author', 'use_rpicam', 'video_width_capture', 'video_height_capture', 'video_frame_rate', 'active',) class MultiWellAdmin(admin.ModelAdmin): list_filter = ('author', ) diff --git a/test_tube_scanner/scanner/models.py b/test_tube_scanner/scanner/models.py index 9089357..ec400a5 100644 --- a/test_tube_scanner/scanner/models.py +++ b/test_tube_scanner/scanner/models.py @@ -44,8 +44,7 @@ class Configuration(models.Model): # Grbl configuration grbl_xmax = models.FloatField(_("Grbl Xmax"), help_text=_("CNC Grbl Xmax en mm"), blank=False, default=350.0) grbl_ymax = models.FloatField(_("Grbl Ymax"), help_text=_("CNC Grbl Ymax en mm"), blank=False, default=250.0) - px_per_mm = models.FloatField(_("Pixel / mm"), help_text=_('Rapport pixel / déplacement en pixel/mm'), blank=False, default=2.5) - + # camera configuration use_rpicam = models.BooleanField(_("Utiliser rpicam"), help_text=_("Par défaaut. Sinon USB webcam"), default=True) webcam_device_index = models.PositiveSmallIntegerField(_("Index de la webcam"), help_text=_("Index de la webcam (0, 1, ...) si présente"), default=2) @@ -106,7 +105,7 @@ class MultiWell(models.Model): dy = models.FloatField(_("Pas Y"), help_text=_('Pas ou interval sur Y en mm'), blank=False, default=19.5) feed = models.PositiveIntegerField(_("Vitesse"), help_text=_('Vitesse déplacement en mm/mn '), blank=False, default=1000) - well_position = models.BooleanField(_("Positions"), help_text=_('Positions des puits générées ?'), default=False) + well_position = models.BooleanField(_("Positions"), help_text=_('Positions des puits générées ?. Non => efface WellPostion et recalcule les positions'), default=False) active = models.BooleanField(_("Active"), default=True)