This commit is contained in:
Serreau Jovann
2026-04-01 15:42:52 +02:00
parent beb12d2b75
commit 686de99909
258 changed files with 32993 additions and 2714 deletions

34
docker/caddy/Caddyfile Normal file
View File

@@ -0,0 +1,34 @@
:80 {
root * /app/public
handle_path /stats/* {
rewrite * {uri}
reverse_proxy https://tools-security.esy-web.dev {
header_up Host tools-security.esy-web.dev
}
}
handle /assets/perf.js {
rewrite * /beacon.min.js
reverse_proxy https://static.cloudflareinsights.com {
header_up Host static.cloudflareinsights.com
}
}
handle_path /sperf {
rewrite * /cdn-cgi/rum
reverse_proxy https://cloudflareinsights.com {
header_up Host cloudflareinsights.com
}
}
php_fastcgi php:9000 {
trusted_proxies private_ranges
}
file_server
encode gzip
try_files {path} /index.php?{query}
}

25
docker/cron/Dockerfile Normal file
View File

@@ -0,0 +1,25 @@
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq-dev \
libzip-dev \
libicu-dev \
cron \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install pdo_pgsql intl \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& groupadd -g 1000 appuser && useradd -u 1000 -g appuser -m appuser
COPY crontab /etc/cron.d/app-crontab
RUN chmod 0644 /etc/cron.d/app-crontab && crontab -u appuser /etc/cron.d/app-crontab
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
WORKDIR /app
# cron daemon requires root to manage user crontabs, jobs run as appuser
USER root
CMD ["/entrypoint.sh"]

7
docker/cron/crontab Normal file
View File

@@ -0,0 +1,7 @@
*/5 * * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:orders:expire-pending" >> /proc/1/fd/1 && php /app/bin/console app:orders:expire-pending --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:orders:expire-pending" >> /proc/1/fd/1
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
0 4 * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:attestations:clean" >> /proc/1/fd/1 && php /app/bin/console app:attestations:clean --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:attestations:clean" >> /proc/1/fd/1
*/15 * * * * echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] START app:services:check" >> /proc/1/fd/1 && php /app/bin/console app:services:check --env=dev >> /proc/1/fd/1 2>&1 && echo "[$(date '+\%Y-\%m-\%d \%H:\%M:\%S')] END app:services:check" >> /proc/1/fd/1

10
docker/cron/entrypoint.sh Normal file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
echo "=== CRM Ecosplay Cron ==="
echo "Registered tasks:"
echo " - */5 * * * * app:orders:expire-pending"
echo " - 0 * * * * app:monitor:messenger"
echo " - 0 3 * * * app:meilisearch:check-consistency --fix"
echo " - 0 4 * * * app:attestations:clean"
echo " - */15 * * * app:services:check"
echo "===================="
exec cron -f

29
docker/ngrok/sync.sh Executable file
View File

