Sign inSign up

chrno79/php-gb

By chrno79

•Updated 4 days ago

Image
Security
Web servers
0

585

chrno79/php-gb repository overview

⁠PHP 8.5/8.6 Apache Docker Image

Modernes und schlankes Docker-Image auf Basis von PHP 8.5/8.6 + Apache für moderne PHP-Webanwendungen.

Das Image stellt eine vorkonfigurierte PHP-/Apache-Umgebung mit den benötigten PHP-Erweiterungen, Apache-Modulen, PHP-Limits und Sicherheitsoptimierungen bereit.

GeoIP-Datenbanken und die geoip2.phar werden nicht fest in das Docker-Image eingebaut. Sie können beim Containerstart automatisch über das entrypoint.sh aktualisiert werden.

⁠Features

  • 🐘 PHP 8.5/8.6

  • 🌐 Apache 2

  • 🗄️ PDO MySQL

  • 🔤 mbstring

  • 📦 zip

  • 🌍 GeoIP-Unterstützung

  • 🔄 Automatische GeoIP-Aktualisierung

  • 🌐 GeoLite2 ASN

  • 🌐 GeoLite2 City

  • 🌐 GeoLite2 Country

  • 📦 Aktuelle MaxMind geoip2.phar

  • 🔄 Apache mod_rewrite

  • 🔐 Apache mod_headers

  • 🌐 Apache mod_remoteip für korrekte Client-IP hinter Reverse Proxy

  • 🛡️ Apache Security Hardening

    • ServerTokens Prod
    • ServerSignature Off
    • TraceEnable Off
  • 💾 128 MB Upload-/POST-Limit

  • 🧠 512 MB PHP Memory Limit

  • ⏱️ 300 Sekunden Execution- und Input-Time

  • 🔧 Optionaler automatischer Composer-Autoloader

  • 🔧 Optionales Korrigieren der Datei-/Verzeichnisrechte

  • 🚀 Eigenes Entrypoint-Script für die Containerinitialisierung


⁠Base Image

FROM php:8.5.11-apache
FROM php:8.6.0RC2-apache

⁠PHP Extensions

Zusätzlich zum PHP-Basisimage werden folgende Erweiterungen installiert:

mbstring
pdo_mysql
zip

Weitere Funktionen wie curl, dom, SimpleXML, fileinfo, session und openssl werden vom verwendeten PHP-Image bereitgestellt.

⁠Apache

Aktivierte Apache-Module:

maxminddb
rewrite
headers
remoteip

Zusätzlich werden beim Containerstart weitere benötigte Module aktiviert:

env
setenvif

Das Image ist damit besonders für PHP-Anwendungen hinter einem Reverse Proxy wie Nginx Proxy Manager geeignet.

⁠Apache Security Hardening

Das Image verwendet:

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Dadurch werden unnötige Informationen über die Apache-Installation nach außen reduziert.


⁠PHP Limits

Das Image verwendet folgende PHP-Einstellungen:

upload_max_filesize=128M
post_max_size=128M
memory_limit=512M
max_execution_time=300
max_input_time=300

Weitere Anpassungen können in einer eigenen php.ini vorgenommen werden.

volumes:
  - ./custom_php.ini:/usr/local/etc/php/php.ini:ro

⁠Reverse Proxy

Um die echte Client-IP von einem Reverse Proxy weiterzuleiten, binden Sie Ihre remoteip.conf ein:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 172.18.0.0/16   <-- Webspace Network
RemoteIPTrustedProxy 172.19.0.0/24   <-- Reverse Proxy Network
volumes:
  - ./remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
⁠Nginx-Proxy-Manager:

Edit Proxy Host -> Advanced -> Custom Nginx Configuration:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;

⁠GeoIP

Das Image erstellt das Verzeichnis:

/usr/share/GeoIP

Die GeoIP-Dateien werden nicht in das Docker-Image eingebaut.

Bei aktivierter Umgebungsvariable:

GEOIP_UPDATE: "1"

lädt das entrypoint.sh beim Containerstart folgende Dateien herunter:

/usr/share/GeoIP/
├── GeoLite2-ASN.mmdb
├── GeoLite2-City.mmdb
├── GeoLite2-Country.mmdb
└── geoip2.phar
⁠⚠️Wer kein GeoBlocking benötigt lässt die Umgebungsvariable weg oder ändert sie auf 0.⚠️

