# ============================================================= # urlshort-qr-gen – Apache + mod_php # Bewusst dasselbe Setup wie klassisches Shared Hosting, damit # sich Docker und FTP-Deployment identisch verhalten (.htaccess). # ============================================================= FROM php:8.3-apache # --- Systempakete & PHP-Erweiterungen ------------------------- # gd -> PNG-Ausgabe der QR-Codes # intl -> Umlaut-Domains (IDN) nach UTS-46; optional, es gibt einen # eigenen Punycode-Rueckfallweg fuer Hosting ohne intl # pdo_mysql -> optionaler MySQL/MariaDB-Betrieb (SQLite ist eingebaut) # imagick -> rastert SVG-Logos fuer die PNG-Ausgabe (optional) # # Die Entwicklungspakete bleiben absichtlich installiert: beim Aufraeumen # mit "apt-get purge --auto-remove" verschwindet sonst auch die von # imagick benoetigte Laufzeitbibliothek libMagickWand. Das Image ist # dadurch groesser, aber die Erweiterungen laden zuverlaessig. RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends \ libpng-dev libjpeg62-turbo-dev libfreetype6-dev \ libzip-dev libicu-dev libmagickwand-dev unzip; \ docker-php-ext-configure gd --with-freetype --with-jpeg; \ docker-php-ext-install -j"$(nproc)" gd intl pdo_mysql zip; \ { pecl install imagick && docker-php-ext-enable imagick; } || \ echo "Hinweis: imagick konnte nicht installiert werden – SVG-Logos wirken dann nur im SVG-Download."; \ rm -rf /var/lib/apt/lists/* /tmp/pear; \ php -m | grep -q '^gd$'; \ php -m | grep -q '^pdo_mysql$' # --- Apache --------------------------------------------------- RUN set -eux; \ a2enmod rewrite headers expires; \ sed -ri 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf; \ printf '%s\n' \ '' \ ' Options -Indexes +FollowSymLinks' \ ' AllowOverride All' \ ' Require all granted' \ '' \ 'ServerTokens Prod' \ 'ServerSignature Off' \ > /etc/apache2/conf-available/urlshort.conf; \ a2enconf urlshort COPY docker/php.ini /usr/local/etc/php/conf.d/urlshort.ini # --- Composer ------------------------------------------------- COPY --from=composer:2 /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html # Abhaengigkeiten zuerst: bleibt beim Aendern des Codes im Cache. COPY composer.json composer.lock ./ RUN composer install --no-dev --no-interaction --no-progress --optimize-autoloader --no-scripts COPY . . RUN set -eux; \ mkdir -p data/uploads; \ chown -R www-data:www-data data; \ chmod -R 775 data COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh EXPOSE 80 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD php -r 'exit(@file_get_contents("http://127.0.0.1/login") === false ? 1 : 0);' ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["apache2-foreground"]