Portail web du Registre Social Unique (ST-RSU)
Ce dépôt contient le portail public et l'espace d'administration du ST-RSU.
frontend-rsu: application Angular 21 ;backend-rsu: API Spring Boot 3.2 / Java 17 ;- PostgreSQL 15 : données éditoriales, utilisateurs et paramètres ;
backend-rsu/uploadsen local, ouUPLOAD_BASE_PATHen production : photos et documents téléversés.
Important : un déploiement fidèle au site préparé en local exige la base PostgreSQL et le dossier
uploads. La base contient les références des fichiers, mais pas les fichiers eux-mêmes.
Livraison Git interne : exécuter
git lfs installavant le clonage, puisgit lfs pullaprès le clonage. Le JAR backend et la sauvegarde PostgreSQL sont stockés avec Git LFS. Les secrets de production ne font jamais partie du dépôt.
1. Informations à obtenir avant le déploiement
La personne chargée du serveur doit confirmer :
- le nom de domaine public définitif ;
- l'adresse et les accès du serveur PostgreSQL 15 ;
- le système d'exploitation du serveur (les exemples ci-dessous utilisent Ubuntu/Debian) ;
- l'adresse électronique technique pour le certificat HTTPS ;
- l'emplacement des sauvegardes ;
- si la publication Facebook doit être activée.
Le domaine officiel utilisé dans ce guide est rsu.gov.bf.
2. Prérequis
Sur le serveur :
- Java JDK/JRE 17 ;
- PostgreSQL 15 ;
- Nginx ;
- Certbot pour HTTPS ;
- au moins 2 Go de mémoire vive et un espace disque surveillé pour les fichiers.
Node.js n'est nécessaire que sur la machine qui compile Angular. Utiliser Node.js 22 LTS et npm 10 ou une version compatible avec Angular 21.
3. Préparer la version à livrer
Depuis la racine du dépôt :
cd backend-rsu
mvn clean package
cd ../frontend-rsu
npm ci
npm run build -- --configuration production
Fichiers produits :
- backend :
backend-rsu/target/rsu-api-1.0.0.jar; - frontend :
frontend-rsu/dist/rsu-web/browser/.
Avant toute livraison, vérifier que git status ne contient pas de secret, de mot de passe, de dump PostgreSQL ou de fichier provenant de uploads.
4. Exporter le contenu préparé en local
4.1 Base PostgreSQL
Sur la machine locale où se trouve la base SITE_RSU :
& "C:\Program Files\PostgreSQL\15\bin\pg_dump.exe" `
-h localhost -U postgres -d SITE_RSU -F c `
-f "C:\chemin\de\livraison\SITE_RSU.dump"
4.2 Photos et documents
Copier intégralement backend-rsu/uploads/ dans le paquet de livraison. Ne pas envoyer uniquement le code Git : les fichiers téléversés sont volontairement ignorés par Git.
Le paquet remis au responsable du déploiement doit contenir :
livraison-rsu/
├── rsu-api-1.0.0.jar
├── frontend/ # contenu de dist/rsu-web/browser
├── uploads/ # photos et documents actuels
├── SITE_RSU.dump
└── README.md
5. Préparer le serveur Linux
Créer un utilisateur système et les dossiers permanents :
sudo useradd --system --home /opt/rsu --shell /usr/sbin/nologin rsu
sudo mkdir -p /opt/rsu/backend /opt/rsu/uploads /var/www/rsu /etc/rsu /var/backups/rsu
sudo chown -R rsu:rsu /opt/rsu
sudo chown -R www-data:www-data /var/www/rsu
sudo chmod 750 /etc/rsu
Installer les livrables :
sudo install -o rsu -g rsu -m 750 rsu-api-1.0.0.jar /opt/rsu/backend/rsu-api.jar
sudo cp -a uploads/. /opt/rsu/uploads/
sudo chown -R rsu:rsu /opt/rsu/uploads
sudo cp -a frontend/. /var/www/rsu/
sudo chown -R www-data:www-data /var/www/rsu
6. Créer et restaurer PostgreSQL
Créer un compte applicatif distinct du compte administrateur postgres :
sudo -u postgres psql
CREATE ROLE rsu_app LOGIN PASSWORD 'MOT_DE_PASSE_TRES_FORT';
CREATE DATABASE "SITE_RSU" OWNER rsu_app ENCODING 'UTF8';
\q
Restaurer la base préparée en local :
sudo -u postgres pg_restore \
--dbname=SITE_RSU \
--no-owner \
--role=rsu_app \
SITE_RSU.dump
Si la base doit être totalement vide, ne pas restaurer de dump. Le premier démarrage créera le schéma et les comptes initiaux à partir des variables SUPER_ADMIN_PASSWORD, ADMIN_PASSWORD, EDITOR_PASSWORD et USER_PASSWORD.
7. Configurer les variables secrètes
Copier .env.example vers /etc/rsu/rsu.env, puis remplacer toutes les valeurs d'exemple :
sudo cp .env.example /etc/rsu/rsu.env
sudo chown root:rsu /etc/rsu/rsu.env
sudo chmod 640 /etc/rsu/rsu.env
Générer le secret JWT avec openssl rand -base64 64.
Variables indispensables :
SERVER_PORT=8096
DB_URL=jdbc:postgresql://localhost:5432/SITE_RSU
DB_USERNAME=rsu_app
DB_PASSWORD=mot-de-passe-fort-de-la-base
JWT_SECRET=secret-base64-genere-par-openssl
UPLOAD_BASE_PATH=/opt/rsu/uploads
PUBLIC_SITE_URL=https://rsu.gov.bf
CORS_ALLOWED_ORIGINS=https://rsu.gov.bf
HIBERNATE_DDL_AUTO=validate
SWAGGER_ENABLED=false
Les variables FACEBOOK_PAGE_ID et FACEBOOK_PAGE_ACCESS_TOKEN sont facultatives. Le jeton Facebook doit rester uniquement sur le serveur.
Utiliser HIBERNATE_DDL_AUTO=validate lorsque SITE_RSU.dump a été restauré. Utiliser temporairement update uniquement pour initialiser une base vide, puis revenir à validate après le premier démarrage réussi.
8. Lancer le backend avec systemd
Créer /etc/systemd/system/rsu-backend.service :
[Unit]
Description=API du portail ST-RSU
After=network.target postgresql.service
[Service]
Type=simple
User=rsu
Group=rsu
WorkingDirectory=/opt/rsu/backend
EnvironmentFile=/etc/rsu/rsu.env
ExecStart=/usr/bin/java -jar /opt/rsu/backend/rsu-api.jar --spring.profiles.active=prod
Restart=on-failure
RestartSec=5
SuccessExitStatus=143
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Activer et contrôler le service :
sudo systemctl daemon-reload
sudo systemctl enable --now rsu-backend
sudo systemctl status rsu-backend
sudo journalctl -u rsu-backend -n 100 --no-pager
Le port 8096 ne doit pas être exposé publiquement ; seul Nginx doit y accéder localement.
9. Configurer Nginx
Créer /etc/nginx/sites-available/rsu :
server {
listen 80;
server_name rsu.gov.bf;
root /var/www/rsu;
index index.html;
client_max_body_size 25M;
location /api/ {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
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;
}
location /uploads/ {
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
expires 1h;
}
location / {
try_files $uri $uri/ /index.html;
}
}
Activer le site :
sudo ln -s /etc/nginx/sites-available/rsu /etc/nginx/sites-enabled/rsu
sudo nginx -t
sudo systemctl reload nginx
La directive try_files ... /index.html est indispensable pour que les adresses Angular telles que /auth/login fonctionnent après actualisation de la page.
10. Activer HTTPS
Après avoir dirigé le domaine vers le serveur :
sudo certbot --nginx -d rsu.gov.bf
sudo certbot renew --dry-run
Ne pas ouvrir l'administration en HTTP. Après activation du certificat, vérifier que toutes les requêtes HTTP sont redirigées vers HTTPS.
11. Vérifications après déploiement
Contrôler au minimum :
- la page d'accueil :
https://rsu.gov.bf/; - la connexion :
https://rsu.gov.bf/auth/login; - la consultation des articles et documents ;
- l'affichage des anciennes photos provenant de
uploads; - l'ajout puis l'affichage d'une nouvelle photo ;
- la création, modification et suppression d'un contenu ;
- les messages, plaintes, commentaires et leurs notifications ;
- les rôles Administrateur et Éditeur ;
- la carte de couverture territoriale ;
- la visualisation et le téléchargement des PDF ;
- l'affichage sur téléphone ;
- les journaux :
journalctl -u rsu-backendet/var/log/nginx/error.log.
12. Sauvegardes obligatoires
La sauvegarde doit toujours associer la base et les fichiers.
sudo -u postgres pg_dump -F c SITE_RSU \
-f /var/backups/rsu/SITE_RSU_$(date +%F_%H-%M).dump
sudo tar -C /opt/rsu -czf \
/var/backups/rsu/uploads_$(date +%F_%H-%M).tar.gz uploads
Recommandation : une sauvegarde quotidienne, conservée sur un autre serveur ou support, avec un test de restauration périodique. Une sauvegarde stockée uniquement sur le serveur du site ne protège pas contre la perte du serveur.
13. Mise à jour ultérieure
Avant chaque mise à jour :
- sauvegarder PostgreSQL et
uploads; - compiler la nouvelle version ;
- conserver le JAR et le frontend précédents pour un retour arrière ;
- remplacer les fichiers ;
- redémarrer le backend et recharger Nginx ;
- exécuter la liste de vérifications.
Ne jamais supprimer ou écraser /opt/rsu/uploads pendant une mise à jour applicative.
14. Sécurité avant ouverture publique
- changer tous les mots de passe temporaires ;
- ne jamais pousser
.env, un dump ou un jeton Facebook sur GitHub ; - limiter PostgreSQL à l'adresse locale ou au réseau privé ;
- garder Swagger désactivé en production ;
- n'exposer publiquement que les ports 80 et 443 ;
- appliquer les mises à jour de sécurité du système ;
- tester la restauration des sauvegardes ;
- vérifier les droits du dossier
uploadset du fichier/etc/rsu/rsu.env.
15. Développement local
Backend :
$env:DB_USERNAME = "postgres"
$env:DB_PASSWORD = "votre-mot-de-passe"
$env:JWT_SECRET = "votre-secret-base64"
cd backend-rsu
mvn spring-boot:run
Frontend :
cd frontend-rsu
npm install
npm start
- site :
http://localhost:4200; - administration :
http://localhost:4200/auth/login; - API :
http://localhost:8096; - Swagger local :
http://localhost:8096/swagger-ui.html.
Le proxy Angular local transmet automatiquement /api et /uploads au backend sur le port 8096.