Aller au contenu

Installer sur un serveur

Cette page est prévue pour être suivie de bout en bout, sans rien deviner. Elle installe Kewos ERP sur un serveur Linux, en service permanent, derrière votre proxy.

Ce qu’il vous faut

SystèmeDebian 12 / 13, Ubuntu 22.04 / 24.04, ou équivalent 64 bits.
Processeur4 cœurs pour démarrer.
Mémoire8 Go. Comptez 16 Go au-delà de vingt utilisateurs simultanés.
Disque20 Go pour le produit, plus la place de vos pièces jointes et de vos sauvegardes.
Base de donnéesPostgreSQL 16 ou 17.
File d’attenteRedis 6 ou plus.
RéseauUn nom de domaine et un proxy qui termine le TLS.

Les paquets système

Fenêtre de terminal
sudo apt update
sudo apt install -y postgresql redis-server ca-certificates curl

Le rendu des documents PDF s’appuie sur quelques bibliothèques natives :

Fenêtre de terminal
sudo apt install -y libpango-1.0-0 libpangoft2-1.0-0 libcairo2 libgdk-pixbuf-2.0-0 \
libffi8 shared-mime-info fonts-dejavu-core

Sans elles, l’application démarre, et l’impression d’un document échoue au moment où quelqu’un en a besoin. Installez-les maintenant.

1. Le compte de service et l’arborescence

L’application ne tourne jamais en root.

Fenêtre de terminal
sudo useradd --system --home-dir /opt/kewos --shell /usr/sbin/nologin kewos
sudo mkdir -p /opt/kewos /etc/kewos /var/lib/kewos/storage /var/log/kewos
sudo chown -R kewos:kewos /opt/kewos /var/lib/kewos /var/log/kewos
sudo chmod 750 /etc/kewos
CheminContenu
/opt/kewos/currentLa version en service (un lien vers /opt/kewos/releases/<version>).
/opt/kewos/releases/Les versions installées. On en garde deux ou trois pour pouvoir revenir.
/etc/kewos/kewos.envLa configuration. Contient des secrets : root:kewos, mode 640.
/etc/kewos/license.tokenVotre jeton de licence.
/var/lib/kewos/storageLes pièces jointes et les documents générés. À sauvegarder.
/var/log/kewosLes journaux.

2. La base de données

Le rôle a besoin du droit CREATEDB : l’application crée sa base et, en multi-société avancé, celles des entités supplémentaires.

Fenêtre de terminal
sudo -u postgres psql <<'SQL'
CREATE ROLE kewos LOGIN PASSWORD 'un-mot-de-passe-long-et-aleatoire' CREATEDB;
CREATE DATABASE kewos OWNER kewos;
SQL

Vérifiez la connexion avant d’aller plus loin :

Fenêtre de terminal
PGPASSWORD='un-mot-de-passe-long-et-aleatoire' psql -h 127.0.0.1 -U kewos -d kewos -c 'select 1'

3. Récupérer votre version

En archive

Fenêtre de terminal
cd /tmp
curl -u '<votre-identifiant>' -O https://download.kewos.io/erp/kewos-erp-<version>.tar.gz
curl -u '<votre-identifiant>' -O https://download.kewos.io/erp/kewos-erp-<version>.tar.gz.sha256

Vérifiez l’empreinte avant de déployer. Un paquet qui ne correspond pas à la sienne n’est pas un paquet Kewos.

Fenêtre de terminal
sha256sum -c kewos-erp-<version>.tar.gz.sha256
# kewos-erp-<version>.tar.gz : Réussi

Puis installez-le dans son propre répertoire de version :

Fenêtre de terminal
sudo mkdir -p /opt/kewos/releases/<version>
sudo tar -xzf kewos-erp-<version>.tar.gz -C /opt/kewos/releases/<version> --strip-components=1
sudo chown -R kewos:kewos /opt/kewos/releases/<version>
sudo ln -sfn /opt/kewos/releases/<version> /opt/kewos/current

