Files
copymailrpi/install.sh
2026-05-05 11:24:06 +02:00

321 lines
10 KiB
Bash

#!/bin/bash
# =============================================================================
# CopyMail — Script d'installation pour Raspberry Pi OS (Debian Bookworm)
# Usage: sudo bash install.sh
# =============================================================================
set -e
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
log() { echo -e "${GREEN}[OK]${NC} $1"; }
warn() { echo -e "${YELLOW}[!!]${NC} $1"; }
err() { echo -e "${RED}[ERREUR]${NC} $1"; exit 1; }
step() { echo -e "\n${BLUE}>>> $1${NC}"; }
[[ $EUID -ne 0 ]] && err "Lancez ce script en root: sudo bash install.sh"
# =============================================================================
# CONFIGURATION — à modifier avant installation
# =============================================================================
DOMAIN="${COPYMAIL_DOMAIN:-mail.local}"
HOSTNAME_RPi="${COPYMAIL_HOSTNAME:-raspberrypi}"
ADMIN_PASSWORD="${COPYMAIL_ADMIN_PASS:-copymail2024}"
DB_ROOT_PASS="${COPYMAIL_DB_ROOT:-$(openssl rand -base64 16)}"
DB_APP_PASS="${COPYMAIL_DB_APP:-$(openssl rand -base64 16)}"
APP_DIR="/opt/copymail"
WWW_DIR="${APP_DIR}/web"
LOG_DIR="/var/log/copymail"
# =============================================================================
step "Mise à jour du système"
apt-get update -qq
apt-get upgrade -y -qq
# =============================================================================
step "Installation des paquets"
PHP_VER=$(apt-cache search '^php[0-9]\.[0-9]-fpm$' | awk '{print $1}' | sort -V | tail -1 | grep -oP '\d+\.\d+')
[[ -z "$PHP_VER" ]] && PHP_VER="8.4"
log "Version PHP détectée : ${PHP_VER}"
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
nginx \
php${PHP_VER}-fpm php${PHP_VER}-mysql php${PHP_VER}-cli php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-intl \
mariadb-server \
postfix postfix-mysql \
dovecot-core dovecot-imapd \
samba \
composer \
python3 \
logrotate \
curl wget git
log "Paquets installés."
# =============================================================================
step "Création de l'utilisateur vmail"
if ! id vmail &>/dev/null; then
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail -s /sbin/nologin
fi
mkdir -p /var/mail/vhosts/"${DOMAIN}"
chown -R vmail:vmail /var/mail/vhosts
log "Utilisateur vmail prêt."
# =============================================================================
step "Déploiement de l'application"
mkdir -p "${APP_DIR}" "${LOG_DIR}"
cp -r "$(dirname "$0")/." "${APP_DIR}/"
chmod +x "${APP_DIR}/scripts/"*.sh
# Config PHP de l'app
cat > "${APP_DIR}/config.php" << PHPCONF
<?php
return [
'db_host' => '127.0.0.1',
'db_name' => 'copymail',
'db_user' => 'copymail',
'db_pass' => '${DB_APP_PASS}',
];
PHPCONF
chmod 640 "${APP_DIR}/config.php"
# Dépendances PHP Composer
cd "${APP_DIR}/processor"
composer install --no-dev --optimize-autoloader -q
cd /
log "Application déployée dans ${APP_DIR}."
# =============================================================================
step "Configuration MariaDB"
systemctl enable mariadb --now
# Sécurisation root
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}';" 2>/dev/null || true
mysql -u root -p"${DB_ROOT_PASS}" -e "DELETE FROM mysql.user WHERE User='';" 2>/dev/null || true
mysql -u root -p"${DB_ROOT_PASS}" -e "DROP DATABASE IF EXISTS test;" 2>/dev/null || true
# Création BDD et utilisateur
mysql -u root -p"${DB_ROOT_PASS}" << SQL
CREATE DATABASE IF NOT EXISTS copymail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'copymail'@'localhost' IDENTIFIED BY '${DB_APP_PASS}';
GRANT ALL PRIVILEGES ON copymail.* TO 'copymail'@'localhost';
FLUSH PRIVILEGES;
SQL
# Import du schéma
mysql -u root -p"${DB_ROOT_PASS}" copymail < "${APP_DIR}/sql/schema.sql"
# Mot de passe admin
ADMIN_HASH=$(php -r "echo password_hash('${ADMIN_PASSWORD}', PASSWORD_BCRYPT, ['cost'=>12]);")
mysql -u root -p"${DB_ROOT_PASS}" copymail \
-e "UPDATE admin_users SET password='${ADMIN_HASH}' WHERE username='admin';"
log "MariaDB configuré. Mot de passe root sauvegardé dans /root/.copymail_db_pass"
echo "DB_ROOT=${DB_ROOT_PASS}" > /root/.copymail_db_pass
echo "DB_APP=${DB_APP_PASS}" >> /root/.copymail_db_pass
chmod 600 /root/.copymail_db_pass
# =============================================================================
step "Configuration Postfix"
systemctl stop postfix 2>/dev/null || true
cat > /etc/postfix/main.cf << POSTFIX
myhostname = ${HOSTNAME_RPi}.${DOMAIN}
mydomain = ${DOMAIN}
myorigin = \$mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost
mynetworks = 127.0.0.0/8
virtual_mailbox_domains = ${DOMAIN}
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_banner = \$myhostname ESMTP
biff = no
append_dot_mydomain = no
message_size_limit = 52428800
POSTFIX
touch /etc/postfix/vmailbox
postmap /etc/postfix/vmailbox
systemctl enable postfix --now
log "Postfix configuré."
# =============================================================================
step "Configuration Dovecot"
systemctl stop dovecot 2>/dev/null || true
touch /etc/dovecot/users
chown root:dovecot /etc/dovecot/users
chmod 640 /etc/dovecot/users
cat > /etc/dovecot/dovecot.conf << DOVECOT
protocols = imap
listen = *
mail_location = maildir:/var/mail/vhosts/%d/%n/Maildir
mail_privileged_group = vmail
auth_mechanisms = plain login
passdb {
driver = passwd-file
args = scheme=SHA512-CRYPT /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
service imap-login {
inet_listener imap {
port = 143
}
}
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
DOVECOT
systemctl enable dovecot --now
log "Dovecot configuré."
# =============================================================================
step "Configuration Samba"
systemctl stop smbd nmbd 2>/dev/null || true
mkdir -p /srv/copymail
chown root:vmail /srv/copymail
chmod 775 /srv/copymail
cat > /etc/samba/smb.conf << SAMBA
[global]
workgroup = WORKGROUP
server string = CopyMail Server
netbios name = COPYMAIL
security = user
map to guest = Never
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
passdb backend = tdbsam
# Les shares des comptes seront ajoutés ici automatiquement
SAMBA
systemctl enable smbd nmbd --now
log "Samba configuré."
# =============================================================================
step "Configuration Nginx"
systemctl stop nginx 2>/dev/null || true
cat > /etc/nginx/sites-available/copymail << NGINX
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root ${WWW_DIR};
index index.php;
client_max_body_size 60M;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php${PHP_VER}-fpm.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
location ~ /\. {
deny all;
}
# Interdit l'accès direct aux fichiers includes et config
location ~* ^/(includes|processor|scripts|sql|config\.php) {
deny all;
}
access_log /var/log/nginx/copymail_access.log;
error_log /var/log/nginx/copymail_error.log;
}
NGINX
ln -sf /etc/nginx/sites-available/copymail /etc/nginx/sites-enabled/copymail
rm -f /etc/nginx/sites-enabled/default
systemctl enable nginx php8.2-fpm --now
log "Nginx configuré."
# =============================================================================
step "Configuration sudo pour scripts système"
cat > /etc/sudoers.d/copymail << SUDOERS
www-data ALL=(root) NOPASSWD: /opt/copymail/scripts/create_account.sh
www-data ALL=(root) NOPASSWD: /opt/copymail/scripts/delete_account.sh
www-data ALL=(root) NOPASSWD: /opt/copymail/scripts/apply_config.sh
SUDOERS
chmod 440 /etc/sudoers.d/copymail
log "Règles sudo configurées."
# Mise à jour des appels sudo dans le code PHP
sed -i "s|shell_exec('/opt/copymail/scripts/|shell_exec('sudo /opt/copymail/scripts/|g" \
"${WWW_DIR}/admin/accounts.php" \
"${WWW_DIR}/admin/domain.php" 2>/dev/null || true
# =============================================================================
step "Cron pour le traitement des mails"
CRON_LINE="* * * * * php ${APP_DIR}/processor/process_mail.php >> ${LOG_DIR}/processor.log 2>&1"
(crontab -l 2>/dev/null | grep -v "process_mail"; echo "${CRON_LINE}") | crontab -
log "Cron configuré (toutes les minutes)."
# =============================================================================
step "Logrotate"
cat > /etc/logrotate.d/copymail << LOGROTATE
${LOG_DIR}/*.log {
daily
rotate 14
compress
missingok
notifempty
create 640 www-data www-data
}
LOGROTATE
# =============================================================================
step "Mise à jour config BDD avec le domaine"
mysql -u copymail -p"${DB_APP_PASS}" copymail \
-e "UPDATE config SET value='${DOMAIN}' WHERE \`key\`='domain';
UPDATE config SET value='${HOSTNAME_RPi}' WHERE \`key\`='hostname';
UPDATE config SET value='1' WHERE \`key\`='install_done';"
# =============================================================================
IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}============================================================${NC}"
echo -e "${GREEN} CopyMail installé avec succès !${NC}"
echo -e "${GREEN}============================================================${NC}"
echo ""
echo -e " Interface web : ${BLUE}http://${IP}/${NC}"
echo -e " Login admin : ${YELLOW}admin${NC} / ${YELLOW}${ADMIN_PASSWORD}${NC}"
echo ""
echo -e " Domaine mail : ${DOMAIN}"
echo -e " SMTP : port 25"
echo -e " IMAP : port 143"
echo -e " SMB shares : /srv/copymail/<compte>/"
echo ""
echo -e " Pour créer un compte mail, aller dans :"
echo -e " ${BLUE}http://${IP}/admin/accounts.php${NC}"
echo ""
echo -e " Mots de passe BDD sauvegardés dans : /root/.copymail_db_pass"
echo -e "${GREEN}============================================================${NC}"