My Personal Wiki

La théorie, c'est quand on sait tout et que rien ne fonctionne.... La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

Outils pour utilisateurs

Outils du site


uckg2:index

Table des matières

UCK G2 Debian Docker


Prérequis

Avant de commencer suivez ces étapes :

  1. Restaurer le UCK G2 avec le dernier Firmware
  2. Fixer l'adresse ip, passerelle et DNS
  3. Configurer la console en mode off-line
  4. Donner lui un nom
  5. Activer SSH avec un password

Script

Avant d’exécuter le script modifier les adresse ip de la passerelle !!
Dans /root –> nano setup.sh –> copier le script –> chmod +x setup.sh –> ./setup.sh

#!/usr/bin/env bash
# ==============================================================================
#  UCK Gen 2 / Gen 2 Plus - Conversion Debian & Déploiement Arcane.app
#  v10.7 - Network Fix + Immuto-SSH + 19GB Docker Storage + Real LAN IP
# ==============================================================================
 
set -uo pipefail
 
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
 
info() { echo -e "${CYAN}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[OK]${NC} $1"; }
warn() { echo -e "${YELLOW}[ATTENTION]${NC} $1"; }
error() { echo -e "${RED}[ERREUR]${NC} $1"; exit 1; }
 
check_liveness() {
  if ! systemctl is-active --quiet ssh || ! ss -tlnp 2>/dev/null | grep -q ':22\b'; then
    error "sshd s'est arrêté ou le port 22 ne répond plus. Interruption de sécurité !"
  fi
}
 
if [ "$EUID" -ne 0 ]; then
  error "Ce script doit être exécuté en tant que root."
fi
 