Le lien symbolique n’est pas une coquetterie : c’est ce qui rend la mise à jour et le retour arrière immédiats, sans jamais laisser l’application dans un état à moitié copié.

En conteneur

Fenêtre de terminal
docker login registry.kewos.io
docker pull registry.kewos.io/erp:<version>

Le reste de cette page décrit l’installation en archive. Pour le conteneur, les mêmes clés de configuration se passent en variables d’environnement, et les mêmes volumes correspondent : /etc/kewos en lecture seule et /var/lib/kewos/storage en écriture.

4. La configuration

Créez /etc/kewos/kewos.env. C’est le seul fichier à écrire.

Fenêtre de terminal
sudo install -o root -g kewos -m 640 /dev/null /etc/kewos/kewos.env
sudo editor /etc/kewos/kewos.env

Générer les secrets

Trois valeurs doivent être aléatoires et vous appartenir. Générez-les une fois :

Fenêtre de terminal
echo "KEWOS_SECRETS_MASTER_KEY=$(openssl rand -base64 32)"
echo "KEWOS_ATTACHMENT_SIGNING_SECRET=$(openssl rand -hex 32)"
echo "KEWOS_PORTAL_SIGNING_SECRET=$(openssl rand -hex 32)"

Le fichier, en entier

Fenêtre de terminal
# --- Obligatoire ---------------------------------------------------------
KEWOS_ENV=production
KEWOS_MASTER_DATABASE_URL=postgresql+psycopg://kewos:MOT_DE_PASSE@127.0.0.1:5432/kewos
KEWOS_REDIS_URL=redis://127.0.0.1:6379/0
KEWOS_SECRETS_MASTER_KEY=...
KEWOS_LICENSE_PUBLIC_KEY=... # fournie par Kewos avec votre licence
KEWOS_PUBLIC_BASE_URL=https://erp.votre-domaine.fr
# --- Chemins -------------------------------------------------------------
KEWOS_MODULES_ROOT=/opt/kewos/current/modules
KEWOS_STORAGE_ROOT=/var/lib/kewos/storage
KEWOS_LOG_DIR=/var/log/kewos
# --- Réseau --------------------------------------------------------------
KEWOS_HOST=127.0.0.1
KEWOS_PORT=8080
# --- Signature des liens -------------------------------------------------
KEWOS_ATTACHMENT_SIGNING_SECRET=...
KEWOS_PORTAL_SIGNING_SECRET=...
# --- Premier administrateur (lu au premier démarrage seulement) -----------
KEWOS_ADMIN_LOGIN=admin
KEWOS_ADMIN_EMAIL=admin@votre-domaine.fr
KEWOS_ADMIN_PASSWORD=...
# --- Recommandé ----------------------------------------------------------
KEWOS_LOG_LEVEL=INFO
KEWOS_MAIL_FROM=no-reply@votre-domaine.fr
KEWOS_RATE_LIMIT_PER_MINUTE=100
KEWOS_HTTP_TIMEOUT_SECONDS=20
KEWOS_DB_TIMEOUT_SECONDS=30
KEWOS_JOB_TIMEOUT_SECONDS=900

Ce que chaque clé fait

