logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Installation de paquets hors ppa

Introduction

#!/usr/bin/sh


# Script de post-installation de machine debian destinée à héberger un
# serveur LAMP-FPM, avec environnement de développement VSCodium/Xdebug
# ainsi que Docker.
#
# Les différentes fonctions sont à effectuer dans un certain ordre :
#    Xdebug après php-fmp pour être sûr que les fichiers et liens sont bien créés
#    PHP après apache pour activer fastcgi
#
# La fonction d'installation de MariaDB permet de changer le mot de passe root de MariaDB
#
# On peut diriger la sortie vers la console ou vers un fichier de log
#
# Des fichiers témoins permettent la reprise en cas d'erreur à une étape

PHPVERSION="8.2"
NODEJSVERSION="18"
MODEL="laptop"
INSTALLDIR="/var/log/install"
LOGDIR="$INSTALLDIR/log"
LOGFILE="/dev/stdout"
SEPARATOR="\n===========================================\n"
RUN="false"
GROUPUSER=$USER
MYSQLROOT1="root"
MYSQLROOT2="mysql"
DISTRIBUTION=""
ADDITIONAL=""

usage() {
    echo
    echo "post-install.sh [-hfrtx] [-u username] [-d distribution] [-a additional]"
    echo "   -h : cette aide"
    echo "   -a additional : liste à virgule sans espace d'outils supplémentaires à installer"
    echo "   -d distribution : debian ou ubuntu"
    echo "   -f : installation d'un ordinateur fixe (pas de firmware-iwlwifi)"
    echo "   -r : run, effectue les opérations"
    echo "   -t : trace, stocke les logs dans un fichier. Sinon, affiche dans le stdout"
    echo "   -u username : ajoute username aux groupes utiles. \$USER par défaut si vous êtes en sudo"
    echo "   -x : set -x, mode affichage des commandes"
    echo
    echo "ATTENTION : Exécuter en tant que root pour avoir les droits de modification et si sudo n'est pas encore configuré"
    echo
}

while getopts hfrxtu:d:a: OPTION;do
    case $OPTION in
	a) ADDITIONAL=$OPTARG;;
	d) DISTRIBUTION=$OPTARG;;
	f) MODEL="fixe";;
	h) usage
	   exit 1;;
	r) RUN="true";;
	t) LOGFILE="$LOGDIR/post-install.`date +%Y%m%d-%H%M%S`.log";;
	u) GROUPUSER=$OPTARG;;
	x) set -x;;
	*) usage
	   exit 2;;
    esac
done

manageError() {
    if [ $1 != 0 ]; then
	echo $2
	exit 2
    fi
}

prerun() {
    if [ "$DISTRIBUTION" = "" ]; then
	echo
	echo "ERREUR : Indiquez la distibution à configurer (debian ou ubuntu)"
	echo
	usage
	exit 2
    fi
    if [ "$ADDITIONAL" != "" ]; then
	echo
	echo "Nous allons installer les produits supplémentaires suivants :"
	for tool in `echo $ADDITIONAL | sed 's/,/ /g'`; do
	    echo "       " $tool
	    exists=`type optional_install$tool`
	    if [ ! "$exists" = "optional_install$tool is a shell function" ]; then
		echo "ERREUR : pas de méthode pour installer $tool"
		echo
		echo "Le script doit contenir une fonction nommée optional_install$tool"
		echo
		echo "Les fonctions optionnelles disponibles sont :"
		echo
		grep '^optional_install' $0
		echo
		exit 2
	    fi
	done
	echo
    fi
    if [ "$DISTRIBUTION" = "ubuntu" ]; then
	PHPVERSION="8.1"
    fi
    echo
    if [ "$RUN" = false ]; then
	echo "Les opérations ne seront pas effectuées, lancer avec l'option -r pour appliquer les modifications, -h pour l'aide"
	echo
    else
	while [ $MYSQLROOT1 != $MYSQLROOT2 ]; do
	    echo "Nouveau mot de passe root pour mysql :"
	    read MYSQLROOT1
	    echo "Confirmation : ressaisissez le mot de passe"
	    read MYSQLROOT2
	    if [ $MYSQLROOT2 != $MYSQLROOT1 ]; then
		echo "ERREUR: les deux saisies ne correspondent pas"
	    fi
	done
    echo	
    fi
    if [ "$LOGFILE" != "/dev/stdout" ]; then
	echo "Fichier de log : $LOGFILE"
	echo
    fi
    echo "Installation sous $INSTALLDIR avec droits pour $GROUPUSER"
    echo $SEPARATOR
    mkdir -p $INSTALLDIR
    mkdir -p $LOGDIR
    for conf in php xdebug_config_codium; do
	cp -pr $conf $INSTALLDIR
	manageError $? "ERREUR lors de la copie de $conf vers $INSTALLDIR"
    done
    cd $INSTALLDIR
}

