init: projet complet copymail pour Raspberry Pi
Stack: Nginx + PHP 8.2 + MariaDB + Postfix + Dovecot + Samba - install.sh: script installation automatisé pour RPi OS Bookworm - Interface web: visionneuse mails + admin (comptes, domaine, dashboard) - Chaque compte mail génère automatiquement un share Samba - Processeur cron: extraction pièces jointes via zbateson/mail-mime-parser - Zéro injection SQL (PDO + prepared statements) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
316
install.sh
Normal file
316
install.sh
Normal file
@@ -0,0 +1,316 @@
|
||||
#!/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"
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
|
||||
nginx \
|
||||
php8.2-fpm php8.2-mysql php8.2-cli php8.2-mbstring php8.2-curl php8.2-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/php8.2-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}"
|
||||
Reference in New Issue
Block a user