321 lines
10 KiB
Bash
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}"
|