try to implement the global containerization

This commit is contained in:
Giovanni committed 2026-10-03 18:42:21 +02:00
1 parent e2b471312c
commit ed38086d09
24 files changed
+966

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
FROM alpine:latest
RUN apk add --no-cache mariadb-client bash dcron
RUN mkdir -p /backups
RUN mkdir -p /etc/periodic/daily
COPY backup_db.sh /etc/periodic/daily/backup_db
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /etc/periodic/daily/backup_db
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
BACKUP_DIR="/backups"
mkdir -p "$BACKUP_DIR"
DAY=$(date +%d)
FILE="$BACKUP_DIR/$DAY.sql"
mysqldump -h mariadb -u "$DB_USERNAME" -p"$DB_PASSWORD" "$DB_DATABASE" > "$FILE" 2>/dev/null
if [ $? -eq 0 ]; then
echo "[$(date)] Backup $DB_DATABASE sauvegardé dans $FILE" >> "$BACKUP_DIR/backup.log"
else
echo "[$(date)] ERREUR lors du backup de $DB_DATABASE" >> "$BACKUP_DIR/backup.log"
fi
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
crond -f -l 2
+14
View File
@@ -0,0 +1,14 @@
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache git bash
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
COPY scripts/wait-for-it.sh /usr/local/bin/wait-for-it.sh
RUN chmod +x /usr/local/bin/entrypoint.sh \
/usr/local/bin/wait-for-it.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["build"]
+38
View File
@@ -0,0 +1,38 @@
#!/bin/sh
set -e
FRONTEND_DIR=/app
APP_DIR=/var/www/app
PUBLIC_DIR="$APP_DIR/public"
GIT_URL="https://oauth2:${GIT_TOKEN}@${FRONTEND_GIT_REPO}"
PHP_HOST="app-php"
PHP_PORT=9000
/usr/local/bin/wait-for-it.sh "$PHP_HOST:$PHP_PORT" -t 300
if [ ! -d "$FRONTEND_DIR/.git" ]; then
git clone -b "${FRONTEND_GIT_BRANCH:-main}" "$GIT_URL" "$FRONTEND_DIR"
else
cd "$FRONTEND_DIR"
git fetch origin
git reset --hard origin/"${FRONTEND_GIT_BRANCH:-main}"
fi
cp "$APP_DIR/public/index.php" "$FRONTEND_DIR/index.php"
cd "$FRONTEND_DIR"
npm ci --prefer-offline --no-audit
npm run build
find "$PUBLIC_DIR" -mindepth 1 \
! -name 'index.php' \
! -name '.htaccess' \
! -name 'storage' \
-delete
cp -r dist/* "$PUBLIC_DIR/"
if [ ! -L "$PUBLIC_DIR/storage" ] || [ ! -e "$PUBLIC_DIR/storage" ]; then
ln -sfn "$APP_DIR/storage/app/public" "$PUBLIC_DIR/storage"
fi
exit 0
+182
View File
@@ -0,0 +1,182 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi
+28
View File
@@ -0,0 +1,28 @@
server {
listen 80;
server_name 127.0.0.1;
root /var/www/app/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SERVER_NAME 127.0.0.1;
fastcgi_param HTTPS off;
}
location /app/ {
proxy_pass http://reverb:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
+81
View File
@@ -0,0 +1,81 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
CORS_PATHS=api/*,sanctum/csrf-cookie,broadcasting/auth
DEV_CORS_ALLOWED_ORIGINS=http://localhost:5173
PROD_CORS_ALLOWED_ORIGINS=http://localhost
SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1,localhost:8000,localhost:5173
ADMIN_NAME=
ADMIN_LASTNAME=
ADMIN_MAIL=
ADMIN_PASSWORD=
ADMIN_PHONE_NUMBER=
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=localhost
SESSION_SECURE_COOKIE=false
BROADCAST_CONNECTION=reverb
REVERB_APP_ID=local
REVERB_APP_KEY=local
REVERB_APP_SECRET=local
REVERB_HOST=reverb
REVERB_PORT=8080
REVERB_SCHEME=http
PUSHER_APP_CLUSTER="mt1"
CACHE_STORE=file
QUEUE_CONNECTION=sync
FILESYSTEM_DISK=local
# CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_SCHEME=null
MAIL_HOST=host.docker.internal
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
TYPESENSE_CONNECTION=typesense
TYPESENSE_API_KEY=
+27
View File
@@ -0,0 +1,27 @@
FROM php:8.4-fpm
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN apt-get update && apt-get install -y \
git unzip libzip-dev libpng-dev libonig-dev gosu \
&& apt-get install -y netcat-openbsd \
&& docker-php-ext-install pdo_mysql zip pcntl
RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \
groupmod -g ${GROUP_ID} www-data && \
usermod -u ${USER_ID} -g ${GROUP_ID} www-data \
;fi
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
COPY scripts/*.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/*.sh
WORKDIR /var/www/app
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["php-fpm"]
+23
View File
@@ -0,0 +1,23 @@
#!/bin/sh
set -e
. /usr/local/bin/context.sh
. /usr/local/bin/setup_git.sh
. /usr/local/bin/setup_composer.sh
. /usr/local/bin/setup_env.sh
. /usr/local/bin/setup_laravel.sh
echo "[INIT] Starting initialization..."
setup_git
setup_composer
setup_env
/usr/local/bin/wait-mariadb.sh
/usr/local/bin/wait-typesense.sh
setup_laravel
echo "[INIT] Done ✅"
exec "$@"
+12
View File
@@ -0,0 +1,12 @@
#!/bin/sh
APP_DIR=/var/www/app
IS_DEV=${DEV:-0}
run() {
if [ "$IS_DEV" = 1 ]; then
gosu www-data "$@"
else
"$@"
fi
}
+12
View File
@@ -0,0 +1,12 @@
#!/bin/sh
setup_composer() {
echo "Installing dependencies..."
mkdir -p /var/www/.composer/cache
chown -R www-data:www-data /var/www/.composer
if [ -f composer.json ]; then
run composer install --no-interaction --prefer-dist
fi
}
+21
View File
@@ -0,0 +1,21 @@
#!/bin/sh
setup_env() {
echo "Configuring environment..."
cp /tmp/app.env .env
/usr/local/bin/wait-typesense.sh
TYPESENSE_API_KEY=$(cat /typesense-data/api-key)
sed -i "s/^TYPESENSE_API_KEY=.*/TYPESENSE_API_KEY=$TYPESENSE_API_KEY/" .env
echo "DEV=$DEV" >> .env
if [ "$IS_DEV" = 1 ]; then
chown www-data:www-data .env
chmod 664 .env
else
chown www-data:www-data .env
chmod 640 .env
fi
}
+36
View File
@@ -0,0 +1,36 @@
#!/bin/sh
setup_git() {
echo "Setting up Git..."
GIT_URL="https://oauth2:${GIT_TOKEN}@${BACKEND_GIT_REPO}"
BRANCH="${BACKEND_GIT_BRANCH:-main}"
FORCE_CLONE="${FORCE_CLONE:-false}"
git config --global --add safe.directory "$APP_DIR"
if [ ! -d "$APP_DIR/.git" ]; then
echo "Cloning repo..."
git clone -b "$BRANCH" "$GIT_URL" "$APP_DIR"
else
echo "Updating repo..."
cd "$APP_DIR"
CURRENT_BRANCH=$(run git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" = "$BRANCH" ]; then
run git fetch origin
run git reset --hard origin/"$CURRENT_BRANCH"
else
if [ "$FORCE_CLONE" = "true" ]; then
rm -rf "$APP_DIR"
mkdir -p "$APP_DIR"
git clone -b "$BRANCH" "$GIT_URL" "$APP_DIR"
else
run git fetch origin
run git reset --hard origin/"$BRANCH"
fi
fi
fi
cd "$APP_DIR"
}
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
setup_laravel() {
echo "Setting up Laravel..."
run php artisan key:generate --force
run php artisan config:clear
run php artisan cache:clear
run php artisan migrate --force --seed
if [ "$IS_DEV" = 1 ]; then
chmod -R 775 storage bootstrap/cache
chmod -R 755 public
else
chown -R www-data:www-data storage bootstrap/cache
chmod -R 775 storage bootstrap/cache
fi
run php artisan storage:link
}
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
until nc -z mariadb 3306; do
sleep 2
done
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
while [ ! -f /typesense-data/api-key ]; do
sleep 1
done
+24
View File
@@ -0,0 +1,24 @@
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y \
git \
unzip \
libzip-dev \
libpng-dev \
libonig-dev \
libxml2-dev \
&& docker-php-ext-install \
pdo \
pdo_mysql \
mbstring \
xml \
pcntl \
sockets \
zip \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/app
EXPOSE 8080
+6
View File
@@ -0,0 +1,6 @@
FROM typesense/typesense:29.0
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
set -e
DATA_DIR="/data"
KEY_FILE="$DATA_DIR/api-key"
if [ ! -f "$KEY_FILE" ]; then
tr -dc A-Za-z0-9 </dev/urandom | head -c 32 > "$KEY_FILE"
fi
API_KEY=$(cat "$KEY_FILE")
exec /opt/typesense-server \
--data-dir "$DATA_DIR" \
--api-key "$API_KEY" \
--enable-cors