#!/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 '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 dovecot_config_version = 2.4.0 dovecot_storage_version = 2.4.0 protocols = imap listen = * mail_location = maildir:/var/mail/vhosts/%{domain}/%{username}/Maildir mail_privileged_group = vmail auth_mechanisms = plain login auth_allow_cleartext = yes passdb passwd-file { default_password_scheme = SHA512-CRYPT passwd_file_path = /etc/dovecot/users } userdb static { fields { uid = vmail gid = vmail home = /var/mail/vhosts/%{domain}/%{username} } } 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//" 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}"