chore(fixtures): enrichit les vaults de test (frontmatter complet, types fichiers pour vues/aper/us, dossiers avec accents+espaces, scripts dupliques, images/logs) + purge residus e2e-diagram
This commit is contained in:
@@ -1,3 +1,32 @@
|
||||
---
|
||||
titre: ObsiGate — Analyse complète & Recommandations V1.1
|
||||
auteur: Hermes-Claw
|
||||
tags:
|
||||
- analyse
|
||||
- obsigate
|
||||
- recommandations
|
||||
- sécurité
|
||||
- roadmap
|
||||
- audit
|
||||
- v1.1
|
||||
aliases:
|
||||
- ObsiGate Analyse
|
||||
- Audit ObsiGate V1.1
|
||||
catégorie: Analyse Technique
|
||||
NomDeVoute: TestVault
|
||||
Description: Analyse complète et recommandations pour ObsiGate, incluant fonctionnalités, forces, points d'amélioration, roadmap et checklist de professionnalisation.
|
||||
creation_date: 2026-05-25T00:00:00+02:00
|
||||
modification_date: 2026-10-07T12:00:00+02:00
|
||||
status: finalisé
|
||||
publish: true
|
||||
favoris: true
|
||||
template: false
|
||||
task: false
|
||||
archive: false
|
||||
draft: false
|
||||
private: false
|
||||
---
|
||||
|
||||
# ObsiGate — Analyse complète & Recommandations V1.1
|
||||
|
||||
> **Date :** 2026-05-25 | **Analyste :** Hermes-Claw + Audit Code Source | **Version testée :** 1.4.0 (backend) / 1.5.0 (frontend) — http://openclaw1.dev.home:2020
|
||||
@@ -381,4 +410,4 @@ TOTP ou WebAuthn pour l'accès admin.
|
||||
---
|
||||
|
||||
*Analyse réalisée le 2026-05-25 — Révisée V1.1 après audit complet du code source*
|
||||
*Document : ANALYSE_REVIEW.md*
|
||||
*Document : ANALYSE_REVIEW.md*
|
||||
Binary file not shown.
+24
-8
@@ -7,16 +7,32 @@ publish: true
|
||||
date: 2025-01-15
|
||||
---
|
||||
|
||||
# Bienvenue dans le vault de test
|
||||
# 📌 **Bienvenue dans TestVault**
|
||||
|
||||
Ceci est un document de test pour [[ObsiGate]].
|
||||
**TestVault** est votre espace centralisé pour organiser, structurer et optimiser la gestion de vos notes et connaissances. Conçue pour allier **efficacité** et **simplicité**, cette voute vous permet de travailler de manière intuitive tout en bénéficiant d'outils puissants.
|
||||
|
||||
## Sections
|
||||
---
|
||||
|
||||
- [[Projets/Projet Alpha]] - Un projet en cours
|
||||
- [[Notes/Configuration serveur]] - Documentation technique
|
||||
- [[Recettes/Pâtes carbonara]] - Une recette
|
||||
## 🚀 **Fonctionnalités clés**
|
||||
|
||||
## Tags
|
||||
✅ **Gestion intelligente des notes**
|
||||
- Créez, modifiez et organisez vos notes en toute simplicité.
|
||||
- Accédez rapidement à vos informations grâce à une structure claire.
|
||||
|
||||
✅ **Organisation avancée**
|
||||
- Utilisez des **tags** et des **catégories** pour classer vos notes de manière logique.
|
||||
- Retrouvez vos informations en un clin d'œil.
|
||||
|
||||
✅ **Recherche rapide et efficace**
|
||||
- Trouvez ce dont vous avez besoin en quelques secondes.
|
||||
|
||||
✅ **Synchronisation multi-appareils**
|
||||
- Accédez à vos notes où que vous soyez, sur tous vos appareils.
|
||||
|
||||
---
|
||||
|
||||
## 📂 **Structure de la voute**
|
||||
Cette voute est conçue pour être **modulaire** et **évolutive**. Vous pouvez l'adapter selon vos besoins pour une expérience personnalisée.
|
||||
|
||||
---
|
||||
|
||||
#accueil #important #test
|
||||
|
||||
+214
-13
@@ -10,6 +10,35 @@ title: Docker Guide
|
||||
|
||||
# Docker Guide
|
||||
|
||||
## Installation de Docker
|
||||
|
||||
### Sur Linux (Debian/Ubuntu)
|
||||
```bash
|
||||
# Mettre à jour les paquets
|
||||
sudo apt update
|
||||
|
||||
# Installer les dépendances
|
||||
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
|
||||
|
||||
# Ajouter la clé GPG officielle de Docker
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
|
||||
# Ajouter le dépôt Docker
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
# Installer Docker Engine
|
||||
sudo apt update
|
||||
sudo apt install -y docker-ce docker-ce-cli containerd.io
|
||||
|
||||
# Vérifier l'installation
|
||||
sudo docker run hello-world
|
||||
```
|
||||
|
||||
### Sur macOS/Windows
|
||||
- Télécharger [Docker Desktop](https://www.docker.com/products/docker-desktop/) et suivre les instructions.
|
||||
|
||||
---
|
||||
|
||||
## Commandes essentielles
|
||||
|
||||
```bash
|
||||
@@ -20,36 +49,208 @@ docker ps -a
|
||||
docker build -t myapp:latest .
|
||||
|
||||
# Lancer un conteneur
|
||||
docker run -d -p 8080:80 myapp:latest
|
||||
docker run -d -p 8080:80 --name my_container myapp:latest
|
||||
|
||||
# Voir les logs
|
||||
docker logs -f container_name
|
||||
docker logs -f my_container
|
||||
|
||||
# Arrêter un conteneur
|
||||
docker stop my_container
|
||||
|
||||
# Supprimer un conteneur
|
||||
docker rm my_container
|
||||
|
||||
# Supprimer une image
|
||||
docker rmi myapp:latest
|
||||
```
|
||||
|
||||
## Docker Compose
|
||||
---
|
||||
|
||||
```yaml
|
||||
version: "3.9"
|
||||
services:
|
||||
web:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
## Réseaux Docker
|
||||
|
||||
Docker propose plusieurs types de réseaux pour isoler ou connecter vos conteneurs :
|
||||
|
||||
| Type | Description | Exemple d'utilisation |
|
||||
|------------|--------------------------------------|-------------------------------------|
|
||||
| **bridge** | Réseau par défaut pour les conteneurs | `docker run -p 8080:80 myapp` |
|
||||
| **host** | Conteneur utilise l'IP de l'hôte | `docker run --network host myapp` |
|
||||
| **overlay**| Pour les swarms multi-hôtes | Utilisé avec `docker stack deploy` |
|
||||
|
||||
**Exemple : Créer un réseau personnalisé**
|
||||
```bash
|
||||
docker network create my_network
|
||||
docker run -d --network my_network --name db redis
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Volumes
|
||||
|
||||
Les volumes permettent de persister les données :
|
||||
|
||||
- **Named volumes** : gérés par Docker
|
||||
```bash
|
||||
docker volume create my_volume
|
||||
docker run -v my_volume:/data myapp
|
||||
```
|
||||
|
||||
- **Bind mounts** : montage direct depuis l'hôte
|
||||
```bash
|
||||
docker run -v /chemin/absolu:/data myapp
|
||||
```
|
||||
|
||||
- **tmpfs** : stockage en mémoire
|
||||
```bash
|
||||
docker run --tmpfs /data myapp
|
||||
```
|
||||
|
||||
Voir aussi : [[Proxmox Setup]]
|
||||
|
||||
---
|
||||
|
||||
## Docker Compose
|
||||
|
||||
Exemple de fichier `docker-compose.yml` avec variables d'environnement et dépendances :
|
||||
|
||||
```yaml
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
environment:
|
||||
- NGINX_ENV=production
|
||||
depends_on:
|
||||
- redis
|
||||
networks:
|
||||
- frontend
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
networks:
|
||||
- frontend
|
||||
|
||||
volumes:
|
||||
redis_data:
|
||||
|
||||
networks:
|
||||
frontend:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
**Commandes utiles**
|
||||
```bash
|
||||
# Démarrer les services
|
||||
docker-compose up -d
|
||||
|
||||
# Arrêter les services
|
||||
docker-compose down
|
||||
|
||||
# Voir les logs
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dockerfile : Exemple commenté
|
||||
|
||||
Voici un exemple de `Dockerfile` pour une application Python (FastAPI) :
|
||||
|
||||
```dockerfile
|
||||
# Utiliser une image officielle Python comme base
|
||||
FROM python:3.9-slim
|
||||
|
||||
# Définir le répertoire de travail
|
||||
WORKDIR /app
|
||||
|
||||
# Copier les fichiers de dépendances
|
||||
COPY requirements.txt .
|
||||
|
||||
# Installer les dépendances
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copier le reste du code source
|
||||
COPY . .
|
||||
|
||||
# Exposer le port 8000
|
||||
EXPOSE 8000
|
||||
|
||||
# Commande pour lancer l'application
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
```
|
||||
|
||||
**Bonnes pratiques pour un Dockerfile** :
|
||||
- Utiliser des images `slim` ou `alpine` pour réduire la taille.
|
||||
- Multi-stage builds pour les applications compilées (Go, Rust, etc.).
|
||||
- Toujours inclure un fichier `.dockerignore`.
|
||||
|
||||
---
|
||||
|
||||
## Sécurité
|
||||
|
||||
### Bonnes pratiques
|
||||
- **Éviter de lancer des conteneurs en tant que `root`** :
|
||||
```bash
|
||||
docker run --user 1000:1000 myapp
|
||||
```
|
||||
|
||||
- **Rendre le système de fichiers en lecture seule** :
|
||||
```bash
|
||||
docker run --read-only myapp
|
||||
```
|
||||
|
||||
- **Limiter les capacités du conteneur** :
|
||||
```bash
|
||||
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
|
||||
```
|
||||
|
||||
- **Scanner les images pour des vulnérabilités** :
|
||||
Utiliser des outils comme [Trivy](https://github.com/aquasecurity/trivy) ou [Clair](https://github.com/quay/clair).
|
||||
|
||||
---
|
||||
|
||||
## Nettoyage des ressources
|
||||
|
||||
Pour libérer de l'espace, supprimez les ressources inutilisées :
|
||||
|
||||
```bash
|
||||
# Supprimer les conteneurs arrêtés
|
||||
docker container prune
|
||||
|
||||
# Supprimer les images inutilisées
|
||||
docker image prune -a
|
||||
|
||||
# Supprimer les volumes inutilisés
|
||||
docker volume prune
|
||||
|
||||
# Supprimer les réseaux inutilisés
|
||||
docker network prune
|
||||
|
||||
# Nettoyer TOUT (attention, irréversible !)
|
||||
docker system prune -a --volumes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Bonnes pratiques
|
||||
|
||||
- [ ] Utiliser des images Alpine
|
||||
- [ ] Multi-stage builds
|
||||
- [x] Utiliser des images Alpine ou `slim`
|
||||
- [x] Multi-stage builds pour les applications compilées
|
||||
- [x] Fichier `.dockerignore`
|
||||
- [x] Un processus par conteneur
|
||||
- [x] Un processus par conteneur
|
||||
- [x] Limiter les ressources (CPU/mémoire) avec `--memory` et `--cpus`
|
||||
- [x] Utiliser des secrets pour les variables sensibles (ex: `--env-file` ou `docker secret`)
|
||||
|
||||
---
|
||||
|
||||
## Ressources utiles
|
||||
- [Documentation officielle Docker](https://docs.docker.com/)
|
||||
- [Docker Curriculum](https://docker-curriculum.com/)
|
||||
- [Awesome Docker](https://github.com/veggiemonk/awesome-docker)
|
||||
- [Tutoriel Docker Compose](https://docs.docker.com/compose/)
|
||||
|
||||
Voir aussi : [[Proxmox Setup]]
|
||||
@@ -0,0 +1,10 @@
|
||||
// Démonstration JavaScript pour le vault de test ObsiGate
|
||||
const API_URL = "http://localhost:2020/api";
|
||||
|
||||
async function fetchVaults() {
|
||||
const res = await fetch(`${API_URL}/vaults`);
|
||||
if (!res.ok) throw new Error("HTTP " + res.status);
|
||||
return res.json();
|
||||
}
|
||||
|
||||
fetchVaults().then((v) => console.log("vaults:", v));
|
||||
@@ -0,0 +1,12 @@
|
||||
// Démonstration TypeScript pour le vault de test ObsiGate
|
||||
interface Vault {
|
||||
name: string;
|
||||
files: number;
|
||||
}
|
||||
|
||||
function summarize(vaults: Vault[]): string {
|
||||
const total = vaults.reduce((acc, v) => acc + v.files, 0);
|
||||
return `${vaults.length} vaults, ${total} fichiers`;
|
||||
}
|
||||
|
||||
export default summarize;
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Script de démonstration pour le vault de test ObsiGate."""
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def main(argv):
|
||||
print("hello from ObsiGate test vault") # commentaire
|
||||
data = {"vaults": ["IT", "Perso"], "count": 2}
|
||||
print(json.dumps(data, indent=2))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
@@ -0,0 +1,13 @@
|
||||
import unittest
|
||||
|
||||
|
||||
class TestDemo(unittest.TestCase):
|
||||
def test_true_is_true(self):
|
||||
self.assertTrue(True) # trivial test
|
||||
|
||||
def test_number(self):
|
||||
self.assertEqual(2 + 2, 4)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -1,7 +1,22 @@
|
||||
---
|
||||
title: Pizza Maison
|
||||
tags: [recette, pizza, rapide]
|
||||
tags: [recette, pizza, rapide, cuisine maison]
|
||||
date: 2025-03-15
|
||||
modification_date: 2025-10-31T14:30:00+01:00
|
||||
aliases: [pizza maison, recette pizza]
|
||||
catégorie: Recettes
|
||||
NomDeVoute: TestVault
|
||||
Description: Recette détaillée pour préparer une pizza maison avec pâte, sauce tomate et garnitures variées.
|
||||
auteur: Inconnu
|
||||
creation_date: 2025-03-15
|
||||
status: publié
|
||||
publish: true
|
||||
favoris: false
|
||||
template: recette
|
||||
task: []
|
||||
archive: false
|
||||
draft: false
|
||||
private: false
|
||||
---
|
||||
|
||||
# Pizza Maison 2
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
# PostgreSQL backup script for HabitForge
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
BACKUP_DIR="/backups"
|
||||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
BACKUP_FILE="${BACKUP_DIR}/habitforge_backup_${TIMESTAMP}.sql.gz"
|
||||
RETENTION_DAYS=7
|
||||
|
||||
# Database settings (from environment)
|
||||
DB_HOST="${POSTGRES_HOST:-db}"
|
||||
DB_PORT="${POSTGRES_PORT:-5432}"
|
||||
DB_NAME="${POSTGRES_DB:-habitforge}"
|
||||
DB_USER="${POSTGRES_USER:-habitforge}"
|
||||
|
||||
# Create backup directory if it doesn't exist
|
||||
mkdir -p "${BACKUP_DIR}"
|
||||
|
||||
echo "Starting backup at $(date)"
|
||||
|
||||
# Perform backup
|
||||
PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump \
|
||||
-h "${DB_HOST}" \
|
||||
-p "${DB_PORT}" \
|
||||
-U "${DB_USER}" \
|
||||
-d "${DB_NAME}" \
|
||||
--format=plain \
|
||||
--no-owner \
|
||||
--no-acl | gzip > "${BACKUP_FILE}"
|
||||
|
||||
# Check if backup was successful
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Backup completed successfully: ${BACKUP_FILE}"
|
||||
|
||||
# Get file size
|
||||
SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
|
||||
echo "Backup size: ${SIZE}"
|
||||
|
||||
# Remove old backups (older than RETENTION_DAYS)
|
||||
echo "Removing backups older than ${RETENTION_DAYS} days..."
|
||||
find "${BACKUP_DIR}" -name "habitforge_backup_*.sql.gz" -type f -mtime +${RETENTION_DAYS} -delete
|
||||
|
||||
# List remaining backups
|
||||
echo "Current backups:"
|
||||
ls -lh "${BACKUP_DIR}"/habitforge_backup_*.sql.gz 2>/dev/null || echo "No backups found"
|
||||
|
||||
else
|
||||
echo "Backup failed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Backup finished at $(date)"
|
||||
@@ -0,0 +1,7 @@
|
||||
2026-09-14 08:12:01 INFO Starting ObsiGate test service on port 2020
|
||||
2026-09-14 08:12:02 DEBUG Loaded 2 vaults: "IT", "Perso"
|
||||
2026-09-14 08:12:05 WARN Disk usage at 82% on /var/data
|
||||
2026-09-14 08:13:11 ERROR Failed to open "/var/db/index.sqlite"
|
||||
2026-09-14 08:13:12 INFO Retrying in 5 seconds...
|
||||
2026-09-14 08:13:17 TRACE connection pool size=8
|
||||
2026-09-14 08:14:00 CRITICAL Backup aborted, code=42
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
@@ -0,0 +1,91 @@
|
||||
# Vaccin Zona 2024 : Analyse Shingrix® vs Zostavax®
|
||||
|
||||
#médecine #vaccin #zona #2024 #santé
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **Contexte 2024 : Shingrix® devient la référence**
|
||||
- **Nom** : **Shingrix®** (GSK) – Vaccin **sous-unitaire recombinant** (non vivant).
|
||||
- **Actualité 2024** :
|
||||
- **29 février 2024** : La **Haute Autorité de Santé (HAS)** recommande **préférentiellement Shingrix®** pour :
|
||||
- Adultes **immunocompétents ≥ 65 ans**.
|
||||
- Personnes **immunodéprimées ≥ 18 ans** (ex. chimiothérapie, VIH).
|
||||
- Personnes ayant **déjà eu un zona** ou vaccinées avec Zostavax® (délai d’1 an).
|
||||
- **Arrêt de Zostavax®** : Commercialisation stoppée en **juin 2024** en France (stocks jusqu’à péremption en **janvier 2025**).
|
||||
|
||||
**Sources** : [MesVaccins](https://www.mesvaccins.net/web/vaccines/161-zostavax), [HAS](https://www.has-sante.fr/jcms/p_3498915/fr/recommandations-vaccinales-contre-le-zona-place-du-vaccin-shingrix)
|
||||
|
||||
---
|
||||
|
||||
## ✅ **Bienfaits du vaccin Shingrix® (données 2024)**
|
||||
|
||||
| **Critère** | **Shingrix®** | **Zostavax® (ancien vaccin)** | **Source** |
|
||||
|--------------------------|----------------------------------------|-------------------------------|------------|
|
||||
| **Efficacité globale** | **92%** (≥60 ans) / **91%** (≥70 ans) | 51% (≥60 ans) | [Infovac](https://www.infovac.ch/fr/les-vaccins/par-maladie/zona-herpes-zoster) |
|
||||
| **Durée de protection** | **>10 ans** (études en cours) | 5-10 ans (diminue avec l’âge) | [HAS PDF 2024](https://www.has-sante.fr/upload/docs/application/pdf/2024-03/recommandation_vaccinales_contre_le_zona._place_du_vaccin_shingrix_2024-03-04_11-26-41_450.pdf) |
|
||||
| **Prévention des DPZ** | **88-91%** (douleurs post-zostériennes) | 67% | [AFA](https://www.afa.asso.fr/prevenir-le-zona-cest-possible-meme-sous-traitement/) |
|
||||
| **Public éligible** | **≥18 ans (immunodéprimés) / ≥65 ans** | ≥65 ans (immunocompétents) | [MesVaccins](https://www.mesvaccins.net/web/vaccines/567-shingrix) |
|
||||
| **Schéma vaccinal** | **2 doses** (à 2-6 mois d’intervalle) | 1 dose | [HAS 2024](https://www.has-sante.fr/jcms/p_3498915/fr/recommandations-vaccinales-contre-le-zona-place-du-vaccin-shingrix) |
|
||||
| **Sécurité** | Effets secondaires modérés (douleur locale, fatigue) | Risque de réactivation du virus (vaccin vivant) | [SFM 2024](https://www.sfm-microbiologie.org/2024/03/24/un-nouveau-vaccin-contre-le-zona-recommande-par-la-haute-autorite-de-sante-has/) |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **Pourquoi Shingrix® est-il une avancée majeure en 2024 ?**
|
||||
1. **Efficacité supérieure** :
|
||||
- Réduction de **92% des cas de zona** (vs 51% pour Zostavax).
|
||||
- **Prévention des douleurs chroniques (DPZ)** dans **88-91% des cas** (vs 67%).
|
||||
2. **Durée de protection étendue** :
|
||||
- **>10 ans** (vs 5-10 ans pour Zostavax, avec efficacité décroissante après 5 ans).
|
||||
3. **Sécurité pour les populations fragiles** :
|
||||
- **Approuvé pour les immunodéprimés** (ex. patients sous traitement immunosuppresseur, VIH).
|
||||
4. **Recommandations officielles 2024** :
|
||||
- **HAS (France)** : Shingrix® devient le **vaccin de référence**.
|
||||
- **Arrêt de Zostavax®** : Plus commercialisé en France depuis **juin 2024**.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ **Limites et points de vigilance**
|
||||
- **Effets secondaires** :
|
||||
- **Fréquents mais bénins** : Douleur locale (78%), fatigue (45%), maux de tête (38%), fièvre (21%).
|
||||
- **Rares** : Réactions allergiques graves.
|
||||
- **Coût** :
|
||||
- **~150-200€ par dose** (non remboursé à 100% en France sauf pour certains cas d’immunodépression).
|
||||
- **Schéma à 2 doses** (espacées de 2 à 6 mois).
|
||||
- **Disponibilité** :
|
||||
- **Pénurie temporaire** signalée dans certains pays (demande accrue post-recommandations 2024).
|
||||
|
||||
---
|
||||
## 📌 **Recommandations pratiques (2024)**
|
||||
- **Pour qui ?**
|
||||
- Adultes **≥65 ans** (même sans antécédent de zona).
|
||||
- **Immunodéprimés ≥18 ans** (ex. cancer, VIH, greffés).
|
||||
- Personnes ayant **déjà eu un zona** (après guérison).
|
||||
|
||||
- **Quand ?**
|
||||
- **2 doses** à 2-6 mois d’intervalle.
|
||||
- **Pas de rappel recommandé** pour l’instant.
|
||||
|
||||
- **Où ?**
|
||||
- Pharmacies, médecins, centres de vaccination (sur ordonnance en France).
|
||||
|
||||
---
|
||||
## 🔗 **Sources officielles (2024)**
|
||||
1. **Haute Autorité de Santé (HAS)** :
|
||||
- [Recommandations vaccinales contre le zona (2024)](https://www.has-sante.fr/jcms/p_3498915/fr/recommandations-vaccinales-contre-le-zona-place-du-vaccin-shingrix)
|
||||
- [PDF détaillé (mars 2024)](https://www.has-sante.fr/upload/docs/application/pdf/2024-03/recommandation_vaccinales_contre_le_zona._place_du_vaccin_shingrix_2024-03-04_11-26-41_450.pdf)
|
||||
|
||||
2. **MesVaccins.net** :
|
||||
- [Fiche Shingrix®](https://www.mesvaccins.net/web/vaccines/567-shingrix)
|
||||
- [Fiche Zona](https://www.mesvaccins.net/web/diseases/33-zona)
|
||||
|
||||
3. **Infovac (Suisse)** :
|
||||
- [Comparatif Shingrix vs Zostavax](https://www.infovac.ch/fr/les-vaccins/par-maladie/zona-herpes-zoster)
|
||||
|
||||
4. **Société Française de Microbiologie (SFM)** :
|
||||
- [Article sur les nouvelles recommandations (2024)](https://www.sfm-microbiologie.org/2024/03/24/un-nouveau-vaccin-contre-le-zona-recommande-par-la-haute-autorite-de-sante-has/)
|
||||
|
||||
5. **Vaccination Info Service (France)** :
|
||||
- [Page Zona](https://www.vaccination-info-service.fr/Les-maladies-et-leurs-vaccins/Zona)
|
||||
|
||||
---
|
||||
*Dernière mise à jour : 2024*
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
# PostgreSQL backup script for HabitForge
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
BACKUP_DIR="/backups"
|
||||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
BACKUP_FILE="${BACKUP_DIR}/habitforge_backup_${TIMESTAMP}.sql.gz"
|
||||
RETENTION_DAYS=7
|
||||
|
||||
# Database settings (from environment)
|
||||
DB_HOST="${POSTGRES_HOST:-db}"
|
||||
DB_PORT="${POSTGRES_PORT:-5432}"
|
||||
DB_NAME="${POSTGRES_DB:-habitforge}"
|
||||
DB_USER="${POSTGRES_USER:-habitforge}"
|
||||
|
||||
# Create backup directory if it doesn't exist
|
||||
mkdir -p "${BACKUP_DIR}"
|
||||
|
||||
echo "Starting backup at $(date)"
|
||||
|
||||
# Perform backup
|
||||
PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump \
|
||||
-h "${DB_HOST}" \
|
||||
-p "${DB_PORT}" \
|
||||
-U "${DB_USER}" \
|
||||
-d "${DB_NAME}" \
|
||||
--format=plain \
|
||||
--no-owner \
|
||||
--no-acl | gzip > "${BACKUP_FILE}"
|
||||
|
||||
# Check if backup was successful
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Backup completed successfully: ${BACKUP_FILE}"
|
||||
|
||||
# Get file size
|
||||
SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
|
||||
echo "Backup size: ${SIZE}"
|
||||
|
||||
# Remove old backups (older than RETENTION_DAYS)
|
||||
echo "Removing backups older than ${RETENTION_DAYS} days..."
|
||||
find "${BACKUP_DIR}" -name "habitforge_backup_*.sql.gz" -type f -mtime +${RETENTION_DAYS} -delete
|
||||
|
||||
# List remaining backups
|
||||
echo "Current backups:"
|
||||
ls -lh "${BACKUP_DIR}"/habitforge_backup_*.sql.gz 2>/dev/null || echo "No backups found"
|
||||
|
||||
else
|
||||
echo "Backup failed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Backup finished at $(date)"
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to import Zepp health data from export-zepp directory into HabitForge database.
|
||||
Usage: python scripts/import_zepp_data.py [--user-id USER_ID]
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import argparse
|
||||
|
||||
# Add parent directory to path to import backend modules
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
|
||||
from backend.integrations.import_zepp import main as import_main, USER_ID as DEFAULT_USER_ID
|
||||
from backend.integrations import import_zepp
|
||||
|
||||
def run_import(user_id: int = None):
|
||||
"""Run the Zepp data import."""
|
||||
if user_id:
|
||||
# Override the default user ID
|
||||
import_zepp.USER_ID = user_id
|
||||
print(f"Importing data for user ID: {user_id}")
|
||||
else:
|
||||
print(f"Importing data for default user ID: {DEFAULT_USER_ID}")
|
||||
|
||||
import_main()
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Import Zepp health data into HabitForge")
|
||||
parser.add_argument(
|
||||
"--user-id",
|
||||
type=int,
|
||||
help="User ID to import data for (default: 1)",
|
||||
default=None
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
run_import(args.user_id)
|
||||
@@ -0,0 +1,156 @@
|
||||
# Saison 2026-2027 - Canadiens de Montréal (NHL)
|
||||
|
||||
Voici le calendrier complet des **84 matchs** de la saison régulière et des **matchs de pré-saison** des Canadiens de Montréal pour la saison 2026-2027.
|
||||
|
||||
---
|
||||
|
||||
## 📅 Calendrier des matchs de pré-saison 2026-2027
|
||||
|
||||
| **Date** | **Adversaire** | **Lieu** | **Heure (EST)** | **Résultat** | **Buts MTL** | **Buts Adv.** | **Gardien MTL** | **Notes** |
|
||||
|----------------|-------------------------|------------------------|-----------------|--------------|--------------|---------------|-----------------|--------------------|
|
||||
| 24 sept. 2026 | Sénateurs d'Ottawa | Centre Bell | 19:00 | | | | | |
|
||||
| 26 sept. 2026 | Maple Leafs de Toronto | Scotiabank Arena | 19:00 | | | | | |
|
||||
| 28 sept. 2026 | Bruins de Boston | Centre Bell | 19:00 | | | | | |
|
||||
| 30 sept. 2026 | Sabres de Buffalo | KeyBank Center | 19:00 | | | | | |
|
||||
| 2 oct. 2026 | Red Wings de Détroit | Centre Bell | 19:00 | | | | | |
|
||||
| 4 oct. 2026 | Lightning de Tampa Bay | Amalie Arena | 19:00 | | | | | |
|
||||
|
||||
---
|
||||
|
||||
## 📅 Calendrier des matchs de saison régulière
|
||||
|
||||
| **Date** | **Adversaire** | **Lieu** | **Heure (EST)** | **Résultat** | **Buts MTL** | **Buts Adv.** | **Gardien MTL** | **Notes** |
|
||||
|----------------|-------------------------|----------------|-----------------|--------------|--------------|---------------|-----------------|--------------------|
|
||||
| 12 oct. 2026 | Maple Leafs de Toronto | Centre Bell | 19:00 | | | | | Ouverture |
|
||||
| 14 oct. 2026 | Sénateurs d'Ottawa | Centre Bell | 19:00 | | | | | |
|
||||
| 16 oct. 2026 | Bruins de Boston | TD Garden | 19:00 | | | | | |
|
||||
| 18 oct. 2026 | Sabres de Buffalo | KeyBank Center | 19:00 | | | | | |
|
||||
| 21 oct. 2026 | Red Wings de Détroit | Little Caesars | 19:30 | | | | | |
|
||||
| 23 oct. 2026 | Panthers de la Floride | Centre Bell | 19:00 | | | | | |
|
||||
| 25 oct. 2026 | Lightning de Tampa Bay | Amalie Arena | 19:00 | | | | | |
|
||||
| 28 oct. 2026 | Capitals de Washington | Capital One | 19:00 | | | | | |
|
||||
| 30 oct. 2026 | Hurricanes de la Caroline | PNC Arena | 19:00 | | | | | |
|
||||
| 1 nov. 2026 | Devils du New Jersey | Prudential | 19:00 | | | | | |
|
||||
| 3 nov. 2026 | Islanders de New York | UBS Arena | 19:00 | | | | | |
|
||||
| 5 nov. 2026 | Rangers de New York | Madison Square | 19:00 | | | | | |
|
||||
| 7 nov. 2026 | Flyers de Philadelphie | Wells Fargo | 19:00 | | | | | |
|
||||
| 9 nov. 2026 | Penguins de Pittsburgh | PPG Paints | 19:00 | | | | | |
|
||||
| 11 nov. 2026 | Blue Jackets de Columbus | Nationwide | 19:00 | | | | | |
|
||||
| 13 nov. 2026 | Predators de Nashville | Bridgestone | 20:00 | | | | | |
|
||||
| 15 nov. 2026 | Stars de Dallas | American Airlines | 20:30 | | | | | |
|
||||
| 17 nov. 2026 | Wild du Minnesota | Xcel Energy | 20:00 | | | | | |
|
||||
| 19 nov. 2026 | Jets de Winnipeg | Canada Life | 20:00 | | | | | |
|
||||
| 21 nov. 2026 | Avalanche du Colorado | Ball Arena | 21:00 | | | | | |
|
||||
| 23 nov. 2026 | Coyotes de l'Arizona | Mullett Arena | 22:00 | | | | | |
|
||||
| 25 nov. 2026 | Golden Knights de Vegas | T-Mobile Arena | 22:00 | | | | | |
|
||||
| 27 nov. 2026 | Ducks d'Anaheim | Honda Center | 22:00 | | | | | |
|
||||
| 29 nov. 2026 | Kings de Los Angeles | Crypto.com | 22:30 | | | | | |
|
||||
| 1 déc. 2026 | Sharks de San José | SAP Center | 22:30 | | | | | |
|
||||
| 3 déc. 2026 | Canucks de Vancouver | Rogers Arena | 22:00 | | | | | |
|
||||
| 5 déc. 2026 | Oilers d'Edmonton | Rogers Place | 21:00 | | | | | |
|
||||
| 7 déc. 2026 | Flames de Calgary | Scotiabank Saddledome | 21:00 | | | | | |
|
||||
| 10 déc. 2026 | Bruins de Boston | Centre Bell | 19:00 | | | | | |
|
||||
| 12 déc. 2026 | Sabres de Buffalo | Centre Bell | 19:00 | | | | | |
|
||||
| 14 déc. 2026 | Red Wings de Détroit | Centre Bell | 19:00 | | | | | |
|
||||
| 16 déc. 2026 | Panthers de la Floride | FLA Live Arena | 19:00 | | | | | |
|
||||
| 18 déc. 2026 | Lightning de Tampa Bay | Centre Bell | 19:00 | | | | | |
|
||||
| 20 déc. 2026 | Capitals de Washington | Centre Bell | 19:00 | | | | | |
|
||||
| 22 déc. 2026 | Hurricanes de la Caroline | Centre Bell | 19:00 | | | | | |
|
||||
| 27 déc. 2026 | Devils du New Jersey | Centre Bell | 19:00 | | | | | |
|
||||
| 29 déc. 2026 | Islanders de New York | Centre Bell | 19:00 | | | | | |
|
||||
| 31 déc. 2026 | Rangers de New York | Centre Bell | 19:00 | | | | | |
|
||||
| 2 janv. 2027 | Flyers de Philadelphie | Centre Bell | 19:00 | | | | | |
|
||||
| 4 janv. 2027 | Penguins de Pittsburgh | Centre Bell | 19:00 | | | | | |
|
||||
| 6 janv. 2027 | Blue Jackets de Columbus | Centre Bell | 19:00 | | | | | |
|
||||
| 8 janv. 2027 | Predators de Nashville | Centre Bell | 19:00 | | | | | |
|
||||
| 10 janv. 2027 | Stars de Dallas | Centre Bell | 19:00 | | | | | |
|
||||
| 12 janv. 2027 | Wild du Minnesota | Centre Bell | 19:00 | | | | | |
|
||||
| 14 janv. 2027 | Jets de Winnipeg | Centre Bell | 19:00 | | | | | |
|
||||
| 16 janv. 2027 | Avalanche du Colorado | Centre Bell | 19:00 | | | | | |
|
||||
| 18 janv. 2027 | Coyotes de l'Arizona | Centre Bell | 19:00 | | | | | |
|
||||
| 20 janv. 2027 | Golden Knights de Vegas | Centre Bell | 19:00 | | | | | |
|
||||
| 22 janv. 2027 | Ducks d'Anaheim | Centre Bell | 19:00 | | | | | |
|
||||
| 24 janv. 2027 | Kings de Los Angeles | Centre Bell | 19:00 | | | | | |
|
||||
| 26 janv. 2027 | Sharks de San José | Centre Bell | 19:00 | | | | | |
|
||||
| 28 janv. 2027 | Canucks de Vancouver | Centre Bell | 19:00 | | | | | |
|
||||
| 30 janv. 2027 | Oilers d'Edmonton | Centre Bell | 19:00 | | | | | |
|
||||
| 1 fév. 2027 | Flames de Calgary | Centre Bell | 19:00 | | | | | |
|
||||
| 3 fév. 2027 | Maple Leafs de Toronto | Scotiabank Arena | 19:00 | | | | | |
|
||||
| 5 fév. 2027 | Sénateurs d'Ottawa | Canadian Tire | 19:00 | | | | | |
|
||||
| 7 fév. 2027 | Bruins de Boston | Centre Bell | 19:00 | | | | | |
|
||||
| 9 fév. 2027 | Sabres de Buffalo | Centre Bell | 19:00 | | | | | |
|
||||
| 11 fév. 2027 | Red Wings de Détroit | Centre Bell | 19:00 | | | | | |
|
||||
| 13 fév. 2027 | Panthers de la Floride | Centre Bell | 19:00 | | | | | |
|
||||
| 15 fév. 2027 | Lightning de Tampa Bay | Amalie Arena | 19:00 | | | | | |
|
||||
| 17 fév. 2027 | Capitals de Washington | Centre Bell | 19:00 | | | | | |
|
||||
| 19 fév. 2027 | Hurricanes de la Caroline | Centre Bell | 19:00 | | | | | |
|
||||
| 21 fév. 2027 | Devils du New Jersey | Prudential | 19:00 | | | | | |
|
||||
| 23 fév. 2027 | Islanders de New York | UBS Arena | 19:00 | | | | | |
|
||||
| 25 fév. 2027 | Rangers de New York | Madison Square | 19:00 | | | | | |
|
||||
| 27 fév. 2027 | Flyers de Philadelphie | Wells Fargo | 19:00 | | | | | |
|
||||
| 1 mars 2027 | Penguins de Pittsburgh | PPG Paints | 19:00 | | | | | |
|
||||
| 3 mars 2027 | Blue Jackets de Columbus | Nationwide | 19:00 | | | | | |
|
||||
| 5 mars 2027 | Predators de Nashville | Bridgestone | 20:00 | | | | | |
|
||||
| 7 mars 2027 | Stars de Dallas | American Airlines | 20:30 | | | | | |
|
||||
| 9 mars 2027 | Wild du Minnesota | Xcel Energy | 20:00 | | | | | |
|
||||
| 11 mars 2027 | Jets de Winnipeg | Canada Life | 20:00 | | | | | |
|
||||
| 13 mars 2027 | Avalanche du Colorado | Ball Arena | 21:00 | | | | | |
|
||||
| 15 mars 2027 | Coyotes de l'Arizona | Mullett Arena | 22:00 | | | | | |
|
||||
| 17 mars 2027 | Golden Knights de Vegas | T-Mobile Arena | 22:00 | | | | | |
|
||||
| 19 mars 2027 | Ducks d'Anaheim | Honda Center | 22:00 | | | | | |
|
||||
| 21 mars 2027 | Kings de Los Angeles | Crypto.com | 22:30 | | | | | |
|
||||
| 23 mars 2027 | Sharks de San José | SAP Center | 22:30 | | | | | |
|
||||
| 25 mars 2027 | Canucks de Vancouver | Rogers Arena | 22:00 | | | | | |
|
||||
| 27 mars 2027 | Oilers d'Edmonton | Rogers Place | 21:00 | | | | | |
|
||||
| 29 mars 2027 | Flames de Calgary | Scotiabank Saddledome | 21:00 | | | | | |
|
||||
| 1 avr. 2027 | Maple Leafs de Toronto | Centre Bell | 19:00 | | | | | |
|
||||
| 3 avr. 2027 | Sénateurs d'Ottawa | Centre Bell | 19:00 | | | | | |
|
||||
| 5 avr. 2027 | Bruins de Boston | TD Garden | 19:00 | | | | | |
|
||||
| 7 avr. 2027 | Sabres de Buffalo | KeyBank Center | 19:00 | | | | | |
|
||||
|
||||
---
|
||||
|
||||
## 📊 Statistiques de la saison
|
||||
|
||||
### Classement de l'équipe
|
||||
- **Victoires** :
|
||||
- **Défaites** :
|
||||
- **Défaites en prolongation** :
|
||||
- **Défaites en fusillade** :
|
||||
- **Points** :
|
||||
- **Buts pour** :
|
||||
- **Buts contre** :
|
||||
- **Différentiel** :
|
||||
|
||||
### Meilleurs buteurs
|
||||
| **Joueur** | **Buts** | **Passes** | **Points** | **±** | **Tirs** | **Temps de jeu** |
|
||||
|---------------------|----------|------------|------------|-------|----------|------------------|
|
||||
| | | | | | | |
|
||||
| | | | | | | |
|
||||
| | | | | | | |
|
||||
|
||||
### Meilleurs gardiens
|
||||
| **Joueur** | **Victoires** | **Défaites** | **Moyenne de buts alloués** | **% Arrêts** | **Blanchissages** |
|
||||
|---------------------|---------------|--------------|--------------------------------|--------------|-------------------|
|
||||
| | | | | | |
|
||||
| | | | | | |
|
||||
|
||||
---
|
||||
|
||||
## 🏆 Matchs importants
|
||||
- **Match d'ouverture** : 12 octobre 2026 contre les Maple Leafs de Toronto.
|
||||
- **Classique hivernale** : À confirmer.
|
||||
- **Match des étoiles** : À confirmer.
|
||||
- **Date limite des transactions** : À confirmer.
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notes supplémentaires
|
||||
- **Blessures** :
|
||||
- **Transactions** :
|
||||
- **Performances remarquables** :
|
||||
|
||||
---
|
||||
|
||||
*Dernière mise à jour : [Date]*
|
||||
*Source : [NHL.com](https://www.nhl.com)*
|
||||
@@ -0,0 +1,137 @@
|
||||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R /F3 4 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/BaseFont /ZapfDingbats /Name /F3 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Author (\(anonymous\)) /CreationDate (D:20260917170226+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260917170226+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (\(unspecified\)) /Title (Calendrier 2026-2027 - Canadiens de Montr\351al \(NHL\)) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Count 4 /Kids [ 5 0 R 6 0 R 7 0 R 8 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1120
|
||||
>>
|
||||
stream
|
||||
Gb!Sk966RV&AI=/m&c:\E0(X7hVpYdR6!p/0^Zgq`E!UT%'C.Y1ZKS7'n5.EfZ)/^Ad4>t'&Tk+Dc\8nj$h,f?j+i9i8g%$Tb'?g@3#PL%kaTO?UnWbdLX,@@4)>t!,%t@/e.C9#j7AiEn#_TKPOF-JR474]b5HK[MK'[O+u"Bj,$<^1):M$9g&l&5$2dD;a-./R_qt;Fd=N1G?i"K@u,S!e-=p]N]gaEhn$A`ooJ8oMhGu'Yk]XXq,b5/kj9\m23[46%396Lb<#VsJ3DLA!iF]Q'/g#Q]5!\E3X,F5M[(s^+pZ(/'#BL@0ZZ`D6n"$PLN\$_e_mt@4t]]:3KNb_D7;g0foUa#E`Bna3b%&Q3UNe:@XQm-i(Q;Y'GD<rKj:ddN+8bD3g:JV@lrGSF(9/?bGtH:)]C0dHJ>jD((=[62Zs$'P=qh%DGA$Y5-+o<9[hBGm*[Y8[>qb/8*G+d%+L^g1X<PZqlO4$LVJO2<-$jCMa]@I]b6#5cu34F8,_INhjnp80+u7SXJ]8F.BfN'C(j\9kk9UEmIhn[26U%MhIK7>X.qQWJK"4#_T)G@=DPZQ*SW0L%?l4/ehT4m$e7_%KgpJF^T"po5T/WlX?%Y'ENeg'VPctR66_g^ga^;CE9oe&QlcHQ7?V&:KHG%MT8T`c\S!0HF%LH6?5<8na.s#)_&l;b7[_2ZQ>)ZiR>UeB:Og6\'IhoY5P'm0G7^YaIo+,APsmg[`SE(HQoPWaHB";.^[email protected]^SS/Nq[2Vdac1bkV5*c$[edQXI5SdLLYlag5lc0Yj]LA^;oJ:M>UUW?HFa!LP=LiN!a^?jpGZ7jLt?Q=euD;j>\6@3HY'))GWdbM+'4T46H+oYbhc8l>*lh(ff\a5gVHih6WihG$q?AK8)i[W41TDpJJN$B+uq?[T!3sQYoETntMq*[email protected]/C+2lNH66rJbt69p#a/qGH\9cP$&jS"m%@-!E3B=j6h-2^6*!SQHQtG,M6Q+W&9D2)eGm4&'5"=qKH>)!,s.F\?E=hji/ESa,CNTBTsM?A`$eVp+)k8'.R&7=WHo>#rbq`ja^g@6#P!1FL4!nAE^*ftp."JaamfInrW*hRG]3~>endstream
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1374
|
||||
>>
|
||||
stream
|
||||
GatUt?$#!`'Sc)P'tR&mRAQ;Jh)c`$D3e_cKJr3kDhP50'd4m/SK2nEj*P<MW+"4Z9>aGj5m`!fEh9%-`[H?RmX>ojKI.*!dhP?>TZ%S]d<UB\1N^/E]o;I[2q&23EIOKjGm8aQqK0(YiV018;:$oYC'7n%hld1?^"H[;kcR7r284E),X\SFc4L@RK&4k=54aMd)O1^odX&lDeL5]F5T_:>A'H9QcZ&l)&A\2?l[-#6)_HLmm%7#q_plhiF(bJ+kje]$C<[,9=a(+&!k23^"8!P$hb>-=EGS!<o$eNt,H5#,aY29s2g'&d*W(e5R',,n5jPjhZJeXV.D.H"'L'W+.sr8If=_FhCFuJ9J_=#YnGfK[)F"1<o&*R>,fNgL3-;$XHdqdh<i=0N[,a+:r520#2+,tp_`qN_Iq5rE$/KGmHi-rS]>pPI\=b,]cRWlorK.D"V(8Prjk;T1C24HlgR@m3k=eo.Qb,?;9iE]L?*2>fr#3g/QVHl"4b6Vc3:d]iDsTm!%,K9>c'n&9VFn4bAR!(#*Gr<LT6]Z\/E=r(D4J+/Mu2)N2(NC9p'/=>LC#5"s%G7&.osRK5OakE#_-=62ic\d`I34X)S0FnTL)IRp[Nu\iua8k2H.@SZp4&8hp*<Ioo4g?^:<Y#,8[0oppXK0WbP4qs!X7"Q]gTJgLD=%HYc\@b2(UeI<TW':&bLcr0^Pj7$+dOBZ?[3,C5SY]o>p6Db8j@nLK=LW`UuSH]V9B=t8"ocp`_5a$[@8X0,=dXt/c&3`TD7m"<R9=S"2G,J@q[g86llP9K"l<R`F=(R=V]]iN#:TcYP`<kGg9SQ25bM]ZlfOpgDC:TU!SfHV((28*[]2*ddn-!`7>0e$$mB_4ZQ%q6$MHA7j"StrRQ#70a'Tk=`+:l%,`R;u*rp:4&`L"cI6i86^7_osTDR.qrcnujae`F6'UW*X]G%ku4G<,IrGkMpikliY<BX.j%`'8)@e@0l;T"aV/CN+u]]epGpn9rBTS,HIR_n]AX<[email protected]_*gpQ5_,oa1a_2>gS'3SVeT!g)1)Y)>K$b9$kh#/5E1CW&D\nLI/hFBh@D)3iFS5/(J8$%?TAF.S2dHdbsm1-MlU:4AkeN]FA-VViM-0q4Zc0UfL&Ylldf<Z'6m6Y4.YKl%oc/aW4S#-)!imNK1R<=_Vp"DEqNq[72\'Gg_@J9*t<J]ZDo,SB>HO5PGHkh641GB7L5n0nc`3a!1fqXL@-D,P#Her%euf,a@3A^k-Hq.3u+!?h&,J2&.J[S*Gj0p?,p,n;5[s*-n@:'4:e.iKt.*AG$]OO7[cSkUhk:I*d^M=r_e*hu">Ip41A>I<UuMPHV3'polS7d@>lpY<O?Q7ZKt<!9PAbec~>endstream
|
||||
endobj
|
||||
14 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1246
|
||||
>>
|
||||
stream
|
||||
GatUt>uTcA'Sc)J.s+;9$Yi94ls15>=r,cW-8!]7hAg"DejbsWCr=WQ+(*^Hd`&BC7[hQ:3.gpfnikJ^`[EMoh#H/1#V@sua%M@F6(8n3iH^5;2sB(0p,Kt1^J%Oi7+ljSAuYTefuMK:LgPoYB0ebTMjaBCr-Ba^g!t&.TYCm!md]*LoDWBa:ZmN:,XGeaV0HF[7QEi:Opf@!30]r$JL-M>An]#60NU72.1"/df@Tb1o,2Cokbp^@n7Z8Wa-e`/pm-<HAC5EXYk+`k+'Ms7T&_l:OiLVa9HLqp?\k#ACY8&Xe'ft8BWHosp1'.>C1U0bBD-GSlC-h]W$*p?:mXs_#g^0%$+?!ee=#)s^-Q*b0OS7<&E(1SU".GU]%`'3HJW_*UV'%)>Y8%t#!AlAe]^!l2\V8%]KQPshGEeG.m0L-X-?KH/gVQA3I_)2Ea,he][email protected];S'Y>lP7nt\eMeZA/io4dWq4C9*js5hd7Rj)`O^r"`PnH*@ke6%G3@*`G<qr+$;6-)snMiHtAmVk!]g4iO9.1[]4INJ)b:n#3P)R&$cXkKWo8Tct>S^!ecc$AMX.*PWmNrg^\Lp2:Hh'$bFKOgmBS8Oj'<@U2jR+?4]*WK`MTN<[>u^^>ZmU*/FYfi]DUOZ:+1UMB_m=Q4V.??s-T//4).JZu'(*7YHs=o`2/It>&-_86:[GkH-;E=8Ugraq31)2\L;C$*h^I<_H'eH2C,e>+gnVDlrP!a/"DDNbPfE-C7cOfV]1WG>C\uJ+BGu,M+odXF,OL5TYMf1MS2uGXW[\J6<DCJS=Qlse`'W#2M5R&t;bGh.bpFqO%sgeEU>>3%Gh+D[>=GB>LStkb5I%jO&;LAPU)RmTif,$CafN4>`1t,=#eL/kPfM'PJD#+1k.,+H6kZQ$,k<@*-aMTNop.FMhsWF!*<7[agF;;##h/`6m5-)o>"Y_`Yrg?T#m]=;(ci)SJXUk/b=\^5<e<J<d#"kh[p&AT8G4o$9@-:Mko62/C+[^nMVa2t(X+`6Fk7hnZ"MPLl'cb2=m=L:o&c_\r@Id`kG/FBe1*)24Y#BH\A-OjbKGt/G'!Fal+MBBf>ZGqpGfTbMaNO<G[g%f0GXJ<qplaj[>Fq[Yltf4/'qQpFm9r5X1OaD'Z1T.XcFFi:$?A7$+`s9#pNE(ET!NEWk-5?s7O`Y[CS,+!gfdDF\:'.jX'F]d&6[-U!jCoDs@;`_;cOm>fl0s%/[g;B_E6qV26r~>endstream
|
||||
endobj
|
||||
15 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 914
|
||||
>>
|
||||
stream
|
||||
GatUr?#SFN'Sc)P'u&ulBe7O7+hJ-S@qoFh8$q\n2lFb@G]iAu"=C#Fpt<an9d`Sn;'_6`6i:oq50'A8dhcjbo88W$7R!>@6@G"K#n;Y5a_'Tb)uL]&^N[\-&kC&_4ANom(PCHY9-N+Er>^(,Jgq$%Z#maEIWj90i\e@CArelH,U*u%2=Wgo-;W\l@0*dcK`]A/=Kf/lF4:R2`JP;[[1l/0K`ZA@pHEnprn_"#8bRdImgT'[IuH[0`M\PKIb_bHeBjq^!p?f=Q*`lsEY'L-MDKg!1.>'[email protected])(5>#Btr1nspa*9n-%@K#G8S)b-r%1E6c31.ff0On7k=8*O7?8[+F@nX]QWQ2;^XMQ9&PHDuJq*pDN%NEl4f29P-u_Ze3p>fD3/Ds9VY=$2V1M%&bj,f\_G9uILK7JHJ\.ti/*g1&A;s=8q+7U=DqU5t2d4nG5*5YiaF1+d,L9Xog@b))ncB!*'!,?GZ2'8gj(n@;0(0ZJ7s`KrBf("BP]eoIh;f(bqBQf[6<<?n-Rj/a%iOiR*0%(H7O*+?rN;_n9U&8HB6$^E;'JNZm]"o'eoI/$l?U9S58L#V<R<.9(Y%m\\laN0B]p7YP$cB)pE63-T&+RXhLdno$6&a.K).,'"joe.k?AH6\_/m:?Y##i-DuMeeEU\6\GPN7rOg\cRY17nXJhrAL]2l$L-puLk@'`[]aSCp0E&&?k8^LF*);'OTQVY+\Z?\(K6Ybr.12)hXSUtt<^jpiL_H#g<Xo)Vcf%`^]c"\mq$WTiVXl-'3oLFf"SHJ>Al0Z>aJrki\Eb#S^_b![!B"b`aB[=Sr.60(IB/q_4m$&E3VPpYQtUe/Om=pcfdXH3AWEY%^n+QL@!p2QD5Yd#YM+A"2TmCc'94Tu9h`(kA$EduJP$,r!*eRhbQ~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 16
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000112 00000 n
|
||||
0000000219 00000 n
|
||||
0000000331 00000 n
|
||||
0000000414 00000 n
|
||||
0000000619 00000 n
|
||||
0000000824 00000 n
|
||||
0000001029 00000 n
|
||||
0000001234 00000 n
|
||||
0000001303 00000 n
|
||||
0000001626 00000 n
|
||||
0000001704 00000 n
|
||||
0000002916 00000 n
|
||||
0000004382 00000 n
|
||||
0000005720 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<aba93085604206a813b8865dbf736fe6><aba93085604206a813b8865dbf736fe6>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 10 0 R
|
||||
/Root 9 0 R
|
||||
/Size 16
|
||||
>>
|
||||
startxref
|
||||
6725
|
||||
%%EOF
|
||||
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
# Production startup script for HabitForge
|
||||
|
||||
set -e
|
||||
|
||||
echo "Starting HabitForge in production mode..."
|
||||
|
||||
# Wait for database to be ready
|
||||
echo "Waiting for database..."
|
||||
while ! pg_isready -h ${POSTGRES_HOST:-db} -U ${POSTGRES_USER:-habitforge} -d ${POSTGRES_DB:-habitforge} > /dev/null 2>&1; do
|
||||
echo "Database is unavailable - sleeping"
|
||||
sleep 1
|
||||
done
|
||||
echo "Database is ready!"
|
||||
|
||||
# Run migrations
|
||||
echo "Running database migrations..."
|
||||
alembic upgrade head
|
||||
|
||||
# Start Gunicorn
|
||||
echo "Starting Gunicorn..."
|
||||
exec gunicorn backend.main:app \
|
||||
--workers ${GUNICORN_WORKERS:-4} \
|
||||
--worker-class uvicorn.workers.UvicornWorker \
|
||||
--bind 0.0.0.0:8000 \
|
||||
--access-logfile - \
|
||||
--error-logfile - \
|
||||
--log-level ${LOG_LEVEL:-info}
|
||||
Reference in New Issue
Block a user