initializations() {
    echo "Initialisations..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/initializations ]; then
	    echo "    Ajout de $GROUPUSER au groupe sudo"
	    usermod -aG sudo $GROUPUSER
	    echo "    Ajout de packages"
	    apt-get install -y ca-certificates apt-transport-https software-properties-common wget curl lsb-release emacs
	    manageError $? "ERREUR lors de l'installation des premiers packages"
	    touch $LOGDIR/initializations
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin des initialisations"
    echo $SEPARATOR
}

configApt() {
    echo "Configuration de apt..."
    if [ "$RUN" = "true" -a "$DISTRIBUTION" = "debian" ]; then
	if [ ! -f $LOGDIR/apt ]; then
	    sed -ibak 's/main$/main contrib non-free/g' /etc/apt/sources.list
	    manageError $? "ERREUR lors de la modification de sources.list"
	    apt update
	    if [ $MODEL = "laptop" ]; then
		apt install -y firmware-linux-nonfree firmware-iwlwifi 
		manageError $? "ERREUR lors de l'installation des packages wifi"
	    fi
	    touch $LOGDIR/apt
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de apt"
    echo $SEPARATOR
}

installApache2() {
    echo "Installation d'Apache..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/apache ]; then
	    apt update && apt install -y apache2
	    manageError $? "ERREUR lors de l'installation de apache"
	    apache2 -v |grep '^Server version'
	    touch $LOGDIR/apache
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration d'Apache"
    echo $SEPARATOR    
}

installChrome () {
    echo "Installation de Chrome..."
    if [ "$RUN" = "true" ]; then
        if [ ! -f $LOGDIR/chrome ]; then
            wget -qO - https://dl.google.com/linux/linux_signing_key.pub \
                | sudo gpg --dearmor -o /usr/share/keyrings/googlechrome-linux-keyring.gpg
            echo "deb [arch=amd64 signed-by=/usr/share/keyrings/googlechrome-linux-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" \
	        > /etc/apt/sources.list.d/google-chrome.list
            apt update && apt install -y google-chrome-stable
            manageError $? "ERREUR lors de l'installation de chrome"
	    google-chrome --version
            touch $LOGDIR/chrome
        else
            echo "Fichier témoin présent, rien à faire"
        fi
    fi
    echo "fin de la configuration de Chrome"
    echo $SEPARATOR  
}

installComposer() {
    # Procedure from https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md
    # difference : --install-dir=/usr/local/bin --filename=composer et gestion du code erreur
    echo "Installation de Composer..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/composer ]; then
	    EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
	    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
	    ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
	    
	    if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]
	    then
		>&2 echo 'ERROR: Invalid installer checksum'
		rm composer-setup.php
		exit 1
	    fi

	    php composer-setup.php --quiet --install-dir=/usr/local/bin --filename=composer
	    manageError $? "ERREUR lors de l'installation de composer"
#	    RESULT=$?
	    rm composer-setup.php
	    composer --version
	    touch $LOGDIR/composer
#	    exit $RESULT
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de composer"
    echo $SEPARATOR  
}

installDiscord() {
    echo "Installation de Discord..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/discord ]; then
	    wget "https://discord.com/api/download?platform=linux&format=deb" -O /tmp/discord.deb
	    apt install -y /tmp/discord.deb
	    manageError $? "ERREUR lors de l'installation de discord"
	    dpkg -l |grep discord| awk '{print $2 " " $3}'
	    touch $LOGDIR/discord
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Discord"
    echo $SEPARATOR    
}

installDocker() {
    echo "Installation de Docker..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/docker ]; then
	    # Install the packages
	    apt-get remove -y --purge docker docker-engine docker.io containerd runc
	    curl -fsSL https://download.docker.com/linux/$DISTRIBUTION/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
	    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/$DISTRIBUTION $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
	    apt update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
	    manageError $? "ERREUR lors de l'installation de docker"
	    # Configuring permissions
	    echo "    Ajout de $GROUPUSER au groupe docker"
	    usermod -aG docker $GROUPUSER
	    # Configuring docker logrotate
	    cat > /etc/docker/daemon.json <<EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3" 
    }
}
EOF
	    docker --version
	    touch $LOGDIR/docker
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Docker"
    echo $SEPARATOR    
}

installLaTeX() {
    echo "Installation de LaTeX et Pandoc..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/latex ]; then
	    apt update
	    apt install -y texlive-latex-base texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra pandoc
	    manageError $? "ERREUR lors de l'installation de LaTeX et Pandoc"
	    touch $LOGDIR/latex
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de LaTeX"
    echo $SEPARATOR    
}

installMariaDB() {
    # MariaDB install with databases relocated in /home/mysql via symbolic link
    # Set root password
    echo "Installation de MariaDB..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/mariadb ]; then
	    # Relocate databases
	    apt update && apt install -y mariadb-*
	    systemctl stop mariadb
	    mv /var/lib/mysql/ /home/
	    ln -s /home/mysql/ /var/lib/mysql
	    sed -ibak 's/ProtectHome=true/ProtectHome=false/g' /usr/lib/systemd/system/mariadb.service
	    systemctl daemon-reload
	    systemctl start mariadb
	    manageError $? "ERREUR lors de l'installation de MariaDB"
	    # Set root password
	    mysql_secure_installation <<EOF

n
Y
$MYSQLROOT1
$MYSQLROOT1
Y
Y
Y
Y
EOF
	    manageError $? "ERREUR lors de la configuration de MariaDB"
	    mariadb --version
	    touch $LOGDIR/mariadb
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de MariaDB"
    echo $SEPARATOR  
}

installNodeJS() {
    echo "Installation de NodeJS et npm..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/nodejs ]; then
	    echo "    Version : $NODEJSVERSION.x"
	    curl -sL https://deb.nodesource.com/setup_$NODEJSVERSION.x | bash -
	    apt update && apt install -y nodejs
	    manageError $? "ERREUR lors de l'installation de NodeJS"
#	    apt install -y npm
#	    manageError $? "ERREUR lors de l'installation de npm"
	    npm install -g npm@latest
	    manageError $? "ERREUR lors de la mise à jour de npm"
	    npm install npm-watch
	    manageError $? "ERREUR lors de l'installation de npm-watch (npm install npm-watch)"
	    npm install --global yarn
	    manageError $? "ERREUR lors de l'installation de yarn (npm install --global yarn)"
	    echo "Node version : " `node --version`
	    echo "Npm version : " `npm --version`
	    echo "Yarn version : " `yarn --version`
	    touch $LOGDIR/nodejs
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de NodeJS et npm"
    echo $SEPARATOR  
}

