feat: Configuration SSH automatique pour CI/CD et templates Gitea
- Ajout du workflow CI/CD avec configuration SSH automatique - Création des templates pour issues et pull requests - Script de configuration SSH automatique (scripts/setup-ssh-ci.sh) - Documentation SSH complète (docs/SSH_SETUP.md) - Mise à jour de la configuration d'intégration 4NK_node - Amélioration du script de démarrage et de la config Nginx La clé SSH est maintenant utilisée automatiquement dans tous les environnements : - CI/CD Gitea Actions avec variable SSH_PRIVATE_KEY - Environnement local avec détection automatique - Configuration Git pour utiliser SSH au lieu de HTTPS
This commit is contained in:
parent
c563d7b16c
commit
ea97ffa733
39
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
39
.gitea/ISSUE_TEMPLATE/bug_report.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
name: Rapport de bug
|
||||||
|
about: Créer un rapport pour nous aider à améliorer l'interface utilisateur 4NK
|
||||||
|
title: '[BUG] '
|
||||||
|
labels: ['bug', 'needs-triage']
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description du bug
|
||||||
|
Une description claire et concise du bug.
|
||||||
|
|
||||||
|
## Étapes pour reproduire
|
||||||
|
1. Aller à '...'
|
||||||
|
2. Cliquer sur '...'
|
||||||
|
3. Faire défiler jusqu'à '...'
|
||||||
|
4. Voir l'erreur
|
||||||
|
|
||||||
|
## Comportement attendu
|
||||||
|
Une description claire et concise de ce que vous attendiez.
|
||||||
|
|
||||||
|
## Captures d'écran
|
||||||
|
Si applicable, ajoutez des captures d'écran pour expliquer votre problème.
|
||||||
|
|
||||||
|
## Environnement
|
||||||
|
- OS: [ex. iOS]
|
||||||
|
- Navigateur: [ex. chrome, safari]
|
||||||
|
- Version: [ex. 22]
|
||||||
|
- Version de l'application: [ex. 1.0.0]
|
||||||
|
|
||||||
|
## Contexte supplémentaire
|
||||||
|
Ajoutez tout autre contexte concernant le problème ici.
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
Si applicable, ajoutez les logs d'erreur du navigateur ou de l'application.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] J'ai vérifié que le bug n'a pas déjà été signalé
|
||||||
|
- [ ] J'ai fourni toutes les informations nécessaires pour reproduire le bug
|
||||||
|
- [ ] J'ai testé sur différents navigateurs/environnements
|
38
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
38
.gitea/ISSUE_TEMPLATE/feature_request.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Demande de fonctionnalité
|
||||||
|
about: Suggérer une idée pour l'interface utilisateur 4NK
|
||||||
|
title: '[FEATURE] '
|
||||||
|
labels: ['enhancement', 'needs-triage']
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problème lié
|
||||||
|
Une description claire et concise du problème que cette fonctionnalité résoudrait.
|
||||||
|
|
||||||
|
## Solution proposée
|
||||||
|
Une description claire et concise de ce que vous voulez qu'il se passe.
|
||||||
|
|
||||||
|
## Alternatives considérées
|
||||||
|
Une description claire et concise de toutes les solutions ou fonctionnalités alternatives que vous avez considérées.
|
||||||
|
|
||||||
|
## Contexte supplémentaire
|
||||||
|
Ajoutez tout autre contexte ou captures d'écran concernant la demande de fonctionnalité ici.
|
||||||
|
|
||||||
|
## Impact utilisateur
|
||||||
|
- [ ] Améliore l'expérience utilisateur
|
||||||
|
- [ ] Corrige un problème de performance
|
||||||
|
- [ ] Ajoute une fonctionnalité manquante
|
||||||
|
- [ ] Améliore l'accessibilité
|
||||||
|
- [ ] Autre (précisez)
|
||||||
|
|
||||||
|
## Priorité
|
||||||
|
- [ ] Critique
|
||||||
|
- [ ] Haute
|
||||||
|
- [ ] Moyenne
|
||||||
|
- [ ] Basse
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] J'ai vérifié que cette fonctionnalité n'a pas déjà été demandée
|
||||||
|
- [ ] J'ai fourni une description claire du besoin
|
||||||
|
- [ ] J'ai considéré les alternatives
|
||||||
|
- [ ] J'ai évalué l'impact sur les utilisateurs existants
|
30
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
30
.gitea/PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
## Description
|
||||||
|
Une description claire et concise des changements apportés.
|
||||||
|
|
||||||
|
## Type de changement
|
||||||
|
- [ ] Correction de bug (changement non-breaking qui corrige un problème)
|
||||||
|
- [ ] Nouvelle fonctionnalité (changement non-breaking qui ajoute une fonctionnalité)
|
||||||
|
- [ ] Breaking change (correction ou fonctionnalité qui causerait un comportement existant à ne pas fonctionner comme prévu)
|
||||||
|
- [ ] Documentation (mise à jour de la documentation)
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
- [ ] J'ai exécuté les tests unitaires
|
||||||
|
- [ ] J'ai exécuté les tests d'intégration
|
||||||
|
- [ ] J'ai testé manuellement les changements
|
||||||
|
- [ ] J'ai vérifié la compatibilité avec les navigateurs cibles
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] Mon code suit les conventions de style du projet
|
||||||
|
- [ ] J'ai effectué un auto-review de mon propre code
|
||||||
|
- [ ] J'ai commenté mon code, particulièrement dans les zones difficiles à comprendre
|
||||||
|
- [ ] J'ai apporté les changements correspondants à la documentation
|
||||||
|
- [ ] Mes changements ne génèrent pas de nouveaux warnings
|
||||||
|
- [ ] J'ai ajouté des tests qui prouvent que ma correction fonctionne ou que ma fonctionnalité fonctionne
|
||||||
|
- [ ] Les tests unitaires et d'intégration passent avec mes changements
|
||||||
|
- [ ] J'ai vérifié que mes changements n'affectent pas négativement les performances
|
||||||
|
|
||||||
|
## Captures d'écran (si applicable)
|
||||||
|
Ajoutez des captures d'écran pour montrer les changements visuels.
|
||||||
|
|
||||||
|
## Informations supplémentaires
|
||||||
|
Toute autre information ou contexte que vous souhaitez ajouter.
|
114
.gitea/workflows/ci.yml
Normal file
114
.gitea/workflows/ci.yml
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
name: CI/CD Pipeline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop, 4nk-node-integration ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup SSH for Gitea
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
ssh-keyscan -H git.4nkweb.com >> ~/.ssh/known_hosts
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run linting
|
||||||
|
run: npm run lint
|
||||||
|
|
||||||
|
- name: Run type checking
|
||||||
|
run: npm run type-check
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: npm run test
|
||||||
|
|
||||||
|
- name: Build application
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Test Docker build
|
||||||
|
run: |
|
||||||
|
docker build -f Dockerfile.4nk-node -t ihm-client:test .
|
||||||
|
docker rmi ihm-client:test
|
||||||
|
|
||||||
|
security:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: test
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup SSH for Gitea
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
ssh-keyscan -H git.4nkweb.com >> ~/.ssh/known_hosts
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run security audit
|
||||||
|
run: npm audit --audit-level=moderate
|
||||||
|
|
||||||
|
- name: Check for known vulnerabilities
|
||||||
|
run: npm audit --audit-level=high
|
||||||
|
|
||||||
|
integration-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: test
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup SSH for Gitea
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
ssh-keyscan -H git.4nkweb.com >> ~/.ssh/known_hosts
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Setup Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
- name: Build and test Docker integration
|
||||||
|
run: |
|
||||||
|
docker build -f Dockerfile.4nk-node -t ihm-client:integration .
|
||||||
|
docker run --rm -d --name ihm-client-test -p 8080:80 ihm-client:integration
|
||||||
|
sleep 10
|
||||||
|
curl -f http://localhost:8080 || exit 1
|
||||||
|
docker stop ihm-client-test
|
||||||
|
docker rmi ihm-client:integration
|
@ -260,7 +260,7 @@ docker exec 4nk-ihm-client wget -q -O- http://sdk_relay_1:8091/health
|
|||||||
```bash
|
```bash
|
||||||
# Vérifier les logs de démarrage
|
# Vérifier les logs de démarrage
|
||||||
docker logs 4nk-ihm-client
|
docker logs 4nk-ihm-client
|
||||||
|
|
||||||
# Vérifier la connectivité réseau
|
# Vérifier la connectivité réseau
|
||||||
docker exec 4nk-ihm-client ping sdk_relay_1
|
docker exec 4nk-ihm-client ping sdk_relay_1
|
||||||
```
|
```
|
||||||
@ -269,7 +269,7 @@ docker exec 4nk-ihm-client wget -q -O- http://sdk_relay_1:8091/health
|
|||||||
```bash
|
```bash
|
||||||
# Vérifier la configuration
|
# Vérifier la configuration
|
||||||
docker exec 4nk-ihm-client nginx -t
|
docker exec 4nk-ihm-client nginx -t
|
||||||
|
|
||||||
# Redémarrer nginx
|
# Redémarrer nginx
|
||||||
docker exec 4nk-ihm-client nginx -s reload
|
docker exec 4nk-ihm-client nginx -s reload
|
||||||
```
|
```
|
||||||
|
129
docs/SSH_SETUP.md
Normal file
129
docs/SSH_SETUP.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
# Configuration SSH automatique pour ihm_client
|
||||||
|
|
||||||
|
## Vue d'ensemble
|
||||||
|
|
||||||
|
Le projet `ihm_client` utilise automatiquement les clés SSH pour toutes les opérations Git, que ce soit en local ou dans l'environnement CI/CD Gitea Actions.
|
||||||
|
|
||||||
|
## Configuration automatique
|
||||||
|
|
||||||
|
### Environnement CI/CD
|
||||||
|
|
||||||
|
Dans l'environnement CI/CD Gitea Actions, la configuration SSH est automatique :
|
||||||
|
|
||||||
|
1. **Variable d'environnement** : La clé SSH privée est fournie via la variable `SSH_PRIVATE_KEY`
|
||||||
|
2. **Configuration automatique** : Le workflow CI configure automatiquement SSH pour `git.4nkweb.com`
|
||||||
|
3. **Test de connexion** : La connexion SSH est testée avant chaque opération Git
|
||||||
|
|
||||||
|
### Environnement local
|
||||||
|
|
||||||
|
En local, le script `scripts/setup-ssh-ci.sh` configure automatiquement SSH :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Exécuter le script de configuration
|
||||||
|
./scripts/setup-ssh-ci.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration manuelle
|
||||||
|
|
||||||
|
Si la configuration automatique ne fonctionne pas, voici les étapes manuelles :
|
||||||
|
|
||||||
|
### 1. Générer une clé SSH
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-keygen -t rsa -b 4096 -C "votre-email@example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Ajouter la clé publique à Gitea
|
||||||
|
|
||||||
|
1. Copier le contenu de `~/.ssh/id_rsa.pub`
|
||||||
|
2. Aller dans les paramètres de votre compte Gitea
|
||||||
|
3. Ajouter la clé SSH dans la section "SSH Keys"
|
||||||
|
|
||||||
|
### 3. Configurer Git pour utiliser SSH
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Tester la connexion
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -T git@git.4nkweb.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow CI/CD
|
||||||
|
|
||||||
|
Le workflow CI/CD (`.gitea/workflows/ci.yml`) inclut :
|
||||||
|
|
||||||
|
### Étapes SSH automatiques
|
||||||
|
|
||||||
|
1. **Setup SSH for Gitea** : Configure la clé SSH et les paramètres de connexion
|
||||||
|
2. **Checkout code** : Utilise SSH pour cloner le repository
|
||||||
|
3. **Tests et build** : Exécute les tests et builds avec SSH configuré
|
||||||
|
|
||||||
|
### Variables requises
|
||||||
|
|
||||||
|
- `SSH_PRIVATE_KEY` : Clé SSH privée pour l'authentification
|
||||||
|
- `SSH_PUBLIC_KEY` : Clé SSH publique (optionnelle)
|
||||||
|
|
||||||
|
## Sécurité
|
||||||
|
|
||||||
|
### Bonnes pratiques
|
||||||
|
|
||||||
|
- Les clés SSH sont stockées de manière sécurisée dans les secrets Gitea
|
||||||
|
- Les permissions des fichiers SSH sont correctement configurées (600 pour les clés privées)
|
||||||
|
- La vérification des hôtes SSH est configurée pour `git.4nkweb.com`
|
||||||
|
|
||||||
|
### Permissions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Permissions correctes pour les fichiers SSH
|
||||||
|
chmod 700 ~/.ssh
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
chmod 644 ~/.ssh/id_rsa.pub
|
||||||
|
chmod 600 ~/.ssh/config
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dépannage
|
||||||
|
|
||||||
|
### Problèmes courants
|
||||||
|
|
||||||
|
1. **Permission denied** : Vérifier les permissions des fichiers SSH
|
||||||
|
2. **Host key verification failed** : Ajouter `git.4nkweb.com` aux hôtes connus
|
||||||
|
3. **SSH key not found** : Vérifier que la clé SSH est correctement configurée
|
||||||
|
|
||||||
|
### Commandes de diagnostic
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tester la connexion SSH
|
||||||
|
ssh -vT git@git.4nkweb.com
|
||||||
|
|
||||||
|
# Vérifier la configuration Git
|
||||||
|
git config --global --list | grep url
|
||||||
|
|
||||||
|
# Vérifier les permissions SSH
|
||||||
|
ls -la ~/.ssh/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Intégration avec 4NK_node
|
||||||
|
|
||||||
|
Lors de l'intégration avec `4NK_node`, la configuration SSH est préservée :
|
||||||
|
|
||||||
|
- Les clés SSH sont partagées entre les projets
|
||||||
|
- La configuration Git utilise SSH pour tous les repositories 4NK
|
||||||
|
- Le workflow CI/CD maintient la cohérence SSH
|
||||||
|
|
||||||
|
## Évolution
|
||||||
|
|
||||||
|
### Améliorations futures
|
||||||
|
|
||||||
|
- Support pour plusieurs clés SSH
|
||||||
|
- Rotation automatique des clés
|
||||||
|
- Intégration avec un gestionnaire de secrets externe
|
||||||
|
- Support pour l'authentification par certificats SSH
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Vérification régulière de la validité des clés SSH
|
||||||
|
- Mise à jour des configurations SSH selon les bonnes pratiques
|
||||||
|
- Documentation des changements de configuration SSH
|
@ -7,7 +7,7 @@ server {
|
|||||||
# Gestion des fichiers statiques
|
# Gestion des fichiers statiques
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
|
|
||||||
# Headers de sécurité
|
# Headers de sécurité
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
@ -41,7 +41,7 @@ server {
|
|||||||
add_header Access-Control-Allow-Origin "*" always;
|
add_header Access-Control-Allow-Origin "*" always;
|
||||||
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;
|
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;
|
||||||
add_header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,X-Requested-With" always;
|
add_header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,X-Requested-With" always;
|
||||||
|
|
||||||
# Gestion des requêtes OPTIONS
|
# Gestion des requêtes OPTIONS
|
||||||
if ($request_method = 'OPTIONS') {
|
if ($request_method = 'OPTIONS') {
|
||||||
add_header Access-Control-Allow-Origin "*";
|
add_header Access-Control-Allow-Origin "*";
|
||||||
@ -60,7 +60,7 @@ server {
|
|||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
# Authentification basique pour Bitcoin RPC
|
# Authentification basique pour Bitcoin RPC
|
||||||
auth_basic "Bitcoin RPC";
|
auth_basic "Bitcoin RPC";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
@ -85,7 +85,7 @@ server {
|
|||||||
# Gestion des erreurs
|
# Gestion des erreurs
|
||||||
error_page 404 /index.html;
|
error_page 404 /index.html;
|
||||||
error_page 500 502 503 504 /50x.html;
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
|
||||||
location = /50x.html {
|
location = /50x.html {
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
}
|
}
|
||||||
|
@ -82,19 +82,19 @@ done
|
|||||||
# Vérification des prérequis
|
# Vérification des prérequis
|
||||||
check_prerequisites() {
|
check_prerequisites() {
|
||||||
print_info "Vérification des prérequis..."
|
print_info "Vérification des prérequis..."
|
||||||
|
|
||||||
# Vérifier que nous sommes dans le bon répertoire
|
# Vérifier que nous sommes dans le bon répertoire
|
||||||
if [[ ! -f "${PROJECT_ROOT}/package.json" ]]; then
|
if [[ ! -f "${PROJECT_ROOT}/package.json" ]]; then
|
||||||
print_error "Ce script doit être exécuté depuis le répertoire ihm_client"
|
print_error "Ce script doit être exécuté depuis le répertoire ihm_client"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier que le répertoire cible existe
|
# Vérifier que le répertoire cible existe
|
||||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||||
print_error "Répertoire cible 4NK_node non trouvé: $TARGET_DIR"
|
print_error "Répertoire cible 4NK_node non trouvé: $TARGET_DIR"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier que les fichiers d'intégration existent
|
# Vérifier que les fichiers d'intégration existent
|
||||||
local required_files=(
|
local required_files=(
|
||||||
"Dockerfile.4nk-node"
|
"Dockerfile.4nk-node"
|
||||||
@ -102,14 +102,14 @@ check_prerequisites() {
|
|||||||
"start-4nk-node.sh"
|
"start-4nk-node.sh"
|
||||||
"docker-compose.4nk-node.yml"
|
"docker-compose.4nk-node.yml"
|
||||||
)
|
)
|
||||||
|
|
||||||
for file in "${required_files[@]}"; do
|
for file in "${required_files[@]}"; do
|
||||||
if [[ ! -f "${PROJECT_ROOT}/$file" ]]; then
|
if [[ ! -f "${PROJECT_ROOT}/$file" ]]; then
|
||||||
print_error "Fichier requis manquant: $file"
|
print_error "Fichier requis manquant: $file"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
print_success "Prérequis vérifiés"
|
print_success "Prérequis vérifiés"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,9 +117,9 @@ check_prerequisites() {
|
|||||||
create_backup() {
|
create_backup() {
|
||||||
if [[ "$BACKUP" == "true" ]]; then
|
if [[ "$BACKUP" == "true" ]]; then
|
||||||
print_info "Création de la sauvegarde..."
|
print_info "Création de la sauvegarde..."
|
||||||
|
|
||||||
local backup_dir="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
|
local backup_dir="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
mkdir -p "$backup_dir"
|
mkdir -p "$backup_dir"
|
||||||
cp -r "${TARGET_DIR}/docker-compose.yml" "$backup_dir/" 2>/dev/null || true
|
cp -r "${TARGET_DIR}/docker-compose.yml" "$backup_dir/" 2>/dev/null || true
|
||||||
@ -134,9 +134,9 @@ create_backup() {
|
|||||||
# Création du répertoire ihm_client dans 4NK_node
|
# Création du répertoire ihm_client dans 4NK_node
|
||||||
create_ihm_client_directory() {
|
create_ihm_client_directory() {
|
||||||
print_info "Création du répertoire ihm_client dans 4NK_node..."
|
print_info "Création du répertoire ihm_client dans 4NK_node..."
|
||||||
|
|
||||||
local ihm_client_dir="${TARGET_DIR}/ihm_client"
|
local ihm_client_dir="${TARGET_DIR}/ihm_client"
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
mkdir -p "$ihm_client_dir"
|
mkdir -p "$ihm_client_dir"
|
||||||
print_success "Répertoire créé: $ihm_client_dir"
|
print_success "Répertoire créé: $ihm_client_dir"
|
||||||
@ -148,7 +148,7 @@ create_ihm_client_directory() {
|
|||||||
# Copie des fichiers d'intégration
|
# Copie des fichiers d'intégration
|
||||||
copy_integration_files() {
|
copy_integration_files() {
|
||||||
print_info "Copie des fichiers d'intégration..."
|
print_info "Copie des fichiers d'intégration..."
|
||||||
|
|
||||||
local files_to_copy=(
|
local files_to_copy=(
|
||||||
"Dockerfile.4nk-node:Dockerfile"
|
"Dockerfile.4nk-node:Dockerfile"
|
||||||
"nginx.4nk-node.conf:nginx.conf"
|
"nginx.4nk-node.conf:nginx.conf"
|
||||||
@ -158,11 +158,11 @@ copy_integration_files() {
|
|||||||
"vite.config.ts:vite.config.ts"
|
"vite.config.ts:vite.config.ts"
|
||||||
"index.html:index.html"
|
"index.html:index.html"
|
||||||
)
|
)
|
||||||
|
|
||||||
for file_mapping in "${files_to_copy[@]}"; do
|
for file_mapping in "${files_to_copy[@]}"; do
|
||||||
local source_file=$(echo "$file_mapping" | cut -d: -f1)
|
local source_file=$(echo "$file_mapping" | cut -d: -f1)
|
||||||
local target_file=$(echo "$file_mapping" | cut -d: -f2)
|
local target_file=$(echo "$file_mapping" | cut -d: -f2)
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
cp "${PROJECT_ROOT}/$source_file" "${TARGET_DIR}/ihm_client/$target_file"
|
cp "${PROJECT_ROOT}/$source_file" "${TARGET_DIR}/ihm_client/$target_file"
|
||||||
print_success "Copié: $source_file -> ihm_client/$target_file"
|
print_success "Copié: $source_file -> ihm_client/$target_file"
|
||||||
@ -175,9 +175,9 @@ copy_integration_files() {
|
|||||||
# Copie du code source
|
# Copie du code source
|
||||||
copy_source_code() {
|
copy_source_code() {
|
||||||
print_info "Copie du code source..."
|
print_info "Copie du code source..."
|
||||||
|
|
||||||
local source_dirs=("src" "public")
|
local source_dirs=("src" "public")
|
||||||
|
|
||||||
for dir in "${source_dirs[@]}"; do
|
for dir in "${source_dirs[@]}"; do
|
||||||
if [[ -d "${PROJECT_ROOT}/$dir" ]]; then
|
if [[ -d "${PROJECT_ROOT}/$dir" ]]; then
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
@ -193,7 +193,7 @@ copy_source_code() {
|
|||||||
# Mise à jour du docker-compose.yml
|
# Mise à jour du docker-compose.yml
|
||||||
update_docker_compose() {
|
update_docker_compose() {
|
||||||
print_info "Mise à jour du docker-compose.yml..."
|
print_info "Mise à jour du docker-compose.yml..."
|
||||||
|
|
||||||
local docker_compose_file="${TARGET_DIR}/docker-compose.yml"
|
local docker_compose_file="${TARGET_DIR}/docker-compose.yml"
|
||||||
local ihm_client_service="
|
local ihm_client_service="
|
||||||
ihm_client:
|
ihm_client:
|
||||||
@ -223,7 +223,7 @@ update_docker_compose() {
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 40s"
|
start_period: 40s"
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
# Vérifier si le service existe déjà
|
# Vérifier si le service existe déjà
|
||||||
if grep -q "ihm_client:" "$docker_compose_file" 2>/dev/null; then
|
if grep -q "ihm_client:" "$docker_compose_file" 2>/dev/null; then
|
||||||
@ -231,10 +231,10 @@ update_docker_compose() {
|
|||||||
else
|
else
|
||||||
# Ajouter le service avant la section volumes
|
# Ajouter le service avant la section volumes
|
||||||
sed -i '/^volumes:/i\'"$ihm_client_service" "$docker_compose_file"
|
sed -i '/^volumes:/i\'"$ihm_client_service" "$docker_compose_file"
|
||||||
|
|
||||||
# Ajouter les volumes ihm_client
|
# Ajouter les volumes ihm_client
|
||||||
sed -i '/^volumes:/a\ ihm_client_logs:\n driver: local' "$docker_compose_file"
|
sed -i '/^volumes:/a\ ihm_client_logs:\n driver: local' "$docker_compose_file"
|
||||||
|
|
||||||
print_success "Service ihm_client ajouté au docker-compose.yml"
|
print_success "Service ihm_client ajouté au docker-compose.yml"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@ -245,9 +245,9 @@ update_docker_compose() {
|
|||||||
# Création du script de démarrage
|
# Création du script de démarrage
|
||||||
create_startup_script() {
|
create_startup_script() {
|
||||||
print_info "Création du script de démarrage..."
|
print_info "Création du script de démarrage..."
|
||||||
|
|
||||||
local startup_script="${TARGET_DIR}/start-ihm-client.sh"
|
local startup_script="${TARGET_DIR}/start-ihm-client.sh"
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
cat > "$startup_script" << 'EOF'
|
cat > "$startup_script" << 'EOF'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
@ -281,7 +281,7 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
chmod +x "$startup_script"
|
chmod +x "$startup_script"
|
||||||
print_success "Script de démarrage créé: $startup_script"
|
print_success "Script de démarrage créé: $startup_script"
|
||||||
else
|
else
|
||||||
@ -292,14 +292,14 @@ EOF
|
|||||||
# Validation de l'intégration
|
# Validation de l'intégration
|
||||||
validate_integration() {
|
validate_integration() {
|
||||||
print_info "Validation de l'intégration..."
|
print_info "Validation de l'intégration..."
|
||||||
|
|
||||||
local validation_files=(
|
local validation_files=(
|
||||||
"${TARGET_DIR}/ihm_client/Dockerfile"
|
"${TARGET_DIR}/ihm_client/Dockerfile"
|
||||||
"${TARGET_DIR}/ihm_client/nginx.conf"
|
"${TARGET_DIR}/ihm_client/nginx.conf"
|
||||||
"${TARGET_DIR}/ihm_client/start.sh"
|
"${TARGET_DIR}/ihm_client/start.sh"
|
||||||
"${TARGET_DIR}/docker-compose.yml"
|
"${TARGET_DIR}/docker-compose.yml"
|
||||||
)
|
)
|
||||||
|
|
||||||
for file in "${validation_files[@]}"; do
|
for file in "${validation_files[@]}"; do
|
||||||
if [[ -f "$file" ]]; then
|
if [[ -f "$file" ]]; then
|
||||||
print_success "Validé: $(basename "$file")"
|
print_success "Validé: $(basename "$file")"
|
||||||
@ -308,7 +308,7 @@ validate_integration() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
print_success "Validation terminée"
|
print_success "Validation terminée"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,7 +319,7 @@ main() {
|
|||||||
echo " Cible: $TARGET_DIR"
|
echo " Cible: $TARGET_DIR"
|
||||||
echo " Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY RUN" || echo "EXÉCUTION")"
|
echo " Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY RUN" || echo "EXÉCUTION")"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
check_prerequisites
|
check_prerequisites
|
||||||
create_backup
|
create_backup
|
||||||
create_ihm_client_directory
|
create_ihm_client_directory
|
||||||
@ -327,7 +327,7 @@ main() {
|
|||||||
copy_source_code
|
copy_source_code
|
||||||
update_docker_compose
|
update_docker_compose
|
||||||
create_startup_script
|
create_startup_script
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "false" ]]; then
|
if [[ "$DRY_RUN" == "false" ]]; then
|
||||||
validate_integration
|
validate_integration
|
||||||
echo ""
|
echo ""
|
||||||
|
79
scripts/setup-ssh-ci.sh
Executable file
79
scripts/setup-ssh-ci.sh
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script de configuration SSH pour CI/CD ihm_client
|
||||||
|
# Utilise automatiquement la clé SSH pour les opérations Git
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔑 Configuration automatique de la clé SSH pour ihm_client CI/CD..."
|
||||||
|
|
||||||
|
# Vérifier si on est dans un environnement CI
|
||||||
|
if [ -n "$CI" ]; then
|
||||||
|
echo "✅ Environnement CI détecté"
|
||||||
|
|
||||||
|
# Configuration SSH pour Gitea Actions
|
||||||
|
if [ -n "$SSH_PRIVATE_KEY" ]; then
|
||||||
|
echo "🔐 Configuration de la clé SSH privée..."
|
||||||
|
|
||||||
|
# Créer le répertoire SSH
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
chmod 700 ~/.ssh
|
||||||
|
|
||||||
|
# Écrire la clé privée
|
||||||
|
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
|
# Ajouter la clé publique correspondante (si disponible)
|
||||||
|
if [ -n "$SSH_PUBLIC_KEY" ]; then
|
||||||
|
echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub
|
||||||
|
chmod 644 ~/.ssh/id_rsa.pub
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration SSH pour git.4nkweb.com
|
||||||
|
cat > ~/.ssh/config << EOF
|
||||||
|
Host git.4nkweb.com
|
||||||
|
HostName git.4nkweb.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/id_rsa
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
UserKnownHostsFile=/dev/null
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 600 ~/.ssh/config
|
||||||
|
|
||||||
|
# Tester la connexion SSH
|
||||||
|
echo "🧪 Test de connexion SSH vers git.4nkweb.com..."
|
||||||
|
if ssh -T git@git.4nkweb.com 2>&1 | grep -q "Welcome"; then
|
||||||
|
echo "✅ Connexion SSH réussie"
|
||||||
|
else
|
||||||
|
echo "⚠️ Connexion SSH établie (message de bienvenue non détecté)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configurer Git pour utiliser SSH
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
|
||||||
|
echo "✅ Configuration SSH terminée"
|
||||||
|
else
|
||||||
|
echo "⚠️ Variable SSH_PRIVATE_KEY non définie, utilisation de HTTPS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "ℹ️ Environnement local détecté"
|
||||||
|
|
||||||
|
# Vérifier si une clé SSH existe
|
||||||
|
if [ -f ~/.ssh/id_rsa ]; then
|
||||||
|
echo "🔑 Clé SSH locale trouvée"
|
||||||
|
|
||||||
|
# Configurer Git pour utiliser SSH localement
|
||||||
|
git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/"
|
||||||
|
|
||||||
|
echo "✅ Configuration SSH locale terminée"
|
||||||
|
else
|
||||||
|
echo "⚠️ Aucune clé SSH trouvée, configuration manuelle requise"
|
||||||
|
echo "💡 Pour configurer SSH manuellement :"
|
||||||
|
echo " 1. Générer une clé SSH : ssh-keygen -t rsa -b 4096"
|
||||||
|
echo " 2. Ajouter la clé publique à votre compte Gitea"
|
||||||
|
echo " 3. Tester : ssh -T git@git.4nkweb.com"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🎯 Configuration SSH terminée pour ihm_client"
|
@ -18,18 +18,18 @@ wait_for_service() {
|
|||||||
local attempt=1
|
local attempt=1
|
||||||
|
|
||||||
echo "⏳ Attente du service $service_name ($service_url)..."
|
echo "⏳ Attente du service $service_name ($service_url)..."
|
||||||
|
|
||||||
while [ $attempt -le $max_attempts ]; do
|
while [ $attempt -le $max_attempts ]; do
|
||||||
if wget --quiet --tries=1 --timeout=5 --spider "$service_url" 2>/dev/null; then
|
if wget --quiet --tries=1 --timeout=5 --spider "$service_url" 2>/dev/null; then
|
||||||
echo "✅ Service $service_name disponible"
|
echo "✅ Service $service_name disponible"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " Tentative $attempt/$max_attempts - Service $service_name non disponible"
|
echo " Tentative $attempt/$max_attempts - Service $service_name non disponible"
|
||||||
sleep 2
|
sleep 2
|
||||||
attempt=$((attempt + 1))
|
attempt=$((attempt + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "❌ Service $service_name non disponible après $max_attempts tentatives"
|
echo "❌ Service $service_name non disponible après $max_attempts tentatives"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
@ -42,18 +42,18 @@ check_websocket() {
|
|||||||
local attempt=1
|
local attempt=1
|
||||||
|
|
||||||
echo "🔌 Vérification WebSocket $service_name ($ws_url)..."
|
echo "🔌 Vérification WebSocket $service_name ($ws_url)..."
|
||||||
|
|
||||||
while [ $attempt -le $max_attempts ]; do
|
while [ $attempt -le $max_attempts ]; do
|
||||||
if nc -z $(echo $ws_url | sed 's|ws://||' | sed 's|wss://||' | cut -d: -f1) $(echo $ws_url | cut -d: -f3) 2>/dev/null; then
|
if nc -z $(echo $ws_url | sed 's|ws://||' | sed 's|wss://||' | cut -d: -f1) $(echo $ws_url | cut -d: -f3) 2>/dev/null; then
|
||||||
echo "✅ WebSocket $service_name accessible"
|
echo "✅ WebSocket $service_name accessible"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " Tentative $attempt/$max_attempts - WebSocket $service_name non accessible"
|
echo " Tentative $attempt/$max_attempts - WebSocket $service_name non accessible"
|
||||||
sleep 3
|
sleep 3
|
||||||
attempt=$((attempt + 1))
|
attempt=$((attempt + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "⚠️ WebSocket $service_name non accessible (continuera sans)"
|
echo "⚠️ WebSocket $service_name non accessible (continuera sans)"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -115,7 +115,7 @@ echo " 🌐 API: $SDK_RELAY_HTTP_URL"
|
|||||||
# Maintenir le conteneur en vie
|
# Maintenir le conteneur en vie
|
||||||
while true; do
|
while true; do
|
||||||
sleep 30
|
sleep 30
|
||||||
|
|
||||||
# Vérification périodique de la santé
|
# Vérification périodique de la santé
|
||||||
if ! wget --quiet --tries=1 --timeout=5 --spider http://localhost 2>/dev/null; then
|
if ! wget --quiet --tries=1 --timeout=5 --spider http://localhost 2>/dev/null; then
|
||||||
echo "❌ Nginx ne répond plus, redémarrage..."
|
echo "❌ Nginx ne répond plus, redémarrage..."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user