⁠Verwendete Quellen

GeoLite2:

https://github.com/P3TERX/GeoLite.mmdb

GeoIP2 PHP:

https://github.com/maxmind/GeoIP2-php

Die Dateien werden zunächst als temporäre Dateien heruntergeladen und anschließend atomar ersetzt. Dadurch bleibt eine bereits vorhandene funktionierende Datei erhalten, falls ein Download fehlschlägt.

⁠GeoIP Docker Volume

Für eine dauerhafte Speicherung der GeoIP-Dateien kann ein Docker Volume verwendet werden:

volumes:
  - geoip:/usr/share/GeoIP

Dadurch müssen die GeoIP-Dateien bei einem Container-Neustart oder Recreate nicht unnötig erneut heruntergeladen werden.

⁠Entrypoint

Das entrypoint.sh übernimmt beim Containerstart unter anderem:

  • Apache-Verzeichnisse vorbereiten
  • Apache-Module konfigurieren
  • optionale GeoIP-Aktualisierung
  • optionale Datei-/Verzeichnisrechte korrigieren
  • optionalen Composer-Autoloader aktualisieren
  • OPcache zurücksetzen
  • PHP- und Apache-Version ausgeben
  • Apache starten

⁠Optionale Umgebungsvariablen

VariableStandardFunktion
GEOIP_UPDATE0Aktualisiert GeoIP-Datenbanken und geoip2.phar
FIX_PERMISSIONS0Korrigiert Rechte unter /var/www/html
COMPOSER_AUTOLOAD0Führt composer dump-autoload aus

Beispiel:

environment:
  GEOIP_UPDATE: "1"
  FIX_PERMISSIONS: "0"
  COMPOSER_AUTOLOAD: "0"

⁠Vollständiges Beispiel eine docker-compose.yml:

version: "3.9"

networks:
  webserver: # Gemeinsames Netzwerk definieren
    driver: bridge
	
services:
  mariadb:
    image: mariadb:latest
    container_name: webserver_mariadb
    environment:
      MYSQL_ROOT_PASSWORD: <SicheresPasswort>
      MYSQL_DATABASE: root
      MYSQL_USER: user
      MYSQL_PASSWORD: <SicheresPasswort>
    ports:
      - "6033:3306"
    volumes:
      - ./mariadb-phpmyadmin/data:/var/lib/mysql
    restart: always
    networks:
      webserver: # Dienst in das gemeinsame Netzwerk einbinden
        aliases:
          - mariadb

  phpmyadmin:
    image: phpmyadmin:latest
    container_name: webserver_phpmyadmin
    links:
      - mariadb
    environment:
      PMA_HOST: mariadb
      PMA_PORT: 3306
    ports:
      - "9000:80"
    restart: always
    networks:
      webserver: # Dienst in das gemeinsame Netzwerk einbinden
        aliases:
          - phpmyadmin

  web:
    image: chrno79/php-gb:latest    # <latest = 8.5 / dev = 8.6>
    links:
      - mariadb
    environment:
      TZ: Europe/Berlin
	  GEOIP_UPDATE: "1"
	  FIX_PERMISSIONS: "0"
	  COMPOSER_AUTOLOAD: "0"
    ports:
      - "8080:80"
    volumes:
      - ./html:/var/www/html
      - ./geoip:/usr/share/GeoIP
	  - ./remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
	  - ./custom_php.ini:/usr/local/etc/php/php.ini:ro
	  - ./hosts:/etc/hosts:ro
    restart: always
    networks:
      webserver: # Chat in das gemeinsame Netzwerk einbinden

⁠Philosophie

Das Image enthält bewusst nur die Komponenten, die zur PHP-/Apache-Laufzeitumgebung gehören.

Anwendungsdaten, Datenbanken und aktualisierbare GeoIP-Daten werden getrennt vom eigentlichen Image verwaltet.

Dadurch bleiben die Images reproduzierbar, übersichtlich und leichter aktualisierbar.

Tag summary

Content type

Image

Digest

sha256:3e745841d…

Size

193.4 MB

Last updated

4 days ago

docker pull chrno79/php-gb