installPhp8() {
    
    echo "Installation de PHP $PHPVERSION..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/php$PHPVERSION ]; then
	    if [ "$DISTRIBUTION" = "debian" ]; then
		curl -sSL https://packages.sury.org/php/README.txt | bash -x
	    fi
	    apt-get update
	    apt install -y php$PHPVERSION php$PHPVERSION-cli php$PHPVERSION-fpm php$PHPVERSION-pdo php$PHPVERSION-mysql \
		php$PHPVERSION-zip php$PHPVERSION-gd php$PHPVERSION-mbstring php$PHPVERSION-curl php$PHPVERSION-xml \
		php$PHPVERSION-bcmath php$PHPVERSION-intl php$PHPVERSION-opcache php$PHPVERSION-readline
#	    apt install -y php$PHPVERSION php$PHPVERSION-cli php$PHPVERSION-fpm php$PHPVERSION-pdo php$PHPVERSION-mysql \
#		php$PHPVERSION-zip php$PHPVERSION-gd php$PHPVERSION-mbstring php$PHPVERSION-curl php$PHPVERSION-xml \
#		php$PHPVERSION-bcmath php$PHPVERSION-intl php$PHPVERSION-intl-dbgsym php$PHPVERSION-opcache php$PHPVERSION-readline
	    manageError $? "ERREUR lors de l'installation de PHP $PHPVERSION"
	    a2enmod proxy_fcgi setenvif
	    a2enconf php$PHPVERSION-fpm
	    systemctl reload apache2

	    cp php/php.ini /etc/php/$PHPVERSION/fpm/php.ini
	    systemctl restart php$PHPVERSION-fpm
	    manageError $? "ERREUR lors de la configuration de PHP FPM"

	    if [ ! -L /etc/php/$PHPVERSION/fpm/conf.d/20-pdo_mysql.ini ]; then
		echo "Lien manquant : /etc/php/$PHPVERSION/fpm/conf.d/20-pdo_mysql.ini"
		exit 2
	    fi
	    if [ ! -L /etc/php/$PHPVERSION/fpm/conf.d/20-intl.ini ]; then
		echo "Lien manquant : /etc/php/$PHPVERSION/fpm/conf.d/20-intl.ini"
		exit 2
	    fi
	    php --version | grep ^PHP
	    touch $LOGDIR/php$PHPVERSION
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de PHP"
    echo $SEPARATOR
}

installPostgreSQL() {
    echo "Installation de PostgreSQL..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/postgresql ]; then
	    apt install -y postgresql postgresql-client postgresql-contrib php$VERSION-pgsql
	    manageError $? "ERREUR lors de l'installation de postgresql"
	    su postgres -c "psql -c \"ALTER USER postgres WITH password '$MYSQLROOT1'\""
	    manageError $? "ERREUR lors de la modification du mot de passe de postgres"
	    postgres -V
	    touch $LOGDIR/postgresql
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de PostgreSQL"
    echo $SEPARATOR
}

installSymfony() {
    echo "Installation de Symfony..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/symfony ]; then
	    curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | bash -
	    apt update && apt install -y symfony-cli
	    manageError $? "ERREUR lors de l'installation de symfony"
	    symfony -V | grep 'Symfony CLI'
	    touch $LOGDIR/symfony
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Symfony"
    echo $SEPARATOR  
}

installTemplate() {
    #
    # Template d'outil à installer
    # Si pas de configuaration particulière, remplacer TOOL par le nom du package à installer
    #
    echo "Installation de TOOL..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/TOOL ]; then
	    apt update && apt install -y TOOL
	    manageError $? "ERREUR lors de l'installation de TOOL"
	    touch $LOGDIR/TOOL
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de TOOL"
    echo $SEPARATOR    
}