@@ -0,0 +1,29 @@
#!/bin/sh
set -e
echo "Waiting for ngrok to start..."
sleep 5
NGROK_URL=""
RETRIES=10
while [ -z "$NGROK_URL" ] && [ "$RETRIES" -gt 0 ]; do
NGROK_URL=$(curl -s http://ngrok:4040/api/tunnels | grep -o '"public_url":"https://[^"]*"' | head -1 | cut -d'"' -f4)
if [ -z "$NGROK_URL" ]; then
echo "Waiting for tunnel..."
sleep 2
RETRIES=$((RETRIES - 1))
fi
done
if [ -z "$NGROK_URL" ]; then
echo "ERROR: Could not get ngrok URL"
exit 1
fi
touch /app/.env.local
sed -i '/^OUTSIDE_URL=/d' /app/.env.local
echo "OUTSIDE_URL=$NGROK_URL" >> /app/.env.local
echo "Ngrok URL: $NGROK_URL"
echo "Written to .env.local"

12
docker/pgsql/init-master.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'crm-ecosplay';
SELECT pg_create_physical_replication_slot('slave_slot');
EOSQL
echo "host replication replicator 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf"
echo "host all all 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf"
pg_ctl reload -D "$PGDATA"

View File

@@ -0,0 +1,2 @@
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'crm-ecosplay';
SELECT pg_create_physical_replication_slot('slave_slot');

20
docker/pgsql/init-slave.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
set -e
until pg_isready -h db-master -U crm-ecosplay; do
echo "Waiting for master..."
sleep 2
done
echo "db-master:5432:replication:replicator:crm-ecosplay" > /tmp/.pgpass
chown postgres:postgres /tmp/.pgpass
chmod 600 /tmp/.pgpass
rm -rf "$PGDATA"/*
chown postgres:postgres "$PGDATA"
chmod 700 "$PGDATA"
su-exec postgres env PGPASSFILE=/tmp/.pgpass pg_basebackup -h db-master -D "$PGDATA" -U replicator -Fp -Xs -P -R
echo "hot_standby = on" >> "$PGDATA/postgresql.conf"
exec su-exec postgres "$@"

View File

@@ -0,0 +1,22 @@
[databases]
crm_ecosplay = host=database port=5432 dbname=crm_ecosplay
crm_ecosplay_test = host=database port=5432 dbname=crm_ecosplay_test
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = plain
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 200
default_pool_size = 20
min_pool_size = 5
reserve_pool_size = 5
reserve_pool_timeout = 3
server_lifetime = 3600
server_idle_timeout = 600
log_connections = 0
log_disconnections = 0
ignore_startup_parameters = extra_float_digits
admin_users = app
stats_users = app

View File

@@ -0,0 +1 @@
"app" "secret"

35
docker/php/dev/Dockerfile Normal file
View File

@@ -0,0 +1,35 @@
# hadolint global ignore=DL3008
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq-dev \
libsqlite3-dev \
libzip-dev \
libxml2-dev \
libicu-dev \
libpng-dev \
libjpeg-dev \
libfreetype-dev \
libmagickwand-dev \
unzip \
qpdf \
curl \
python3 \
python3-pip \
git \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \
pdo_mysql \
pdo_pgsql \
pdo_sqlite \
zip \
intl \
gd \
&& pecl install redis imagick pcov \
&& docker-php-ext-enable redis imagick pcov \
&& groupadd -g 1000 appuser && useradd -u 1000 -g appuser -m appuser
WORKDIR /app
USER appuser

View File

@@ -0,0 +1,35 @@
# hadolint global ignore=DL3008
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq-dev \
libsqlite3-dev \
libzip-dev \
libxml2-dev \
libicu-dev \
libpng-dev \
libjpeg-dev \
libfreetype-dev \
libmagickwand-dev \
unzip \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \
pdo_mysql \
pdo_pgsql \
pdo_sqlite \
zip \
intl \
gd \
exif \
opcache \
&& pecl install redis imagick \
&& docker-php-ext-enable redis imagick \
&& groupadd -g 1000 appuser && useradd -u 1000 -g appuser -m appuser
COPY php.ini /usr/local/etc/php/conf.d/app.ini
COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
WORKDIR /app
USER appuser

View File

@@ -0,0 +1,9 @@
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.save_comments=0
opcache.enable_cli=1
opcache.jit=tracing
opcache.jit_buffer_size=128M

21
docker/php/prod/php.ini Normal file
View File

@@ -0,0 +1,21 @@
date.timezone = Europe/Paris
memory_limit = 256M
upload_max_filesize = 100M
post_max_size = 150M
max_execution_time = 30
max_input_time = 30
expose_php = Off
display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
realpath_cache_size = 4096K
realpath_cache_ttl = 600
session.cookie_secure = On
session.cookie_httponly = On
session.cookie_samesite = Lax
session.use_strict_mode = 1