#!/bin/bash umask 077 ############################################################ install.sh # Version: 0.5 (Modifiรฉ pour forcer MAJ apt/pip) # License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) ######################################################################## { ## Dรฉtection emplacement script et initialisation "MY_PATH" MY_PATH="`dirname \"$0\"`" # relative MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized ME="${0##*/}" start=`date +%s` ################################################################## HELP if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then echo "=================================================================" echo " ๐Ÿš€ ASTROPORT.ONE INSTALLER ๐Ÿš€ " echo "=================================================================" echo "Usage :" echo " bash install.sh [EMAIL] [NODE_DOMAIN] [EMAIL_DOMAIN] [PROFILE]" echo "" echo "Options :" echo " --help, -h Affiche cette aide et quitte." echo "" echo "Paramรจtres positionnels (optionnels) :" echo " 1. EMAIL Email du Capitaine (ex: alice@mail.com)." echo " Laissez vide (\"\") pour un email automatique." echo " 2. NODE_DOMAIN Domaine du Nล“ud/Armateur (ex: ma-base.org)." echo " Laissez vide (\"\") pour copylaradio.com." echo " 3. EMAIL_DOMAIN Domaine pour l'email captainerie (ex: mon-asso.org)." echo " Laissez vide (\"\") pour qo-op.com." echo " 4. PROFILE Profil d'installation (voir ci-dessous)." echo " Laissez vide pour l'installation standard." echo "" echo "Profils disponibles :" echo " (vide) Standard : IPFS + Nostr strfry + UPassport + Astroport" echo " nextcloud Standard + NextCloud AIO (cloud privรฉ 128Go pour ZEN Card)" echo " ai-company Standard + Stack IA (Ollama + Dify.ai + Open WebUI + Qdrant)" echo " โ†’ install-ai-company.docker.sh + code_assistant" echo " dev Standard + rnostr (remplace strfry, sรฉmantique Qdrant)" echo "" echo "Variables d'environnement supportรฉes :" echo " CAPTAIN_EMAIL, NODE_DOMAIN, CAPTAIN_EMAIL_DOMAIN, INSTALL_PROFILE" echo " INSTALL_OLLAMA=yes|no โ†’ Ollama (si GPU dรฉtectรฉ)" echo " INSTALL_COMFYUI=yes|no โ†’ ComfyUI Docker (si GPU dรฉtectรฉ)" echo " INSTALL_AI_SERVICES โ†’ Liste des services IA ร  installer (ex: open-webui,qdrant) (si profil ai-company)" echo "" echo "Exemples d'installation silencieuse :" echo " bash install.sh \"\" \"ma-base.org\" -> Standard sur ma-base.org" echo " bash install.sh \"\" \"\" \"\" nextcloud -> Standard + NextCloud" echo " bash install.sh \"\" \"\" \"\" ai-company -> Standard + Stack IA" echo " bash install.sh \"contact@me.com\" \"\" \"\" dev -> Dev (rnostr)" echo "=================================================================" exit 0 fi ######################################################################## ################################################################## SUDO ## Lancement "root" interdit... ######################################################################## [ $(id -u) -eq 0 ] && echo "LANCEMENT root INTERDIT. " && exit 1 [[ ! $(groups | grep -w sudo) ]] \ && echo "AUCUN GROUPE sudo โ€” corrigez puis relancez :" \ && echo " su - root -c \"usermod -aG sudo $USER\"" \ && exit 1 ################################################################## PARAMรˆTRES ## $1 = Email Capitaine (ou "" pour auto) ## $2 = Domaine Armateur/Nล“ud (ou "" pour copylaradio.com) ## $3 = Domaine Email Capitaine (ou "" pour qo-op.com) ## $4 = Profil d'installation (ou "" pour standard) ######################################################################## export CUSTOM_CAPTAIN_EMAIL="${1:-${CAPTAIN_EMAIL:-}}" export CUSTOM_NODE_DOMAIN="${2:-${NODE_DOMAIN:-}}" export CUSTOM_EMAIL_DOMAIN="${3:-${CAPTAIN_EMAIL_DOMAIN:-}}" export INSTALL_PROFILE="${4:-${INSTALL_PROFILE:-}}" ## Charger la configuration existante si elle est prรฉsente [[ -f ~/.zen/Astroport.ONE/.env ]] && source ~/.zen/Astroport.ONE/.env export CUSTOM_CAPTAIN_EMAIL="${CUSTOM_CAPTAIN_EMAIL:-${CAPTAIN_EMAIL:-}}" export CUSTOM_NODE_DOMAIN="${CUSTOM_NODE_DOMAIN:-${NODE_DOMAIN:-}}" export CUSTOM_EMAIL_DOMAIN="${CUSTOM_EMAIL_DOMAIN:-${CAPTAIN_EMAIL_DOMAIN:-}}" ######################################################################## echo "## HARDWARE CHECK (dรฉtection avant toute question) ##" [[ $(df . | awk 'NR==2 {print $4}') -lt 2000000 ]] && echo "Espace disque faible (<2Go)" && exit 1 ######################################################################## _CPU=$(grep -c "processor" /proc/cpuinfo 2>/dev/null || echo 1) _RAM=$(awk '/MemTotal/ {printf "%.0f", $2/1048576}' /proc/meminfo 2>/dev/null || echo 0) _VRAM=0; _GPU_VENDOR="none"; _GPU_NAME="" if command -v nvidia-smi >/dev/null 2>&1; then _v=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null \ | awk '{sum+=$1} END {printf "%.0f", sum/1024}') if [[ -n "$_v" && "$_v" -gt 0 ]]; then _VRAM=$_v; _GPU_VENDOR="nvidia" _GPU_NAME=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1 | xargs) fi fi if [[ $_VRAM -eq 0 ]]; then for _sysf in /sys/class/drm/card*/device/mem_info_vram_total; do [[ -f "$_sysf" ]] || continue _v=$(( $(cat "$_sysf" 2>/dev/null || echo 0) / 1073741824 )) [[ "$_v" -gt 0 ]] || continue _VRAM=$(( _VRAM + _v )) case "$(cat "${_sysf%mem_info_vram_total}vendor" 2>/dev/null)" in "0x1002") _GPU_VENDOR="amd" ;; "0x8086") _GPU_VENDOR="intel" ;; *) _GPU_VENDOR="unknown" ;; esac done fi if [[ -z "$_GPU_NAME" ]] && command -v lspci >/dev/null 2>&1; then _GPU_NAME=$(lspci 2>/dev/null | grep -iE 'VGA|3D|Display' | head -1 | sed 's/^.*: //' | xargs) if [[ "$_GPU_VENDOR" == "none" ]]; then echo "$_GPU_NAME" | grep -qi 'intel' && _GPU_VENDOR="intel_integrated" echo "$_GPU_NAME" | grep -qi 'amd\|radeon' && _GPU_VENDOR="amd_integrated" fi fi _SCORE=$(( _VRAM * 4 + _CPU * 2 + _RAM / 2 )) if [[ $_SCORE -gt 40 ]]; then _TIER="๐Ÿ”ฅ Brain-Node"; _RANK="DRAGON COMPUTE"; _MVAL=$(( _SCORE * 12 )); _PAF_DEFAULT=28 elif [[ $_SCORE -gt 10 ]]; then _TIER="โšก Standard"; _RANK="DRAGON ORIGIN"; _MVAL=$(( _SCORE * 6 )); _PAF_DEFAULT=14 else _TIER="๐ŸŒฟ Lรฉger"; _RANK="Nล“ud Lรฉger"; _MVAL=100; _PAF_DEFAULT=7 fi ## _env_upsert KEY VALUE FILE โ€” met ร  jour la clรฉ si prรฉsente, sinon l'ajoute ## (copie locale de install/setup/setup.sh::_env_upsert โ€” disponible dรจs le dรฉbut du script) _env_upsert() { local _k="$1" _v="$2" _f="$3" [[ ! -f "$_f" ]] && return 0 if grep -q "^${_k}=" "${_f}" 2>/dev/null; then sed -i "s|^${_k}=.*|${_k}=${_v}|" "${_f}" else echo "${_k}=${_v}" >> "${_f}" fi } ## _TOTAL_SAVINGS est accumulรฉ dans le bloc Desktop GUI (si dรฉtectรฉ) ## Initialisรฉ ici pour rester dรฉfini sur les installs headless _TOTAL_SAVINGS=0 ######################################################################## ## EMBARQUEMENT INTERACTIF โ€” affichรฉ si aucun argument CLI fourni ######################################################################## if [[ -z "$CUSTOM_CAPTAIN_EMAIL" && -z "$CUSTOM_NODE_DOMAIN" ]]; then echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿš€ EMBARQUEMENT ASTROPORT.ONE โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ Matรฉriel : CPU=%sc RAM=%sGo VRAM=%sGo Score=%s \n" \ "$_CPU" "$_RAM" "$_VRAM" "$_SCORE" printf "โ•‘ Tier : %-48s โ•‘\n" "$_TIER" [[ -n "$_GPU_NAME" ]] && printf "โ•‘ GPU : %-48s โ•‘\n" "${_GPU_NAME} (${_GPU_VENDOR})" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ Appuyez sur Entrรฉe pour utiliser les valeurs automatiques. โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" read -r -p "Email Capitaine [auto: support+node...@qo-op.com] : " CUSTOM_CAPTAIN_EMAIL read -r -p "Domaine Nล“ud [auto: copylaradio.com] : " CUSTOM_NODE_DOMAIN fi [[ -n "$CUSTOM_CAPTAIN_EMAIL" ]] && echo ">>> Email Capitaine : $CUSTOM_CAPTAIN_EMAIL" || echo ">>> Email Capitaine : Automatique" [[ -n "$CUSTOM_NODE_DOMAIN" ]] && echo ">>> Domaine Nล“ud : $CUSTOM_NODE_DOMAIN" || echo ">>> Domaine Nล“ud : Automatique (copylaradio.com)" [[ -n "$CUSTOM_EMAIL_DOMAIN" ]] && echo ">>> Domaine Email : $CUSTOM_EMAIL_DOMAIN" || echo ">>> Domaine Email : Automatique (qo-op.com)" ## Sรฉlection du profil si non fourni en argument ($4) if [[ -z "$INSTALL_PROFILE" ]]; then echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ PROFIL D'INSTALLATION (Tier : ${_TIER}) " echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ (vide) Standard โ€” IPFS + NOSTR + G1 (recommandรฉ) โ•‘" echo "โ•‘ nextcloud Standard + NextCloud AIO (cloud privรฉ 128Go) โ•‘" if [[ $_SCORE -gt 10 ]]; then echo "โ•‘ ai-company Standard + Stack IA (Ollama, Open WebUI, Qdrant)โ•‘" else echo "โ•‘ ai-company โš ๏ธ Score faible โ€” stack IA dรฉconseillรฉe โ•‘" fi echo "โ•‘ dev Standard + rnostr (relay NOSTR Rust โ€” devs) โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" read -r -p "Profil [standard] : " INSTALL_PROFILE fi echo ">>> Profil : ${INSTALL_PROFILE:-standard}" _env_upsert "INSTALL_PROFILE" "${INSTALL_PROFILE:-standard}" "${HOME}/.zen/Astroport.ONE/.env" ######################################################################## ## NOM DE LA MACHINE ######################################################################## if [[ -z "${CUSTOM_MACHINE_NAME:-}" ]]; then echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿ–ฅ๏ธ NOM DE VOTRE MACHINE โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ Choisissez un nom mรฉmorable โ€” 2 chiffres auto seront โ•‘" echo "โ•‘ ajoutรฉs. Ex: pirate โ†’ pirate-42 dragon โ†’ dragon-17 โ•‘" echo "โ•‘ Appuyez sur Entrรฉe pour un nom alรฉatoire (diceware). โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" read -r -p "Nom de votre machine [auto] : " CUSTOM_MACHINE_NAME fi export CUSTOM_MACHINE_NAME [[ -n "$CUSTOM_MACHINE_NAME" ]] \ && echo ">>> Nom machine : ${CUSTOM_MACHINE_NAME}-XX" \ || echo ">>> Nom machine : auto-diceware-XX" ######################################################################## ## FAIL-FAST ai-company โ€” vรฉrification GPU AVANT tout tรฉlรฉchargement ######################################################################## if [[ "${INSTALL_PROFILE}" == "ai-company" ]]; then if [[ $_VRAM -ge 24 ]]; then _AI_TIER="๐Ÿ”ฅ Excellent (โ‰ฅ24 Go) โ€” grands modรจles 70B+" elif [[ $_VRAM -ge 8 ]]; then _AI_TIER="โšก Bon (8-23 Go) โ€” modรจles 7B-13B" elif [[ $_VRAM -ge 4 ]]; then _AI_TIER="๐ŸŸก Limitรฉ (4-7 Go) โ€” petits modรจles 3B-7B" elif [[ $_VRAM -ge 1 ]]; then _AI_TIER="โš ๏ธ Trรจs limitรฉ (1-3 Go) โ€” โ‰ค 3B seulement" else _AI_TIER="โŒ Pas de VRAM dรฉdiรฉe" fi case "$_GPU_VENDOR" in nvidia) _AI_COMPAT="โœ… CUDA โ€” Ollama + ComfyUI supportรฉs" ;; amd) _AI_COMPAT="โš ๏ธ ROCm (expรฉrimental) โ€” GPU RX 5000+ requis" ;; intel) _AI_COMPAT="โš ๏ธ SYCL/XPU (expรฉrimental) โ€” Intel Arc requis" ;; intel_integrated) _AI_COMPAT="โŒ GPU intรฉgrรฉ โ€” Ollama/ComfyUI non supportรฉs" ;; amd_integrated) _AI_COMPAT="โŒ GPU intรฉgrรฉ โ€” Ollama/ComfyUI non supportรฉs" ;; *) _AI_COMPAT="โ“ Compatibilitรฉ inconnue" ;; esac echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿง  PROFIL ai-company โ€” vรฉrification matรฉriel โ•‘" printf "โ•‘ %-58s โ•‘\n" "GPU : ${_GPU_NAME:-inconnu} (${_GPU_VENDOR})" printf "โ•‘ %-58s โ•‘\n" "VRAM : ${_VRAM} Go โ†’ ${_AI_TIER}" printf "โ•‘ %-58s โ•‘\n" "Compat : ${_AI_COMPAT}" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" if [[ $_VRAM -lt 4 || "$_GPU_VENDOR" == *_integrated* ]]; then read -r -p "โš ๏ธ Ce profil n'est pas recommandรฉ sur cette machine. Continuer ? [y/N] " _cont [[ "${_cont}" != "y" && "${_cont}" != "Y" ]] && exit 1 fi fi [[ -t 0 ]] && read -r -p $'\n โ†ต Paramรจtres confirmรฉs โ€” Entrรฉe pour dรฉmarrer l\'installation... ' _ #### GIT CLONE ############################################################### echo "#############################################" echo "=== CODE CLONING TO '~/.zen/Astroport.ONE' ===" echo "#############################################" echo "UPDATING SYSTEM REPOSITORY" sudo apt-get update sudo apt install -y git mkdir -p ~/.zen/workspace cd ~/.zen/workspace if [ -d UPlanet ]; then cd UPlanet && git pull && cd ..; else git clone --depth 1 https://github.com/papiche/UPlanet; fi cd ~/.zen if [ -d Astroport.ONE ]; then cd Astroport.ONE && git pull && cd ..; else git clone --depth 1 https://github.com/papiche/Astroport.ONE.git; fi # TODO INSTALL FROM IPFS / IPNS ## S'assurer que tous les scripts principaux sont exรฉcutables aprรจs le clone chmod +x ~/.zen/Astroport.ONE/*.sh \ ~/.zen/Astroport.ONE/tools/*.sh \ ~/.zen/Astroport.ONE/RUNTIME/*.sh 2>/dev/null || true echo "โœ… Scripts rendus exรฉcutables" ## Crรฉer .env depuis template si absent (รฉvite "Aucun fichier" au dรฉmarrage des services) [[ ! -f ~/.zen/Astroport.ONE/.env ]] \ && cp ~/.zen/Astroport.ONE/.env.template ~/.zen/Astroport.ONE/.env \ && echo "โœ… ~/.zen/Astroport.ONE/.env crรฉรฉ depuis .env.template" \ || echo "โ„น๏ธ ~/.zen/Astroport.ONE/.env dรฉjร  prรฉsent" ################################################################### IPFS ## installation de ipfs ######################################################################## [[ ! $(which ipfs) ]] \ && ~/.zen/Astroport.ONE/install/install.kubo_v0.40.0_linux.sh \ || echo "=== IPFS FOUND === OK" [[ ! $(which ipfs) ]] && echo "INSTALL IPFS PLEASE" && exit 1 #################################################################### # MISES ร€ JOUR GLOBALES (APT & PIP) # -> S'exรฉcute TOUJOURS, mรชme si une installation est dรฉjร  prรฉsente #################################################################### echo "#############################################" echo "###### MISE A JOUR DU SYSTEME (APT/PIP) #####" echo "#############################################" # Mise ร  jour gรฉnรฉrale des paquets existants sudo apt-get update -y # sudo apt-get upgrade -y ## run at the beginning could need reboot !! echo "#############################################" echo "######### INSTALL PRECIOUS FREE SOFTWARE ####" echo "#############################################" for i in zip ssss dos2unix make cmake hdparm iptables ufw fail2ban wireguard openssh-server sshfs \ parallel npm shellcheck multitail netcat-traditional socat ncdu chromium miller inotify-tools \ curl net-tools libsodium* miniupnpc libcurl4-openssl-dev libgpgme-dev libffi-dev htop cron psmisc iputils-ping; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done echo "#############################################" echo "####### INSTALL PYTHON BUILD DEPENDENCIES ###" echo "#############################################" for i in python3-venv python3-dev libssl-dev build-essential python3-magic; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done echo "#############################################" echo "####### INSTALL PYTHON3 SYSTEM LIBRARIES ####" echo "#############################################" for i in pipx python3-pip python3-setuptools python3-base58 python3-wheel python3-dotenv python3-gpg \ python3-jwcrypto python3-brotli python3-aiohttp python3-prometheus-client python3-tk; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done echo "#############################################" echo "##### INSTALL MULTIMEDIA & DATA TOOLS ######" echo "#############################################" for i in qrencode pv gnupg pandoc cargo btop sox ocrmypdf ca-certificates basez markdown jq bc file gawk ffmpeg \ geoip-bin bind9-dnsutils ntpsec-ntpdate v4l-utils espeak vlc mp3info musl-dev openssl detox nmap httrack \ html2text imagemagick libmagic1t64 libimage-exiftool-perl poppler-utils; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done echo "#############################################" echo "######### INSTALL ASCII ART TOOLS ###########" echo "#############################################" for i in figlet cmatrix cowsay fonts-hack-ttf; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done if [[ $(which X 2>/dev/null) || -n "$DISPLAY" || -n "$WAYLAND_DISPLAY" ]]; then echo "#############################################" echo "######### INSTALL DESKTOP TOOLS ######" echo "#############################################" # 1. Outils systรจmes de base pour l'environnement graphique for i in x11-utils xclip zenity; do if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $i; [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "INSTALL $i FAILED." >> ~/.zen/install.errors.log && continue fi done # 2. Menu interactif : Logiciels de Crรฉation Libres vs Propriรฉtaires echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐ŸŽจ LOGICIELS DESKTOP โ€” L'ร‰MANCIPATION NUMร‰RIQUE โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ Score machine : ${_SCORE} | VRAM : ${_VRAM} Go" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ [1] Graphisme 2D (ร‰conomie estimรฉe : ~1150โ‚ฌ) โ•‘" echo "โ•‘ โ€ข GIMP (alt. Photoshop ~240โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข Inkscape (alt. Illustrator ~240โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข Krita (alt. Corel Painter ~430โ‚ฌ) โ•‘" echo "โ•‘ โ€ข Scribus (alt. InDesign ~240โ‚ฌ/an) โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ [2] Bureautique & Multimรฉdia (ร‰conomie estimรฉe : ~250โ‚ฌ) โ•‘" echo "โ•‘ โ€ข LibreOffice (alt. MS Office ~150โ‚ฌ) โ•‘" echo "โ•‘ โ€ข Thunderbird (alt. Outlook ~50โ‚ฌ) โ•‘" echo "โ•‘ โ€ข VLC (alt. PowerDVD/Lecteurs payants ~50โ‚ฌ) โ•‘" echo "โ•‘ โ•‘" if [[ $_SCORE -gt 10 ]]; then echo "โ•‘ [3] Audiovisuel (ร‰conomie estimรฉe : ~630โ‚ฌ) โ•‘" echo "โ•‘ โ€ข Kdenlive (alt. Premiere Pro ~240โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข Mixxx (alt. Traktor Pro ~100โ‚ฌ) โ•‘" echo "โ•‘ โ€ข OBS Studio(alt. XSplit ~50โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข Audacity (alt. Adobe Audition ~240โ‚ฌ/an) โ•‘" else echo "โ•‘ [3] Audiovisuel โš ๏ธ (Score > 10 recommandรฉ) โ•‘" fi echo "โ•‘ โ•‘" if [[ $_SCORE -gt 40 || $_VRAM -ge 4 ]]; then echo "โ•‘ [4] 3D, CAO & MAO Pro (ร‰conomie estimรฉe : ~4200โ‚ฌ) โ•‘" echo "โ•‘ โ€ข Blender (alt. Maya/3ds Max ~1700โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข FreeCAD (alt. AutoCAD ~2000โ‚ฌ/an) โ•‘" echo "โ•‘ โ€ข LMMS (alt. FL Studio ~200โ‚ฌ) โ•‘" echo "โ•‘ โ€ข Ardour (alt. Pro Tools ~300โ‚ฌ/an) โ•‘" else echo "โ•‘ [4] 3D, CAO & MAO โš ๏ธ (Brain-Node ou GPU 4Go+ recommandรฉ) โ•‘" fi echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ [5] TOUT INSTALLER (Sรฉlectionne les packs compatibles) โ•‘" echo "โ•‘ [0] Passer (Ne rien installer de plus) โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" read -r -p "Choix des packs (ex: 1 2 3) [0] : " _desktop_choices _PKGS="" _TOTAL_SAVINGS=0 if [[ "$_desktop_choices" == *"1"* || "$_desktop_choices" == *"5"* ]]; then _PKGS+=" gimp inkscape krita scribus" _TOTAL_SAVINGS=$((_TOTAL_SAVINGS + 1150)) fi if [[ "$_desktop_choices" == *"2"* || "$_desktop_choices" == *"5"* ]]; then _PKGS+=" libreoffice libreoffice-l10n-fr thunderbird vlc" _TOTAL_SAVINGS=$((_TOTAL_SAVINGS + 250)) fi if [[ "$_desktop_choices" == *"3"* || "$_desktop_choices" == *"5"* ]]; then # En mode 'Tout installer', on vรฉrifie que le PC tient la route if [[ $_SCORE -gt 10 || "$_desktop_choices" != *"5"* ]]; then _PKGS+=" kdenlive mixxx obs-studio audacity" _TOTAL_SAVINGS=$((_TOTAL_SAVINGS + 630)) fi fi if [[ "$_desktop_choices" == *"4"* || "$_desktop_choices" == *"5"* ]]; then # En mode 'Tout installer', on vรฉrifie que le PC tient la route if [[ $_SCORE -gt 40 || $_VRAM -ge 4 || "$_desktop_choices" != *"5"* ]]; then _PKGS+=" blender freecad lmms ardour" _TOTAL_SAVINGS=$((_TOTAL_SAVINGS + 4200)) fi fi if [[ -n "$_PKGS" ]]; then echo ">>> Prรฉparation de l'installation des logiciels :$_PKGS" for p in $_PKGS; do if [ $(dpkg-query -W -f='${Status}' $p 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo ">>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Installation $p <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" sudo apt install -y $p [[ $? != 0 ]] && echo "INSTALL $p FAILED." && echo "INSTALL $p FAILED." >> ~/.zen/install.errors.log fi done echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐ŸŽ‰ INSTALLATION GRAPHIQUE TERMINร‰E ! โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ ๐Ÿ’ฐ Valeur estimรฉe des licences รฉvitรฉes : %-19s โ•‘\n" "${_TOTAL_SAVINGS} โ‚ฌ" echo "โ•‘ โ•‘" echo "โ•‘ Le Logiciel Libre vous fait รฉconomiser cet argent chaque โ•‘" echo "โ•‘ annรฉe tout en respectant votre vie privรฉe. โ•‘" echo "โ•‘ -> Pensez ร  faire un don aux dรฉveloppeurs ! โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour continuer] " _ else echo ">>> Aucun pack crรฉatif supplรฉmentaire sรฉlectionnรฉ." fi fi echo "################################## ~/.astro/bin PYTHON ENV" cd $HOME ## Ubuntu 22.04 : 'python' n'existe pas โ†’ utiliser python3 if [[ ! -s ~/.astro/bin/activate ]]; then python3 -m venv .astro \ && echo "โœ… Python venv crรฉรฉ : ~/.astro" \ || echo "โš ๏ธ Crรฉation venv รฉchouรฉe (python3 absent ?)" fi [[ -s ~/.astro/bin/activate ]] && . ~/.astro/bin/activate || echo "โš ๏ธ ~/.astro/bin/activate absent โ€” pip install sans venv" cd - echo "#####################################" echo "## PYTHON TOOLS & CRYPTO LIB ##" echo "#####################################" export PATH=$HOME/.local/bin:$PATH pipx install duniterpy --include-deps ## keeps old v1 dep (soon deprecated) ## add monero & bitcoin compatible keys for i in pip python-dotenv scrypt setuptools wheel termcolor amzqr ollama \ requests geohash beautifulsoup4 browser-cookie3 cryptography jwcrypto secp256k1 \ gql base58 pybase64 google pynacl python-gnupg pynentry paho-mqtt \ aiohttp ipfshttpclient bitcoin monero ecdsa pynostr bech32 \ matplotlib readability-lxml duniterpy cachetools pydantic-settings \ robohash substrate-interface websocket-client websockets imap_tools \ fastapi aiofiles jinja2 python-multipart python-magic uvicorn python-telegram-bot; do echo ">>> Installation/Mise ร  jour $i <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" ~/.astro/bin/pip install -U $i 2>> ~/.zen/install.errors.log [[ $? != 0 ]] && echo "INSTALL $i FAILED." && echo "python -m pip install -U $i FAILED." >> ~/.zen/install.errors.log && continue done ## playwright remplace pyppeteer (abandonnรฉ 2022) pour tools/page_screenshot.py echo ">>> playwright (remplaรงant pyppeteer โ€” tools/page_screenshot.py) <<<" ~/.astro/bin/pip install -U playwright 2>> ~/.zen/install.errors.log \ && echo "โœ… playwright installรฉ" \ || echo "โš ๏ธ playwright install FAILED โ€” voir ~/.zen/install.errors.log" ## Installe le binaire Chromium de playwright (utilise le Chromium systรจme si prรฉsent) ~/.astro/bin/python -m playwright install chromium 2>> ~/.zen/install.errors.log \ && echo "โœ… playwright chromium prรชt" \ || echo "โš ๏ธ playwright chromium install FAILED (page_screenshot.py utilisera /usr/bin/chromium)" #################################################################### # MAIN # Vร‰RIFICATION CLร‰ PLAYER POUR SUITE INSTALLATION COMPLETE if [[ ! -d ~/.zen/game/players/ ]]; then echo "#############################################" echo "###### ASTROPORT.ONE ZEN STATION ############" echo "#############################################" echo "######### INSTALL DOCKER ........ ###########" echo "#############################################" ~/.zen/Astroport.ONE/install/install.docker.sh echo "#############################################" echo "######### INSTALL TIDDLYWIKI ############" echo "#############################################" ########################################################## sudo npm install -g tiddlywiki@5.2.3 [[ $? != 0 ]] \ && echo "INSTALL tiddlywiki FAILED." \ && echo "INSTALL tiddlywiki FAILED." >> ~/.zen/install.errors.log ## โ”€โ”€ Vรฉrification Docker, Node.js, NPM, TiddlyWiki โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ echo "#############################################" echo "######### VERIFICATION DOCKER & NODE ######" echo "#############################################" DOCKER_OK=false; NPM_OK=false; TW_OK=false; DOCKER_COMPOSE_OK=false; DENO_OK=false ## Utiliser sg docker pour รฉviter de nรฉcessiter newgrp (groupe activรฉ sans nouveau shell interactif) sg docker -c "docker --version" 2>/dev/null && DOCKER_OK=true || echo "โš ๏ธ Docker non disponible" sg docker -c "docker compose version" 2>/dev/null && DOCKER_COMPOSE_OK=true || echo "โš ๏ธ Docker Compose non disponible" node --version 2>/dev/null && NPM_OK=true || echo "โš ๏ธ Node.js non disponible" npm --version 2>/dev/null || echo "โš ๏ธ NPM non disponible" tiddlywiki --version 2>/dev/null && TW_OK=true || echo "โš ๏ธ TiddlyWiki non accessible (PATH?)" ## Deno : moteur JS alternatif pour yt-dlp EJS quand Node < v20 ## Permet aussi d'exรฉcuter des scripts navigateur dans un conteneur Docker (youtube-dl via EJS) deno --version 2>/dev/null | head -1 && DENO_OK=true || echo "โš ๏ธ Deno non disponible (yt-dlp EJS peut รชtre affectรฉ)" echo "" echo " Docker : $($DOCKER_OK && echo 'โœ…' || echo 'โŒ') | Compose : $($DOCKER_COMPOSE_OK && echo 'โœ…' || echo 'โŒ')" echo " Node.js : $($NPM_OK && echo 'โœ…' || echo 'โŒ') | TW : $($TW_OK && echo 'โœ…' || echo 'โŒ') | Deno : $($DENO_OK && echo 'โœ…' || echo 'โŒ')" echo "" echo " DOCKER STATUS:" sg docker -c "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" 2>/dev/null | head -10 || echo " (aucun conteneur)" echo "#############################################" ## Correct PDF restrictions for imagemagick echo "######### IMAGEMAGICK PDF ############" if [[ $(cat /etc/ImageMagick-6/policy.xml | grep PDF) ]]; then ## Backup AVANT modification (pour restauration par uninstall.sh) [[ ! -f /etc/ImageMagick-6/policy.xml.backup ]] \ && sudo cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.backup \ && echo "Backup ImageMagick policy.xml โ†’ policy.xml.backup" cat /etc/ImageMagick-6/policy.xml | grep -Ev PDF > /tmp/policy.xml sudo cp /tmp/policy.xml /etc/ImageMagick-6/policy.xml fi echo "#############################################" echo "#############################################" LP=$(ls /dev/usb/lp* 2>/dev/null) if [[ ! -z $LP ]]; then echo "######### $LP PRINTER ##############" ########### QRCODE : ZENCARD / G1BILLET : PRINTER ############## ## PRINT & FONTS sudo apt install ttf-mscorefonts-installer printer-driver-all cups -y ~/.astro/bin/pip install brother_ql # pipx install brother_ql sudo cupsctl --remote-admin sudo usermod -aG lpadmin $USER sudo usermod -a -G tty $USER sudo usermod -a -G lp $USER ## brother_ql_print echo "$USER ALL=(ALL) NOPASSWD:/usr/local/bin/brother_ql_print" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/brother_ql_print') fi ## UPASSPORT API echo "######### UPASSPORT ##############" echo "INSTALL UPASSPORT : http://localhost:54321" ~/.zen/Astroport.ONE/install/install_upassport.sh ## NIP-101 strfry NOSTR relay echo "######### NIP-101 strfry NOSTR relay ##############" echo "INSTALL NOSTR RELAY : wss://localhost:7777" bash <(wget -qO- https://github.com/papiche/NIP-101/raw/refs/heads/main/install_strfry.sh) ## g1cli (gcli) โ€” Duniter v2s CLI client (compiled from source, branche nostr) echo "######### g1cli Duniter v2 Client ##############" ~/.zen/Astroport.ONE/install/install_gcli.sh ## G1BILLET -- needs reviewing --- code used for .print.sh scipt echo "######### G1BILLET ##############" echo "INSTALL G1BILLET : http://g1billet.localhost:33101" cd ~/.zen git clone https://github.com/papiche/G1BILLET.git # cd G1BILLET && ./setup_systemd.sh ## NETWORK SERVICE NOT USED cd - echo ############################################################### echo "## ADDING lazydocker ================" ~/.zen/Astroport.ONE/install/install.lazydocker.sh ############################################################### echo "## INSTALL yt-dlp (youtube copier, sans anti-bot) ##############" # Anti-bot optionnel : astrosystemctl local install youtube-antibot ~/.zen/Astroport.ONE/install/youtube-dl.sh ############################################################### echo "## INSTALL Matterbridge & BRO Omni-Channel ##############" ~/.zen/Astroport.ONE/install/install_matterbridge.sh ############################################################### echo "## INSTALL PowerJoular (Power consumption monitoring) ##########" ~/.zen/Astroport.ONE/install/install_powerjoular.sh ############################################################### ## prometheus-node-exporter seul : lรฉger, expose /metrics sur :9100 ## Prometheus serveur complet : installรฉ uniquement avec le profil ai-company echo "## INSTALL prometheus-node-exporter (heartbox metrics export) ##########" sudo apt-get install -y prometheus-node-exporter 2>/dev/null \ && echo "โœ… prometheus-node-exporter actif sur :9100" \ || echo "โš ๏ธ prometheus-node-exporter non disponible" ############################################################### echo "## INSTALL RTK (Rust Token Killer โ€” optimiseur tokens Claude Code) ##" ############################################################### ## Standard : one-liner curl (rapide) ## Dev : clone + build cargo (modifiable, rebuildable) if [[ "${INSTALL_PROFILE}" == "dev" ]]; then mkdir -p ~/.zen/workspace if [[ ! -d ~/.zen/workspace/rtk ]]; then git clone --depth 1 https://github.com/rtk-ai/rtk.git ~/.zen/workspace/rtk \ && echo "โœ… RTK clonรฉ dans ~/.zen/workspace/rtk" \ || echo "โš ๏ธ RTK clone รฉchouรฉ" else (cd ~/.zen/workspace/rtk && git pull --ff-only 2>/dev/null) && echo "โœ… RTK ร  jour" || true fi if [[ -f ~/.zen/workspace/rtk/Cargo.toml ]]; then echo "โณ Compilation RTK (cargo build --release)..." (cd ~/.zen/workspace/rtk && cargo build --release 2>/dev/null) \ && cp ~/.zen/workspace/rtk/target/release/rtk ~/.local/bin/rtk \ && echo "โœ… RTK compilรฉ : ~/.local/bin/rtk" \ || echo "โš ๏ธ RTK build รฉchouรฉ (cargo requis)" fi ## Sรฉlection de l'รฉditeur ร  relier ร  RTK if command -v rtk >/dev/null 2>&1; then echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿ”Œ RTK โ€” Relier ร  votre รฉditeur de code โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ [1] Claude Code (VS Code extension) rtk init โ•‘" echo "โ•‘ [2] Cursor rtk init โ•‘" echo "โ•‘ [3] Neovim / Vim rtk init --global โ•‘" echo "โ•‘ [4] Tous les projets (global) rtk init --global โ•‘" echo "โ•‘ [0] Passer (configurer plus tard) โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" read -r -p "Choix [1-4, dรฉfaut: 4] : " _rtk_editor case "${_rtk_editor:-4}" in 1|2) rtk init 2>/dev/null && echo "โœ… RTK hook activรฉ (projet courant)" || true ;; 3|4) rtk init --global 2>/dev/null && echo "โœ… RTK hook global activรฉ" || true ;; 0) echo "โ†’ RTK installรฉ, configurez avec : rtk init --global" ;; esac fi else ## Mode standard โ€” one-liner officiel if ! command -v rtk >/dev/null 2>&1; then echo "โณ Installation RTK via curl..." curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh \ && echo "โœ… RTK installรฉ" \ || echo "โš ๏ธ RTK install รฉchouรฉ (curl requis)" ## Hook global silencieux (pas d'รฉditeur ร  choisir en mode standard) command -v rtk >/dev/null 2>&1 && rtk init --global 2>/dev/null || true else echo "โ„น๏ธ RTK dรฉjร  prรฉsent : $(rtk --version 2>/dev/null || echo 'version inconnue')" fi fi if [[ $INSTALL_PROFILE == "dev" ]]; then ############################################################### echo "## INSTALL Flutter SDK (web builds for Ginkgo app) ##########" ~/.zen/Astroport.ONE/install/install_flutter.sh ## Add Flutter to PATH for the rest of install export PATH="$HOME/.flutter/bin:$PATH" fi echo "=== INSTALL SYSTEM (sudoers, systemd, SSH, symlinks)" ~/.zen/Astroport.ONE/install/install_system.sh echo "=== SETUP ASTROPORT (runtime config)" ~/.zen/Astroport.ONE/install/setup/setup.sh ############################################################### echo "## ACTIVER LE PARE-FEU UFW ################################" ~/.zen/Astroport.ONE/admin/system/firewall.sh ON ## _CPU/_RAM/_VRAM/_SCORE/_TIER/_MVAL/_PAF_DEFAULT dรฉjร  calculรฉs en tรชte d'install ############################################################### echo "## INSTALLATIONS CONDITIONNELLES SELON PROFIL ###########" ############################################################### NEXTCLOUD_ACTIVE=false AISTACK_ACTIVE=false RNOSTR_ACTIVE=false case "${INSTALL_PROFILE}" in nextcloud) bash "$HOME/.zen/Astroport.ONE/install/install_nextcloud.sh" \ && NEXTCLOUD_ACTIVE=true \ || echo "โš ๏ธ NextCloud โ€” erreur d'installation (voir ~/.zen/install.errors.log)" ;; ai-company) echo "๐Ÿง  PROFIL ai-company โ€” dรฉmarrage installation Stack IA..." ## Prometheus serveur complet : collecte les mรฉtriques heartbox + node_exporter ## Utile pour les Brain-Nodes (GPU) qui veulent monitorer leur charge IA echo "โณ Installation Prometheus + exporters heartbox..." ~/.zen/Astroport.ONE/install/install_prometheus.sh \ && echo "โœ… Prometheus heartbox monitoring actif (:9090)" \ || echo "โš ๏ธ Prometheus โ€” erreur (non bloquant)" AI_SVC_ARGS="" if [[ -n "${INSTALL_AI_SERVICES:-}" ]]; then AI_SVC_ARGS="${INSTALL_AI_SERVICES}" fi ~/.zen/Astroport.ONE/install/install-ai-company.docker.sh $AI_SVC_ARGS \ && AISTACK_ACTIVE=true \ && echo "โœ… AI Company Stack dรฉmarrรฉe" \ || echo "โš ๏ธ AI Stack โ€” erreur (voir ~/.zen/ai-company/)" echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ โš ๏ธ AVERTISSEMENT โ€” Stack en cours d'intรฉgration โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ โ•‘" echo "โ•‘ Les services IA dรฉmarrรฉs (Dify.ai, Open WebUI, LiteLLM) โ•‘" echo "โ•‘ ne sont PAS encore intรฉgrรฉs nativement ร  Astroport.ONE. โ•‘" echo "โ•‘ Ils fonctionnent en parallรจle mais nรฉcessitent : โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ โ€ข Connexion Open WebUI โ†’ crรฉer compte admin ร  1รจre ouvert. โ•‘" echo "โ•‘ โ€ข Connexion Ollama โ†” LiteLLM ร  valider โ•‘" echo "โ•‘ โ€ข Intรฉgration #BRO (NOSTR โ†’ Open WebUI OpenAI API) โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ‰ APPEL AUX DRAGONS U.SOCIETY : โ•‘" echo "โ•‘ Cette stack est votre terrain d'expรฉrimentation. โ•‘" echo "โ•‘ Participez ร  son intรฉgration dans la constellation : โ•‘" echo "โ•‘ โ†’ support@qo-op.com โ€” Objet : 'DRAGON ai-company' โ•‘" echo "โ•‘ โ†’ Salon Nostr U.SOCIETY : #BRO develop โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ Services (si dรฉmarrรฉs) : โ•‘" echo "โ•‘ Open WebUI : http://localhost:8000 โ† interface IA โ•‘" echo "โ•‘ Dify.ai : http://localhost:8010 (agents) โ•‘" echo "โ•‘ Qdrant : http://localhost:6333/dashboard โ•‘" echo "โ•‘ Ollama : http://localhost:11434 โ•‘" echo "โ•‘ code_assistant : ~/.zen/Astroport.ONE/code_assistant โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ DOC : ~/.zen/ai-company/install-ai-company.md โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour continuer] " _ ;; dev) echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ โš™๏ธ PROFIL dev โ€” Migration strfry โ†’ rnostr (Rust) โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" ## strfry doit รชtre arrรชtรฉ avant rnostr (port 7777 partagรฉ via NPM) echo "โน๏ธ Arrรชt et dรฉsactivation de strfry..." sudo systemctl stop strfry 2>/dev/null || true sudo systemctl disable strfry 2>/dev/null || true ## rnostr = relai Nostr en Rust, plus performant, support Qdrant sรฉmantique if [[ -f ~/.zen/Astroport.ONE/install/install_rnostr_semantic.sh ]]; then ~/.zen/Astroport.ONE/install/install_rnostr_semantic.sh \ && RNOSTR_ACTIVE=true \ && echo "โœ… rnostr installรฉ (remplace strfry)" \ || echo "โš ๏ธ rnostr โ€” erreur d'installation" else echo "โš ๏ธ install_rnostr_semantic.sh introuvable โ€” rnostr non installรฉ" echo " โ†’ compilez depuis : https://github.com/rnostr/rnostr" fi echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿ“‹ CHANTIER DEV โ€” Migration des plugins writePolicy โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ โ•‘" echo "โ•‘ SITUATION ACTUELLE (strfry bash) : โ•‘" echo "โ•‘ Les plugins de filtrage Nostr sont des scripts bash : โ•‘" echo "โ•‘ โ€ข all_but_blacklist.sh (filtre principal) โ•‘" echo "โ•‘ โ€ข filter/1.sh 7.sh 9735.sh 30023.sh ... โ•‘" echo "โ•‘ Ils reรงoivent les รฉvรฉnements Nostr via stdin/stdout JSON, โ•‘" echo "โ•‘ filtrent par kind, classifient (nobody/player/uplanet), โ•‘" echo "โ•‘ gรจrent la blacklist et la liste amisOfAmis.txt. โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ OBJECTIF (rnostr Rust) : โ•‘" echo "โ•‘ Rรฉรฉcrire ces filtres comme des rรจgles rnostr en Rust ou โ•‘" echo "โ•‘ comme plugins WASM compatibles rnostr. Avantages : โ•‘" echo "โ•‘ โ€ข Performance ร— 10-100 vs bash โ•‘" echo "โ•‘ โ€ข Intรฉgration Qdrant sรฉmantique native โ•‘" echo "โ•‘ โ€ข Classification IA des messages (LLM local Ollama) โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ FICHIERS ร€ MIGRER : โ•‘" echo "โ•‘ NIP-101/relay.writePolicy.plugin/all_but_blacklist.sh โ•‘" echo "โ•‘ NIP-101/relay.writePolicy.plugin/filter/*.sh โ•‘" echo "โ•‘ โ†’ Logique cible : rnostr/config.toml rules + Rust plugin โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ‰ APPEL AUX DRAGONS dev/Rust : โ•‘" echo "โ•‘ โ†’ support@qo-op.com โ€” Objet : 'DRAGON rnostr migration' โ•‘" echo "โ•‘ โ†’ Repo rnostr : https://github.com/rnostr/rnostr โ•‘" echo "โ•‘ โ†’ Repo NIP-101 : https://github.com/papiche/NIP-101 โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour continuer] " _ ;; ""|standard) echo " Profil standard โ€” pas d'installation supplรฉmentaire." ;; *) echo "โš ๏ธ Profil inconnu '${INSTALL_PROFILE}' โ€” installation standard uniquement." ;; esac ############################################################### echo "## Dร‰TECTION GPU โ€” Installation IA optionnelle ###########" ############################################################### ## Variables optionnelles pour mode silencieux : ## INSTALL_OLLAMA=yes โ†’ Ollama installรฉ sans confirmation ## INSTALL_COMFYUI=yes โ†’ ComfyUI installรฉ sans confirmation ## INSTALL_OLLAMA=no โ†’ Ignorรฉ mรชme si GPU prรฉsent ~/.zen/Astroport.ONE/install/install_gpu_ai.sh ############################################################### echo "## DUNITER v2s โ€” MIRROIR G1 (optionnel) #################" ############################################################### ## Un nล“ud mirroir Duniter v2s synchronise la blockchain G1 localement. ## Avantages : RPC local :9944 (gcli/wallet sans dรฉpendance externe), ## participation rรฉseau P2P G1. Prรฉrequis : > 10 Go disque, lien stable. ## ## Recommandation selon Power-Score : ## Score > 40 ๐Ÿ”ฅ Brain โ†’ optimal (SSD, sync rapide) ## Score > 10 โšก Standard โ†’ recommandรฉ ## Score โ‰ค 10 ๐ŸŒฟ Light โ†’ dรฉconseillรฉ (sync lente, disque limitรฉ) _DUNITER_DC="$HOME/.zen/Astroport.ONE/_DOCKER/duniter_v2/docker-compose.yml" _DUNITER_ACTIVE=false if docker ps --format '{{.Names}}' 2>/dev/null | grep -q 'duniter'; then echo "โœ… Duniter v2s dรฉjร  actif" _DUNITER_ACTIVE=true elif [[ -f "$_DUNITER_DC" ]] && command -v docker >/dev/null 2>&1; then if [[ $_SCORE -gt 40 ]]; then _DUNITER_REC="๐Ÿ”ฅ Optimal โ€” Brain-Node (SSD, sync rapide)" elif [[ $_SCORE -gt 10 ]]; then _DUNITER_REC="โšก Recommandรฉ โ€” Standard" else _DUNITER_REC="โš ๏ธ Dรฉconseillรฉ โ€” Light (sync lente, disque limitรฉ)" fi _DISK_AVAIL_GB=$(df "$HOME" --output=avail -BG 2>/dev/null | tail -1 | tr -d 'G ' || echo 0) echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ โ›“๏ธ DUNITER v2s โ€” MIRROIR G1 (blockchain ฤž1 libre currency) โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ Matรฉriel : %-47s โ•‘\n" "${_DUNITER_REC}" printf "โ•‘ Disque disponible : %-38s โ•‘\n" "${_DISK_AVAIL_GB} Go (โ‰ฅ 10 Go requis)" echo "โ•‘ โ•‘" echo "โ•‘ โ€ข RPC local :9944 โ†’ gcli/wallet sans dรฉpendance โ•‘" echo "โ•‘ โ€ข P2P public :30333 โ†’ contribution au rรฉseau G1 โ•‘" echo "โ•‘ โ€ข Prometheus :9615 โ†’ mรฉtriques mirroir โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" if [[ $_SCORE -le 10 ]]; then read -r -p "โš ๏ธ Non recommandรฉ sur cette machine. Installer quand mรชme ? [y/N] " _dun_cont [[ "${_dun_cont}" == "y" || "${_dun_cont}" == "Y" ]] && _dun_choice="y" || _dun_choice="n" else read -r -p "Installer le mirroir Duniter v2s G1 ? [y/N] " _dun_choice fi if [[ "${_dun_choice}" == "y" || "${_dun_choice}" == "Y" ]]; then echo "โณ Dรฉmarrage mirroir Duniter v2s..." sg docker -c "docker compose -f '$_DUNITER_DC' up -d" 2>/dev/null \ && _DUNITER_ACTIVE=true \ && echo "โœ… Duniter v2s mirroir G1 dรฉmarrรฉ (RPC: 127.0.0.1:9944, P2P: :30333)" \ || echo "โš ๏ธ Duniter v2s โ€” erreur de dรฉmarrage (voir: docker compose -f $_DUNITER_DC logs)" if [[ "$_DUNITER_ACTIVE" == "true" ]] && command -v ufw >/dev/null 2>&1 \ && sudo ufw status 2>/dev/null | grep -q "Status: active"; then sudo ufw allow 30333/tcp comment 'Duniter v2s P2P TCP' >/dev/null 2>&1 sudo ufw allow 30333/udp comment 'Duniter v2s P2P UDP' >/dev/null 2>&1 echo "๐Ÿ”ฅ UFW : port 30333 ouvert (Duniter P2P)" fi else echo "โ†’ Mirroir Duniter ignorรฉ." fi else echo "โ„น๏ธ Duniter v2s : docker-compose introuvable โ€” ignorรฉ" fi # --- INJECTION : CALCUL VALEUR COMPARATIVE CLOUD --- _CLOUD_SAVINGS=0 # Valeur de base (Infrastructure de base, Orchestration, P2P vs Centralisรฉ) _CLOUD_SAVINGS=$((_CLOUD_SAVINGS + 1200)) # ร‰quivalent VPS + Orchestrateur managรฉ / an if [[ "${INSTALL_PROFILE}" == "nextcloud" ]]; then _CLOUD_SAVINGS=$((_CLOUD_SAVINGS + 450)) # ร‰quivalent SaaS Cloud 128Go + Maintenance / an fi if [[ "${INSTALL_PROFILE}" == "ai-company" ]]; then # Comparaison avec une instance GPU managรฉe (ex: Lambda Labs ou AWS p3.2xlarge) # Une instance GPU coรปte environ 1$ ร  3$ / heure. # En auto-hรฉbergรฉ, on รฉconomise le coรปt d'une instance "On-Demand". _CLOUD_SAVINGS=$((_CLOUD_SAVINGS + 5200)) # ร‰quivalent Instance GPU 24/7 / an fi # Sauvegarde dans le .env pour persistance _env_upsert "CLOUD_EMANCIPATION_VALUE" "${_CLOUD_SAVINGS}" "${HOME}/.zen/Astroport.ONE/.env" # --------------------------------------------------- ############################################################### echo "## SCORE CARD DU Nล’UD ################################" ############################################################### ## Calcul inline โ€” pas de dรฉpendance ร  IPFS au moment de l'install _CPU=$(grep -c "processor" /proc/cpuinfo 2>/dev/null || echo 1) _RAM=$(awk '/MemTotal/ {printf "%.0f", $2/1048576}' /proc/meminfo 2>/dev/null || echo 0) ## _VRAM/_GPU_VENDOR dรฉjร  calculรฉs en tรชte de section โ€” on ne re-dรฉtecte pas _SCORE=$(( _VRAM * 4 + _CPU * 2 + _RAM / 2 )) if [[ $_SCORE -gt 40 ]]; then _TIER="๐Ÿ”ฅ Brain-Node (GPU)"; _RANK="DRAGON COMPUTE"; _MVAL=$(( _SCORE * 12 )); _PAF_DEFAULT=28 elif [[ $_SCORE -gt 10 ]]; then _TIER="โšก Standard"; _RANK="DRAGON ORIGIN"; _MVAL=$(( _SCORE * 6 )); _PAF_DEFAULT=14 else _TIER="๐ŸŒฟ Lรฉger"; _RANK="Nล“ud Lรฉger"; _MVAL=100; _PAF_DEFAULT=7 fi ## โ”€โ”€ Benchmark disque โ€” dd (รฉcriture) + hdparm (lecture rรฉelle) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ## ร‰criture : dd + fdatasync โ€” force le flush sur disque, fiable sur tous supports ## Lecture : hdparm -t --direct โ€” bypasse le page cache, donne le vrai dรฉbit I/O ## Fallback : dd lecture si hdparm impossible (LVM, container, pas de sudo) ## Convertit sortie dd en Mo/s (GB/s, MB/s, kB/s) _dd_to_mbps() { local _raw _raw=$(echo "$1" | grep -oE '[0-9.]+ [GkM]B/s' | tail -1) case "$_raw" in *" GB/s") printf "%.0f" "$(echo "${_raw% GB/s} * 1000" | bc 2>/dev/null || echo 0)" ;; *" MB/s") printf "%.0f" "${_raw% MB/s}" ;; *" kB/s") printf "%.0f" "$(echo "${_raw% kB/s} / 1000" | bc 2>/dev/null || echo 0)" ;; *) echo 0 ;; esac } ## Convertit sortie hdparm en Mo/s (MB/sec ou GB/sec) _hdparm_to_mbps() { local _raw _raw=$(echo "$1" | grep -oE '[0-9.]+ [GM]B/sec' | tail -1) case "$_raw" in *" GB/sec") printf "%.0f" "$(echo "${_raw% GB/sec} * 1000" | bc 2>/dev/null || echo 0)" ;; *" MB/sec") printf "%.0f" "${_raw% MB/sec}" ;; *) echo 0 ;; esac } ## Dรฉtecte le block device racine (NVMe, SATA/IDE/VirtIO) โ€” vide si LVM/overlay _detect_disk_dev() { local _src _src=$(df "$HOME" --output=source 2>/dev/null | tail -1 | xargs) case "$_src" in /dev/nvme*p*) echo "${_src%p*}" ;; /dev/[shv]d[a-z][0-9]*) echo "${_src%%[0-9]*}" ;; /dev/mapper/*|tmpfs|overlay) echo "" ;; *) echo "$_src" ;; esac } _DISK_CACHE="$HOME/.zen/game/disk_bench.cache" mkdir -p "$HOME/.zen/game" ## Relance si absent, valeurs nulles, ou cache > 24h _disk_cache_age=$(( $(date +%s) - $(stat -c %Y "$_DISK_CACHE" 2>/dev/null || echo 0) )) if [[ ! -s "$_DISK_CACHE" ]] || grep -q "^0 0$" "$_DISK_CACHE" 2>/dev/null || \ [[ $_disk_cache_age -gt 86400 ]]; then echo "โฑ๏ธ Benchmark disque (dd รฉcriture + hdparm lecture)..." _tmp_bench=$(mktemp) _out=$(LANG=C dd if=/dev/zero of="$_tmp_bench" bs=1M count=256 conv=fdatasync 2>&1) _disk_write=$(_dd_to_mbps "$_out") rm -f "$_tmp_bench" _disk_dev=$(_detect_disk_dev) _disk_read=0 if [[ -n "$_disk_dev" ]] && command -v hdparm >/dev/null 2>&1; then _out=$(LANG=C sudo hdparm -t --direct "$_disk_dev" 2>&1) _disk_read=$(_hdparm_to_mbps "$_out") fi ## Fallback dd si hdparm a รฉchouรฉ ou indisponible if [[ "${_disk_read:-0}" -eq 0 ]]; then echo " (hdparm indisponible โ€” lecture via dd, rรฉsultat non comparable)" _tmp_bench=$(mktemp) LANG=C dd if=/dev/zero of="$_tmp_bench" bs=1M count=256 conv=fdatasync >/dev/null 2>&1 _out=$(LANG=C dd if="$_tmp_bench" of=/dev/null bs=1M 2>&1) _disk_read=$(_dd_to_mbps "$_out") rm -f "$_tmp_bench" fi echo "${_disk_write:-0} ${_disk_read:-0}" > "$_DISK_CACHE" fi read _disk_write _disk_read < "$_DISK_CACHE" 2>/dev/null _disk_write="${_disk_write:-0}"; _disk_read="${_disk_read:-0}" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿ† SCORE CARD โ€” Rang dans la constellation โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ %-58s โ•‘\n" "CPU : ${_CPU} cล“urs RAM : ${_RAM} Go VRAM : ${_VRAM} Go" printf "โ•‘ %-58s โ•‘\n" "GPU : ${_GPU_NAME:-aucun} (${_GPU_VENDOR})" printf "โ•‘ %-58s โ•‘\n" "Disque รฉcriture : ${_disk_write} Mo/s lecture : ${_disk_read} Mo/s" printf "โ•‘ %-58s โ•‘\n" "Power-Score : ${_SCORE} โ†’ ${_TIER}" printf "โ•‘ %-58s โ•‘\n" "Rang DRAGON : ${_RANK}" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" _CLOUD_VAL=$(grep "^CLOUD_EMANCIPATION_VALUE=" "${HOME}/.zen/Astroport.ONE/.env" | cut -d'=' -f2 || echo "0") _TOTAL_ECO=$(( _CLOUD_VAL + _TOTAL_SAVINGS )) # _TOTAL_SAVINGS vient de la partie Desktop printf "โ•‘ %-58s โ•‘\n" "Valeur Matรฉriel (CAPITAL) : ${_MVAL} แบEN" printf "โ•‘ %-58s โ•‘\n" "ร‰mancipation Cloud (FLOSS) : ${_CLOUD_VAL} โ‚ฌ / an" if [ "$_TOTAL_SAVINGS" -gt 0 ]; then printf "โ•‘ %-58s โ•‘\n" "ร‰mancipation Crรฉative : ${_TOTAL_SAVINGS} โ‚ฌ / an" fi echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ %-58s โ•‘\n" "VALEUR TOTALE LIBร‰Rร‰E : ${_TOTAL_ECO} โ‚ฌ / an" echo "โ•‘ (vs Solutions Cloud Propriรฉtaires & Kubernetes Managรฉ) โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ Participez au concours DRAGON UPlanet : โ•‘" echo "โ•‘ Publiez votre score โ†’ kind:30850 (ECONOMY.broadcast.sh) โ•‘" echo "โ•‘ Faites รฉvaluer votre nล“ud โ†’ support@qo-op.com โ•‘" echo "โ•‘ โ†’ Devenez DRAGON ORIGIN, DRAGON COMPUTE ou DRAGON แบEN โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour continuer] " _ ## Initialiser MACHINE_VALUE, PAF, CAPITAL_DATE dans game/.env si absents _GAME_ENV="$HOME/.zen/game/.env" if ! grep -q "^MACHINE_VALUE=" "$_GAME_ENV" 2>/dev/null; then echo "MACHINE_VALUE=${_MVAL}" >> "$_GAME_ENV" echo "PAF=${_PAF_DEFAULT}" >> "$_GAME_ENV" echo "CAPITAL_DATE=$(date +%Y%m%d)000000000" >> "$_GAME_ENV" echo "DEPRECIATION_WEEKS=156" >> "$_GAME_ENV" echo " โœ… Valeurs initiales sauvegardรฉes โ†’ ${_GAME_ENV}" echo " MACHINE_VALUE=${_MVAL} แบEN | PAF=${_PAF_DEFAULT} แบEN/sem" fi end=`date +%s` DURATION=$((end - start)) MINUTES=$((DURATION / 60)) SECONDS_REM=$((DURATION % 60)) ## Source my.sh for display variables (domain, hostname, network type) . ~/.zen/Astroport.ONE/tools/my.sh 2>/dev/null HOSTNAME_DISPLAY=$(hostname) DOMAIN_DISPLAY="${myDOMAIN:-copylaradio.com}" IPFS_DISPLAY="${myIPFS:-https://ipfs.${DOMAIN_DISPLAY}}" RELAY_DISPLAY="${myRELAY:-wss://relay.${DOMAIN_DISPLAY}}" USPOT_DISPLAY="${uSPOT:-https://u.${DOMAIN_DISPLAY}}" if [[ "${UPLANETNAME}" == "0000000000000000000000000000000000000000000000000000000000000000" ]]; then NETWORK_DISPLAY="UPlanet ORIGIN (sandbox)" else NETWORK_DISPLAY="UPlanet ZEN (${DOMAIN_DISPLAY})" fi ############################################################### echo "## QDRANT โ€” VectorDB IA apprenante pour MULTIPASS ##########" ############################################################### ## Stratรฉgie selon Power-Score : ## Score > 10 (Standard/Brain) + Docker โ†’ Qdrant local (docker compose --profile ai) ## Score โ‰ค 10 (Light/PiZero/picoport) โ†’ tunnel IPFS P2P vers nล“ud swarm ## ## Dans les deux cas : QDRANT_URL=http://127.0.0.1:6333 dans .env ## Ce QDRANT_URL active BRO/nextcloud_bro_sync.sh, memory_manager, short_memory ## pour les MULTIPASS hรฉbergรฉs sur ce nล“ud โ€” mรชme sur un Pi Zero 2W (picoport). ## ## TODO (davfs) : sur nล“ud Lรฉger avec ZenCard, monter le Nextcloud de la constellation ## via WebDAV pour stocker les snapshots Qdrant de faรงon persistante : ## mount -t davfs https://cloud.domain/remote.php/webdav/ /mnt/nc_qdrant ## โ†’ qdrant_storage volume โ†’ /mnt/nc_qdrant/qdrant/ _QDRANT_URL="http://127.0.0.1:6333" _QDRANT_INSTALLED=false _ENVFILE="$HOME/.zen/Astroport.ONE/.env" ## Helper sed-upsert (indรฉpendant de _env_upsert dรฉfini dans setup.sh) _set_env_qdrant() { if grep -q "^QDRANT_URL=" "$_ENVFILE" 2>/dev/null; then sed -i "s|^QDRANT_URL=.*|QDRANT_URL=\"${_QDRANT_URL}\"|" "$_ENVFILE" else echo "QDRANT_URL=\"${_QDRANT_URL}\"" >> "$_ENVFILE" fi } if [[ $_SCORE -gt 10 ]] && command -v docker >/dev/null 2>&1; then ## ## Standard / Brain โ†’ installer Qdrant localement (standalone, sans Ollama requis) ## echo "โšก Power-Score ${_SCORE} (${_TIER}) + Docker โ†’ installation Qdrant locale" _ASTRO_COMPOSE="$HOME/.zen/Astroport.ONE/docker/docker-compose.yml" if docker ps --format '{{.Names}}' 2>/dev/null | grep -q 'qdrant'; then echo "โœ… Qdrant dรฉjร  actif" _QDRANT_INSTALLED=true elif [[ -f "$_ASTRO_COMPOSE" ]]; then echo "โณ Dรฉmarrage Qdrant (docker compose --profile ai)..." if docker compose -f "$_ASTRO_COMPOSE" --profile ai up -d qdrant 2>/dev/null; then _QDRANT_INSTALLED=true echo "โœ… Qdrant local dรฉmarrรฉ (port 6333)" else echo "โš ๏ธ Qdrant docker รฉchouรฉ โ€” vรฉrifiez : docker compose -f $HOME/.zen/Astroport.ONE/docker/docker-compose.yml --profile ai logs qdrant" fi else echo "โš ๏ธ docker-compose.yml absent โ€” Qdrant non dรฉmarrรฉ" fi ## Partager Qdrant avec la constellation (le retirer de DRAGON_PRIVATE_SERVICES) ## pour que les nล“uds Lรฉgers puissent s'y connecter via IPFS P2P if [[ "$_QDRANT_INSTALLED" == "true" ]] && [[ -f "$_ENVFILE" ]]; then _priv=$(grep -oP 'DRAGON_PRIVATE_SERVICES="\K[^"]*' "$_ENVFILE" 2>/dev/null \ || grep -oP "DRAGON_PRIVATE_SERVICES='\K[^']*" "$_ENVFILE" 2>/dev/null || echo "") if echo " $_priv " | grep -qw "qdrant"; then _new_priv=$(echo "$_priv" | tr ' ' '\n' | grep -vxF "qdrant" | tr '\n' ' ' | xargs) sed -i "s|^DRAGON_PRIVATE_SERVICES=.*|DRAGON_PRIVATE_SERVICES=\"${_new_priv}\"|" "$_ENVFILE" echo "๐ŸŒ Qdrant partagรฉ au swarm (retirรฉ de DRAGON_PRIVATE_SERVICES)" fi fi else ## ## Light (Pi Zero, picoport, sound-spot) โ†’ tenter une connexion swarm via IPFS P2P ## echo "๐ŸŒฟ Power-Score ${_SCORE} (${_TIER}) โ€” Qdrant local non installรฉ" echo " Recherche d'un nล“ud swarm exposant Qdrant via IPFS P2P..." _ASYS="$HOME/.zen/Astroport.ONE/tools/astrosystemctl.sh" [[ ! -x "$_ASYS" ]] && command -v astrosystemctl >/dev/null 2>&1 && _ASYS="astrosystemctl" if [[ -x "$_ASYS" ]] && find "$HOME/.zen/tmp/swarm/" -name "x_qdrant.sh" 2>/dev/null | grep -q .; then echo " Nล“ud Qdrant trouvรฉ dans le swarm โ€” connexion persistante..." bash "$_ASYS" enable qdrant 2>/dev/null \ && _QDRANT_INSTALLED=true \ && echo "โœ… Qdrant swarm connectรฉ (tunnel IPFS P2P persistant sur port 6333)" \ || echo "โš ๏ธ astrosystemctl enable qdrant รฉchouรฉ" else echo "โ„น๏ธ Aucun nล“ud swarm n'expose Qdrant pour l'instant." echo " โ†’ BRO/MULTIPASS fonctionnera en mode dรฉgradรฉ (flashmem local uniquement)" echo " โ†’ Dรจs qu'un nล“ud Standard+ rejoint l'essaim, relancez :" echo " astrosystemctl connect qdrant && astrosystemctl enable qdrant" fi fi ## ร‰crire QDRANT_URL dans .env (http://127.0.0.1:6333 dans tous les cas โ€” local ou tunnel P2P) _set_env_qdrant if [[ "$_QDRANT_INSTALLED" == "true" ]]; then echo "โœ… QDRANT_URL=${_QDRANT_URL} โ†’ IA apprenante MULTIPASS activรฉe" else echo "โ„น๏ธ QDRANT_URL=${_QDRANT_URL} inscrit dans .env (inactif jusqu'ร  connexion swarm)" fi echo "######### Enterprise Swarm AI Stack Manager ############## TRY IT UPGRADE IT : ~/.zen/Astroport.ONE/install/install-ai-company.docker.sh" echo echo "#############################################" echo " INSTALLATION TERMINEE (${MINUTES}min ${SECONDS_REM}s)" echo "#############################################" echo echo " Station: ${HOSTNAME_DISPLAY}" echo " Reseau: ${NETWORK_DISPLAY}" echo " Capitaine: $(cat ~/.zen/game/players/.current/.player 2>/dev/null || echo 'embarquement en cours...')" echo echo " PROFIL INSTALLร‰: ${INSTALL_PROFILE:-standard}" echo echo " INFRASTRUCTURE (Docker) :" sg docker -c "docker ps --format ' {{.Names}}: {{.Status}}'" 2>/dev/null | head -30 || echo " (aucun conteneur actif)" echo echo " NODE.JS / NPM / DENO :" echo " Node.js $(node --version 2>/dev/null || echo 'โš ๏ธ non disponible')" echo " NPM v$(npm --version 2>/dev/null || echo 'โš ๏ธ non disponible')" echo " TiddlyWiki $(tiddlywiki --version 2>/dev/null || echo 'โš ๏ธ โ€” relancez: sudo npm install -g tiddlywiki@5.2.3')" echo " Deno $(deno --version 2>/dev/null | head -1 || echo 'โš ๏ธ non disponible (yt-dlp EJS)')" echo " (Deno sert de runtime JS pour yt-dlp EJS : extraction YouTube via navigateur)" echo echo " SERVICES ASTROPORT :" echo " Astroport http://localhost:12345" echo " UPassport http://localhost:54321" echo " IPFS http://localhost:8080" echo " NOSTR ws://localhost:7777" echo " G1Billet http://localhost:33101" if [[ "${NEXTCLOUD_ACTIVE}" == "true" ]]; then echo " NextCloud http://127.0.0.1:8443 (admin initial)" echo " https://cloud.${DOMAIN_DISPLAY} (via NPM)" fi if command -v ollama >/dev/null 2>&1; then echo " Ollama http://localhost:11434 โ† LLM GPU local" fi if systemctl is-active --quiet comfyui 2>/dev/null; then echo " ComfyUI http://localhost:8188 โ† Gรฉnรฉration d'images GPU" fi if [[ "${AISTACK_ACTIVE}" == "true" ]]; then echo " Open WebUI http://localhost:8000 โ† portail IA pour les membres" echo " Dify.ai http://localhost:8010 โ† crรฉation d'agents/workflows" echo " Qdrant http://localhost:6333" echo " Ollama http://localhost:11434" fi if [[ "${RNOSTR_ACTIVE}" == "true" ]]; then echo " rnostr ws://localhost:8888 (relay NOSTR Rust โ€” dev)" fi echo echo " DOCKER :" echo " docker ps" echo " docker compose -f ~/.zen/Astroport.ONE/docker/docker-compose.yml ps" echo " docker compose -f ~/.zen/Astroport.ONE/docker/docker-compose.yml logs -f" echo echo " ESSAIM :" echo " IPFS ${IPFS_DISPLAY}" echo " Relay ${RELAY_DISPLAY}" echo " UPassport ${USPOT_DISPLAY}" echo echo " COMMANDES :" echo " astrosystemctl list โ† score local vs swarm" echo " astrosystemctl list-remote โ† Brain-Nodes disponibles" echo " station-info โ† รฉtat station (terminal)" echo " station ~/.zen/Astroport.ONE/station.sh" echo " captain ~/.zen/Astroport.ONE/captain.sh" echo " start / stop ~/.zen/Astroport.ONE/start.sh | stop.sh" if [[ "${AISTACK_ACTIVE}" == "true" ]]; then echo "" echo " STACK IA :" echo " docker compose -f ~/.zen/Astroport.ONE/docker/docker-compose.yml --profile ai ps" echo " install/install-ai-company.docker.sh --check โ† compatibilitรฉ GPU" fi echo echo " EXTENSIONS NAVIGATEUR :" echo " Pour archiver YouTube directement dans votre uDRIVE :" echo " 1. Installez l'extension 'Open With' sur Firefox :" echo " https://addons.mozilla.org/firefox/addon/open-with" echo " 2. Importez la configuration dans l'extension :" echo " bash ~/.zen/open_with_yt-dlp.txt" echo echo " ERREURS: ~/.zen/install.errors.log" echo "#############################################" echo [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour voir la suite] " _ ## โ”€โ”€โ”€ Message final conditionnรฉ par le mode rรฉseau โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ if [[ "${UPLANETNAME}" == "0000000000000000000000000000000000000000000000000000000000000000" || -z "${UPLANETNAME}" ]]; then ## โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• MODE ACADร‰MIE / UPLANET ORIGIN โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐ŸŽฎ ACADร‰MIE UPLANET ORIGIN โ€” ร‰TAPE 1 / 4 โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ โ•‘" echo "โ•‘ Cette station fonctionne en mode BACS ร€ SABLE (swarm.key = zรฉro). โ•‘" echo "โ•‘ Elle est hรฉbergรฉe par vous (ARMATEUR) mais opรฉrรฉe par le collectif โ•‘" echo "โ•‘ G1FabLab en attendant votre certification comme CAPITAINE. โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ’ฐ En tant qu'Armateur, vous pouvez percevoir jusqu'ร  14 แบen / sem โ•‘" echo "โ•‘ โ†’ Souscrivez sur : https://opencollective.com/monnaie-libre โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ‘‰ VOTRE MISSION POUR DEVENIR CAPITAINE : โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ 1. Ouvrez votre navigateur : http://127.0.0.1:54321/g1 โ•‘" echo "โ•‘ 2. Crรฉez votre MULTIPASS avec votre Vร‰RITABLE adresse email. โ•‘" echo "โ•‘ 3. Lisez les ZINEs quotidiens que le systรจme va vous envoyer. โ•‘" echo "โ•‘ 4. Contactez support@qo-op.com pour valider votre formation DRAGON. โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ‰ Formation DRAGON โ†’ swarm.key privรฉ โ†’ UPlanet แบEN โ†’ + 28 แบen/sem โ•‘" echo "โ•‘ โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" else ## โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• MODE PRODUCTION / UPLANET แบEN โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿš€ PROCHAINE ร‰TAPE โ€” ACTIVATION CAPITAINE โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ โ•‘" echo "โ•‘ Votre station est installรฉe et votre compte GMARKMAIL crรฉรฉ. โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ โš ๏ธ IMPORTANT : Pour activer votre statut de Capitaine, un autre โ•‘" echo "โ•‘ Capitaine de la constellation doit valider votre recrutement. โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ“ง Contactez-nous pour rejoindre la constellation : โ•‘" echo "โ•‘ support@qo-op.com โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ Indiquez dans votre email : โ•‘" echo "โ•‘ โ€ข Votre email GMARKMAIL : $(cat ~/.zen/game/players/.current/.player 2>/dev/null || echo 'voir ci-dessus') โ•‘" echo "โ•‘ โ€ข Votre hostname : $(hostname) โ•‘" echo "โ•‘ โ€ข Votre position GPS : $(cat ~/.zen/GPS 2>/dev/null || echo 'non dรฉtectรฉe') โ•‘" echo "โ•‘ โ•‘" echo "โ•‘ ๐ŸŒ Notre Systรจme d'Information Dรฉcentralisรฉ : https://qo-op.com โ•‘" echo "โ•‘ ๐Ÿ“š Rรฉseau Dรฉcentralisรฉ : https://$myLIBRA/ipns/astroport.one โ•‘" echo "โ•‘ ๐Ÿ“š Rechargez en ฤž1 votre UPlanet แบen : $UPLANETNAME_G1 โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" fi echo . ~/.bashrc ########################################################## # Bootstrap WoTx2 โ€” Compรฉtences Capitaine Astroport # Propose au capitaine de dรฉclarer ses compรฉtences techniques initiales [[ -f ~/.zen/Astroport.ONE/tools/oracle_init_captain_wotx2.sh ]] && \ ~/.zen/Astroport.ONE/tools/oracle_init_captain_wotx2.sh ########################################################## ########################################################## ~/.zen/Astroport.ONE/RUNTIME/DRAGON_p2p_ssh.sh ON ########################################################## ########################################################## ## COMPTES Dร‰MO โ€” identitรฉs NOSTR uniques par station ## Salt = prรฉnom perso (coucou/toto/jean) ## Pepper = adresse email format UPlanet avec hostname ## โ†’ clรฉs diffรฉrentes sur chaque station, pas de collision MULTIPASS/ZenCard ########################################################## _DEMO_HOSTNAME=$(hostname) _KEYGEN="${HOME}/.zen/Astroport.ONE/tools/keygen" _DEMO_DIR="$HOME/.zen/demo" ## Domaine email hรฉrite de la configuration de la station _DEMO_DOMAIN="${CAPTAIN_EMAIL_DOMAIN:-${CUSTOM_EMAIL_DOMAIN:-qo-op.com}}" mkdir -p "$_DEMO_DIR" echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐ŸŽญ COMPTES DE Dร‰MONSTRATION WoTx2 / MineLife โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "" for _demo in coucou toto jean; do _demo_file="${_DEMO_DIR}/${_demo}.keys" _demo_salt="${_demo}" _demo_pepper="support+${_demo}-${_DEMO_HOSTNAME}@${_DEMO_DOMAIN}" _DEMO_DISPLAY="$(echo "${_demo}" | awk '{print toupper(substr($0,1,1)) substr($0,2)}') [DEMO]" if [[ ! -s "$_demo_file" ]]; then _nsec=$("$_KEYGEN" -t nostr -s "$_demo_salt" "$_demo_pepper" 2>/dev/null || echo "") _npub=$("$_KEYGEN" -t nostr "$_demo_salt" "$_demo_pepper" 2>/dev/null || echo "") if [[ -n "$_nsec" && -n "$_npub" ]]; then printf "NSEC=%s\nNPUB=%s\nEMAIL=%s\n" \ "$_nsec" "$_npub" "$_demo_pepper" > "$_demo_file" chmod 600 "$_demo_file" ## Publier le profil Kind 0 taguรฉ DEMO sur le relay local _DEMO_CONTENT="{\"name\":\"${_DEMO_DISPLAY}\",\"about\":\"Compte de dรฉmonstration WoTx2 โ€” ${_DEMO_HOSTNAME}\",\"demo\":true,\"picture\":\"https://robohash.org/${_demo_pepper}?set=set4\"}" ~/.astro/bin/python3 ~/.zen/Astroport.ONE/tools/nostr_node_intercom.py publish \ --nsec "$_nsec" \ --kind 0 \ --tags '[["t","demo"]]' \ --content "$_DEMO_CONTENT" \ --relays "ws://localhost:7777" 2>/dev/null \ && echo " โœ… ${_DEMO_DISPLAY} โ€” profil publiรฉ sur le relay" \ || echo " โš ๏ธ ${_DEMO_DISPLAY} โ€” publication diffรฉrรฉe (relay non prรชt)" fi fi _nsec=$(grep "^NSEC=" "$_demo_file" 2>/dev/null | cut -d= -f2) _npub=$(grep "^NPUB=" "$_demo_file" 2>/dev/null | cut -d= -f2) _email=$(grep "^EMAIL=" "$_demo_file" 2>/dev/null | cut -d= -f2) printf " ๐Ÿ‘ค %-10s <%s>\n" "$_DEMO_DISPLAY" "$_email" printf " nsec : %s\n" "${_nsec:-(keygen non disponible)}" printf " npub : %s...\n" "${_npub:0:24}" echo "" done echo " Les clรฉs sont sauvegardรฉes dans ~/.zen/demo/" echo "" echo " โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”" echo " โ”‚ X. Ouvrez MineLife dans votre navigateur : โ”‚" echo " โ”‚ http://127.0.0.1:54321/UPlanet/earth/minelife.html โ”‚" echo " โ”‚ Changez d'identitรฉ dans nos2x pour simuler la WoTx2 โ”‚" echo " โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜" echo "" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour continuer] " _ ########################################################## ## MULTIPASS CAPITAINE โ€” Clรฉ NOSTR d'identitรฉ principale ########################################################## _CAPTAIN_EMAIL=$(cat ~/.zen/game/players/.current/.player 2>/dev/null || echo "") _CAP_SECRET="$HOME/.zen/game/nostr/${_CAPTAIN_EMAIL}/.secret.nostr" if [[ -n "$_CAPTAIN_EMAIL" && -s "$_CAP_SECRET" ]]; then _CAP_NSEC=$(grep -oP 'NSEC=\K[^;]+' "$_CAP_SECRET" 2>/dev/null || echo "") _CAP_NPUB=$(grep -oP 'NPUB=\K[^;]+' "$_CAP_SECRET" 2>/dev/null || echo "") if [[ -n "$_CAP_NSEC" ]]; then echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐Ÿ”‘ MULTIPASS CAPITAINE โ€” CLร‰ NOSTR PRIVร‰E โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" printf "โ•‘ Capitaine : %-46s โ•‘\n" "${_CAPTAIN_EMAIL:0:46}" echo "โ•‘ โ•‘" echo "โ•‘ โš ๏ธ INSEREZ CETTE CLร‰ DANS VOTRE NAVIGATEUR โ•‘" echo "โ•‘ โš ๏ธ Elle donne accรจs ร  votre identitรฉ CAPTAIN sur NOSTR โ•‘" echo "โ•‘ โ•‘" printf "โ•‘ nsec : %-51s โ•‘\n" "${_CAP_NSEC}" printf "โ•‘ npub : %-51s โ•‘\n" "${_CAP_NPUB:0:51}" echo "โ•‘ โ•‘" echo "โ•‘ โ†’ Importez la nsec dans nos2x / Alby / Amethyst pour โ•‘" echo "โ•‘ accรฉder ร  votre identitรฉ NOSTR sur tous vos appareils. โ•‘" echo "โ•‘ Sauvegarde : ~/.zen/game/nostr/$_CAPTAIN_EMAIL/.secret.nostr" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" [[ -t 0 ]] && read -r -p " โš ๏ธ NOTEZ VOTRE nsec CI-DESSUS โ€” Entrรฉe pour continuer... " _ fi fi ########################################################## ## SESSION DE FORMATION LIVE โ€” vdo.ninja UPLANET ########################################################## _CAPTAIN_EMAIL=$(cat ~/.zen/game/players/.current/.player 2>/dev/null || echo "") _CAPTAIN_NPUB=$(cat ~/.zen/game/nostr/${_CAPTAIN_EMAIL}/NPUB 2>/dev/null | head -1 || echo "") _VDO_ID="${_CAPTAIN_NPUB:0:12}" [[ -z "$_VDO_ID" ]] && _VDO_ID="uplanet" _VDO_ROOM="uplanet_${_VDO_ID}" _VDO_HOST="https://vdo.ninja/?room=${_VDO_ROOM}&push=captain&record=1" _VDO_VIEW="https://vdo.ninja/?room=${_VDO_ROOM}&view" _VDO_FORM="https://vdo.ninja/?room=uplanet_formation&view" echo "" echo "โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—" echo "โ•‘ ๐ŸŽฅ SESSION DE FORMATION โ€” vdo.ninja UPLANET โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ Rejoignez une session visio avec un formateur certifiรฉ. โ•‘" echo "โ•‘ La session sera enregistrรฉe โ†’ publiรฉe sur votre UPlanet. โ•‘" echo "โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ" echo "โ•‘ โ•‘" echo "โ•‘ Votre canal personnel (hรดte + enregistrement) : โ•‘" printf "โ•‘ %-58s โ•‘\n" "${_VDO_HOST:0:58}" echo "โ•‘ โ•‘" echo "โ•‘ Canal FORMATION collectif (spectateur) : โ•‘" printf "โ•‘ %-58s โ•‘\n" "${_VDO_FORM:0:58}" echo "โ•‘ โ•‘" echo "โ•‘ ๐Ÿ“ง Planifiez votre session : support@qo-op.com โ•‘" echo "โ•‘ Objet : 'Formation DRAGON โ€” $(hostname)' โ•‘" echo "โ•‘ โ•‘" echo "โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" echo "" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour terminer] " _ else echo "=============================================" echo " MISES ร€ JOUR (APT/PIP) EFFECTUร‰ES AVEC SUCCรˆS" echo "=============================================" echo " INSTALLATION COMPLรˆTE IGNORร‰E :" echo " CAPTAIN already onboard..." echo "=============================================" _CAPTAIN_EMAIL=$(cat ~/.zen/game/players/.current/.player 2>/dev/null || echo "") _CAP_SECRET="$HOME/.zen/game/nostr/${_CAPTAIN_EMAIL}/.secret.nostr" cat $_CAP_SECRET echo "=============================================" [[ -t 0 ]] && read -r -p " โ†ต [Entrรฉe pour terminer] " _ # MAIN # fi }