EPIDOCS API — Diagnostics¶
Vérifications rapides¶
État des conteneurs¶
Résultat attendu :
NAME IMAGE STATUS PORTS
epidocs_api ghcr.io/epitechafrik/epidocs-api:deploy Up X hours (healthy) 0.0.0.0:7010->8000/tcp
epidocs_db postgres:16 Up X hours (healthy)
Health check¶
# Depuis le VPS
curl -s http://127.0.0.1:7010/
# Vérifier uniquement le status code
curl -o /dev/null -s -w "%{http_code}" http://127.0.0.1:7010/
# 200 = OK
Connectivité PostgreSQL¶
docker compose exec web python manage.py shell -c "
from django.db import connection
cursor = connection.cursor()
cursor.execute('SELECT 1')
print('PostgreSQL OK')
"
Vérifier les migrations¶
docker compose exec web python manage.py showmigrations | grep "\[ \]"
# Si des migrations ne sont pas appliquées, elles apparaîtront avec [ ]
Vérifier les droits (permissions)¶
docker compose exec web python manage.py shell -c "
from apps.user.models import User, Right
for u in User.objects.filter(is_staff=True):
rights = u.rights.values_list('name', flat=True)
print(f'{u.email} (super={u.is_superuser}): {list(rights)}')
"
Vérifier les templates de documents¶
# Lister les templates uploadés
docker compose exec web ls -la /epidocs/media/modeles/
# Vérifier les types de documents actifs
docker compose exec web python manage.py shell -c "
from apps.document_type.models import DocumentType
for d in DocumentType.objects.all():
print(f'{d.doc_id}: active={d.is_active}, modele={d.modele}')
"
Nombre d'étudiants par classe¶
docker compose exec web python manage.py shell -c "
from apps.student.models import Student
from django.db.models import Count
stats = Student.objects.filter(account_suspended=0).values('section').annotate(count=Count('login')).order_by('section')
for s in stats:
print(f\"{s['section']}: {s['count']} étudiants\")
"
Logs¶
Logs Docker (temps réel)¶
# Logs du backend
docker compose logs -f web --tail 100
# Logs PostgreSQL
docker compose logs -f db --tail 50
# Filtrer les erreurs
docker compose logs web --tail 500 | grep -i "error\|exception\|traceback"
Logs applicatifs¶
Les logs Django sont écrits dans /epidocs/logs/file.log à l'intérieur du conteneur :
Logs via Grafana/Loki¶
Si Pedago Watch est configuré avec Promtail, les logs EPIDOCS sont accessibles dans Grafana :
- Aller sur grafana.epitools.bj
- Explorer → Loki
- Filtrer par
container_name="epidocs_api"
Vérification des sessions¶
Sessions actives¶
docker compose exec web python manage.py shell -c "
from apps.user.models import UserSession
from django.utils import timezone
active = UserSession.objects.filter(is_valid=True, expires_at__gt=timezone.now())
print(f'{active.count()} sessions actives')
for s in active[:10]:
user = s.user or s.student
print(f' {user} - role={s.role} - expires={s.expires_at}')
"
Purger les sessions expirées¶
docker compose exec web python manage.py shell -c "
from apps.user.models import UserSession
from django.utils import timezone
expired = UserSession.objects.filter(expires_at__lt=timezone.now())
count = expired.count()
expired.update(is_valid=False)
print(f'{count} sessions expirées invalidées')
"
État du système¶
Mode maintenance¶
docker compose exec web python manage.py shell -c "
from apps.user.models import SystemStatus
s = SystemStatus.objects.first()
if s:
print(f'Maintenance: {s.is_maintenance}')
print(f'Message: {s.maintenance_message}')
print(f'Fenêtre: {s.scheduled_start} → {s.scheduled_end}')
else:
print('Aucun SystemStatus configuré')
"
Annonces actives¶
docker compose exec web python manage.py shell -c "
from apps.user.models import Announcement
from django.utils import timezone
active = Announcement.objects.filter(is_active=True)
for a in active:
print(f'[{a.priority}] {a.title} - cible: {a.target} {a.target_class or \"\"}')
"
Espace disque¶
Media¶
# Taille totale du dossier media
du -sh /root/projects/mydocs/epidocs-api/media/
# Détail par sous-dossier
du -sh /root/projects/mydocs/epidocs-api/media/*/