CléRôle
KEWOS_ENVproduction sur un serveur. Toute autre valeur active des facilités de développement, dont l’application de schéma à chaud.
KEWOS_MASTER_DATABASE_URLL’adresse de la base. Le préfixe postgresql+psycopg:// est requis.
KEWOS_REDIS_URLLa file de travaux et le cache. Sans elle, aucun traitement de fond ne s’exécute.
KEWOS_SECRETS_MASTER_KEYChiffre les secrets stockés en base. Irremplaçable.
KEWOS_LICENSE_PUBLIC_KEYLa clé avec laquelle votre jeton de licence est vérifié. Sans elle, l’application refuse de démarrer en production.
KEWOS_PUBLIC_BASE_URLL’adresse publique. Sert à fabriquer les liens absolus des courriels et des PDF ; sans elle, les images n’apparaissent pas dans les documents envoyés.
KEWOS_MODULES_ROOTOù sont les modules. Pointez le lien current, pas une version figée.
KEWOS_STORAGE_ROOTOù vivent les pièces jointes. À sauvegarder avec la base.
KEWOS_LOG_DIRActive le journal en fichier, avec rotation. Sans elle, tout va sur la sortie standard.
KEWOS_HOST / KEWOS_PORTL’écoute. Restez sur 127.0.0.1 : c’est le proxy qui expose.
KEWOS_ATTACHMENT_SIGNING_SECRETSigne les liens de pièce jointe. Changer cette valeur invalide les liens déjà envoyés.
KEWOS_PORTAL_SIGNING_SECRETSigne les accès du portail externe. Même remarque.
KEWOS_ADMIN_PASSWORDLe mot de passe du premier administrateur, appliqué au premier démarrage.
KEWOS_MAIL_FROML’expéditeur par défaut des courriels sortants.
KEWOS_RATE_LIMIT_PER_MINUTELe budget de requêtes par acteur et par minute.
KEWOS_LOG_LEVELINFO en service courant, DEBUG seulement le temps d’un diagnostic.

5. Le premier démarrage

Cette commande enregistre l’installation, crée le schéma et l’administrateur. Elle est idempotente : la rejouer ne fait pas de dégât.

Fenêtre de terminal
cd /opt/kewos/current
sudo -u kewos env $(grep -v '^#' /etc/kewos/kewos.env | xargs) \
./bin/kewos-server provision
provisioned tenant 'main' + admin 'admin' (created)

Puis alignez le schéma. Une installation neuve se déclare en dérive tant que ce n’est pas fait, parce que les tables sont créées d’un bloc sans que les migrations soient marquées. La commande est additive : elle crée ce qui manque et ne détruit jamais.

Fenêtre de terminal
sudo -u kewos env $(grep -v '^#' /etc/kewos/kewos.env | xargs) \
./bin/kewos reconcile --confirm --modules-root /opt/kewos/current/modules
main [active]: reconciled (37 migration(s), 0 column(s))
done: 1 tenant(s), 0 failed

6. Poser votre licence

Fenêtre de terminal
sudo install -o root -g kewos -m 640 votre-licence.token /etc/kewos/license.token
cd /opt/kewos/current
sudo -u kewos env $(grep -v '^#' /etc/kewos/kewos.env | xargs) \
./bin/kewos license install \
--tenant main \
--database-url "$KEWOS_MASTER_DATABASE_URL" \
--token-file /etc/kewos/license.token

Vérifiez :

Fenêtre de terminal
sudo -u kewos env $(grep -v '^#' /etc/kewos/kewos.env | xargs) \
./bin/kewos license show --database-url "$KEWOS_MASTER_DATABASE_URL"
status: valid
tenant: main
plan: on-prem
users: 1 / 25
companies: 1 / 3
expires: 2027-09-03T11:28:38+00:00

Sans cette étape, le démarrage se termine par :

refusing to start: tenant(s) without a valid license: main=missing

Si votre licence est liée à une machine

Fenêtre de terminal
sudo -u kewos ./bin/kewos license fingerprint

Envoyez la valeur affichée à Kewos, qui émet un jeton lié à ce serveur.

7. Les services

Deux services : l’application, et le travailleur qui draine la file. Les deux sont nécessaires. Sans le travailleur, les courriels, les imports et les documents attendent sans message d’erreur.

/etc/systemd/system/kewos.service :

[Unit]
Description=Kewos ERP
After=network-online.target postgresql.service redis-server.service
Wants=postgresql.service redis-server.service
[Service]
Type=simple
User=kewos
Group=kewos
WorkingDirectory=/opt/kewos/current
EnvironmentFile=/etc/kewos/kewos.env
ExecStart=/opt/kewos/current/bin/kewos-server
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/kewos /var/log/kewos
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target