installVSCodium() {
    echo "Installation de VSCodium..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/vscodium ]; then
	    wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg \
		| gpg --dearmor \
		| dd of=/usr/share/keyrings/vscodium.gpg
    
	    echo 'deb [ signed-by=/usr/share/keyrings/vscodium.gpg ] https://download.vscodium.com/debs vscodium main' \
		| tee /etc/apt/sources.list.d/vscodium.list
    
	    apt update && apt install -y codium
	    manageError $? "ERREUR lors de l'installation de VSCodium"
	    echo "codium : " `codium --version | head -1`
	    touch $LOGDIR/vscodium
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de VSCodium"
    echo $SEPARATOR  
}

installXdebug() {
    echo "Installation de Xdebug..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/xdebug ]; then
	    apt install -y php-xdebug
	    manageError $? "ERREUR lors de l'installation de Xdebug"
	    systemctl restart php$PHPVERSION-fpm
	    dpkg -l |grep php-xdebug| awk '{print $2 " " $3}'
	    touch $LOGDIR/xdebug
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Xdebug"
    echo $SEPARATOR  
}

optional_installtoolboxjetbrains() {
    echo "Installation de JetBrains..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/jetbrains ]; then
	    wget -O /tmp/jetbrains-toolbox.tar.gz 'https://download-cdn.jetbrains.com/toolbox/jetbrains-toolbox-1.27.2.13801.tar.gz'
	    tar -xzf /tmp/jetbrains-toolbox.tar.gz -C /opt
	    manageError $? "ERREUR lors de l'installation de JetBrains"
	    touch $LOGDIR/jetbrains
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de JetBrains"
    echo $SEPARATOR    
}

optional_installhugo() {
    echo "Installation de Hugo..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/hugo ]; then
	    wget https://github.com/gohugoio/hugo/releases/download/v0.79.0/hugo_0.79.0_Linux-64bit.deb -O /tmp/hugo.deb
	    apt install -y /tmp/hugo.deb
	    manageError $? "ERREUR lors de l'installation de Hugo"
	    touch $LOGDIR/hugo
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Hugo"
    echo $SEPARATOR
    optional_installgo
    echo "Hugo et go sont installés"
    echo "  Vous devez maintenant les configurer"
    echo "  Pour télécharger le repository hugo-theme-relearn : "
    echo "    git submodule add https://github.com/McShelby/hugo-theme-relearn themes/hugo-theme-relearn"
    echo "  Pour installer la documentation :"
    echo "    git clone --recurse-submodules https://gitlab.com/smartfidelis/smartvotation-doc.git"
    echo "  Pour lancer le serveur Hugo:"
    echo "    hugo server"
    echo $SEPARATOR
}

optional_installgo() {
# Reference : https://go.dev/doc/install
    echo "Installation de Go..."
    if [ "$RUN" = "true" ]; then
	if [ ! -f $LOGDIR/go ]; then
	    wget -O /tmp/go.tar.gz https://go.dev/dl/go1.19.4.linux-amd64.tar.gz
	    rm -rf /usr/local/go && sudo tar -C /usr/local -xzf /tmp/go.tar.gz
	    manageError $? "ERREUR lors de l'installation de Go"
	    touch $LOGDIR/go
	else
	    echo "Fichier témoin présent, rien à faire"
	fi
    fi
    echo "fin de la configuration de Go"
    echo $SEPARATOR    
}

prerun
{
    echo ""
    initializations
    configApt
    installChrome
    installApache2
    installPhp8
    installMariaDB
    installSymfony
    installComposer
    installNodeJS
    installVSCodium
    installXdebug
    installDocker
    installPostgreSQL
    installDiscord
    installLaTeX
    if [ "$ADDITIONAL" != "" ]; then
	for tool in `echo $ADDITIONAL | sed 's/,/ /g'`; do
	    optional_install$tool
	done
    fi
    echo
} > $LOGFILE 2>&1
utilisateurs/hypathie/post_install_debian.txt · Dernière modification: 13/11/2024 17:53 par Hypathie

Pied de page des forums

Propulsé par FluxBB