Initial commit: Docker infrastructure for fullstack Vollversammlung app

This commit is contained in:
2026-06-28 15:37:48 +02:00
commit 2960855bca
21 changed files with 1434 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
# =============================================
# Symphony Backend Environment Konfiguration
# Kopiere diese Datei nach .env.local und passe die Werte an.
# =============================================
# -------------------
# Symfony Basics
# -------------------
APP_ENV=dev
APP_DEBUG=1
APP_SECRET=__CHANGE_ME__
# -------------------
# PostgreSQL DB
# -------------------
DATABASE_URL="postgresql://symfony:secret@db:5432/symfony?serverVersion=16&charset=utf8mb4"
# -------------------
# Mercure Logging
# -------------------
MERCURE_JWT_SECRET=__CHANGE_ME_MERCURE_JWT_SECRET__
MERCURE_PUBLISHER_JWT_KEY=__CHANGE_ME_PUBLISHER_KEY__
MERCURE_SUBSCRIBER_JWT_KEY=__CHANGE_ME_SUBSCRIBER_KEY__
MERCURE_URL="http://mercure-hub/.well-known/mercure"
MERCURE_PUBLIC_URL="${MERCURE_PUBLIC_URL:-http://localhost:3000/.well-known/mercure}"
# -------------------
# OAuth (Vonova Provider)
# -------------------
OAUTH_PROVIDER="vonova"
OAUTH_PROVIDER_NAME="${OAUTH_PROVIDER_NAME:-vonova}"
OAUTH_AUTHORIZATION_ENDPOINT="https://oauth.vonova.de/oauth/authorize"
OAUTH_TOKEN_ENDPOINT="https://oauth.vonova.de/oauth/token"
OAUTH_CLIENT_ID=__CHANGE_ME_OAUTH_CLIENT_ID__
OAUTH_CLIENT_SECRET=__CHANGE_ME_OAUTH_CLIENT_SECRET__
OAUTH_REDIRECT_URI="http://localhost:8080/api/oauth/callback"
OAUTH_SCOPES="read profile mandant_id"
# -------------------
# Mandant-Scope (Standard/Tenant für lokale Entwicklung)
# -------------------
TENANT_ID=""
# -------------------
# Mail (Mailpit im Dev-Stack)
# -------------------
MAILER_DSN="smtp://mailpit:1025"
+54
View File
@@ -0,0 +1,54 @@
FROM php:8.3-fpm-alpine
# Install system dependencies
RUN apk add --no-cache \
imagemagick \
imagemagick-dev \
git \
curl \
oniguruma-dev \
libpng-dev \
libjpeg-turbo-dev \
libxml2-dev \
zip \
unzip
# Install PHP extensions
RUN docker-php-ext-install \
pdo_pgsql \
gd \
intl \
mbregex \
xml
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create app directory
WORKDIR /app
# Copy entrypoint script
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# Set up Symfony directory structure
RUN mkdir -p \
src/UI/{API,Console}/{Controller,Request,Response,Command} \
src/Logic/{Manager,Calculator,Model,Provider,Processor,Shared} \
src/Data/{Entity,Repository} \
public/files \
var/cache \
var/log \
var/sessions
# Install Symfony runtime and framework dependencies
RUN composer config allow-plugins true
RUN composer require symfony/framework-bundle symfony/asset symfony/mime symfony/console \
symfony/dotenv symfony/flex symfony/runtime symfony/twig-bundle symfony/validator \
symfony/doctrine-messenger symfony/messenger twig symfony/mercure symfony/routing \
symfony/serializer php-http/discovery
EXPOSE 9000
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm", "-F"]
+71
View File
@@ -0,0 +1,71 @@
FROM php:8.3-fpm-alpine AS base
# Install system dependencies (minimal for production)
RUN apk add --no-cache \
curl \
oniguruma-dev \
libpng-dev \
libjpeg-turbo-dev \
libxml2-dev \
zip \
unzip \
imagemagick \
ttf-freefont
# Install PHP extensions (production-safe with --enable-option-checking)
RUN docker-php-ext-configure gd --with-jpeg \
&& docker-php-ext-install \
pdo_pgsql \
gd \
intl \
mbstring \
xmlrpc \
opcache
# Enable OPcache for production
RUN echo "opcache.memory_consumption=256" > /usr/local/etc/php/conf.d/opcache.ini \
&& echo "opcache.max_accelerated_files=32531" >> /usr/local/etc/php/conf.d/opcache.ini \
&& echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/opcache.ini \
&& echo "opcache.revalidate_freq=0" >> /usr/local/etc/php/conf.d/opcache.ini
# Install Composer (production stage)
FROM composer:latest AS composer
# ---------------
# Build stage install dependencies
# ---------------
FROM base AS build
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --classmap-authoritative
COPY . .
RUN chmod +x bin/console \
&& APP_ENV=prod APP_DEBUG=0 COMPOSER_DEV_MODE=0 composer dump-autoload --classmap-authoritative --optimize \
&& php bin/console cache:clear --env=prod \
&& php bin/console assets:install public --env=prod
# ---------------
# Final production image
# ---------------
FROM base AS production
LABEL maintainer="devops@vollversammlung" \
description="Vollversammlung Symfony Production Image"
WORKDIR /app
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=build /app .
# Create necessary directories with correct permissions
RUN chown -R www-data:www-data var/cache var/log var/sessions public/files \
&& find var/ -type d -exec chmod 750 {} \; \
&& find var/ -type f -exec chmod 640 {} \;
EXPOSE 9000
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm", "-F"]
+86
View File
@@ -0,0 +1,86 @@
#!/bin/sh
set -e
echo "========================================"
echo " Vollversammlung - Symfony Startup"
echo "========================================"
# ----------------------------
# Wait for database availability
# ----------------------------
wait_for_db() {
echo "Waiting for PostgreSQL to be ready..."
max_tries=30
try=0
while ! nc -z db 5432 2>/dev/null; do
sleep 1
try=$((try + 1))
if [ "$try" -ge "$max_tries" ]; then
echo "ERROR: PostgreSQL did not become ready in time."
exit 1
fi
done
echo "PostgreSQL is ready."
}
wait_for_db
# ----------------------------
# Run Doctrine Migrations
# ----------------------------
run_migrations() {
if [ -f "bin/console" ]; then
echo "Running Doctrine Migrations..."
php bin/console doctrine:migrations:migrate --no-interaction --all-or-nothing || {
echo "WARNING: Migration failed, continuing startup."
}
fi
}
run_migrations
# ----------------------------
# Configure Mercure for logging
# ----------------------------
configure_mercure() {
if [ -n "${MERCURE_JWT_SECRET}" ]; then
export MERCURE_PUBLISHER_JWT_KEY="${MERCURE_JWT_SECRET}"
echo "Mercure Publisher JWT: configured"
export MERCURE_SUBSCRIBER_JWT_KEY="${MERCURE_JWT_SECRET}"
echo "Mercure Subscriber JWT: configured"
else
echo "WARNING: MERCURE_JWT_SECRET not set Mercure logging may not work."
fi
if [ -n "${MERCURE_URL}" ]; then
echo "Mercure URL: ${MERCURE_URL}"
fi
}
configure_mercure
# ----------------------------
# Clear cache for current environment
# ----------------------------
clear_cache() {
if [ -f "bin/console" ]; then
echo "Clearing Symfony cache (env=${APP_ENV:-dev})..."
php bin/console cache:clear --env="${APP_ENV:-dev}" --no-warmup || true
fi
}
clear_cache
# ----------------------------
# Start PHP-FPM or dev server
# ----------------------------
echo ""
echo "========================================"
if [ "${Symfony_USE_DEV_SERVER:-1}" = "1" ] && [ "${APP_ENV:-dev}" = "dev" ]; then
echo " Starting Symfony Dev Server on :8000"
exec php bin/console server:run 0.0.0.0:8000 --no-reload
else
echo " Starting PHP-FPM on port 9000"
exec php-fpm -F
fi