Auto-héberger Send sur Proxmox : guide d'installation complet 2026
Guide pas-à-pas pour déployer Send sur deux nœuds Proxmox. Architecture, prérequis, install Ubuntu LTS, MariaDB, Redis, NFS, ClamAV, Horizon supervisor. Production-ready en une journée.
Ce guide décrit le déploiement de Send sur deux nœuds Proxmox VE. À la fin, vous aurez une instance production-ready, accessible sur votre domaine, avec multi-tenancy, anti-virus, queue distribuée et sauvegardes automatiques.
Architecture cible
L'infra Send tourne sur deux VM Ubuntu LTS pour séparer les charges :
| Rôle | VM 1 — app-server |
VM 2 — media-server |
|---|---|---|
| Web front | Nginx + TLS | — |
| PHP-FPM | ✓ | ✓ |
| MariaDB 11 | ✓ | — |
| Redis 7 | ✓ | — |
| Workers Horizon | default, priority |
media, low |
| Storage NFS | Mount client | NFS server |
| FFmpeg, LibreOffice, Tesseract, Ghostscript | — | ✓ |
Les deux VM communiquent via WireGuard sur un subnet privé
10.10.0.0/24. Aucun port applicatif (NFS, Redis, SSH) n'est exposé
publiquement.
Pré-requis
- Proxmox VE 8.x avec 24+ vCPU dispos + 64 GB RAM
- 2 TB disque libre (XFS recommandé pour le nœud media)
- Un domaine + accès DNS pour configurer un wildcard
*.votre-domaine.com - Compte SMTP pour envoi de mails (Brevo, OVH, Sendgrid…)
- License Send commerciale (cf. /self-host) ou trial 30j sur le SaaS
Étape 1 — Créer les deux VM Ubuntu
Sur Proxmox, créez deux VM avec ces specs :
app-server :
- 8 vCPU, 32 GB RAM, 100 GB SSD NVMe
- Ubuntu Server 24.04 LTS
- Interface réseau bridgée
media-server :
- 16 vCPU, 16 GB RAM, 50 GB SSD (système) + disque XFS dédié 2 TB
- Ubuntu Server 26.04 LTS
- Interface réseau bridgée
Activer qemu-guest-agent sur les deux pour la propagation des
adresses IP côté Proxmox.
Étape 2 — Configurer WireGuard entre les deux nœuds
Sur chaque VM :
sudo apt update && sudo apt install -y wireguard
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
Échangez les publickey entre les deux serveurs (via SSH). Puis sur
app-server créez /etc/wireguard/wg0.conf :
[Interface]
PrivateKey = <app-server-privatekey>
Address = 10.10.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <media-server-publickey>
AllowedIPs = 10.10.0.2/32
Endpoint = <media-server-public-ip>:51820
PersistentKeepalive = 25
Et sur media-server, l'inverse :
[Interface]
PrivateKey = <media-server-privatekey>
Address = 10.10.0.2/24
ListenPort = 51820
[Peer]
PublicKey = <app-server-publickey>
AllowedIPs = 10.10.0.1/32
Endpoint = <app-server-public-ip>:51820
PersistentKeepalive = 25
Démarrer :
sudo systemctl enable --now wg-quick@wg0
Vérifier la connexion : ping 10.10.0.2 depuis app-server.
Étape 3 — Stack logicielle
app-server : PHP 8.5 (via PPA ondrej/php) + MariaDB + Redis + Nginx
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y nginx php8.5-fpm php8.5-cli php8.5-mysql php8.5-redis \
php8.5-mbstring php8.5-xml php8.5-zip php8.5-gd \
php8.5-curl php8.5-bcmath php8.5-intl \
mariadb-server redis-server certbot python3-certbot-nginx
Sécurisez MariaDB : sudo mysql_secure_installation.
Créez la base + user :
CREATE DATABASE send CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'send'@'localhost' IDENTIFIED BY '<strong-password>';
GRANT ALL ON send.* TO 'send'@'localhost';
FLUSH PRIVILEGES;
media-server : PHP 8.5 + FFmpeg + LibreOffice + Tesseract + Ghostscript
sudo apt install -y php8.5-fpm php8.5-cli php8.5-mysql php8.5-redis \
ffmpeg libreoffice-core libreoffice-writer libreoffice-calc \
tesseract-ocr tesseract-ocr-fra ghostscript poppler-utils \
imagemagick clamav clamav-daemon nfs-kernel-server
Démarrer ClamAV daemon :
sudo systemctl enable --now clamav-daemon clamav-freshclam
NFS partagé
Sur media-server, créer le dossier de stockage :
sudo mkdir -p /srv/data/send-v2
sudo chown www-data:www-data /srv/data/send-v2
echo "/srv/data/send-v2 10.10.0.1(rw,sync,no_subtree_check,no_root_squash,fsid=1)" | \
sudo tee -a /etc/exports
sudo systemctl restart nfs-kernel-server
Sur app-server, monter le NFS :
sudo mkdir -p /mnt/send-storage
echo "10.10.0.2:/srv/data/send-v2 /mnt/send-storage nfs4 _netdev,nofail,hard,intr,rsize=1048576,wsize=1048576 0 0" | \
sudo tee -a /etc/fstab
sudo mount -a
Sur media-server, créer un lien symbolique pour que les workers accèdent au stockage par le même chemin que sur l'app-server :
sudo ln -s /srv/data/send-v2 /mnt/send-storage
Étape 4 — Déployer le code Send
Suivez la procédure de license + livraison depuis votre dashboard
client Send. Le déploiement utilise Deployer.org (PHP, intégration
Laravel native) avec un fichier deploy.php qui gère les deux VM en
parallèle.
# Sur votre machine de dev
git clone git@send-git:send.git
cd send
cp .env.example .env
# Éditer .env avec vos credentials DB, Redis, etc.
dep deploy all
Cela exécute composer install, npm ci && npm run build,
php artisan migrate --force, et démarre Horizon sur les deux VM.
Étape 5 — Configuration Nginx + TLS
Sur app-server :
server {
listen 443 ssl http2;
server_name *.votre-domaine.com votre-domaine.com;
ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem;
root /var/www/send/current/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# X-Accel-Redirect pour serve les fichiers tenant
location /internal/storage/ {
internal;
alias /mnt/send-storage/;
}
}
Obtenir le certificat wildcard :
sudo certbot certonly --manual --preferred-challenges=dns \
-d 'votre-domaine.com' -d '*.votre-domaine.com'
Étape 6 — Configurer Horizon comme service
Sur chaque VM, créer /etc/systemd/system/horizon.service :
[Unit]
Description=Send Horizon Queue Worker
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/send/current
ExecStart=/usr/bin/php artisan horizon
Restart=always
Environment="HORIZON_ENV=production-app" # ou production-media
[Install]
WantedBy=multi-user.target
Démarrer :
sudo systemctl enable --now horizon
Étape 7 — Validation
Sur l'app-server :
cd /var/www/send/current
php artisan health:clamav # Sur media-server cette fois
php artisan tools:index # Indexe le catalog dans Meilisearch (optionnel)
Accéder à https://admin.votre-domaine.com pour le panel super-admin
et créer votre premier tenant.
Maintenance courante
- Backups :
php artisan backup:runconfiguré en daily 02:00 viabootstrap/app.php. Pousse vers un stockage tiers (S3, Azure, B2…). - Mises à jour :
dep deploy allaprès chaquegit pullcôté votre repo. Zéro-downtime via symlink atomic switch. - Monitoring :
/upLaravel healthcheck. Optionnel : Grafana + Prometheus exporter pour Horizon.
Coût total
- Proxmox host (location ou serveur dédié) : 100-300 €/mois selon niveau de redondance
- License Send : à partir de 800 €/mois (cf. /self-host)
- TLS : gratuit (Let's Encrypt)
- DNS : votre registrar habituel (~10 €/an)
Total : ~1 000-1 500 €/mois HT pour une console B2B multi-tenants sur votre infra, vs ~50-100 €/mois/user pour les équivalents SaaS combinés (WeTransfer + iLovePDF + Smallpdf + TinyPNG…). ROI immédiat dès 15-20 utilisateurs internes.
Conclusion
L'auto-hébergement de Send sur Proxmox prend une journée d'admin système avec ce guide. Le bénéfice : tous les outils documentaires de votre équipe sur votre infra, traçables, RGPD-clean, et adaptables à vos besoins via l'API REST complète.
Si vous voulez démarrer avec la version SaaS hébergée chez nous (France) pour valider le besoin avant l'auto-hébergement, c'est essai gratuit 30 jours sans CB. La bascule vers l'auto-hébergement est documentée + accompagnée par notre équipe.