diff --git a/ansible/deploy.yml b/ansible/deploy.yml index 95d1589..7279292 100644 --- a/ansible/deploy.yml +++ b/ansible/deploy.yml @@ -228,6 +228,13 @@ job: "docker compose -f /var/www/e-ticket/docker-compose-prod.yml exec -T php php bin/console app:stripe:sync --env=prod >> /var/log/e-ticket-stripe-sync.log 2>&1" user: bot + - name: Configure infra snapshot cron (every 5 minutes) + cron: + name: "e-ticket infra snapshot" + minute: "*/5" + job: "docker compose -f /var/www/e-ticket/docker-compose-prod.yml exec -T php php bin/console app:infra:snapshot --env=prod >> /var/log/e-ticket-infra.log 2>&1" + user: bot + post_tasks: - name: Disable maintenance mode command: make maintenance_off diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 2153f4a..74b9f82 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -179,8 +179,11 @@ services: dockerfile: Dockerfile container_name: e_ticket_cron restart: unless-stopped + group_add: + - "${DOCKER_GID:-989}" volumes: - .:/app + - /var/run/docker.sock:/var/run/docker.sock:ro depends_on: pgbouncer: condition: service_healthy diff --git a/docker/cron/crontab b/docker/cron/crontab index 240d983..9ad0aaa 100644 --- a/docker/cron/crontab +++ b/docker/cron/crontab @@ -2,3 +2,4 @@ 0 * * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:monitor:messenger" >> /proc/1/fd/1 && php /app/bin/console app:monitor:messenger --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:monitor:messenger" >> /proc/1/fd/1 0 3 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:meilisearch:check-consistency" >> /proc/1/fd/1 && php /app/bin/console app:meilisearch:check-consistency --fix --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:meilisearch:check-consistency" >> /proc/1/fd/1 0 */6 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:stripe:sync" >> /proc/1/fd/1 && php /app/bin/console app:stripe:sync --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:stripe:sync" >> /proc/1/fd/1 +*/5 * * * * php /app/bin/console app:infra:snapshot --env=dev >> /proc/1/fd/1 2>&1 diff --git a/src/Command/InfraSnapshotCommand.php b/src/Command/InfraSnapshotCommand.php new file mode 100644 index 0000000..059fa33 --- /dev/null +++ b/src/Command/InfraSnapshotCommand.php @@ -0,0 +1,40 @@ +infra->getAll(); + $data['generated_at'] = (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM); + + $path = $this->projectDir.'/var/infra.json'; + file_put_contents($path, json_encode($data, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); + + $output->writeln(sprintf('Snapshot written to %s (%d bytes)', $path, filesize($path))); + + return Command::SUCCESS; + } +} diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 0953805..f020323 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -649,9 +649,21 @@ class AdminController extends AbstractController } #[Route('/infra', name: 'app_admin_infra', methods: ['GET'])] - public function infra(\App\Service\InfraService $infra): Response + public function infra(#[Autowire('%kernel.project_dir%')] string $projectDir): Response { - return $this->render('admin/infra.html.twig', $infra->getAll()); + $path = $projectDir.'/var/infra.json'; + if (!file_exists($path)) { + return $this->render('admin/infra.html.twig', [ + 'snapshot_missing' => true, + 'server' => [], 'containers' => [], 'redis_global' => ['connected' => false], + 'redis_dbs' => [], 'postgres' => ['connected' => false], 'pgbouncer' => ['connected' => false], + 'generated_at' => null, + ]); + } + + $data = json_decode(file_get_contents($path), true) ?? []; + + return $this->render('admin/infra.html.twig', $data); } #[Route('/organisateurs/inviter', name: 'app_admin_invite_organizer', methods: ['GET', 'POST'])] diff --git a/templates/admin/infra.html.twig b/templates/admin/infra.html.twig index 5ce320f..64843b0 100644 --- a/templates/admin/infra.html.twig +++ b/templates/admin/infra.html.twig @@ -3,6 +3,19 @@ {% block title %}Infrastructure{% endblock %} {% block body %} +{% if snapshot_missing is defined and snapshot_missing %} +
+

Aucun snapshot disponible. Lancez php bin/console app:infra:snapshot

+
+{% endif %} + +{% if generated_at is defined and generated_at %} +
+

Derniere mise a jour : {{ generated_at|date('d/m/Y H:i:s') }}

+ Rafraichir +
+{% endif %} +
{# ── COL 1: Serveur ────────────────────────────────── #}