Docfile commited on
Commit
fd984e0
·
verified ·
1 Parent(s): a980ade

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +29 -131
Dockerfile CHANGED
@@ -1,142 +1,40 @@
1
- # Dockerfile pour Apex Ores avec PostgreSQL et diagnostics
2
- FROM python:3.11-bookworm
3
-
4
- # Mettre à jour et installer les dépendances système
5
- RUN apt-get update && apt-get install -y \
6
- wkhtmltopdf \
7
- xvfb \
8
- supervisor \
9
- postgresql-client \
10
- curl \
11
- && rm -rf /var/lib/apt/lists/*
12
-
13
- # Créer l'utilisateur
14
- RUN useradd -m -u 1000 user
15
-
16
- # Créer les répertoires pour supervisor et les logs
17
- RUN mkdir -p /var/log/supervisor /var/log/apex \
18
- && chown -R user:user /var/log/supervisor /var/log/apex
19
-
20
- # CRITIQUE : Créer le répertoire PostgreSQL pour éviter "Permission denied"
21
- # psycopg2 essaie d'accéder à ce répertoire même si on ne veut pas de certificats
22
- RUN mkdir -p /root/.postgresql /home/user/.postgresql \
23
- && touch /root/.postgresql/postgresql.crt \
24
- && touch /root/.postgresql/postgresql.key \
25
- && touch /home/user/.postgresql/postgresql.crt \
26
- && touch /home/user/.postgresql/postgresql.key \
27
- && chmod 777 /root/.postgresql \
28
- && chmod 666 /root/.postgresql/* \
29
- && chown -R user:user /home/user/.postgresql \
30
- && chmod 700 /home/user/.postgresql \
31
- && chmod 600 /home/user/.postgresql/*
32
 
33
  # Définir le répertoire de travail
34
  WORKDIR /app
35
 
36
- # Copier et installer les dépendances Python
37
- COPY --chown=user ./requirements.txt requirements.txt
38
- RUN pip install --no-cache-dir --upgrade -r requirements.txt
39
-
40
- # Copier tout le code
41
- COPY --chown=user . /app
42
 
43
- # Script de démarrage avec vérification de la DB
44
- RUN echo '#!/bin/bash\n\
45
- set -e\n\
46
- \n\
47
- echo "===== Application Startup at $(date) ====="\n\
48
- echo "Environment variables:"\n\
49
- echo "FLASK_ENV: $FLASK_ENV"\n\
50
- echo "DATABASE_URL: ${DATABASE_URL:0:30}..." # Affiche seulement le début\n\
51
- \n\
52
- # Test de connexion PostgreSQL\n\
53
- echo "Testing PostgreSQL connection..."\n\
54
- python3 -c "\n\
55
- import sys\n\
56
- import os\n\
57
- try:\n\
58
- from sqlalchemy import create_engine, text\n\
59
- db_url = os.environ.get(\"DATABASE_URL\")\n\
60
- if not db_url:\n\
61
- print(\"ERROR: DATABASE_URL not set\")\n\
62
- sys.exit(1)\n\
63
- # Ajouter les options SSL\n\
64
- if \"?\" in db_url:\n\
65
- db_url = db_url.split(\"?\")[0] + \"?sslmode=require\"\n\
66
- engine = create_engine(db_url, connect_args={\"sslmode\": \"require\"})\n\
67
- with engine.connect() as conn:\n\
68
- result = conn.execute(text(\"SELECT version();\"))\n\
69
- print(f\"PostgreSQL connected: {result.scalar()[:50]}\")\n\
70
- print(\"Database connection successful!\")\n\
71
- except Exception as e:\n\
72
- print(f\"ERROR connecting to database: {e}\")\n\
73
- sys.exit(1)\n\
74
- "\n\
75
- \n\
76
- # Initialiser la base de données\n\
77
- echo "Initializing database..."\n\
78
- python3 -c "\n\
79
- from app import create_app, db\n\
80
- app = create_app()\n\
81
- with app.app_context():\n\
82
- db.create_all()\n\
83
- print(\"Database tables created successfully\")\n\
84
- " || {\n\
85
- echo "ERROR: Failed to initialize database"\n\
86
- exit 1\n\
87
- }\n\
88
- \n\
89
- echo "Starting supervisord..."\n\
90
- exec /usr/bin/supervisord -c /etc/supervisor/conf.d/apex.conf\n\
91
- ' > /app/start.sh && chmod +x /app/start.sh
92
 
93
- # Créer la configuration supervisord
94
- RUN echo '[supervisord]\n\
95
- nodaemon=true\n\
96
- user=root\n\
97
- logfile=/var/log/supervisor/supervisord.log\n\
98
- pidfile=/var/run/supervisord.pid\n\
99
- loglevel=info\n\
100
- \n\
101
- [program:flask]\n\
102
- command=flask run --host=0.0.0.0 --port=7860\n\
103
- directory=/app\n\
104
- user=user\n\
105
- autostart=true\n\
106
- autorestart=true\n\
107
- stdout_logfile=/dev/stdout\n\
108
- stdout_logfile_maxbytes=0\n\
109
- stderr_logfile=/dev/stderr\n\
110
- stderr_logfile_maxbytes=0\n\
111
- environment=PYTHONPATH=/app,FLASK_APP=run.py,HOME=/home/user\n\
112
- startsecs=10\n\
113
- startretries=3\n\
114
- \n\
115
- [program:scheduler]\n\
116
- command=python3 -m app.task_runner --daemon\n\
117
- directory=/app\n\
118
- user=user\n\
119
- autostart=true\n\
120
- autorestart=true\n\
121
- stdout_logfile=/dev/stdout\n\
122
- stdout_logfile_maxbytes=0\n\
123
- stderr_logfile=/dev/stderr\n\
124
- stderr_logfile_maxbytes=0\n\
125
- environment=PYTHONPATH=/app,HOME=/home/user\n\
126
- startsecs=10\n\
127
- startretries=3' > /etc/supervisor/conf.d/apex.conf
128
 
129
- # Variables d'environnement
130
- ENV PYTHONPATH=/app
131
- ENV FLASK_APP=run.py
132
- ENV PATH="/home/user/.local/bin:$PATH"
133
- ENV HOME=/home/user
134
 
135
- # NE PAS définir PGSSLCERT, PGSSLKEY, PGSSLROOTCERT ici
136
- # On va utiliser les fichiers créés dans .postgresql/
 
137
 
138
- # Exposer le port Flask
139
  EXPOSE 7860
140
 
141
- # Commande de démarrage avec script de vérification
142
- CMD ["/app/start.sh"]
 
 
 
1
+ # Utiliser une image Python officielle légère
2
+ FROM python:3.11-slim
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  # Définir le répertoire de travail
5
  WORKDIR /app
6
 
7
+ # Variables d'environnement pour optimiser Python
8
+ ENV PYTHONDONTWRITEBYTECODE=1 \
9
+ PYTHONUNBUFFERED=1 \
10
+ FLASK_APP=run.py
 
 
11
 
12
+ # Installer les dépendances système minimales
13
+ # libpq-dev est nécessaire pour psycopg2
14
+ # curl est utile pour le healthcheck
15
+ RUN apt-get update && apt-get install -y \
16
+ libpq-dev \
17
+ curl \
18
+ gcc \
19
+ && rm -rf /var/lib/apt/lists/*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
+ # Copier et installer les requirements
22
+ COPY requirements.txt .
23
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
24
+ # Installer Gunicorn pour la production
25
+ RUN pip install gunicorn
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ # Copier le code
28
+ COPY . .
 
 
 
29
 
30
+ # Créer un utilisateur non-root pour la sécurité
31
+ RUN useradd -m appuser && chown -R appuser:appuser /app
32
+ USER appuser
33
 
34
+ # Exposer le port (Hugging Face Spaces utilise 7860 par défaut)
35
  EXPOSE 7860
36
 
37
+ # Lancer l'application avec Gunicorn (Serveur de production robuste)
38
+ # --bind 0.0.0.0:7860 : Écoute sur toutes les interfaces
39
+ # run:app : Fichier run.py, instance 'app'
40
+ CMD ["gunicorn", "--bind", "0.0.0.0:7860", "--workers", "2", "--timeout", "120", "run:app"]