Send

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.

Équipe Send · 10 mai 2026 · 12 min de lecture

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:run configuré en daily 02:00 via bootstrap/app.php. Pousse vers un stockage tiers (S3, Azure, B2…).
  • Mises à jour : dep deploy all après chaque git pull côté votre repo. Zéro-downtime via symlink atomic switch.
  • Monitoring : /up Laravel 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.

#auto-hebergement #proxmox #installation #rgpd