/etc/systemd/system/kewos-worker.service :

[Unit]
Description=Kewos ERP background worker
After=network-online.target redis-server.service kewos.service
Wants=redis-server.service
[Service]
Type=simple
User=kewos
Group=kewos
WorkingDirectory=/opt/kewos/current
EnvironmentFile=/etc/kewos/kewos.env
ExecStart=/opt/kewos/current/bin/kewos worker --threads 8
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/kewos /var/log/kewos
[Install]
WantedBy=multi-user.target
Fenêtre de terminal
sudo systemctl daemon-reload
sudo systemctl enable --now kewos kewos-worker
sudo systemctl status kewos kewos-worker --no-pager

Le démarrage prend une dizaine de secondes. Une vérification lancée trop tôt échoue alors que tout va bien.

8. Le proxy

Caddy

erp.votre-domaine.fr {
encode zstd gzip
request_body {
max_size 60MB
}
reverse_proxy 127.0.0.1:8080
}

nginx

server {
listen 443 ssl http2;
server_name erp.votre-domaine.fr;
ssl_certificate /etc/letsencrypt/live/erp.votre-domaine.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/erp.votre-domaine.fr/privkey.pem;
# Les pièces jointes et les imports peuvent être volumineux : une valeur
# trop basse ici renvoie un 413 avant que l'application ne voie la requête.
client_max_body_size 60m;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
}

9. Vérifier

Fenêtre de terminal
curl -fsS https://erp.votre-domaine.fr/health/live
# {"status":"alive"}
curl -fsS https://erp.votre-domaine.fr/health/schema
# {"status":"ok","tenants_checked":1,"drifted":{}}
curl -o /dev/null -w '%{http_code}\n' https://erp.votre-domaine.fr/api/v1/about
# 401

Un 401 sur l’API est un bon signe : elle est fermée.

Puis ouvrez l’adresse dans un navigateur et connectez-vous.

Ce que vous voyezCe que ça veut direCe qu’il faut faire
L’écran de connexionTout va bien.Mettre en service.
Le service ne démarre pasLicence manquante, clé publique absente, ou base injoignable.journalctl -u kewos -n 50 --no-pager
Une page vide, l’API répondLe paquet est incomplet.Reprenez le téléchargement et vérifiez l’empreinte.
/health/schema répond driftedLe schéma est en retard sur le code.Relancez reconcile --confirm, puis redémarrez.
Les courriels ne partent pasLe travailleur ne tourne pas.sudo systemctl status kewos-worker

10. Mettre à jour, et revenir en arrière

Une mise à jour consiste à installer une version à côté et à déplacer le lien.

Fenêtre de terminal
# 1. Sauvegarder AVANT.
sudo -u postgres pg_dump -Fc kewos > /var/backups/kewos-$(date +%F).dump
# 2. Installer la nouvelle version à côté de l'ancienne.
sudo mkdir -p /opt/kewos/releases/<nouvelle>
sudo tar -xzf kewos-erp-<nouvelle>.tar.gz -C /opt/kewos/releases/<nouvelle> --strip-components=1
sudo chown -R kewos:kewos /opt/kewos/releases/<nouvelle>
# 3. Basculer, aligner le schéma, redémarrer.
sudo ln -sfn /opt/kewos/releases/<nouvelle> /opt/kewos/current
sudo systemctl stop kewos kewos-worker
cd /opt/kewos/current && sudo -u kewos env $(grep -v '^#' /etc/kewos/kewos.env | xargs) \
./bin/kewos reconcile --confirm --modules-root /opt/kewos/current/modules
sudo systemctl start kewos kewos-worker

Le retour arrière est le même geste, dans l’autre sens :

Fenêtre de terminal
sudo ln -sfn /opt/kewos/releases/<ancienne> /opt/kewos/current
sudo systemctl restart kewos kewos-worker

Et ensuite

Mettre en service : les réglages à faire avant d’ouvrir aux utilisateurs.