echo -e "${CYAN}"
cat << "EOF"
  _  _  ___ _  __  ___  ___ ___ _  _ 
 | || |/ __| |/ / / __|/ __|_ _| || |
 | || | (__| ' < | (_ | (__ | || __ |
 \___/ \___|_|\_\ \___|\___|___|_||_|
  Debian Conversion & Arcane Setup Script (v10.7)
EOF
echo -e "${NC}"
 
# ------------------------------------------------------------------------------
# ÉTAPE 0 : VÉRIFICATION ET SÉCURISATION DU RÉSEAU (GW: 192.168.0.64)
# ------------------------------------------------------------------------------
info "0/6 : Fixation de la passerelle (192.168.0.64) et des DNS..."
 
IFACE=$(ip -4 route show default 2>/dev/null | awk '{print $5}' | head -n1)
if [ -z "$IFACE" ]; then
    IFACE=$(ip -4 link show | grep -E 'eth0|enp|end' | cut -d: -f2 | tr -d ' ' | head -n1)
fi
 
# Application forcée de la passerelle
ip route del default 2>/dev/null || true
ip route add default via 192.168.0.64 dev "$IFACE" 2>/dev/null || true
 
# Réécriture propre des DNS système
rm -f /etc/resolv.conf
cat << RESOLV_EOF > /etc/resolv.conf
nameserver 1.1.1.1
nameserver 8.8.8.8
RESOLV_EOF
 
# Purge des règles Iptables UniFi pour autoriser tout le trafic
iptables -F 2>/dev/null || true
iptables -X 2>/dev/null || true
iptables -P INPUT ACCEPT 2>/dev/null || true
iptables -P FORWARD ACCEPT 2>/dev/null || true
iptables -P OUTPUT ACCEPT 2>/dev/null || true
 
# Test d'accès IP direct avec le paramètre -n (évite le blocage DNS inversé)
if ping -n -c 1 -W 2 1.1.1.1 &>/dev/null; then
    success "Connectivité réseau opérationnelle via 192.168.0.64."
else
    warn "Attention: Impossible de joindre 1.1.1.1. Vérifiez que la passerelle est active."
fi
 
# ------------------------------------------------------------------------------
# ÉTAPE 1 : VERROUILLAGE IMMUABLE & WATCHDOG SSH (FIX NO-DISCONNECT)
# ------------------------------------------------------------------------------
info "1/6 : Lock-out permanent et immuable d'OpenSSH..."
 
apt-get update -y || true
apt-get install -y openssh-server e2fsprogs rsync || true
 
# Déverrouillage temporaire si déjà verrouillé pour appliquer la configuration
chattr -i /etc/ssh/sshd_config 2>/dev/null || true
 
systemctl unmask ssh 2>/dev/null || true
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
 
# Verrouillage immuable du fichier de configuration contre tout écrasement système
chattr +i /etc/ssh/sshd_config
 
# Déploiement du service Watchdog (relance SSH automatique si coupé)
cat << 'WATCHDOG_EOF' > /etc/systemd/system/ssh-watchdog.service
[Unit]
Description=Watchdog SSH Maintien Port 22
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do if ! systemctl is-active --quiet ssh; then systemctl restart ssh; fi; sleep 10; done'
Restart=always
 
[Install]
WantedBy=multi-user.target
WATCHDOG_EOF
 
systemctl daemon-reload
systemctl enable ssh-watchdog.service
systemctl start ssh-watchdog.service 2>/dev/null || true
 
# Utilisation de RELOAD pour préserver la session SSH active sans provoquer de Broken pipe
systemctl reload ssh || systemctl enable ssh
check_liveness
success "Serveur SSH rendu IMMUABLE et protégé par Watchdog."
 
# ------------------------------------------------------------------------------
# ÉTAPE 2 : PURGE SÉCURISÉE DES PAQUETS ET SERVICES UNIFI (ANTI-BRICK)
# ------------------------------------------------------------------------------
info "2/6 : Purge contrôlée des paquets UniFi..."
 
# Garde-fou Anti-Brick (Ces paquets ne doivent JAMAIS être purgés)
FORBIDDEN="ck-ui ubnt-tools"
 
# Liste complète des paquets UniFi à cibler
TARGET_PACKAGES="unifi-assets-uckp unifi-assets-uckg2 unifi-email-templates-all python3-unifi-console-protos mongodb-server mongodb-clients mongodb-server-core unifi unifi-core unifi-directory unifi-identity-update uid-agent ucs-agent uos-agent uos-discovery-client uos ulp-go ustd ubnt-systemhub ubnt-unifi-setup ucore-setup-listener"
 
# Désactivation et MASK des services UniFi et de mise à jour/restauration
UNITS="ck-splash-reboot.service ck-splash-shutdown.service ck-ui.service infctld-emergency.service infctld.service ubnt-systemhub.service ubnt-unifi-setup.service ucore-setup-listener.service ucs-agent.service uhwd.service uid-agent.service ulp-go.service unifi-core.service unifi-directory.service unifi-identity-update.service unifi.service uos-agent.service uos-discovery-client.service usd.service usdbd.service ubnt-dpkg-restore.service ubnt-archive.service"
 
for u in $UNITS; do
  systemctl disable --now "$u" 2>/dev/null || true
  systemctl mask "$u" 2>/dev/null || true
done
 
# Identification et suppression des paquets présents
TO_PURGE=""
for pkg in $TARGET_PACKAGES; do
  if dpkg -l | grep -qE "^i[i|c]\s+${pkg}\b"; then
     if ! echo "$FORBIDDEN" | grep -qx "$pkg"; then
        TO_PURGE="$TO_PURGE $pkg"
     fi
  fi
done
 
if [ -n "$TO_PURGE" ]; then
    info "Suppression des paquets : $TO_PURGE"
    apt-get purge -y $TO_PURGE || true
    apt-get autoremove --purge -y
    apt-get clean
    check_liveness
    success "Surcouche applicative UniFi supprimée."
else
    success "Aucun paquet UniFi résiduel à purger."
fi
 
# Nettoyage des dossiers de données UniFi & Bases Postgres résiduelles
info "Nettoyage des résidus /data/ et bases PostgreSQL..."
rm -rf /data/unifi /data/uos /data/autobackup
 
if command -v psql >/dev/null 2>&1; then
  EXISTING_DBS=$(sudo -u postgres psql -lqt 2>/dev/null | cut -d'|' -f1 | tr -d ' ' || true)
  for db in unifi-core unifi-identity-update; do
    if echo "$EXISTING_DBS" | grep -qx "$db"; then
      sudo -u postgres dropdb "$db" 2>/dev/null || true
      sudo -u postgres dropuser "$db" 2>/dev/null || true
    fi
  done
fi
 
apt-get install -y curl wget ca-certificates openssl jq htop nano || true
 
# ------------------------------------------------------------------------------
# ÉTAPE 3 : CONFIGURATION ÉCRAN OLED
# ------------------------------------------------------------------------------
info "3/6 : Configuration de l'écran OLED..."
 
if [ -f "/usr/local/bin/cloudkey" ] && systemctl is-active --quiet cloudkey 2>/dev/null; then
    success "Démon OLED déjà actif."
else
    OLED_SUCCESS=false
    if curl -fsSL -k "https://github.com/jnovack/cloudkey/releases/download/v1.2.0/cloudkey-v1.2.0-linux-arm64" -o /usr/local/bin/cloudkey 2>/dev/null; then
        OLED_SUCCESS=true
    fi
 
    if [ "$OLED_SUCCESS" = true ]; then
        chmod +x /usr/local/bin/cloudkey
        cat << 'SERVICE_EOF' > /etc/systemd/system/cloudkey.service
[Unit]
Description=Custom OLED Display Daemon
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
ExecStart=/usr/local/bin/cloudkey
Restart=always
RestartSec=5
 
[Install]
WantedBy=multi-user.target
SERVICE_EOF
        systemctl daemon-reload
        systemctl enable --now cloudkey
        success "OLED configuré avec succès."
    fi
fi
 
# ------------------------------------------------------------------------------
# ÉTAPE 4 : DOCKER ENGINE (SUR PARTITION 19GB /srv)
# ------------------------------------------------------------------------------
info "4/6 : Configuration de Docker Engine sur la partition 19GB (/srv)..."
 
if ! command -v docker &> /dev/null; then
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    rm -f get-docker.sh
fi
 
systemctl stop docker 2>/dev/null || true
 
# Création du dossier cible sur la grande partition de 19 Go
mkdir -p /srv/docker
mkdir -p /etc/docker
 
# Utilisation des DNS de l'hôte (pas de blocage d'IPs externes pour Docker)
cat << 'DOCKER_CONF_EOF' > /etc/docker/daemon.json
{
  "data-root": "/srv/docker",
  "storage-driver": "vfs"
}
DOCKER_CONF_EOF
 
systemctl restart docker
systemctl enable docker
success "Docker configuré pour utiliser la partition 19 Go (/srv/docker)."
 
# ------------------------------------------------------------------------------
# ÉTAPE 5 : DÉPLOIEMENT ARCANE.APP
# ------------------------------------------------------------------------------
info "5/6 : Déploiement d'Arcane.app..."
 
ARCANE_DIR="/opt/arcane"
mkdir -p "$ARCANE_DIR"
 
ENCRYPTION_KEY="hex:$(openssl rand -hex 32)"
JWT_SECRET=$(openssl rand -hex 32)
 
cat << COMPOSE_EOF > "$ARCANE_DIR/docker-compose.yml"
services:
  arcane:
    image: ghcr.io/getarcaneapp/manager:latest
    container_name: arcane
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - arcane-data:/app/data
    environment:
      - PORT=3552
      - APP_URL=http://localhost:3552
      - PUID=1000
      - PGID=1000
      - ENCRYPTION_KEY=${ENCRYPTION_KEY}
      - JWT_SECRET=${JWT_SECRET}
    cgroup: host
    restart: unless-stopped
 
volumes:
  arcane-data:
COMPOSE_EOF
 
cd "$ARCANE_DIR"
docker compose down -v 2>/dev/null || true
docker pull ghcr.io/getarcaneapp/manager:latest
docker compose up -d
 
# Extraction garantie de l'IP de l'interface réseau active vers la passerelle
FINAL_IP=$(ip route get 192.168.0.64 2>/dev/null | awk '{print $7}' | head -n1)
 
# Secours si la passerelle ne répond pas
if [ -z "$FINAL_IP" ]; then
    FINAL_IP=$(hostname -I | awk '{print $1}')
fi
 
echo ""
echo -e "${GREEN}======================================================================${NC}"
echo -e "${GREEN}               CONVERSION & DÉPLOIEMENT TERMINÉS !                    ${NC}"
echo -e "${GREEN}======================================================================${NC}"
echo -e " Accès SSH        :  ${CYAN}ssh root@${FINAL_IP}${NC}"
echo -e " Accès Arcane.app :  ${CYAN}http://${FINAL_IP}:3552${NC}"
echo -e "${GREEN}======================================================================${NC}"

uckg2/index.txt · Dernière modification : de sylvain

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki