Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1f9dec5fe | ||
|
|
be6be42947 |
+2
-2
@@ -70,7 +70,7 @@ PUBLIC_ORIGIN=
|
|||||||
PROXY_HTTP_PORT=
|
PROXY_HTTP_PORT=
|
||||||
PROXY_HTTPS_PORT=
|
PROXY_HTTPS_PORT=
|
||||||
# Réglages mémoire de la stack déployée. Sans eux, timescaledb-tune réserve 25 % de la RAM de la
|
# Réglages mémoire de la stack déployée. Sans eux, timescaledb-tune réserve 25 % de la RAM de la
|
||||||
# machine à chaque base au premier démarrage, et le webserver Airflow lance 4 workers gunicorn.
|
# machine à chaque base au premier démarrage. L'api-server Airflow 3 n'a rien à régler ici : son
|
||||||
|
# nombre de workers vaut 1 par défaut, contre 4 pour le webserver d'Airflow 2.
|
||||||
TS_TUNE_MEMORY=2GB
|
TS_TUNE_MEMORY=2GB
|
||||||
TS_TUNE_NUM_CPUS=2
|
TS_TUNE_NUM_CPUS=2
|
||||||
AIRFLOW_WEBSERVER_WORKERS=2
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ jobs:
|
|||||||
done
|
done
|
||||||
echo "L'API ne répond pas après 3 minutes" >&2
|
echo "L'API ne répond pas après 3 minutes" >&2
|
||||||
cd "/srv/enervision/${ENVIRONNEMENT}"
|
cd "/srv/enervision/${ENVIRONNEMENT}"
|
||||||
docker compose ps
|
compose="docker compose -f docker-compose.yml -f docker-compose.prod.yml"
|
||||||
docker compose logs --tail=50 backend proxy
|
$compose ps
|
||||||
|
$compose logs --tail=50 backend proxy
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ kubeconfig
|
|||||||
# Airflow
|
# Airflow
|
||||||
etl/airflow/logs/
|
etl/airflow/logs/
|
||||||
airflow.db
|
airflow.db
|
||||||
airflow-webserver.pid
|
|
||||||
standalone_admin_password.txt
|
standalone_admin_password.txt
|
||||||
|
|
||||||
# Environnement et secrets
|
# Environnement et secrets
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ services-up: ## Démarre les services conteneurisés dont `make dev` dépend (ba
|
|||||||
docker compose up -d db mailpit
|
docker compose up -d db mailpit
|
||||||
@$(MAKE) --no-print-directory db-wait
|
@$(MAKE) --no-print-directory db-wait
|
||||||
@$(MAKE) --no-print-directory db-ensure-airflow
|
@$(MAKE) --no-print-directory db-ensure-airflow
|
||||||
docker compose up -d airflow-init airflow-webserver airflow-scheduler
|
docker compose up -d airflow-init airflow-apiserver airflow-scheduler airflow-dag-processor
|
||||||
|
|
||||||
dev-backend: ## Lance l'API seule en rechargement à chaud
|
dev-backend: ## Lance l'API seule en rechargement à chaud
|
||||||
@echo "backend -> http://localhost:8000 (docs sur /docs)"
|
@echo "backend -> http://localhost:8000 (docs sur /docs)"
|
||||||
|
|||||||
@@ -94,8 +94,9 @@ et frontend en rechargement a chaud sur le poste.
|
|||||||
| Mailpit | <http://localhost:8025> |
|
| Mailpit | <http://localhost:8025> |
|
||||||
|
|
||||||
Le `.env` doit porter les cles Airflow avant le premier `make dev` : `AIRFLOW_FERNET_KEY`,
|
Le `.env` doit porter les cles Airflow avant le premier `make dev` : `AIRFLOW_FERNET_KEY`,
|
||||||
`AIRFLOW_WEBSERVER_SECRET_KEY`, `AIRFLOW_APP_SECRET_KEY` et `AIRFLOW_ADMIN_PASSWORD`. Sans elles
|
`AIRFLOW_API_SECRET_KEY`, `AIRFLOW_JWT_SECRET`, `AIRFLOW_APP_SECRET_KEY` et
|
||||||
`airflow-init` refuse de demarrer, et `airflow-webserver` comme `airflow-scheduler` avec lui.
|
`AIRFLOW_ADMIN_PASSWORD`. Sans elles `airflow-init` refuse de demarrer, et `airflow-apiserver`,
|
||||||
|
`airflow-scheduler` et `airflow-dag-processor` avec lui.
|
||||||
|
|
||||||
Les cibles d'origine restent disponibles pour ne demarrer qu'une partie : `make db-up`,
|
Les cibles d'origine restent disponibles pour ne demarrer qu'une partie : `make db-up`,
|
||||||
`make airflow-up`, `make dev-backend`, `make dev-frontend`.
|
`make airflow-up`, `make dev-backend`, `make dev-frontend`.
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ services:
|
|||||||
airflow-apiserver:
|
airflow-apiserver:
|
||||||
ports: !override
|
ports: !override
|
||||||
- "127.0.0.1:${AIRFLOW_PORT:-8080}:8080"
|
- "127.0.0.1:${AIRFLOW_PORT:-8080}:8080"
|
||||||
environment:
|
|
||||||
AIRFLOW__WEBSERVER__WORKERS: ${AIRFLOW_WEBSERVER_WORKERS:-2}
|
|
||||||
|
|
||||||
backend:
|
backend:
|
||||||
ports: !reset null
|
ports: !reset null
|
||||||
|
|||||||
@@ -63,8 +63,9 @@ secret.
|
|||||||
|
|
||||||
- Deux TimescaleDB sur une machine de 8 Go : sans réglage, chacune se réserverait 25 % de la
|
- Deux TimescaleDB sur une machine de 8 Go : sans réglage, chacune se réserverait 25 % de la
|
||||||
RAM au premier démarrage. L'overlay fixe `TS_TUNE_MEMORY` à 2 Go et `TS_TUNE_NUM_CPUS` à 2 par
|
RAM au premier démarrage. L'overlay fixe `TS_TUNE_MEMORY` à 2 Go et `TS_TUNE_NUM_CPUS` à 2 par
|
||||||
base, et 2 workers gunicorn par webserver Airflow. La montée à 32 Go prévue par les
|
base. Airflow 3 n'a rien à régler de ce côté : son api-server lance un seul worker par défaut,
|
||||||
consignes est à demander.
|
là où le webserver d'Airflow 2 en lançait quatre. La montée à 32 Go prévue par les consignes
|
||||||
|
est à demander.
|
||||||
- Un runner auto-hébergé sur un dépôt public exécute le code qu'on lui envoie. `deploy.yml` ne
|
- Un runner auto-hébergé sur un dépôt public exécute le code qu'on lui envoie. `deploy.yml` ne
|
||||||
se déclenche jamais sur `pull_request`, le runner tourne sous un utilisateur dédié, et le
|
se déclenche jamais sur `pull_request`, le runner tourne sous un utilisateur dédié, et le
|
||||||
dépôt doit exiger une approbation pour les workflows des PR externes.
|
dépôt doit exiger une approbation pour les workflows des PR externes.
|
||||||
|
|||||||
@@ -47,13 +47,15 @@ preparer() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f "$dossier/.env" ]]; then
|
if [[ ! -f "$dossier/.env" ]]; then
|
||||||
|
local brouillon="$dossier/.env.brouillon" oubliees
|
||||||
sed -e "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(secret)|" \
|
sed -e "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(secret)|" \
|
||||||
-e "s|^POSTGRES_PORT=.*|POSTGRES_PORT=$port_pg|" \
|
-e "s|^POSTGRES_PORT=.*|POSTGRES_PORT=$port_pg|" \
|
||||||
-e "s|^APP_SECRET_KEY=.*|APP_SECRET_KEY=$(secret)|" \
|
-e "s|^APP_SECRET_KEY=.*|APP_SECRET_KEY=$(secret)|" \
|
||||||
-e "s|^MAILPIT_UI_PORT=.*|MAILPIT_UI_PORT=$port_mailpit|" \
|
-e "s|^MAILPIT_UI_PORT=.*|MAILPIT_UI_PORT=$port_mailpit|" \
|
||||||
-e "s|^AIRFLOW_PORT=.*|AIRFLOW_PORT=$port_airflow|" \
|
-e "s|^AIRFLOW_PORT=.*|AIRFLOW_PORT=$port_airflow|" \
|
||||||
-e "s|^AIRFLOW_FERNET_KEY=.*|AIRFLOW_FERNET_KEY=$(fernet)|" \
|
-e "s|^AIRFLOW_FERNET_KEY=.*|AIRFLOW_FERNET_KEY=$(fernet)|" \
|
||||||
-e "s|^AIRFLOW_WEBSERVER_SECRET_KEY=.*|AIRFLOW_WEBSERVER_SECRET_KEY=$(secret)|" \
|
-e "s|^AIRFLOW_API_SECRET_KEY=.*|AIRFLOW_API_SECRET_KEY=$(secret)|" \
|
||||||
|
-e "s|^AIRFLOW_JWT_SECRET=.*|AIRFLOW_JWT_SECRET=$(secret)|" \
|
||||||
-e "s|^AIRFLOW_ADMIN_PASSWORD=.*|AIRFLOW_ADMIN_PASSWORD=$(secret | cut -c1-20)|" \
|
-e "s|^AIRFLOW_ADMIN_PASSWORD=.*|AIRFLOW_ADMIN_PASSWORD=$(secret | cut -c1-20)|" \
|
||||||
-e "s|^AIRFLOW_APP_SECRET_KEY=.*|AIRFLOW_APP_SECRET_KEY=$(secret)|" \
|
-e "s|^AIRFLOW_APP_SECRET_KEY=.*|AIRFLOW_APP_SECRET_KEY=$(secret)|" \
|
||||||
-e "s|^PUBLIC_HOST=.*|PUBLIC_HOST=$hote|" \
|
-e "s|^PUBLIC_HOST=.*|PUBLIC_HOST=$hote|" \
|
||||||
@@ -61,13 +63,21 @@ preparer() {
|
|||||||
-e "s|^COMPOSE_PROJECT_NAME=.*|COMPOSE_PROJECT_NAME=enervision-$env|" \
|
-e "s|^COMPOSE_PROJECT_NAME=.*|COMPOSE_PROJECT_NAME=enervision-$env|" \
|
||||||
-e "s|^PROXY_HTTP_PORT=.*|PROXY_HTTP_PORT=$port_http|" \
|
-e "s|^PROXY_HTTP_PORT=.*|PROXY_HTTP_PORT=$port_http|" \
|
||||||
-e "s|^PROXY_HTTPS_PORT=.*|PROXY_HTTPS_PORT=$port_https|" \
|
-e "s|^PROXY_HTTPS_PORT=.*|PROXY_HTTPS_PORT=$port_https|" \
|
||||||
"$dossier/.env.example" > "$dossier/.env"
|
"$dossier/.env.example" > "$brouillon"
|
||||||
# Branche antérieure à l'ADR 0009 : ces clés manquent alors dans .env.example.
|
# Branche antérieure à l'ADR 0009 : ces clés manquent alors dans .env.example.
|
||||||
for cle in "COMPOSE_PROJECT_NAME=enervision-$env" "PUBLIC_ORIGIN=$origine" \
|
for cle in "COMPOSE_PROJECT_NAME=enervision-$env" "PUBLIC_ORIGIN=$origine" \
|
||||||
"PROXY_HTTP_PORT=$port_http" "PROXY_HTTPS_PORT=$port_https"; do
|
"PROXY_HTTP_PORT=$port_http" "PROXY_HTTPS_PORT=$port_https"; do
|
||||||
grep -q "^${cle%%=*}=" "$dossier/.env" || echo "$cle" >> "$dossier/.env"
|
grep -q "^${cle%%=*}=" "$brouillon" || echo "$cle" >> "$brouillon"
|
||||||
done
|
done
|
||||||
chmod 600 "$dossier/.env"
|
# Piège : une clé renommée en amont garde sa valeur d'exemple, que le `:?` du compose ne
|
||||||
|
# voit pas puisqu'elle n'est pas vide. Cas vécu : AIRFLOW_WEBSERVER_SECRET_KEY, Airflow 3.
|
||||||
|
oubliees="$(grep '=change_me$' "$brouillon" | grep -v '^APP_MOCK_API_' | cut -d= -f1 | tr '\n' ' ' || true)"
|
||||||
|
if [[ -n "$oubliees" ]]; then
|
||||||
|
rm -f "$brouillon"
|
||||||
|
erreur "$env : secrets non générés, .env non écrit : $oubliees"
|
||||||
|
fi
|
||||||
|
chmod 600 "$brouillon"
|
||||||
|
mv "$brouillon" "$dossier/.env"
|
||||||
echo "$env : .env généré. Reste à renseigner APP_MOCK_API_USERNAME et APP_MOCK_API_PASSWORD."
|
echo "$env : .env généré. Reste à renseigner APP_MOCK_API_USERNAME et APP_MOCK_API_PASSWORD."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user