Initial commit: Docker infrastructure for fullstack Vollversammlung app
This commit is contained in:
@@ -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"
|
||||
@@ -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"]
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user