Compare commits
40 Commits
56352f2749
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 48c26f9f84 | |||
| 70facd85f3 | |||
| 5eda1c002e | |||
| 24a45fecf3 | |||
| 1b758b6161 | |||
| b75afa7df8 | |||
| 58b6a44819 | |||
| 8e882c7756 | |||
| b8808e4219 | |||
| 5375a48bfd | |||
| 4936d3c8e7 | |||
| 3d64c538af | |||
| d9c2e20402 | |||
| 12cbbd0a6a | |||
| bd74da92ff | |||
| 5e663d8925 | |||
| 2f0831aa09 | |||
| cad29cdc71 | |||
| eabf6c042e | |||
| ca73246a47 | |||
| 1b7173b824 | |||
| bc57514c0d | |||
| 9b29b85fb2 | |||
| 4ee5bcc04f | |||
| 164c69f580 | |||
| 00c1c9562b | |||
| a8cd67f38c | |||
| 285e332a9f | |||
| 0d46cf7752 | |||
| a3ecc212dd | |||
| 506dfb1086 | |||
| f22cf0bff7 | |||
| 917f3a68bb | |||
| 579631df00 | |||
| 680b9a2af9 | |||
| bf8b686477 | |||
| 86583798f5 | |||
| 4c1ca83681 | |||
| cdd5b93432 | |||
| 400b22d821 |
9
LICENCE
9
LICENCE
@@ -1,9 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Cédrix
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -20,7 +20,7 @@ Les contributions sont les bienvenues ! Si vous avez des suggestions, des correc
|
||||
6. **Pousser votre branche** : `git push origin ma-nouvelle-branche`
|
||||
7. **Créer une Pull Request**
|
||||
|
||||
Pour plus de détails, veuillez lire le fichier [CONTRIBUTING.md](contribute.md).
|
||||
Pour plus de détails, veuillez lire le fichier [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
|
||||
## Code de Conduite
|
||||
|
||||
@@ -28,7 +28,7 @@ Pour garantir un environnement ouvert et accueillant, nous avons adopté un code
|
||||
|
||||
## Licence
|
||||
|
||||
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
|
||||
Voir le fichier [LICENCE](LICENCE.md) et [LICENCE en Français](LICENCE_FR.md) pour plus de détails.
|
||||
|
||||
## Remerciements
|
||||
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# Contribuer au Projet
|
||||
|
||||
Merci de votre intérêt pour contribuer à ce projet ! Vos contributions sont essentielles pour améliorer ce dépôt de notes techniques. Voici quelques lignes directrices pour vous aider à démarrer.
|
||||
|
||||
## Comment Contribuer
|
||||
|
||||
1. **Fork le dépôt** : Cliquez sur le bouton "Fork" en haut à droite de la page pour créer une copie de ce dépôt dans votre compte Git (GitHub, GitLab, Gitea ...).
|
||||
|
||||
2. **Cloner votre fork** : Clonez le dépôt forké sur votre machine locale.
|
||||
```bash
|
||||
git clone https://xxxx/votre-utilisateur/votre-repo.git
|
||||
```
|
||||
|
||||
3. **Créer une branche** : Créez une nouvelle branche pour votre fonctionnalité ou correction.
|
||||
```bash
|
||||
git checkout -b ma-nouvelle-branche
|
||||
```
|
||||
|
||||
4. **Faire des modifications** : Apportez vos modifications ou ajoutez de nouvelles notes techniques dans la structure de dossiers appropriée.
|
||||
|
||||
5. **Commits** : Faites des commits de vos modifications avec des messages clairs et concis.
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Ajouter une nouvelle note sur [sujet]"
|
||||
```
|
||||
|
||||
6. **Pousser votre branche** : Poussez votre branche vers votre dépôt forké.
|
||||
```bash
|
||||
git push origin ma-nouvelle-branche
|
||||
```
|
||||
|
||||
7. **Créer une Pull Request** : Allez sur la page de votre dépôt forké et cliquez sur "New Pull Request". Décrivez vos modifications dans la description de la Pull Request.
|
||||
|
||||
## Lignes Directrices pour les Contributions
|
||||
|
||||
- **Clarté et précision** : Assurez-vous que vos notes sont claires, précises et faciles à suivre.
|
||||
- **Formatage** : Utilisez le format Markdown pour rédiger vos notes. Utilisez des titres, des sous-titres, des listes et du code formaté pour une meilleure lisibilité.
|
||||
- **Consistance** : Suivez le même style et les mêmes conventions que les autres notes du dépôt.
|
||||
- **Licences et droits d'auteur** : Assurez-vous que votre contribution n'enfreint aucun droit d'auteur. Mentionnez les sources si vous vous basez sur des travaux existants.
|
||||
|
||||
## Suggestions et Discussions
|
||||
|
||||
Si vous avez des idées, des suggestions ou des questions, n'hésitez pas à ouvrir une issue. Nous encourageons les discussions et le brainstorming pour améliorer ce projet.
|
||||
|
||||
## Code de Conduite
|
||||
|
||||
En contribuant à ce projet, vous acceptez de respecter notre [Code de Conduite](code_of_conduct.md). Veuillez lire ce document pour comprendre les comportements que nous attendons et ceux que nous n'acceptons pas.
|
||||
|
||||
Merci de votre contribution !
|
||||
@@ -1,4 +1,7 @@
|
||||
all_inclusive
|
||||
common
|
||||
server-dhcp
|
||||
server-httpd
|
||||
server-mail
|
||||
server-mariadb
|
||||
server-postgres
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
LICENSE="Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0"
|
||||
|
||||
# Recherche récursive de tous les fichiers contenant un shebang #!/bin/bash
|
||||
find . -type f -exec grep -l "^#!/bin/bash" {} \; | while read -r file; do
|
||||
echo "Traitement du fichier : $file"
|
||||
|
||||
# Vérifie si la deuxième et troisième ligne contiennent une mention de licence
|
||||
sed -i.bak -e '2,3d' "$file"
|
||||
|
||||
# Insère la nouvelle licence après le shebang
|
||||
sed -i "2i # $LICENSE" "$file"
|
||||
|
||||
echo "Licence mise à jour dans : $file"
|
||||
done
|
||||
|
||||
echo "Mise à jour terminée."
|
||||
@@ -3,16 +3,16 @@
|
||||
Ce guide vous explique comment télécharger et exécuter les scripts d'installation et de configuration disponibles dans ce dépôt.
|
||||
|
||||
## 🛠 Prérequis
|
||||
|
||||
Avant d'utiliser les scripts, assurez-vous d'avoir :
|
||||
- Un système Linux Debian like
|
||||
- `git` installé sur votre machine si vous déployez avec GIT
|
||||
Avant d'utiliser les scripts, assurez-vous de disposer des éléments suivants :
|
||||
- Un système Linux de type Debian
|
||||
- `git` installé si vous déployez avec GIT (sauf méthode 3)
|
||||
- Les droits administrateur (`sudo`)
|
||||
|
||||
## 🚀 Installation
|
||||
Vous avez trois options pour récupérer les scripts. La troisième est recommandée.
|
||||
|
||||
### 1️⃣ Cloner le dépôt
|
||||
Si vous souhaitez récupérer l'intégralité du projet, utilisez :
|
||||
Si vous souhaitez récupérer l'intégralité du projet, utilisez la commande suivante :
|
||||
```bash
|
||||
git clone https://git.abonnel.fr/cedricAbonnel/notes-techniques.git
|
||||
cd notes-techniques/scripts
|
||||
@@ -27,29 +27,80 @@ git sparse-checkout add scripts/server-mail
|
||||
```
|
||||
Remplacez `server-mail` par le dossier du service que vous souhaitez installer.
|
||||
|
||||
### 3️⃣ Exécuter un script d'installation
|
||||
Une fois dans le bon dossier, lancez le script d'installation correspondant. Par exemple, pour installer un serveur de messagerie :
|
||||
### 3️⃣ Exécuter le script d'installation personnalisé (recommandé)
|
||||
Un script personnalisé permet de télécharger un ou plusieurs scripts en fonction des éléments sélectionnés. Il offre les avantages suivants :
|
||||
- Mise à jour automatique avec la dernière version disponible
|
||||
- Téléchargement sélectif des scripts depuis le dépôt
|
||||
- Interface interactive de sélection des scripts avec `whiptail`
|
||||
- Suppression des fichiers obsolètes
|
||||
- Application automatique des permissions d'exécution
|
||||
- Pas besoin d'avoir le programme `git`
|
||||
|
||||
---
|
||||
|
||||
# 🔄 Installation et mise à jour automatique des scripts
|
||||
|
||||
## 🛠 Prérequis
|
||||
Avant d'exécuter le script, assurez-vous que votre système répond aux exigences suivantes :
|
||||
- Système d'exploitation Linux
|
||||
- `bash` installé
|
||||
- `wget` installé
|
||||
- `whiptail` (inclus dans `dialog` sur certaines distributions)
|
||||
|
||||
Pour installer les dépendances, utilisez la commande suivante :
|
||||
```bash
|
||||
sudo apt update && sudo apt install -y wget dialog
|
||||
```
|
||||
(Sur une distribution utilisant `yum` ou `dnf`, adaptez la commande en conséquence.)
|
||||
|
||||
## 📥 Installation
|
||||
### 1️⃣ Télécharger le script
|
||||
```bash
|
||||
wget -O fetch_scripts.sh https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh
|
||||
```
|
||||
|
||||
### 2️⃣ Rendre le script exécutable
|
||||
```bash
|
||||
chmod +x fetch_scripts.sh
|
||||
```
|
||||
|
||||
### 3️⃣ Exécuter le script
|
||||
```bash
|
||||
./fetch_scripts.sh
|
||||
```
|
||||
|
||||
Accédez ensuite au dossier de votre choix et exécutez le script d'installation correspondant. Par exemple, pour installer un serveur de messagerie :
|
||||
```bash
|
||||
cd scripts/server-mail
|
||||
./setup_server.sh
|
||||
```
|
||||
Suivez ensuite les instructions affichées.
|
||||
|
||||
## 📌 Utilisation du script de téléchargement automatique
|
||||
## ⚙️ Fonctionnement du script
|
||||
Le script permet de :
|
||||
- Se mettre à jour automatiquement en téléchargeant la dernière version disponible
|
||||
- Télécharger une liste de scripts depuis le dépôt
|
||||
- Offrir une interface interactive pour sélectionner les scripts à télécharger
|
||||
- Supprimer les fichiers obsolètes
|
||||
- Appliquer les permissions d'exécution aux scripts téléchargés
|
||||
|
||||
Si vous préférez récupérer uniquement les fichiers nécessaires sans passer par Git, vous pouvez utiliser le script de téléchargement automatique :
|
||||
|
||||
### 1️⃣ Télécharger le script
|
||||
```bash
|
||||
wget -O fetch_scripts.sh "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh"
|
||||
chmod +x fetch_scripts.sh
|
||||
```
|
||||
|
||||
### 2️⃣ Exécuter le script
|
||||
## 🔄 Mise à jour des scripts
|
||||
Le script se met à jour automatiquement à chaque exécution si une nouvelle version est disponible. Pour forcer une mise à jour, exécutez :
|
||||
```bash
|
||||
./fetch_scripts.sh
|
||||
```
|
||||
Le script vous proposera une liste de dossiers. Sélectionnez ceux que vous souhaitez télécharger.
|
||||
|
||||
## 🛠 Problèmes courants
|
||||
|
||||
- **Erreur : `whiptail: command not found`**
|
||||
- Installez `whiptail` avec la commande suivante :
|
||||
```bash
|
||||
sudo apt install dialog # ou sudo yum install dialog
|
||||
```
|
||||
|
||||
- **Erreur de connexion au dépôt**
|
||||
- Vérifiez votre connexion internet
|
||||
- Assurez-vous que l'URL du dépôt est correcte
|
||||
|
||||
## 📖 Support & Contribution
|
||||
Si vous rencontrez un problème ou souhaitez proposer une amélioration, consultez le fichier `CONTRIBUTING.md` ou ouvrez une issue sur le dépôt.
|
||||
|
||||
@@ -16,9 +16,9 @@ Consulter le document d'[installation](INSTALL.md).
|
||||
## 🤝 Contribution
|
||||
|
||||
Vous pouvez ajouter de nouveaux scripts en respectant la structure existante et en documentant leur fonctionnement.
|
||||
Consulter le document de [contribution](CONTRIBUTING.md) pour plus d'informations.
|
||||
Consulter le document de [contribution](../CONTRIBUTING.md) pour plus d'informations.
|
||||
|
||||
## 📜 Licence
|
||||
|
||||
Ce projet est sous licence [MIT](LICENSE). Vous trouverez plus d'explications dans la [note d'informations concernant la Licence MIT en français](LICENCE_FR.md).
|
||||
Ce projet est sous licence [CC By-NC](../LICENSE.md). Vous trouverez plus d'explications dans la [note d'informations concernant la Licence en français](../LICENCE_FR.md).
|
||||
|
||||
|
||||
1
scripts/all_inclusive/.list_files.txt
Normal file
1
scripts/all_inclusive/.list_files.txt
Normal file
@@ -0,0 +1 @@
|
||||
lychee_install.sh
|
||||
159
scripts/all_inclusive/lychee_install.sh
Normal file
159
scripts/all_inclusive/lychee_install.sh
Normal file
@@ -0,0 +1,159 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Vérifier que le script est lancé en root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Ce script doit être exécuté en tant que root." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Définir les variables
|
||||
DB_NAME="lychee"
|
||||
DB_USER="lycheeuser"
|
||||
LYCHEE_DIR="/var/www/lychee"
|
||||
APACHE_CONF="/etc/apache2/sites-available/lychee.conf"
|
||||
PHP_VERSION="8.3"
|
||||
|
||||
PHP_INI_CLI="/etc/php/${PHP_VERSION}/cli/php.ini"
|
||||
PHP_INI_APACHE="/etc/php/${PHP_VERSION}/apache2/php.ini"
|
||||
|
||||
TIMEZONE=$(timedatectl show --value --property=Timezone)
|
||||
|
||||
# Générer un mot de passe alphanumérique sécurisé
|
||||
DB_PASSWORD=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16)
|
||||
echo "Mot de passe généré pour la base de données : ${DB_PASSWORD}"
|
||||
|
||||
# Sauvegarde temporaire root-only
|
||||
echo "${DB_PASSWORD}" > /root/.lychee_db_password
|
||||
chmod 600 /root/.lychee_db_password
|
||||
|
||||
# Mise à jour du système
|
||||
apt update && apt upgrade -y
|
||||
|
||||
# Ajout du dépôt Sury pour PHP 8.3
|
||||
apt install -y apt-transport-https lsb-release ca-certificates wget gnupg2
|
||||
wget -qO - https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/php.gpg
|
||||
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
|
||||
apt update
|
||||
|
||||
# Installation des paquets nécessaires
|
||||
apt install -y apache2 mariadb-server php${PHP_VERSION} php${PHP_VERSION}-cli php${PHP_VERSION}-intl php${PHP_VERSION}-xmlrpc \
|
||||
php${PHP_VERSION}-soap php${PHP_VERSION}-mysql php${PHP_VERSION}-zip php${PHP_VERSION}-gd php${PHP_VERSION}-tidy \
|
||||
php${PHP_VERSION}-mbstring php${PHP_VERSION}-curl php${PHP_VERSION}-xml php${PHP_VERSION}-bcmath php${PHP_VERSION}-imagick \
|
||||
php${PHP_VERSION}-tokenizer libapache2-mod-php${PHP_VERSION} unzip
|
||||
|
||||
# Définir la timezone PHP pour CLI et Apache
|
||||
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_CLI}"
|
||||
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_APACHE}"
|
||||
|
||||
# Sécuriser MariaDB
|
||||
mysql_secure_installation <<EOF
|
||||
|
||||
y
|
||||
n
|
||||
y
|
||||
y
|
||||
y
|
||||
y
|
||||
EOF
|
||||
|
||||
# Créer la base et l'utilisateur avec droits restreints
|
||||
mysql <<EOF
|
||||
CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASSWORD}';
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
|
||||
# Télécharger et installer Lychee proprement
|
||||
cd /tmp
|
||||
wget https://github.com/LycheeOrg/Lychee/releases/latest/download/Lychee.zip
|
||||
unzip Lychee.zip
|
||||
rm -rf ${LYCHEE_DIR}
|
||||
mv Lychee ${LYCHEE_DIR}
|
||||
rm Lychee.zip
|
||||
|
||||
# Demander le nom de domaine ou l'IP publique
|
||||
read -p "Entrez le nom de domaine ou l'adresse IP d'accès à Lychee (ex: lychee.mondomaine.fr ou 192.168.1.100) : " LYCHEE_HOST
|
||||
|
||||
# Forcer le protocole HTTP pour APP_URL
|
||||
APP_URL="http://${LYCHEE_HOST}"
|
||||
|
||||
# Modification du .env
|
||||
cp ${LYCHEE_DIR}/.env.example ${LYCHEE_DIR}/.env
|
||||
|
||||
sed -i "s|^APP_URL=.*|APP_URL=${APP_URL}|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=mysql|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^DB_PORT=.*|DB_PORT=3306|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^#*DB_DATABASE=.*|DB_DATABASE=${DB_NAME}|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^#*DB_USERNAME=.*|DB_USERNAME=${DB_USER}|" ${LYCHEE_DIR}/.env
|
||||
sed -i "s|^#*DB_PASSWORD=.*|DB_PASSWORD=\"${DB_PASSWORD}\"|" ${LYCHEE_DIR}/.env
|
||||
|
||||
# Définir le fuseau horaire
|
||||
echo "APP_TIMEZONE=Europe/Paris" >> ${LYCHEE_DIR}/.env
|
||||
|
||||
# Propriétés et permissions
|
||||
chown -R www-data:www-data ${LYCHEE_DIR}
|
||||
chmod 640 ${LYCHEE_DIR}/.env
|
||||
find ${LYCHEE_DIR} -type f -exec chmod 640 {} \;
|
||||
find ${LYCHEE_DIR} -type d -exec chmod 750 {} \;
|
||||
|
||||
# Permissions spécifiques pour data/upload
|
||||
chmod -R 750 ${LYCHEE_DIR}/uploads/ ${LYCHEE_DIR}/data/
|
||||
|
||||
# Permissions spécifiques attendues par Lychee
|
||||
chmod -R g+s ${LYCHEE_DIR}/public/uploads
|
||||
chmod -R g+s ${LYCHEE_DIR}/public/sym
|
||||
chmod 2775 ${LYCHEE_DIR}/public/uploads
|
||||
chmod 2775 ${LYCHEE_DIR}/public/uploads/import
|
||||
chmod 2775 ${LYCHEE_DIR}/public/sym
|
||||
chmod 0664 ${LYCHEE_DIR}/public/uploads/import/index.html
|
||||
chmod 0664 ${LYCHEE_DIR}/public/sym/index.html
|
||||
chmod 2775 ${LYCHEE_DIR}/storage/tmp/jobs
|
||||
chmod 2775 ${LYCHEE_DIR}/storage/tmp/uploads
|
||||
chmod -R g+s ${LYCHEE_DIR}/storage/tmp/jobs
|
||||
chmod -R g+s ${LYCHEE_DIR}/storage/tmp/uploads
|
||||
|
||||
# Protéger les fichiers sensibles via .htaccess
|
||||
cat > ${LYCHEE_DIR}/.htaccess <<EOF
|
||||
<FilesMatch "\.(env|env\.example|sql|log|conf)$">
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
EOF
|
||||
|
||||
# Configuration Apache
|
||||
cat > ${APACHE_CONF} <<EOF
|
||||
<VirtualHost *:80>
|
||||
ServerAdmin webmaster@localhost
|
||||
DocumentRoot ${LYCHEE_DIR}/public
|
||||
|
||||
<Directory ${LYCHEE_DIR}/public>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
ErrorLog \${APACHE_LOG_DIR}/lychee_error.log
|
||||
CustomLog \${APACHE_LOG_DIR}/lychee_access.log combined
|
||||
|
||||
LimitRequestBody 10485760
|
||||
</VirtualHost>
|
||||
EOF
|
||||
|
||||
# Désactiver modules inutiles
|
||||
a2dismod -f autoindex status cgi userdir
|
||||
|
||||
# Activer Lychee et désactiver le site par défaut
|
||||
a2enmod rewrite
|
||||
a2ensite lychee.conf
|
||||
a2dissite 000-default.conf
|
||||
|
||||
# Recharger Apache
|
||||
systemctl reload apache2
|
||||
|
||||
# Déterminer l'IP locale
|
||||
IP=$(hostname -I | awk '{print $1}')
|
||||
|
||||
echo "Installation de Lychee terminée."
|
||||
echo "Accédez à l’interface web pour finaliser la configuration : http://${IP}"
|
||||
@@ -1,2 +1,3 @@
|
||||
common_utils.sh
|
||||
setup_debian.sh
|
||||
setup_mdns.sh
|
||||
|
||||
@@ -9,6 +9,11 @@ check_root() {
|
||||
fi
|
||||
}
|
||||
|
||||
generate_token() {
|
||||
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c "${1:-32}"
|
||||
echo
|
||||
}
|
||||
|
||||
update_system() {
|
||||
echo "=== Mise à jour du système ==="
|
||||
|
||||
@@ -62,10 +67,10 @@ get_fqdn_and_domain() {
|
||||
# Vérification de la résolution DNS
|
||||
check_dns() {
|
||||
local server_name=$1
|
||||
|
||||
|
||||
# Récupération de l'adresse IP publique du serveur
|
||||
SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')
|
||||
|
||||
|
||||
# Récupération de l'adresse IP associée au FQDN
|
||||
FQDN_IP=$(dig +short A "$server_name" | tail -n1)
|
||||
|
||||
@@ -73,17 +78,18 @@ check_dns() {
|
||||
if [[ -z "$FQDN_IP" ]]; then
|
||||
echo "❌ Erreur : Impossible de récupérer l'adresse IP associée à $server_name via DIG."
|
||||
echo "➡️ Vérifie la configuration DNS et l'existence du domaine."
|
||||
exit 1
|
||||
return 1 # Erreur bloquante uniquement ici
|
||||
fi
|
||||
|
||||
# Comparaison des IPs
|
||||
# Comparaison des IPs mais uniquement en Alerte non bloquante
|
||||
if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
|
||||
echo "⚠️ Alerte DNS : L'adresse IP résolue ($FQDN_IP) ne correspond pas à l'IP publique actuelle ($SERVER_IP)."
|
||||
echo "➡️ Vérifie la configuration DNS et la propagation des enregistrements."
|
||||
exit 1
|
||||
echo "➡️ Vérifie la configuration DNS et la propagation si nécessaire."
|
||||
else
|
||||
echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
|
||||
fi
|
||||
|
||||
echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -138,6 +138,19 @@ configure_locales() {
|
||||
fi
|
||||
}
|
||||
|
||||
configure_timezone() {
|
||||
echo "Détection de la timezone via l'IP publique..."
|
||||
TIMEZONE=$(curl -s https://ipinfo.io/timezone)
|
||||
|
||||
# Définir la timezone via timedatectl
|
||||
echo "Définition de la timezone à : $TIMEZONE"
|
||||
timedatectl set-timezone "$TIMEZONE"
|
||||
}
|
||||
|
||||
install_paquets() {
|
||||
apt install -y curl
|
||||
}
|
||||
|
||||
### SECTION PRINCIPALE : Activer/Désactiver les options ici
|
||||
update_system
|
||||
install_sudo
|
||||
@@ -145,6 +158,8 @@ add_admin_user
|
||||
configure_ssh
|
||||
install_fail2ban
|
||||
configure_locales
|
||||
install_paquets
|
||||
configure_timezone
|
||||
|
||||
echo "Installation et configuration de base terminées."
|
||||
echo "Vous pouvez maintenant vous connecter avec l'utilisateur : $NEW_USER"
|
||||
133
scripts/common/setup_mdns.sh
Normal file
133
scripts/common/setup_mdns.sh
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
set -e
|
||||
|
||||
echo "=== Détection des interfaces réseau actives ==="
|
||||
INTERFACES=$(ip -o link show | awk -F': ' '{print $2}' | grep -Ev 'lo|docker|veth|br|vmnet|virbr')
|
||||
echo "Interfaces détectées : $INTERFACES"
|
||||
ALLOWED_INTERFACES=$(echo "$INTERFACES" | paste -sd "," -)
|
||||
|
||||
echo "=== Installation d'Avahi (mDNS) et des dépendances ==="
|
||||
apt update
|
||||
apt install -y avahi-daemon avahi-utils libnss-mdns nscd systemd-resolved
|
||||
|
||||
echo "=== Vérification de la présence de libnss_mdns.so.2 ==="
|
||||
if [[ ! -f /lib/x86_64-linux-gnu/libnss_mdns.so.2 ]]; then
|
||||
echo "❌ libnss_mdns.so.2 manquante, tentative de réinstallation"
|
||||
apt install --reinstall -y libnss-mdns
|
||||
fi
|
||||
|
||||
echo "=== Configuration de /etc/nsswitch.conf ==="
|
||||
if grep -q '^hosts:' /etc/nsswitch.conf; then
|
||||
sed -i 's/^hosts:.*/hosts: files mdns4 dns/' /etc/nsswitch.conf
|
||||
else
|
||||
echo "hosts: files mdns4 dns" >> /etc/nsswitch.conf
|
||||
fi
|
||||
grep hosts /etc/nsswitch.conf
|
||||
|
||||
echo "=== Redémarrage des caches DNS si présents ==="
|
||||
systemctl restart nscd || echo "nscd non utilisé"
|
||||
systemctl restart systemd-resolved || echo "systemd-resolved non utilisé"
|
||||
|
||||
echo "=== Vérification d'un éventuel service sur le port 80 ==="
|
||||
if ss -tuln | grep -q ':80 '; then
|
||||
echo "❌ Un service écoute déjà sur le port 80. Abandon de la publication HTTP de test."
|
||||
PUBLISH_HTTP=false
|
||||
else
|
||||
PUBLISH_HTTP=true
|
||||
fi
|
||||
|
||||
echo "=== Sauvegarde de la conf avahi ==="
|
||||
cp /etc/avahi/avahi-daemon.conf /etc/avahi/avahi-daemon.conf.bak.$(date +%F-%H%M)
|
||||
|
||||
echo "=== Génération de la configuration avahi-daemon.conf ==="
|
||||
cat > /etc/avahi/avahi-daemon.conf <<EOF
|
||||
[server]
|
||||
host-name=$(hostname)
|
||||
use-ipv4=yes
|
||||
use-ipv6=no
|
||||
allow-interfaces=$ALLOWED_INTERFACES
|
||||
ratelimit-interval-usec=1000000
|
||||
ratelimit-burst=10
|
||||
|
||||
[wide-area]
|
||||
enable-wide-area=no
|
||||
|
||||
[publish]
|
||||
publish-addresses=yes
|
||||
publish-hinfo=yes
|
||||
publish-workstation=yes
|
||||
publish-domain=yes
|
||||
|
||||
[reflector]
|
||||
enable-reflector=no
|
||||
|
||||
[rlimits]
|
||||
rlimit-as=0
|
||||
rlimit-core=0
|
||||
rlimit-data=4194304
|
||||
rlimit-fsize=0
|
||||
rlimit-nofile=300
|
||||
rlimit-stack=4194304
|
||||
EOF
|
||||
|
||||
if $PUBLISH_HTTP; then
|
||||
echo "=== Publication temporaire d'un service HTTP de test ==="
|
||||
mkdir -p /etc/avahi/services
|
||||
cat > /etc/avahi/services/test-http.service <<EOF
|
||||
<?xml version="1.0" standalone='no'?>
|
||||
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
|
||||
<service-group>
|
||||
<name replace-wildcards="yes">Test HTTP on %h</name>
|
||||
<service>
|
||||
<type>_http._tcp</type>
|
||||
<port>80</port>
|
||||
</service>
|
||||
</service-group>
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "=== Activation et redémarrage du service Avahi ==="
|
||||
systemctl enable avahi-daemon
|
||||
systemctl restart avahi-daemon
|
||||
|
||||
echo "=== Vérification du statut du service ==="
|
||||
systemctl status avahi-daemon --no-pager || { echo "❌ Avahi ne fonctionne pas."; exit 1; }
|
||||
|
||||
echo "=== Vérification du multicast sur l'interface ==="
|
||||
ip a | grep MULTICAST || echo "⚠️ Aucune interface multicast détectée"
|
||||
|
||||
echo "=== Vérification de l'écoute sur le port UDP 5353 ==="
|
||||
ss -uln | grep 5353 || echo "⚠️ Aucun service écoutant sur UDP/5353"
|
||||
|
||||
echo "=== Test de la résolution mDNS avec getent (NSS) ==="
|
||||
LOCAL_HOST="$(hostname).local"
|
||||
if getent hosts "$LOCAL_HOST"; then
|
||||
echo "✅ Résolution mDNS de $LOCAL_HOST réussie via getent"
|
||||
else
|
||||
echo "❌ La résolution mDNS de $LOCAL_HOST a échoué via getent"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Scan des services mDNS disponibles ==="
|
||||
avahi-browse -a -t || echo "⚠️ Aucun service mDNS visible (normal si peu de services publiés)"
|
||||
|
||||
echo "✅ mDNS opérationnel sur : $ALLOWED_INTERFACES"
|
||||
echo "$INTERFACES" > /var/log/mdns_interfaces.log
|
||||
echo "Interfaces enregistrées dans /var/log/mdns_interfaces.log"
|
||||
|
||||
if $PUBLISH_HTTP; then
|
||||
echo "=== Suppression du service HTTP de test ==="
|
||||
rm -f /etc/avahi/services/test-http.service
|
||||
systemctl restart avahi-daemon
|
||||
echo "✅ Service HTTP de test retiré proprement"
|
||||
fi
|
||||
|
||||
echo "✅ Script terminé avec succès"
|
||||
@@ -4,3 +4,4 @@ get_first_free_ip.sh
|
||||
remove_dns_entry.sh
|
||||
search_entry.sh
|
||||
setup_dhcp.sh
|
||||
setup_nat_auto.sh
|
||||
|
||||
@@ -89,11 +89,11 @@ for HOSTNAME in "${HOSTNAMES[@]}"; do
|
||||
if is_hostname_registered "$FQDN"; then
|
||||
echo "L'association $FQDN -> $IP existe déjà."
|
||||
else
|
||||
read -t 5 -p "Le FQDN $FQDN n'est pas dans la liste. Voulez-vous l'ajouter ? (o/N) 5s " REPLY
|
||||
read -p "Le FQDN $FQDN n'est pas dans la liste. Voulez-vous l'ajouter ? (o/N) " REPLY
|
||||
# Si aucune entrée n'est faite dans le délai imparti, on met "n" par défaut
|
||||
if [[ -z "$REPLY" ]]; then
|
||||
REPLY="n"
|
||||
echo -e "\nTemps écoulé. Réponse par défaut : n"
|
||||
echo -e "\nRéponse par défaut : n"
|
||||
fi
|
||||
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
||||
echo "address=/$FQDN/$IP" >> "$DNSMASQ_CONF"
|
||||
@@ -140,10 +140,10 @@ for HOSTNAME in "${HOSTNAMES[@]}"; do
|
||||
if [[ "$(get_actual_fqdn "$IP")" != "$ACTUAL_FQDN" ]]; then
|
||||
if [[ -n "$EXISTING_PTR" ]]; then
|
||||
if [[ "$EXISTING_PTR" != "ptr-record=$PTR_RECORD,$ACTUAL_FQDN" ]]; then
|
||||
read -t 5 -p "Voulez-vous le remplacer ? (o/N) 5s " REPLY
|
||||
read -p "Voulez-vous le remplacer ? (o/N) " REPLY
|
||||
if [[ -z "$REPLY" ]]; then
|
||||
REPLY="n"
|
||||
echo -e "\nTemps écoulé. Réponse par défaut : n"
|
||||
echo -e "\nRéponse par défaut : n"
|
||||
fi
|
||||
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
|
||||
sed -i "/ptr-record=$PTR_RECORD/d" "$DNSMASQ_CONF"
|
||||
|
||||
@@ -1,103 +1,63 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
# Fichier contenant les enregistrements
|
||||
FILE="/etc/dnsmasq.d/custom_hosts"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
# Vérifie si une IP est fournie
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <IP>"
|
||||
# Vérification de l'existence du fichier
|
||||
if [[ ! -f "$FILE" ]]; then
|
||||
echo "Erreur: Le fichier $FILE n'existe pas."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IP="$1"
|
||||
|
||||
echo "🔍 Recherche du nom d'hôte pour l'IP : $IP"
|
||||
|
||||
# Fonction pour vérifier si une commande est disponible
|
||||
command_exists() {
|
||||
command -v "$1" &> /dev/null
|
||||
}
|
||||
|
||||
# Détection du serveur DNS en prenant en compte dnsmasq et fallback sur resolv.conf
|
||||
get_dns_server() {
|
||||
local dns_server=""
|
||||
|
||||
if command_exists resolvectl; then
|
||||
dns_server=$(resolvectl dns | awk '/^Global:/ {print $2; exit}')
|
||||
fi
|
||||
|
||||
if [ -z "$dns_server" ] && command_exists dnsmasq; then
|
||||
dns_server=$(ss -tulpn | grep dnsmasq | awk '{print $5}' | cut -d: -f1 | head -n1)
|
||||
fi
|
||||
|
||||
if [ -z "$dns_server" ] && [ -f /etc/resolv.conf ]; then
|
||||
dns_server=$(grep -m1 '^nameserver' /etc/resolv.conf | awk '{print $2}')
|
||||
fi
|
||||
|
||||
echo "${dns_server:-9.9.9.9}" # Utilisation d'un fallback 9.9.9.9 si aucun DNS trouvé
|
||||
}
|
||||
|
||||
DNS_SERVER=$(get_dns_server)
|
||||
echo "🛜 Serveur DNS détecté : $DNS_SERVER"
|
||||
|
||||
# 1️⃣ Test LLMNR (Link-Local Multicast Name Resolution)
|
||||
if command_exists resolvectl; then
|
||||
HOSTNAME_LLMNR=$(resolvectl query "$IP" 2>/dev/null | grep -oP '(?<=Name:\s).*' | head -n1)
|
||||
if [ -n "$HOSTNAME_LLMNR" ]; then
|
||||
echo "✅ LLMNR: $HOSTNAME_LLMNR"
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo "⚠ LLMNR non disponible (resolvectl absent)"
|
||||
# Vérification des arguments
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "Usage: $0 <nom_machine|FQDN|adresse_IP>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2️⃣ Test mDNS (Multicast DNS / Avahi)
|
||||
if command_exists avahi-resolve; then
|
||||
HOSTNAME_MDNS=$(avahi-resolve -a "$IP" 2>/dev/null | awk '{print $2}')
|
||||
if [ -n "$HOSTNAME_MDNS" ]; then
|
||||
echo "✅ mDNS (Avahi): $HOSTNAME_MDNS"
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo "⚠ mDNS non disponible (avahi-resolve absent)"
|
||||
SEARCH_TERM="$1"
|
||||
|
||||
# Détection du nom de domaine
|
||||
if [[ -f /etc/resolv.conf ]]; then
|
||||
DOMAIN=$(awk '/^search / {print $2; exit} /^domain / {print $2; exit}' /etc/resolv.conf)
|
||||
fi
|
||||
|
||||
# 3️⃣ Vérification du cache ARP
|
||||
if command_exists arp; then
|
||||
HOSTNAME_ARP=$(arp -a | grep "$IP" | awk '{print $1}')
|
||||
if [ -n "$HOSTNAME_ARP" ]; then
|
||||
echo "✅ ARP: $HOSTNAME_ARP"
|
||||
exit 0
|
||||
# Alternative si resolv.conf n'existe pas ou est vide
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
DOMAIN=$(hostname --domain 2>/dev/null) # Essayer avec hostname
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
DOMAIN=$(nmcli -t -f IP4.DOMAIN dev show | head -n 1) # Essayer avec nmcli
|
||||
fi
|
||||
else
|
||||
echo "⚠ ARP non disponible"
|
||||
fi
|
||||
|
||||
# 4️⃣ Vérification via NetBIOS (Windows/Samba)
|
||||
if command_exists nmblookup; then
|
||||
HOSTNAME_NETBIOS=$(nmblookup -A "$IP" 2>/dev/null | grep -m1 '<00>' | awk '{print $1}')
|
||||
if [ -n "$HOSTNAME_NETBIOS" ]; then
|
||||
echo "✅ NetBIOS: $HOSTNAME_NETBIOS"
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo "⚠ NetBIOS non disponible (nmblookup absent)"
|
||||
# Vérifier qu'on a bien trouvé un domaine
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
echo "Erreur: Impossible de détecter le nom de domaine."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 5️⃣ Scan réseau avec Nmap pour identifier l'hôte
|
||||
if command_exists nmap; then
|
||||
HOSTNAME_NMAP=$(nmap --dns-servers "$DNS_SERVER" -sP "$IP" 2>/dev/null | grep "Nmap scan report" | awk '{print $5}')
|
||||
if [ -n "$HOSTNAME_NMAP" ]; then
|
||||
echo "✅ Nmap: $HOSTNAME_NMAP"
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo "⚠ Nmap non disponible"
|
||||
# Si l'entrée ne contient pas un point, on ajoute le domaine détecté
|
||||
if [[ ! "$SEARCH_TERM" =~ \. ]]; then
|
||||
SEARCH_TERM="$SEARCH_TERM.$DOMAIN"
|
||||
fi
|
||||
|
||||
# Vérification si l'entrée est une adresse IP
|
||||
if [[ "$SEARCH_TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
RESULTS=$(grep -E "/$SEARCH_TERM\$" "$FILE")
|
||||
else
|
||||
if [[ ! "$SEARCH_TERM" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
|
||||
echo "Erreur: '$SEARCH_TERM' ne semble pas être un FQDN valide."
|
||||
exit 1
|
||||
fi
|
||||
RESULTS=$(grep -E "^address=/$SEARCH_TERM/" "$FILE")
|
||||
fi
|
||||
|
||||
# Vérification et affichage des résultats
|
||||
if [[ -n "$RESULTS" ]]; then
|
||||
echo "Résultats trouvés :"
|
||||
echo "$RESULTS"
|
||||
else
|
||||
echo "Aucun résultat trouvé pour '$SEARCH_TERM'."
|
||||
fi
|
||||
|
||||
echo "❌ Aucune correspondance trouvée."
|
||||
exit 1
|
||||
|
||||
@@ -18,11 +18,23 @@ NETMASK_CIDR=$(echo "$IP_INFO" | cut -d'/' -f2)
|
||||
# Extraire le préfixe réseau (ex: "192.168.100")
|
||||
PREFIX=$(echo "$NETWORK_IP" | awk -F. '{print $1"."$2"."$3}')
|
||||
|
||||
# Calculer les bornes de la plage d'adresses IP en fonction du masque
|
||||
NETMASK=$(( 32 - NETMASK_CIDR ))
|
||||
TOTAL_HOSTS=$(( 2 ** NETMASK ))
|
||||
# Calculer la plage IP en fonction du masque
|
||||
TOTAL_HOSTS=$(( 2 ** (32 - NETMASK_CIDR) ))
|
||||
IP_RANGE_START="$PREFIX.1"
|
||||
IP_RANGE_END="$PREFIX.$(( TOTAL_HOSTS - 2 ))" # -2 pour exclure le broadcast
|
||||
IP_RANGE_END="$PREFIX.$(( TOTAL_HOSTS - 2 ))" # -2 pour exclure le broadcast et l'adresse réseau
|
||||
|
||||
# Afficher la plage détectée
|
||||
echo "🔍 Plage IP détectée :"
|
||||
echo " ➡ Début : $IP_RANGE_START"
|
||||
echo " ➡ Fin : $IP_RANGE_END"
|
||||
|
||||
# Demander confirmation ou modification de la plage
|
||||
read -p "Nouvelle adresse de début (laisser vide pour conserver $IP_RANGE_START) : " NEW_START
|
||||
read -p "Nouvelle adresse de fin (laisser vide pour conserver $IP_RANGE_END) : " NEW_END
|
||||
|
||||
# Si l'utilisateur ne saisit rien, conserver les valeurs détectées
|
||||
IP_RANGE_START=${NEW_START:-$IP_RANGE_START}
|
||||
IP_RANGE_END=${NEW_END:-$IP_RANGE_END}
|
||||
|
||||
# Fichier contenant les réservations DHCP
|
||||
RESERVATION_FILE="/etc/dnsmasq.d/custom_hosts"
|
||||
@@ -49,33 +61,23 @@ fi
|
||||
# Lire toutes les IP utilisées dans le fichier de réservation
|
||||
USED_IPS=($(grep -oE 'address=/[^/]+/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "$RESERVATION_FILE" | awk -F'/' '{print $3}'))
|
||||
|
||||
# Si aucune IP n'est réservée, retourner la première adresse disponible
|
||||
if [[ ${#USED_IPS[@]} -eq 0 ]]; then
|
||||
echo "✅ Première IP disponible : $IP_RANGE_START"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Trouver la plus grande IP utilisée
|
||||
MAX_IP_INT=0
|
||||
for ip in "${USED_IPS[@]}"; do
|
||||
ip_int=$(ip_to_int "$ip")
|
||||
if (( ip_int > MAX_IP_INT )); then
|
||||
MAX_IP_INT=$ip_int
|
||||
fi
|
||||
done
|
||||
|
||||
# Calculer la prochaine IP disponible
|
||||
NEXT_IP_INT=$((MAX_IP_INT + 1))
|
||||
NEXT_IP=$(int_to_ip "$NEXT_IP_INT")
|
||||
|
||||
# Vérifier que cette IP est bien dans la plage autorisée
|
||||
# Vérification et recherche de la première IP disponible
|
||||
START_INT=$(ip_to_int "$IP_RANGE_START")
|
||||
END_INT=$(ip_to_int "$IP_RANGE_END")
|
||||
|
||||
if (( NEXT_IP_INT > END_INT )); then
|
||||
echo "❌ Plus aucune IP disponible dans la plage définie."
|
||||
exit 1
|
||||
fi
|
||||
CURRENT_IP_INT=$START_INT
|
||||
|
||||
echo "✅ Première IP disponible : $NEXT_IP"
|
||||
exit 0
|
||||
while (( CURRENT_IP_INT <= END_INT )); do
|
||||
CURRENT_IP=$(int_to_ip "$CURRENT_IP_INT")
|
||||
|
||||
# Vérifier si l'IP est déjà réservée
|
||||
if [[ ! " ${USED_IPS[@]} " =~ " $CURRENT_IP " ]]; then
|
||||
echo "✅ Première IP disponible : $CURRENT_IP"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
(( CURRENT_IP_INT++ ))
|
||||
done
|
||||
|
||||
echo "❌ Plus aucune IP disponible dans la plage définie."
|
||||
exit 1
|
||||
|
||||
@@ -12,26 +12,62 @@ if ! command -v dnsmasq &> /dev/null; then
|
||||
echo "Installation de dnsmasq..."
|
||||
apt update && apt install -y dnsmasq
|
||||
echo "Installation d'outils réseau..."
|
||||
apt install -y systemd-resolved avahi-utils net-tools smbclient nmap
|
||||
apt install -y avahi-utils net-tools smbclient nmap
|
||||
systemctl disable --now avahi-daemon
|
||||
else
|
||||
echo "dnsmasq est déjà installé."
|
||||
fi
|
||||
|
||||
# Récupérer toutes les interfaces réseau sauf loopback
|
||||
mapfile -t NOMS < <(ip -o link show | awk -F': ' '{print $2}' | grep -v lo)
|
||||
|
||||
# Obtenir l'adresse IP du serveur sur l'interface principale
|
||||
IP_SERVEUR=$(ip -4 addr show $(ip route show default | awk '/default/ {print $5}') | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
|
||||
if [[ -z "$IP_SERVEUR" ]]; then
|
||||
echo "Impossible de déterminer l'adresse IP du serveur."
|
||||
if [[ ${#NOMS[@]} -eq 0 ]]; then
|
||||
echo "Aucune interface réseau trouvée."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier si l'IP est dans une plage privée autorisée
|
||||
if [[ "$IP_SERVEUR" =~ ^10\..* || "$IP_SERVEUR" =~ ^192\.168\..* || "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\..* ]]; then
|
||||
echo "Adresse IP privée détectée : $IP_SERVEUR"
|
||||
# Construire les options avec IP si existante
|
||||
OPTIONS=()
|
||||
for IFACE in "${NOMS[@]}"; do
|
||||
# Nettoyer l'interface de @ifX
|
||||
IFACE_CLEAN=$(echo "$IFACE" | cut -d'@' -f1)
|
||||
IP=$(ip -4 -o addr show "$IFACE_CLEAN" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1)
|
||||
if [[ -n "$IP" ]]; then
|
||||
OPTIONS+=("$IFACE_CLEAN ($IP)")
|
||||
else
|
||||
OPTIONS+=("$IFACE_CLEAN (Pas d'IP)")
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Sélectionnez l'interface réseau à utiliser (IP affichée si existante) :"
|
||||
PS3="Votre choix : "
|
||||
select CHOIX in "${OPTIONS[@]}"; do
|
||||
if [[ -n "$CHOIX" ]]; then
|
||||
INTERFACE=$(echo "$CHOIX" | awk '{print $1}')
|
||||
break
|
||||
else
|
||||
echo "Choix invalide. Veuillez réessayer."
|
||||
fi
|
||||
done
|
||||
|
||||
# Maintenant que l'interface est choisie, récupérer l'IP
|
||||
IP_EXISTANTE=$(ip -4 -o addr show "$INTERFACE" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1)
|
||||
|
||||
if [[ -n "$IP_EXISTANTE" ]]; then
|
||||
IP_SERVEUR="$IP_EXISTANTE"
|
||||
else
|
||||
echo "Erreur : L'adresse IP $IP_SERVEUR n'est pas dans un réseau privé."
|
||||
exit 1
|
||||
read -rp "Aucune IP détectée sur $INTERFACE. Veuillez entrer une IP à utiliser : " IP_SAISIE
|
||||
IP_SERVEUR="$IP_SAISIE"
|
||||
fi
|
||||
|
||||
echo "✅ Interface sélectionnée : $INTERFACE"
|
||||
echo "✅ Adresse IP sélectionnée : $IP_SERVEUR"
|
||||
|
||||
# Vérifier si l'IP est privée ou publique
|
||||
if [[ "$IP_SERVEUR" =~ ^10\. ]] || [[ "$IP_SERVEUR" =~ ^192\.168\. ]] || [[ "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then
|
||||
echo "✅ Adresse IP privée détectée : $IP_SERVEUR"
|
||||
else
|
||||
echo "⚠️ Attention : L'adresse IP $IP_SERVEUR semble PUBLIQUE !"
|
||||
fi
|
||||
|
||||
FORCE=false
|
||||
@@ -40,8 +76,10 @@ if [[ "$1" == "--force" ]]; then
|
||||
echo "Mode forçage activé : reconfiguration complète..."
|
||||
fi
|
||||
|
||||
if systemctl is-active --quiet dnsmasq && [ "$FORCE" = false ]; then
|
||||
echo "dnsmasq est déjà actif et configuré. Utilisez --force pour reconfigurer."
|
||||
DNSMASQ_CONF="/etc/dnsmasq.conf"
|
||||
|
||||
if grep -q "# CONFIGURE_PAR_CEDRIX" "$DNSMASQ_CONF" && [ "$FORCE" = false ]; then
|
||||
echo "dnsmasq est déjà configuré. Utilisez --force pour reconfigurer."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -88,7 +126,8 @@ fi
|
||||
# Configurer dnsmasq
|
||||
echo "Configuration de dnsmasq..."
|
||||
|
||||
cat <<EOF > /etc/dnsmasq.conf
|
||||
cat <<EOF > $DNSMASQ_CONF
|
||||
# CONFIGURE_PAR_CEDRIX
|
||||
# Configuration de dnsmasq
|
||||
|
||||
# Interface réseau principale
|
||||
@@ -152,10 +191,18 @@ echo 'nameserver 127.0.0.1' > /etc/resolv.conf
|
||||
echo "Configuration DNS mise à jour sur 127.0.0.1"
|
||||
# Redémarrer les services nécessaires
|
||||
echo "Redémarrage des services..."
|
||||
systemctl restart dnsmasq 2>/dev/null && echo "dnsmasq redémarré."
|
||||
systemctl restart systemd-resolved 2>/dev/null && echo "systemd-resolved redémarré."
|
||||
systemctl restart networking 2>/dev/null && echo "networking redémarré."
|
||||
systemctl restart NetworkManager 2>/dev/null && echo "NetworkManager redémarré."
|
||||
for service in dnsmasq systemd-resolved networking NetworkManager; do
|
||||
if systemctl list-unit-files | grep -qw "${service}.service"; then
|
||||
echo "Redémarrage de $service..."
|
||||
if timeout 5s systemctl restart "$service" 2>/dev/null; then
|
||||
echo "$service redémarré."
|
||||
else
|
||||
echo "⚠️ Timeout ou erreur sur $service."
|
||||
fi
|
||||
else
|
||||
echo "Service $service non disponible sur ce système."
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Configuration terminée avec succès!"
|
||||
echo "Serveur DHCP/DNS fonctionnel sur $IP_SERVEUR"
|
||||
|
||||
88
scripts/server-dhcp/setup_nat_auto.sh
Normal file
88
scripts/server-dhcp/setup_nat_auto.sh
Normal file
@@ -0,0 +1,88 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
# Objectif : Faire du NAT du LAN vers le WAN
|
||||
|
||||
# Import des fonctions utilitaires communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérification des droits root
|
||||
check_root
|
||||
|
||||
echo "[+] Détection des interfaces réseau..."
|
||||
|
||||
# Détection de l'interface WAN (par défaut la passerelle)
|
||||
WAN_IF=$(ip route | grep default | awk '{print $5}' | head -n 1)
|
||||
if [[ -z "$WAN_IF" ]]; then
|
||||
echo "[❌] Aucune interface WAN détectée (pas de route par défaut)."
|
||||
exit 1
|
||||
fi
|
||||
echo "[+] Interface WAN détectée : $WAN_IF"
|
||||
|
||||
# Détection de l'interface LAN (IP privée autre que WAN_IF)
|
||||
LAN_IF=""
|
||||
LAN_IP=""
|
||||
LAN_SUBNET=""
|
||||
|
||||
while IFS= read -r line; do
|
||||
IFACE=$(echo "$line" | awk '{print $2}')
|
||||
IP_CIDR=$(echo "$line" | awk '{print $4}')
|
||||
IP_ADDR=${IP_CIDR%%/*}
|
||||
|
||||
# Vérifie que l'interface n'est pas celle du WAN et possède une IP privée
|
||||
if [[ "$IFACE" != "$WAN_IF" ]] && (
|
||||
[[ "$IP_ADDR" =~ ^192\.168\. ]] ||
|
||||
[[ "$IP_ADDR" =~ ^10\. ]] ||
|
||||
([[ "$IP_ADDR" =~ ^172\. ]] && [[ $(echo "$IP_ADDR" | cut -d. -f2) -ge 16 ]] && [[ $(echo "$IP_ADDR" | cut -d. -f2) -le 31 ]])
|
||||
); then
|
||||
LAN_IF="$IFACE"
|
||||
LAN_IP="$IP_ADDR"
|
||||
LAN_SUBNET="$IP_CIDR"
|
||||
break
|
||||
fi
|
||||
done < <(ip -o -4 addr show)
|
||||
|
||||
if [[ -z "$LAN_IF" || -z "$LAN_SUBNET" ]]; then
|
||||
echo "[❌] Impossible de détecter l'interface LAN ou le sous-réseau."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[+] Interface LAN détectée : $LAN_IF ($LAN_IP / $LAN_SUBNET)"
|
||||
echo "[ℹ️] Toutes les interfaces réseau :"
|
||||
ip -o -4 addr show | awk '{print "- Interface:", $2, "=> IP:", $4}'
|
||||
|
||||
if [[ "$LAN_IF" == "$WAN_IF" ]]; then
|
||||
echo "[❌] Erreur : L'interface LAN et WAN sont identiques ($WAN_IF). Corrige ta configuration réseau."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$LAN_IF" ]]; then
|
||||
echo "[+] Interface LAN détectée : $LAN_IF"
|
||||
echo "[+] Sous-réseau LAN détecté : $LAN_SUBNET"
|
||||
else
|
||||
echo "[⚠️] Aucune interface réseau avec une IP privée détectée."
|
||||
echo " Vérifiez votre configuration réseau ou connectez-vous à un réseau local."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
echo "[+] Mise à jour et installation des paquets nécessaires..."
|
||||
apt update -y
|
||||
apt install -y iptables iproute2
|
||||
|
||||
echo "[+] Activation de l'IP forwarding..."
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
sed -i '/^#net.ipv4.ip_forward=1/s/^#//' /etc/sysctl.conf
|
||||
sysctl -p
|
||||
|
||||
echo "[+] Nettoyage des anciennes règles iptables NAT..."
|
||||
iptables -t nat -F
|
||||
iptables -F
|
||||
|
||||
echo "[+] Mise en place du NAT (MASQUERADE)..."
|
||||
iptables -t nat -A POSTROUTING -s "$LAN_SUBNET" -o "$WAN_IF" -j MASQUERADE
|
||||
|
||||
echo "[+] Sauvegarde des règles iptables..."
|
||||
apt install -y iptables-persistent
|
||||
netfilter-persistent save
|
||||
|
||||
echo "[✅] NAT opérationnel : $LAN_SUBNET sort par $WAN_IF"
|
||||
@@ -1,3 +1,5 @@
|
||||
add_domain.sh
|
||||
add_domain_ssl.sh
|
||||
install-php8-3.sh
|
||||
set-permissions-www.sh
|
||||
setup_httpd.sh
|
||||
|
||||
49
scripts/server-httpd/add_domain.sh
Normal file → Executable file
49
scripts/server-httpd/add_domain.sh
Normal file → Executable file
@@ -9,31 +9,19 @@ source "$(dirname "$0")/../common/common_utils.sh"
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
# Vérification DNS
|
||||
check_dns "$DOMAIN"
|
||||
# Vérification DNS (alerte non bloquante)
|
||||
if ! check_dns "$DOMAIN"; then
|
||||
echo "⚠️ Attention : Résolution DNS impossible pour $DOMAIN. Vérifie si c'est bien ce que tu veux."
|
||||
fi
|
||||
|
||||
REVERSED_DOMAIN=$(echo "$DOMAIN" | awk -F. '{for(i=NF; i>0; i--) printf "%s%s", $i, (i>1 ? "." : "")}')
|
||||
VHOST_CONF="/etc/apache2/sites-available/$REVERSED_DOMAIN.conf"
|
||||
LE_DIR="/etc/letsencrypt/live/$DOMAIN"
|
||||
BACKUP_DIR="/etc/apache2/backups"
|
||||
TEMPLATE_DIR="/etc/apache2/templates"
|
||||
TEMPLATE="$TEMPLATE_DIR/vhost-template.conf"
|
||||
CHALLENGE_DIR="/var/www/cedrix/.well-known/acme-challenge"
|
||||
PATH_URL_ACME_CHALLENGE=".well-known/acme-challenge"
|
||||
TEST_FILE="test-challenge"
|
||||
TEST_URL="http://${DOMAIN}/${PATH_URL_ACME_CHALLENGE}/${TEST_FILE}"
|
||||
RANDOM_CONTENT=$(openssl rand -hex 12)
|
||||
|
||||
# Créer les dossiers nécessaires
|
||||
mkdir -p "$BACKUP_DIR" "$TEMPLATE_DIR" "$CHALLENGE_DIR"
|
||||
chown -R www-data:www-data "$CHALLENGE_DIR"
|
||||
|
||||
# Préparer le dossier du VirtualHost
|
||||
mkdir -p "/var/www/$REVERSED_DOMAIN"
|
||||
chown -R www-data:www-data "/var/www/$REVERSED_DOMAIN"
|
||||
chmod -R 755 "/var/www/$REVERSED_DOMAIN"
|
||||
|
||||
|
||||
|
||||
# Vérifier si le VirtualHost HTTP existe déjà
|
||||
if [[ ! -f "$VHOST_CONF" ]]; then
|
||||
echo "=== Création du fichier VirtualHost HTTP pour $DOMAIN ==="
|
||||
@@ -44,11 +32,9 @@ if [[ ! -f "$VHOST_CONF" ]]; then
|
||||
ErrorLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-error.log
|
||||
CustomLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-access.log combined
|
||||
|
||||
# Cedrix challenge
|
||||
Alias /${PATH_URL_ACME_CHALLENGE}/ $CHALLENGE_DIR/
|
||||
<Directory $CHALLENGE_DIR>
|
||||
<Directory /var/www/$REVERSED_DOMAIN>
|
||||
Options +Indexes
|
||||
AllowOverride None
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
@@ -61,26 +47,5 @@ else
|
||||
echo "✅ VirtualHost HTTP déjà configuré pour $DOMAIN."
|
||||
fi
|
||||
|
||||
|
||||
# Vérification d'accès au dossier cedric-challenge
|
||||
echo "Vérification d'accès au dossier ${PATH_URL_ACME_CHALLENGE}"
|
||||
echo "$RANDOM_CONTENT" | sudo tee "$CHALLENGE_DIR/$TEST_FILE" > /dev/null
|
||||
chmod 644 "$CHALLENGE_DIR/$TEST_FILE"
|
||||
RESPONSE=$(curl -s "$TEST_URL")
|
||||
|
||||
if [[ "$RESPONSE" == "$RANDOM_CONTENT" ]]; then
|
||||
echo "✅ Le dossier est accessible depuis l'extérieur."
|
||||
else
|
||||
echo "❌ Le dossier n'est pas accessible depuis l'extérieur."
|
||||
echo "URL testée : $TEST_URL"
|
||||
echo "Vérifiez votre configuration Apache/Nginx, les firewalls, les proxy et les permissions."
|
||||
#sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
|
||||
exit 3
|
||||
fi
|
||||
|
||||
# Suppression du fichier test
|
||||
#sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
|
||||
|
||||
|
||||
echo "✅ Virtual Host configuré pour $DOMAIN avec succès !"
|
||||
exit 0
|
||||
|
||||
0
scripts/server-httpd/add_domain_ssl.sh
Normal file → Executable file
0
scripts/server-httpd/add_domain_ssl.sh
Normal file → Executable file
165
scripts/server-httpd/install-php8-3.sh
Executable file
165
scripts/server-httpd/install-php8-3.sh
Executable file
@@ -0,0 +1,165 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
# Définition des couleurs pour un affichage clair
|
||||
GREEN="\e[32m"
|
||||
YELLOW="\e[33m"
|
||||
RED="\e[31m"
|
||||
RESET="\e[0m"
|
||||
|
||||
echo -e "${YELLOW}Mise à jour des paquets...${RESET}"
|
||||
apt update && apt upgrade -y || { echo -e "${RED}Échec de la mise à jour des paquets${RESET}"; exit 1; }
|
||||
|
||||
# Détection de la version de Debian
|
||||
VERSION=$(lsb_release -sc)
|
||||
SUPPORTED_VERSIONS=("buster" "bullseye" "bookworm")
|
||||
|
||||
TIMEZONE=$(timedatectl show --value --property=Timezone)
|
||||
|
||||
if [[ ! " ${SUPPORTED_VERSIONS[@]} " =~ " ${VERSION} " ]]; then
|
||||
echo -e "${RED}Version de Debian non supportée : $VERSION${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Version de Debian détectée : $VERSION${RESET}"
|
||||
|
||||
# Vérification de l'existence du dépôt Sury
|
||||
if ! grep -q "packages.sury.org" /etc/apt/sources.list.d/php.list 2>/dev/null; then
|
||||
echo -e "${YELLOW}Ajout du dépôt Sury pour PHP...${RESET}"
|
||||
apt install -y ca-certificates apt-transport-https software-properties-common || { echo -e "${RED}Échec de l'installation des paquets nécessaires${RESET}"; exit 1; }
|
||||
wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg || { echo -e "${RED}Échec du téléchargement de la clé GPG de Sury${RESET}"; exit 1; }
|
||||
echo "deb https://packages.sury.org/php/ $VERSION main" | tee /etc/apt/sources.list.d/php.list
|
||||
apt update
|
||||
else
|
||||
echo -e "${GREEN}Le dépôt Sury est déjà installé.${RESET}"
|
||||
fi
|
||||
|
||||
# Définition de la version PHP souhaitée
|
||||
PHP_VERSION="8.3"
|
||||
|
||||
PHP_INI_CLI="/etc/php/${PHP_VERSION}/cli/php.ini"
|
||||
PHP_INI_APACHE="/etc/php/${PHP_VERSION}/apache2/php.ini"
|
||||
|
||||
# Vérification de l'installation de PHP
|
||||
echo -e "${YELLOW}Installation de PHP $PHP_VERSION et des modules courants...${RESET}"
|
||||
|
||||
# Base des modules PHP à installer
|
||||
PHP_MODULES=(
|
||||
php${PHP_VERSION}
|
||||
php${PHP_VERSION}-cli
|
||||
php${PHP_VERSION}-fpm
|
||||
php${PHP_VERSION}-curl
|
||||
php${PHP_VERSION}-gd
|
||||
php${PHP_VERSION}-mbstring
|
||||
php${PHP_VERSION}-xml
|
||||
php${PHP_VERSION}-zip
|
||||
php${PHP_VERSION}-bcmath
|
||||
php${PHP_VERSION}-soap
|
||||
php${PHP_VERSION}-intl
|
||||
php${PHP_VERSION}-readline
|
||||
php${PHP_VERSION}-ldap
|
||||
php${PHP_VERSION}-imagick
|
||||
php${PHP_VERSION}-exif
|
||||
php${PHP_VERSION}-gmp
|
||||
php${PHP_VERSION}-apcu
|
||||
php${PHP_VERSION}-opcache
|
||||
php${PHP_VERSION}-sqlite3
|
||||
)
|
||||
|
||||
# Vérification MySQL / MariaDB
|
||||
if dpkg -l | grep -qE 'mysql-server|mariadb-server'; then
|
||||
echo -e "${GREEN}MySQL/MariaDB détecté. Ajout du module php-mysql.${RESET}"
|
||||
PHP_MODULES+=(php${PHP_VERSION}-mysql)
|
||||
fi
|
||||
|
||||
# Vérification PostgreSQL
|
||||
if dpkg -l | grep -q postgresql; then
|
||||
echo -e "${GREEN}PostgreSQL détecté. Ajout du module php-pgsql.${RESET}"
|
||||
PHP_MODULES+=(php${PHP_VERSION}-pgsql)
|
||||
fi
|
||||
|
||||
# Installation des modules PHP
|
||||
echo -e "${GREEN}Installation des modules PHP...${RESET}"
|
||||
apt install -y "${PHP_MODULES[@]}" || {
|
||||
echo -e "${RED}❌ Échec de l'installation de PHP ou des modules.${RESET}"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Vérification si Apache est installé et installation du module PHP si nécessaire
|
||||
if systemctl list-units --type=service --all | grep -q "apache2.service"; then
|
||||
echo -e "${YELLOW}Apache détecté. Installation de libapache2-mod-php${RESET}"
|
||||
apt install -y libapache2-mod-php$PHP_VERSION || { echo -e "${RED}Échec de l'installation de libapache2-mod-php${RESET}"; exit 1; }
|
||||
|
||||
echo -e "${YELLOW}Redémarrage d'Apache...${RESET}"
|
||||
systemctl restart apache2 || { echo -e "${RED}Échec du redémarrage d'Apache${RESET}"; exit 1; }
|
||||
fi
|
||||
|
||||
# Configuration de PHP-FPM si ce n'est pas déjà fait
|
||||
PHP_INI="/etc/php/$PHP_VERSION/fpm/php.ini"
|
||||
PHP_INI_DIR="/etc/php/${PHP_VERSION}/fpm/conf.d"
|
||||
|
||||
if grep -q "memory_limit = 512M" "$PHP_INI"; then
|
||||
echo -e "${GREEN}Configuration de PHP-FPM déjà optimisée.${RESET}"
|
||||
else
|
||||
echo -e "${YELLOW}Configuration de PHP-FPM...${RESET}"
|
||||
sed -i 's/memory_limit = .*/memory_limit = 512M/' "$PHP_INI"
|
||||
sed -i 's/upload_max_filesize = .*/upload_max_filesize = 100M/' "$PHP_INI"
|
||||
sed -i 's/post_max_size = .*/post_max_size = 100M/' "$PHP_INI"
|
||||
sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$PHP_INI"
|
||||
|
||||
echo -e "${YELLOW}Redémarrage de PHP-FPM...${RESET}"
|
||||
systemctl restart php$PHP_VERSION-fpm || { echo -e "${RED}Échec du redémarrage de PHP-FPM${RESET}"; exit 1; }
|
||||
fi
|
||||
|
||||
# Configuration OPCache
|
||||
OPCACHE_INI="${PHP_INI_DIR}/10-opcache.ini"
|
||||
cat > "$OPCACHE_INI" <<EOF
|
||||
; Configuration OPcache optimisée
|
||||
opcache.enable=1
|
||||
opcache.memory_consumption=128
|
||||
opcache.interned_strings_buffer=16
|
||||
opcache.max_accelerated_files=10000
|
||||
opcache.revalidate_freq=60
|
||||
opcache.fast_shutdown=1
|
||||
opcache.enable_cli=1
|
||||
EOF
|
||||
echo "==> Fichier $OPCACHE_INI mis à jour."
|
||||
|
||||
# Configuration APCu
|
||||
APCU_INI="${PHP_INI_DIR}/20-apcu.ini"
|
||||
cat > "$APCU_INI" <<EOF
|
||||
; Configuration APCu optimisée
|
||||
apc.enabled=1
|
||||
apc.shm_size=64M
|
||||
apc.ttl=7200
|
||||
apc.enable_cli=0
|
||||
EOF
|
||||
echo "==> Fichier $APCU_INI mis à jour."
|
||||
|
||||
# Définir la timezone PHP pour CLI et Apache
|
||||
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_CLI}"
|
||||
sed -i "s|^;*date.timezone =.*|date.timezone = ${TIMEZONE}|" "${PHP_INI_APACHE}"
|
||||
|
||||
# Test de la configuration Apache
|
||||
if systemctl is-active --quiet apache2; then
|
||||
read -rp "Voulez-vous tester le support de PHP par Apache ? (o/n) : " test_php
|
||||
if [[ "$test_php" =~ ^[oOyY]$ ]]; then
|
||||
echo -e "${YELLOW}Vérification du support de PHP par Apache...${RESET}"
|
||||
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
|
||||
chown www-data:www-data /var/www/html/info.php
|
||||
chmod 644 /var/www/html/info.php
|
||||
echo -e "${GREEN}Vous pouvez tester PHP en accédant à : http://<IP_SERVEUR>/info.php${RESET}"
|
||||
else
|
||||
echo -e "${YELLOW}Test PHP annulé.${RESET}"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}Le service Apache n'est pas actif.${RESET}"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Installation terminée avec succès ! 🚀${RESET}"
|
||||
70
scripts/server-httpd/set-permissions-www.sh
Executable file
70
scripts/server-httpd/set-permissions-www.sh
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
WWW_DIR="/var/www"
|
||||
CURRENT_USER="${SUDO_USER:-$(whoami)}"
|
||||
|
||||
echo "Correction des permissions de $WWW_DIR/html si nécessaire..."
|
||||
if [ -d "$WWW_DIR/html" ]; then
|
||||
OWNER_GROUP=$(stat -c "%U:%G" "$WWW_DIR/html")
|
||||
if [ "$OWNER_GROUP" != "www-data:www-data" ]; then
|
||||
sudo chown -R www-data:www-data "$WWW_DIR/html"
|
||||
echo "Propriétaire de $WWW_DIR/html corrigé en www-data:www-data"
|
||||
else
|
||||
echo "$WWW_DIR/html est déjà correctement configuré."
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Liste des dossiers dans $WWW_DIR :"
|
||||
dirs=()
|
||||
i=1
|
||||
for d in "$WWW_DIR"/*/; do
|
||||
folder=$(basename "$d")
|
||||
dirs+=("$folder")
|
||||
echo "[$i] $folder"
|
||||
((i++))
|
||||
done
|
||||
|
||||
echo "[0] Tous les dossiers"
|
||||
|
||||
read -p "Sur quel dossier appliquer la règle ? (Entrer le numéro ou 0 pour tous) : " choix
|
||||
|
||||
# Ajout de l'utilisateur courant au groupe www-data
|
||||
if id -nG "$CURRENT_USER" | grep -qw "www-data"; then
|
||||
echo "L'utilisateur $CURRENT_USER est déjà dans le groupe www-data"
|
||||
else
|
||||
echo "Ajout de $CURRENT_USER au groupe www-data..."
|
||||
usermod -aG www-data "$CURRENT_USER"
|
||||
fi
|
||||
|
||||
# Fonction d'application des droits
|
||||
apply_permissions() {
|
||||
dossier="$1"
|
||||
echo "Application des permissions sur $WWW_DIR/$dossier ..."
|
||||
chown -R www-data:www-data "$WWW_DIR/$dossier"
|
||||
chmod -R g+rwX "$WWW_DIR/$dossier"
|
||||
}
|
||||
|
||||
if [ "$choix" -eq 0 ]; then
|
||||
for d in "${dirs[@]}"; do
|
||||
apply_permissions "$d"
|
||||
done
|
||||
else
|
||||
index=$((choix - 1))
|
||||
if [ "$index" -ge 0 ] && [ "$index" -lt "${#dirs[@]}" ]; then
|
||||
apply_permissions "${dirs[$index]}"
|
||||
else
|
||||
echo "Choix invalide."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Opération terminée. Pensez à vous déconnecter/reconnecter si c'est la première fois que vous rejoignez le groupe www-data."
|
||||
0
scripts/server-httpd/setup_httpd.sh
Normal file → Executable file
0
scripts/server-httpd/setup_httpd.sh
Normal file → Executable file
4
scripts/server-mariadb/.list_files.txt
Normal file
4
scripts/server-mariadb/.list_files.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
check_mysql_secure.sh
|
||||
create_db.sh
|
||||
set_root_password.sh
|
||||
setup_mariadb.sh
|
||||
220
scripts/server-mariadb/check_mysql_secure.sh
Executable file
220
scripts/server-mariadb/check_mysql_secure.sh
Executable file
@@ -0,0 +1,220 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
echo "=== Audit Sécurité MariaDB sur $(hostname) ($(date)) ==="
|
||||
|
||||
CONFIG_FILE="/etc/mysql/mariadb.conf.d/50-server.cnf"
|
||||
ISSUES_FOUND=0
|
||||
RESTART_REQUIRED=0
|
||||
|
||||
# Vérifier la présence de la commande mysql
|
||||
if ! command -v mysql >/dev/null 2>&1; then
|
||||
echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
get_password_from_cnf() {
|
||||
local file=$1
|
||||
sed -n '/\[client\]/,/^\[/p' "$file" | grep -m1 'password' | sed -E 's/^[ \t]*password[ \t]*=[ \t]*//'
|
||||
}
|
||||
|
||||
if [[ -f /etc/mysql/debian.cnf ]]; then
|
||||
DB_USER=$(grep -A5 '\[client\]' /etc/mysql/debian.cnf | grep -m1 'user' | awk -F= '{gsub(/ /,"",$2); print $2}')
|
||||
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf" || echo "")
|
||||
DB_ROOT_PASSWORD=$(echo "$DB_ROOT_PASSWORD" | tr -d '\r\n')
|
||||
else
|
||||
DB_USER="root"
|
||||
read -rp "🔐 Entrez le mot de passe root pour MariaDB : " -s DB_ROOT_PASSWORD
|
||||
echo
|
||||
fi
|
||||
|
||||
TEMP_CNF=$(mktemp)
|
||||
chmod 600 "$TEMP_CNF"
|
||||
cat > "$TEMP_CNF" <<EOF
|
||||
[client]
|
||||
user=$DB_USER
|
||||
password=$DB_ROOT_PASSWORD
|
||||
EOF
|
||||
|
||||
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"
|
||||
|
||||
echo "🔎 Test de connexion..."
|
||||
if ! $MYSQL_CMD -e "SELECT 1;" >/dev/null 2>&1; then
|
||||
echo "❌ Échec de connexion ($DB_USER)"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Connexion $DB_USER réussie"
|
||||
|
||||
echo
|
||||
|
||||
check_permissions() {
|
||||
echo "Vérification des permissions systèmes..."
|
||||
if [[ $(stat -c "%U %G" /var/lib/mysql) != "mysql mysql" ]]; then
|
||||
echo "❌ /var/lib/mysql n'appartient pas à mysql:mysql"
|
||||
ISSUE=1
|
||||
else
|
||||
echo "✔️ Permissions /var/lib/mysql OK"
|
||||
fi
|
||||
|
||||
if [[ $(stat -c "%U %G" $CONFIG_FILE) != "root root" ]]; then
|
||||
echo "❌ $CONFIG_FILE n'appartient pas à root:root"
|
||||
ISSUE=1
|
||||
else
|
||||
echo "✔️ Permissions du fichier de conf OK"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_storage_engines() {
|
||||
echo "🛠 Vérification des moteurs de stockage..."
|
||||
ENABLED=$($MYSQL_CMD -e "SHOW ENGINES;" | awk '$2 ~ /YES|DEFAULT/ {print $1}')
|
||||
for ENGINE in ARCHIVE BLACKHOLE FEDERATED; do
|
||||
if grep -q "$ENGINE" <<< "$ENABLED"; then
|
||||
echo "❌ $ENGINE actif"
|
||||
read -rp "Désactiver $ENGINE (ajout dans disabled_storage_engines) ? (y/n) " choice
|
||||
if [[ $choice == "y" ]]; then
|
||||
if ! grep -q "disabled_storage_engines" "$CONFIG_FILE"; then
|
||||
echo "disabled_storage_engines=$ENGINE" >> "$CONFIG_FILE"
|
||||
else
|
||||
sed -i "/^disabled_storage_engines/s/$/,$ENGINE/" "$CONFIG_FILE"
|
||||
fi
|
||||
RESTART_REQUIRED=1
|
||||
ISSUES_FOUND=1
|
||||
echo "✔️ $ENGINE désactivé (redémarrage requis)"
|
||||
fi
|
||||
else
|
||||
echo "✔️ $ENGINE non actif"
|
||||
fi
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
check_bind() {
|
||||
echo "🌐 Vérification du bind-address..."
|
||||
BIND_ADDRESS=$(grep -E "^bind-address" "$CONFIG_FILE" | cut -d= -f2 | tr -d ' ')
|
||||
if [[ "$BIND_ADDRESS" != "127.0.0.1" ]]; then
|
||||
echo "❌ MariaDB écoute sur $BIND_ADDRESS"
|
||||
read -rp "Forcer 127.0.0.1 ? (y/n) " choice
|
||||
if [[ $choice == "y" ]]; then
|
||||
sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' "$CONFIG_FILE"
|
||||
RESTART_REQUIRED=1
|
||||
echo "✔️ bind-address corrigé"
|
||||
fi
|
||||
else
|
||||
echo "✔️ bind-address sécurisé"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_anonymous_users() {
|
||||
echo "👤 Vérification des utilisateurs anonymes..."
|
||||
if [[ $($MYSQL_CMD -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='';") -gt 0 ]]; then
|
||||
echo "❌ Utilisateurs anonymes trouvés"
|
||||
read -rp "Supprimer ? (y/n) " choice
|
||||
[[ $choice == "y" ]] && $MYSQL_CMD -e "DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;" && echo "✔️ Anonymes supprimés"
|
||||
else
|
||||
echo "✔️ Aucun utilisateur anonyme"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_remote_root() {
|
||||
echo "🔑 Vérification des accès root distants..."
|
||||
if [[ $($MYSQL_CMD -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');") -gt 0 ]]; then
|
||||
echo "❌ Accès root distant détecté"
|
||||
read -rp "Supprimer ces accès ? (y/n) " choice
|
||||
[[ $choice == "y" ]] && $MYSQL_CMD -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); FLUSH PRIVILEGES;" && echo "✔️ Accès root externe supprimé"
|
||||
else
|
||||
echo "✔️ Aucun accès root distant"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_test_db() {
|
||||
echo "🧪 Vérification de la base 'test'..."
|
||||
if $MYSQL_CMD -e "SHOW DATABASES LIKE 'test';" | grep -q "test"; then
|
||||
echo "❌ Base 'test' présente"
|
||||
read -rp "Supprimer ? (y/n) " choice
|
||||
[[ $choice == "y" ]] && $MYSQL_CMD -e "DROP DATABASE test;" && echo "✔️ Base test supprimée"
|
||||
else
|
||||
echo "✔️ Base 'test' absente"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_file_priv() {
|
||||
echo "📂 Vérification des FILE PRIV..."
|
||||
USERS=$($MYSQL_CMD -N -e "SELECT CONCAT(User, '@', Host) FROM mysql.user WHERE File_priv='Y';")
|
||||
if [[ -n "$USERS" ]]; then
|
||||
echo "❌ Utilisateurs avec FILE PRIV détectés:"
|
||||
echo "$USERS"
|
||||
read -rp "Retirer le droit FILE ? (y/n) " choice
|
||||
if [[ $choice == "y" ]]; then
|
||||
while read -r user; do
|
||||
$MYSQL_CMD -e "REVOKE FILE ON *.* FROM '$user';"
|
||||
done <<< "$USERS"
|
||||
$MYSQL_CMD -e "FLUSH PRIVILEGES;"
|
||||
echo "✔️ FILE révoqué"
|
||||
fi
|
||||
else
|
||||
echo "✔️ Aucun droit FILE abusif"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_slow_log() {
|
||||
echo "🐌 Vérification du slow query log..."
|
||||
ACTIVE=$($MYSQL_CMD -N -e "SHOW VARIABLES LIKE 'slow_query_log';" | awk '{print $2}')
|
||||
if [[ "$ACTIVE" != "ON" ]]; then
|
||||
echo "⚠️ Slow query log désactivé"
|
||||
read -rp "Activer dans la conf ? (y/n) " choice
|
||||
if [[ $choice == "y" ]]; then
|
||||
cat >> "$CONFIG_FILE" <<EOL
|
||||
|
||||
slow_query_log = 1
|
||||
slow_query_log_file = /var/log/mysql/mariadb-slow.log
|
||||
long_query_time = 2
|
||||
EOL
|
||||
touch /var/log/mysql/mariadb-slow.log
|
||||
chown mysql:mysql /var/log/mysql/mariadb-slow.log
|
||||
RESTART_REQUIRED=1
|
||||
echo "✔️ Slow query log activé"
|
||||
fi
|
||||
else
|
||||
echo "✔️ Slow query log actif"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
echo "===> Démarrage de l'audit..."
|
||||
echo
|
||||
|
||||
# Lancer les contrôles
|
||||
check_permissions
|
||||
check_storage_engines
|
||||
check_bind
|
||||
check_anonymous_users
|
||||
check_remote_root
|
||||
check_test_db
|
||||
check_file_priv
|
||||
check_slow_log
|
||||
|
||||
if [[ $RESTART_REQUIRED -eq 1 ]]; then
|
||||
echo "♻️ Redémarrage de MariaDB requis"
|
||||
systemctl restart mariadb
|
||||
echo
|
||||
fi
|
||||
|
||||
if [[ $ISSUES_FOUND -eq 1 ]]; then
|
||||
echo "⚠️ Audit terminé avec des recommandations ou actions effectuées."
|
||||
else
|
||||
echo "✅ Audit terminé - Aucun problème majeur détecté."
|
||||
fi
|
||||
157
scripts/server-mariadb/create_db.sh
Executable file
157
scripts/server-mariadb/create_db.sh
Executable file
@@ -0,0 +1,157 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
echo "=== Gestion du mot de passe administrateur ==="
|
||||
|
||||
# Vérifier la présence de la commande mysql
|
||||
if ! command -v mysql >/dev/null 2>&1; then
|
||||
echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Fonction de recherche dans un fichier cnf ou conf
|
||||
get_password_from_cnf() {
|
||||
local file=$1
|
||||
if [[ -f "$file" ]]; then
|
||||
PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
|
||||
if [[ -n "$PASSWORD" ]]; then
|
||||
echo "$PASSWORD"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Tentative de récupération depuis /etc/mysql/debian.cnf
|
||||
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
|
||||
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo "✅ Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
|
||||
else
|
||||
# Recherche dans d'autres fichiers .cnf ou .conf
|
||||
for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
|
||||
DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
|
||||
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo "✅ Mot de passe root trouvé dans $file"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Si toujours rien, demande à l'utilisateur
|
||||
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo -n "🔐 Entrez le mot de passe root pour MariaDB : "
|
||||
read -r -s USER_PASSWORD
|
||||
echo
|
||||
DB_ROOT_PASSWORD="$USER_PASSWORD"
|
||||
fi
|
||||
|
||||
# Création d'un fichier temporaire sécurisé pour la connexion MySQL
|
||||
TEMP_CNF=$(mktemp)
|
||||
chmod 600 "$TEMP_CNF"
|
||||
cat > "$TEMP_CNF" <<EOF
|
||||
[client]
|
||||
user=root
|
||||
password=$DB_ROOT_PASSWORD
|
||||
EOF
|
||||
|
||||
# TEST du mot de passe root
|
||||
echo "🔎 Test de connexion avec le mot de passe root..."
|
||||
if ! mysql --defaults-extra-file="$TEMP_CNF" -e "SELECT 1;" 2>/dev/null; then
|
||||
echo "❌ Échec de la connexion avec le mot de passe root. Arrêt du script."
|
||||
rm -f "$TEMP_CNF"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Connexion root réussie."
|
||||
|
||||
# Définir la variable MYSQL_CMD pour le reste du script
|
||||
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"
|
||||
|
||||
# N'oublie pas de prévoir un nettoyage à la fin :
|
||||
trap 'rm -f "$TEMP_CNF"' EXIT
|
||||
|
||||
echo "=== Création d'une nouvelle base de données MariaDB ==="
|
||||
|
||||
# Lecture du nom de la base de données
|
||||
read -rp "Nom de la base de données : " DB_NAME
|
||||
if [[ -z "$DB_NAME" ]]; then
|
||||
echo "❌ Nom de base de données requis."
|
||||
rm -f "$TEMP_CNF"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérification de l'existence de la base de données
|
||||
DB_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'")
|
||||
if [[ "$DB_EXISTS" == "$DB_NAME" ]]; then
|
||||
echo "❌ La base de données '$DB_NAME' existe déjà."
|
||||
rm -f "$TEMP_CNF"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Lecture du nom de l'utilisateur
|
||||
read -rp "Nom de l'utilisateur : " DB_USER
|
||||
if [[ -z "$DB_USER" ]]; then
|
||||
echo "❌ Nom d'utilisateur requis."
|
||||
rm -f "$TEMP_CNF"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérification de l'existence de l'utilisateur
|
||||
USER_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT COUNT(*) FROM mysql.user WHERE user='$DB_USER'")
|
||||
if [[ "$USER_EXISTS" -gt 0 ]]; then
|
||||
echo "ℹ️ L'utilisateur '$DB_USER' existe déjà. Il ne sera pas recréé."
|
||||
CREATE_USER_SQL=""
|
||||
USER_PASS_TO_SAVE=""
|
||||
else
|
||||
echo "✅ L'utilisateur '$DB_USER' sera créé."
|
||||
# Demande du mot de passe utilisateur ou génération
|
||||
read -rsp "Mot de passe de l'utilisateur (laisser vide pour générer) : " DB_PASS
|
||||
echo
|
||||
if [[ -z "$DB_PASS" ]]; then
|
||||
DB_PASS=$(generate_token 64)
|
||||
echo "🔑 Mot de passe généré : $DB_PASS"
|
||||
fi
|
||||
CREATE_USER_SQL="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
|
||||
USER_PASS_TO_SAVE="$DB_PASS"
|
||||
fi
|
||||
|
||||
# Création de la base et attribution des droits
|
||||
SQL=$(cat <<EOF
|
||||
CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||
$CREATE_USER_SQL
|
||||
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
)
|
||||
|
||||
echo "✅ Exécution de la création..."
|
||||
if mysql --defaults-extra-file="$TEMP_CNF" -e "$SQL"; then
|
||||
echo "🎉 Base de données '$DB_NAME' créée et droits attribués à '$DB_USER'."
|
||||
else
|
||||
echo "❌ Erreur lors de la création."
|
||||
rm -f "$TEMP_CNF"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Sauvegarde des identifiants
|
||||
if [[ -n "$USER_PASS_TO_SAVE" ]]; then
|
||||
TIMESTAMP=$(date +%Y%m%d%H%M%S)
|
||||
CRED_FILE="db_${DB_NAME}_${TIMESTAMP}.credentials"
|
||||
|
||||
umask 077 # Restriction immédiate des droits sur le fichier
|
||||
{
|
||||
printf "Base: %s\n" "$DB_NAME"
|
||||
printf "User: %s\n" "$DB_USER"
|
||||
printf "Password: %s\n" "$USER_PASS_TO_SAVE"
|
||||
} > "$CRED_FILE"
|
||||
|
||||
echo "🔒 Identifiants sauvegardés dans $CRED_FILE"
|
||||
fi
|
||||
|
||||
# Nettoyage du fichier temporaire de connexion
|
||||
rm -f "$TEMP_CNF"
|
||||
112
scripts/server-mariadb/set_root_password.sh
Executable file
112
scripts/server-mariadb/set_root_password.sh
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
# Variables
|
||||
NEW_PASS=$(generate_token 20)
|
||||
DB_SERVICE="mariadb" # Adapter si besoin
|
||||
MYSQL_SOCK="/var/run/mysqld/mysqld.sock"
|
||||
CNF_FILES=("/etc/mysql/debian.cnf" "/root/.my.cnf")
|
||||
MYSQLD_SAFE_LOG="/tmp/mysqld_safe.log"
|
||||
|
||||
echo "[+] Nouveau mot de passe root généré."
|
||||
|
||||
# Arrêt du service MySQL/MariaDB
|
||||
echo "[+] Arrêt du service $DB_SERVICE..."
|
||||
systemctl stop "$DB_SERVICE"
|
||||
|
||||
echo "[+] Attente de l'arrêt complet du service..."
|
||||
while systemctl is-active --quiet "$DB_SERVICE"; do
|
||||
sleep 1
|
||||
done
|
||||
echo "[+] Service arrêté."
|
||||
|
||||
# Nettoyage des éventuels sockets ou PID bloquants
|
||||
echo "[+] Nettoyage des sockets et PID..."
|
||||
rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock
|
||||
|
||||
# Démarrage en mode sans échec
|
||||
echo "[+] Démarrage de MySQL en mode sans échec..."
|
||||
mysqld_safe --skip-grant-tables --skip-networking > "$MYSQLD_SAFE_LOG" 2>&1 &
|
||||
SAFE_PID=$!
|
||||
|
||||
# Attente que mysqld_safe soit vraiment prêt
|
||||
echo "[+] Attente de la disponibilité de mysqld_safe..."
|
||||
for i in {1..10}; do
|
||||
if mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
|
||||
echo "[+] mysqld_safe est prêt."
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if ! mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
|
||||
echo "[❌] Échec du démarrage de mysqld_safe. Voir $MYSQLD_SAFE_LOG"
|
||||
kill -9 $SAFE_PID 2>/dev/null
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Réinitialisation du mot de passe root
|
||||
echo "[+] Réinitialisation du mot de passe root..."
|
||||
mysql --socket="$MYSQL_SOCK" <<EOF
|
||||
FLUSH PRIVILEGES;
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PASS';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
|
||||
# Nettoyage complet du mode sans échec
|
||||
echo "[+] Arrêt complet du mode sans échec et des processus MySQL/MariaDB..."
|
||||
kill -9 $SAFE_PID
|
||||
killall -9 mysqld_safe mariadbd mysqld || true
|
||||
sleep 5
|
||||
|
||||
# Redémarrage du service
|
||||
echo "[+] Redémarrage du service $DB_SERVICE..."
|
||||
systemctl start "$DB_SERVICE"
|
||||
|
||||
# Vérification du bon démarrage
|
||||
echo "[+] Attente du démarrage complet de MariaDB..."
|
||||
for i in {1..10}; do
|
||||
if systemctl is-active --quiet "$DB_SERVICE"; then
|
||||
echo "[+] MariaDB est démarré."
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if ! systemctl is-active --quiet "$DB_SERVICE"; then
|
||||
echo "[❌] MariaDB ne démarre pas. Voir journalctl -xeu $DB_SERVICE"
|
||||
systemctl status "$DB_SERVICE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test de connexion avec le nouveau mot de passe
|
||||
echo "[+] Test de connexion réel avec le nouveau mot de passe root..."
|
||||
if mysql -uroot -p"$NEW_PASS" -e "SELECT 'Connexion réussie' AS Status;" >/dev/null 2>&1; then
|
||||
echo "[✔] Connexion root réussie."
|
||||
|
||||
# Mise à jour des fichiers .cnf si user = root
|
||||
for file in "${CNF_FILES[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
if grep -q "^\s*user\s*=\s*root" "$file"; then
|
||||
echo "[+] Mise à jour du fichier $file (user=root détecté)."
|
||||
sed -i -E "s/(password\s*=\s*).*/\1$NEW_PASS/" "$file"
|
||||
else
|
||||
echo "[!] Pas de user=root dans $file, aucune modification."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "---------------------------------------------"
|
||||
echo "[✔] Mot de passe root MySQL/MariaDB réinitialisé avec succès."
|
||||
echo "[✔] Nouveau mot de passe root : $NEW_PASS"
|
||||
echo "---------------------------------------------"
|
||||
else
|
||||
echo "[❌] Échec de la connexion root après redémarrage de MariaDB."
|
||||
exit 1
|
||||
fi
|
||||
164
scripts/server-mariadb/setup_mariadb.sh
Executable file
164
scripts/server-mariadb/setup_mariadb.sh
Executable file
@@ -0,0 +1,164 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
# Mise à jour du système
|
||||
update_system
|
||||
|
||||
PASS_FILE=~/mariadb_root_password.txt
|
||||
DEBIAN_CNF=/etc/mysql/debian.cnf
|
||||
MARIADB_CNF=/etc/mysql/mariadb.conf.d/50-server.cnf
|
||||
|
||||
echo "=== Installation de MariaDB ==="
|
||||
apt install -y mariadb-server mariadb-client
|
||||
|
||||
echo "=== Activation et démarrage de MariaDB ==="
|
||||
systemctl enable mariadb
|
||||
systemctl start mariadb
|
||||
|
||||
echo "=== Configuration du bind-address pour bloquer les connexions externes ==="
|
||||
if grep -q "^bind-address" $MARIADB_CNF; then
|
||||
sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' $MARIADB_CNF
|
||||
else
|
||||
echo "bind-address = 127.0.0.1" >> $MARIADB_CNF
|
||||
fi
|
||||
|
||||
echo "=== Activation du log binaire et purge automatique des anciens logs ==="
|
||||
if ! grep -q "^log-bin" "$MARIADB_CNF"; then
|
||||
cat >> "$MARIADB_CNF" <<EOL
|
||||
|
||||
# Journalisation binaire activée pour la réplication et la sécurité
|
||||
log-bin = /var/log/mysql/mariadb-bin
|
||||
expire_logs_days = 7
|
||||
EOL
|
||||
fi
|
||||
|
||||
echo "=== Vérification et création du répertoire pour les binlogs ==="
|
||||
mkdir -p /var/log/mysql
|
||||
chown mysql:mysql /var/log/mysql
|
||||
chmod 750 /var/log/mysql
|
||||
|
||||
|
||||
systemctl restart mariadb
|
||||
|
||||
echo "=== Gestion du mot de passe administrateur ==="
|
||||
|
||||
# Fonction de recherche dans un fichier cnf ou conf
|
||||
get_password_from_cnf() {
|
||||
local file=$1
|
||||
if [[ -f "$file" ]]; then
|
||||
PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
|
||||
if [[ -n "$PASSWORD" ]]; then
|
||||
echo "$PASSWORD"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Générer ou récupérer le mot de passe root MariaDB
|
||||
if [[ -f "$PASS_FILE" ]]; then
|
||||
DB_ROOT_PASSWORD=$(grep 'root password:' "$PASS_FILE" | awk '{print $3}')
|
||||
echo "Mot de passe root existant récupéré."
|
||||
else
|
||||
# Tentative de récupération depuis /etc/mysql/debian.cnf
|
||||
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
|
||||
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo "Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
|
||||
else
|
||||
# Tentative dans d'autres fichiers .cnf ou .conf connus
|
||||
for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
|
||||
DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
|
||||
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo "Mot de passe root trouvé dans $file"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Si toujours pas de mot de passe trouvé, demander ou générer
|
||||
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
|
||||
echo -n "Entrez un mot de passe root pour MariaDB ou le mot de passe existant (laisser vide pour générer automatiquement) : "
|
||||
read -r -s USER_PASSWORD
|
||||
echo
|
||||
if [[ -n "$USER_PASSWORD" ]]; then
|
||||
DB_ROOT_PASSWORD="$USER_PASSWORD"
|
||||
echo "Mot de passe root défini par l'utilisateur."
|
||||
else
|
||||
DB_ROOT_PASSWORD=$(generate_token 64)
|
||||
echo "Mot de passe root généré automatiquement."
|
||||
echo "root password: $DB_ROOT_PASSWORD" > "$PASS_FILE"
|
||||
chmod 600 "$PASS_FILE"
|
||||
echo "Mot de passe root sauvegardé dans $PASS_FILE."
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
echo "=== Sécurisation de MariaDB ==="
|
||||
mysql -u root -p"$DB_ROOT_PASSWORD" <<EOF
|
||||
-- Définir le mot de passe root correctement
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD';
|
||||
|
||||
-- Supprimer les utilisateurs anonymes
|
||||
DELETE FROM mysql.user WHERE User='';
|
||||
|
||||
-- Supprimer tout accès root externe ou d'autres users externes
|
||||
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1', '::1');
|
||||
|
||||
-- Supprimer la base de test si elle existe
|
||||
DROP DATABASE IF EXISTS test;
|
||||
|
||||
-- Supprimer les droits sur la base de test
|
||||
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
|
||||
|
||||
-- Recharger les privilèges
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
|
||||
echo "=== Mise à jour de /etc/mysql/debian.cnf pour les scripts de maintenance ==="
|
||||
cat > /etc/mysql/debian.cnf <<EOL
|
||||
[client]
|
||||
host = localhost
|
||||
user = root
|
||||
password = $DB_ROOT_PASSWORD
|
||||
socket = /run/mysqld/mysqld.sock
|
||||
|
||||
[mysql_upgrade]
|
||||
host = localhost
|
||||
user = root
|
||||
password = $DB_ROOT_PASSWORD
|
||||
socket = /run/mysqld/mysqld.sock
|
||||
EOL
|
||||
chmod 600 /etc/mysql/debian.cnf
|
||||
|
||||
echo "=== Vérification de la présence de PHP ==="
|
||||
if command -v php >/dev/null 2>&1; then
|
||||
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
|
||||
echo "PHP version détectée : $PHP_VERSION"
|
||||
|
||||
echo "=== Installation de php-mysql pour PHP $PHP_VERSION ==="
|
||||
apt install -y php${PHP_VERSION}-mysql
|
||||
|
||||
echo "=== Redémarrage d'Apache si installé ==="
|
||||
if systemctl list-units --type=service | grep -q apache2; then
|
||||
systemctl restart apache2
|
||||
echo "Apache redémarré"
|
||||
fi
|
||||
|
||||
echo "=== Redémarrage de PHP-FPM si installé ==="
|
||||
if systemctl list-units --type=service | grep -q php${PHP_VERSION}-fpm; then
|
||||
systemctl restart php${PHP_VERSION}-fpm
|
||||
echo "PHP-FPM redémarré"
|
||||
fi
|
||||
else
|
||||
echo "PHP n'est pas installé. Installation de MariaDB terminée sans liaison PHP."
|
||||
fi
|
||||
|
||||
echo "=== Fin de l'installation et sécurisation de MariaDB ==="
|
||||
3
scripts/server-postgres/.list_files.txt
Normal file
3
scripts/server-postgres/.list_files.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
create_pg_db.sh
|
||||
create_pg_role.sh
|
||||
setup-postgres.sh
|
||||
52
scripts/server-postgres/create_pg_db.sh
Executable file
52
scripts/server-postgres/create_pg_db.sh
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
set -e
|
||||
|
||||
echo "👉 Nom de la base de données à créer : "
|
||||
read DB_NAME
|
||||
|
||||
echo "👉 Nom de l'utilisateur PostgreSQL propriétaire : "
|
||||
read DB_USER
|
||||
|
||||
# Lecture du mot de passe en mode sécurisé
|
||||
read -s -p "🔑 Mot de passe PostgreSQL de l'utilisateur 'postgres' : " DB_PASS
|
||||
echo ""
|
||||
|
||||
# Exporter le mot de passe temporairement
|
||||
export PGPASSWORD="$DB_PASS"
|
||||
|
||||
echo "🔎 Vérification de l'existence de l'utilisateur PostgreSQL '$DB_USER'..."
|
||||
USER_EXISTS=$(sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${DB_USER}'")
|
||||
|
||||
|
||||
if [[ "$USER_EXISTS" != "1" ]]; then
|
||||
echo "❌ L'utilisateur '$DB_USER' n'existe pas dans PostgreSQL."
|
||||
unset PGPASSWORD
|
||||
exit 2
|
||||
else
|
||||
echo "✅ L'utilisateur '$DB_USER' existe."
|
||||
fi
|
||||
|
||||
echo "🔎 Vérification de l'existence de la base de données '$DB_NAME'..."
|
||||
DB_EXISTS=$(sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='${DB_NAME}'")
|
||||
|
||||
|
||||
if [[ "$DB_EXISTS" == "1" ]]; then
|
||||
echo "⚠️ La base de données '$DB_NAME' existe déjà."
|
||||
else
|
||||
echo "🛠 Création de la base de données '$DB_NAME' avec le propriétaire '$DB_USER'..."
|
||||
sudo -u postgres createdb -O "$DB_USER" "$DB_NAME"
|
||||
echo "✅ Base de données '$DB_NAME' créée avec succès."
|
||||
fi
|
||||
|
||||
# Nettoyage de la variable d'environnement
|
||||
unset PGPASSWORD
|
||||
|
||||
echo "🎉 Opération terminée."
|
||||
73
scripts/server-postgres/create_pg_role.sh
Executable file
73
scripts/server-postgres/create_pg_role.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
set -e
|
||||
|
||||
# Demande interactive si le rôle n’est pas passé en paramètre
|
||||
if [[ -n "$1" ]]; then
|
||||
ROLE_NAME="$1"
|
||||
else
|
||||
read -p "👤 Entrez le nom du rôle PostgreSQL à créer : " ROLE_NAME
|
||||
fi
|
||||
|
||||
if [[ -z "$ROLE_NAME" ]]; then
|
||||
echo "❌ Le nom du rôle est obligatoire."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Demander le mot de passe de l'utilisateur 'postgres'
|
||||
read -s -p "🔑 Entrez le mot de passe de l'utilisateur 'postgres' : " POSTGRES_PASSWORD
|
||||
echo ""
|
||||
|
||||
# Générer le mot de passe du rôle
|
||||
echo "🔐 Génération d'un mot de passe fort pour le rôle '$ROLE_NAME'..."
|
||||
ROLE_PASSWORD=$(generate_token 20)
|
||||
|
||||
# Générer un fichier SQL temporaire pour la vérification + création
|
||||
SQL_FILE=$(mktemp)
|
||||
|
||||
cat <<EOF > "$SQL_FILE"
|
||||
DO \$\$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${ROLE_NAME}') THEN
|
||||
RAISE NOTICE '🛠 Création du rôle "${ROLE_NAME}"...';
|
||||
CREATE ROLE ${ROLE_NAME} WITH LOGIN PASSWORD '${ROLE_PASSWORD}';
|
||||
ELSE
|
||||
RAISE NOTICE '⚠️ Le rôle "${ROLE_NAME}" existe déjà.';
|
||||
END IF;
|
||||
END
|
||||
\$\$;
|
||||
EOF
|
||||
|
||||
chmod 644 "$SQL_FILE"
|
||||
|
||||
# Une seule exécution de psql via sudo avec mot de passe PostgreSQL exporté
|
||||
echo "🔎 Exécution des commandes SQL avec sudo..."
|
||||
sudo -u postgres bash -c "PGPASSWORD='${POSTGRES_PASSWORD}' psql -v ON_ERROR_STOP=1 -f '${SQL_FILE}'"
|
||||
|
||||
rm -f "$SQL_FILE"
|
||||
|
||||
# Affichage des identifiants si création
|
||||
echo ""
|
||||
echo "-------------------------------------------"
|
||||
echo " Nom du rôle : ${ROLE_NAME}"
|
||||
echo " Mot de passe : ${ROLE_PASSWORD}"
|
||||
echo "-------------------------------------------"
|
||||
|
||||
# Proposer d’enregistrer dans ~/.pgpass
|
||||
read -p "💾 Voulez-vous enregistrer ces identifiants dans ~/.pgpass ? (y/n) " SAVE_PASS
|
||||
if [[ "$SAVE_PASS" =~ ^[Yy]$ ]]; then
|
||||
PGPASS_FILE="${HOME}/.pgpass"
|
||||
echo "*:*:*:${ROLE_NAME}:${ROLE_PASSWORD}" >> "$PGPASS_FILE"
|
||||
chmod 600 "$PGPASS_FILE"
|
||||
echo "✅ Identifiants sauvegardés dans $PGPASS_FILE"
|
||||
fi
|
||||
|
||||
echo "⚠️ Pensez à sauvegarder ces informations si vous ne les enregistrez pas."
|
||||
echo "🎉 Opération terminée."
|
||||
77
scripts/server-postgres/setup-postgres.sh
Executable file
77
scripts/server-postgres/setup-postgres.sh
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/bin/bash
|
||||
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
|
||||
|
||||
# Importer les fonctions communes
|
||||
source "$(dirname "$0")/../common/common_utils.sh"
|
||||
|
||||
# Vérifier si le script est exécuté en root
|
||||
check_root
|
||||
|
||||
set -e
|
||||
|
||||
echo "📦 Mise à jour des paquets..."
|
||||
apt update -y
|
||||
|
||||
echo "📚 Installation de postgresql-common (pour script de dépôt officiel)..."
|
||||
apt install -y postgresql-common
|
||||
|
||||
echo "➕ Ajout automatique du dépôt officiel PostgreSQL (via pgdg script)..."
|
||||
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
|
||||
|
||||
echo ""
|
||||
echo "🧩 Versions disponibles dans le dépôt :"
|
||||
AVAILABLE_VERSIONS=$(apt-cache search "^postgresql-[0-9][0-9]$" | awk '{print $1}' | cut -d'-' -f2 | sort -nr)
|
||||
echo "$AVAILABLE_VERSIONS"
|
||||
|
||||
read -p "➡️ Entrez la version PostgreSQL à installer (ex: 17) : " PG_VERSION
|
||||
|
||||
if ! echo "$AVAILABLE_VERSIONS" | grep -q "^${PG_VERSION}$"; then
|
||||
echo "❌ Version PostgreSQL invalide ou non disponible : ${PG_VERSION}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "📦 Installation de PostgreSQL $PG_VERSION..."
|
||||
apt update -y
|
||||
apt install -y "postgresql-${PG_VERSION}"
|
||||
|
||||
echo "🚀 Activation et démarrage du service PostgreSQL..."
|
||||
systemctl enable postgresql
|
||||
systemctl start postgresql
|
||||
|
||||
echo "⏳ Attente du démarrage du service PostgreSQL..."
|
||||
sleep 3
|
||||
|
||||
echo "✅ Vérification du service..."
|
||||
if ! systemctl is-active --quiet postgresql; then
|
||||
echo "❌ Le service PostgreSQL ne fonctionne pas correctement."
|
||||
journalctl -xeu postgresql --no-pager | tail -n 20
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🧪 Test de connexion à PostgreSQL..."
|
||||
if ! sudo -u postgres psql -c '\q' 2>/dev/null; then
|
||||
echo "❌ Échec de la connexion à PostgreSQL. Vérifiez que le socket est disponible."
|
||||
echo " Astuce : systemctl status postgresql"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔐 Génération d'un mot de passe fort pour l'utilisateur postgres..."
|
||||
POSTGRES_PASSWORD=$(generate_token 20)
|
||||
|
||||
echo "🔧 Configuration du mot de passe de l'utilisateur postgres..."
|
||||
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '${POSTGRES_PASSWORD}';"
|
||||
|
||||
echo "🔧 Configuration de l'accès local en md5..."
|
||||
PG_HBA="/etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
|
||||
sed -i "s/^\(local\s\+all\s\+postgres\s\+\)peer/\1md5/" "$PG_HBA"
|
||||
|
||||
echo "♻️ Redémarrage de PostgreSQL pour appliquer les changements..."
|
||||
systemctl restart postgresql
|
||||
|
||||
echo ""
|
||||
echo "✅ Installation de PostgreSQL ${PG_VERSION} terminée."
|
||||
echo "-------------------------------------------"
|
||||
echo " Mot de passe de l'utilisateur postgres :"
|
||||
echo " ${POSTGRES_PASSWORD}"
|
||||
echo "-------------------------------------------"
|
||||
echo " Pensez à le sauvegarder en lieu sûr."
|
||||
Reference in New Issue
Block a user