{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreigqdhxkqeywuiwhp7euwo6tsdfyeudumsdcxp7n7tpcrsnbl6obxu",
"uri": "at://did:plc:gebrjai724nigboonkb4mmd5/app.bsky.feed.post/3mmcbtbxrzpn6"
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreiebkiiavt4xeqvyf5hrfroiaxwfsqu4sk5gzu2zsqmatto2p2dg3a"
},
"mimeType": "image/png",
"size": 58800
},
"description": "Ich möchte ich euch eine Lösung Vorstellen die ich mir zusammengestellt habe um auf einem Raspberry Pi einen alten Server mit PHP5.4 und MySQL5.6 (kompatible) Datenbank in Docker zu installieren. Der Stand dieser beiden Programme ist natürlich komplett veraltet und sollte deshalb mit bedacht eingesetzt werden. Bei mir läuft so ein System im Heimnetzwerk, weil...",
"path": "/2025/08/03/server-mit-php5-4-und-mysql5-6-auf-dem-raspberry-pi/",
"publishedAt": "2025-08-03T11:33:55.000Z",
"site": "at://did:plc:gebrjai724nigboonkb4mmd5/site.standard.publication/3mmc6qisz6tep",
"tags": [
"alter webserver",
"anleitung",
"cgi-bin",
"debian",
"docker",
"docker-compose",
"FediBlog",
"ftp"
],
"textContent": "Ich möchte ich euch eine Lösung Vorstellen die ich mir zusammengestellt habe um auf einem Raspberry Pi einen alten Server mit PHP5.4 und MySQL5.6 (kompatible) Datenbank in Docker zu installieren. Der Stand dieser beiden Programme ist natürlich komplett veraltet und sollte deshalb mit bedacht eingesetzt werden. Bei mir läuft so ein System im Heimnetzwerk, weil ich eine alte Webanwendung habe die auf aktuellen PHP & MySQL Versionen nicht läuft. Bei mir liegt alles unter /volume1/docker – als erstes brauchen wir folgende Unterordner: sudo mkdir /volume1/docker/altewebseite1 sudo mkdir /volume1/docker/altewebseite1/php sudo mkdir /volume1/docker/altewebseite1/php/cert sudo mkdir /volume1/docker/altewebseite1/www sudo mkdir /volume1/docker/altewebseite1/cgi-bin Dann wechseln wir in das Hauptverzeichnis und ordnen die Ordnern www und cgi-bin noch dem www-data Benutzer zu cd /volume1/docker/altewebseite1 sudo chown -R www-data:www-data www sudo chown -R www-data:www-data cgi-bin Jetzt erstellen wir die docker-compose.yml Datei sudo nano docker-compose.yml version: '2' services: # PHP & Apache Service web: build: context: ./php container_name: php54_1_web ports: - \"8580:80\" - \"5443:443\" volumes: - /volume1/docker/altewebseite1/www:/var/www/html/ - /volume1/docker/altewebseite1/cgi-bin:/var/www/cgi-bin - /volume1/docker/altewebseite1/php/certs/apache-selfsigned.crt:/etc/ssl/certs/apache-selfsigned.crt - /volume1/docker/altewebseite1/php/certs/apache-selfsigned.key:/etc/ssl/private/apache-selfsigned.key depends_on: - db networks: - app-network # MariaDB Service db: image: mariadb:10.3 container_name: php54_1_mysql restart: always ports: - \"3306:3306\" volumes: - db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: \"ROOT_PASSWORT_AENDERN\" MYSQL_DATABASE: \"altewebseite1_db\" MYSQL_USER: \"altewebseite1\" MYSQL_PASSWORD: \"MYSQL_PASSWORT_AENDERN\" # Diese Zeile anfügen, um die \"Regeln\" zu lockern: command: --sql_mode='NO_ENGINE_SUBSTITUTION' networks: - app-network # phpMyAdmin Service phpmyadmin: image: phpmyadmin:5.2.1-apache container_name: php54_1_phpmyadmin restart: always ports: - \"8581:80\" environment: PMA_HOST: db UPLOAD_LIMIT: 256M depends_on: - db networks: - app-network ftp: image: delfer/alpine-ftp-server container_name: php54_ftp ports: - \"21:21\" - \"30000-30009:30000-30009\" volumes: # Passe die Pfade an das neue Home-Verzeichnis an - /volume1/docker/altewebseite1/www:/home/altserver1/www - /volume1/docker/altewebseite1/cgi-bin:/home/altserver1/cgi-bin environment: # Die Konfiguration ist hier etwas anders USERS: \"altserver1|bg8dQnhU!xsMWjvc!c7hyb|/home/altserver1\" # Ändere das Passwort hier ADDRESS: \"0.0.0.0\" # Auf allen Netzwerkinterfaces lauschen PASV_ADDRESS: \"localhost\" # Wichtig für den passiven Modus PASV_MIN_PORT: \"30000\" PASV_MAX_PORT: \"30009\" restart: always networks: - app-network networks: app-network: driver: bridge volumes: db_data: Beachtet, dass der Host für die MySQL Datenbank nicht localhost sondern db ist. Das müsst ihr in euren Scripten dann anpassen. Als nächstes den Apache konfigurieren sudo nano php/000-default.conf <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ScriptAlias /cgi-bin/ /var/www/cgi-bin/ <Directory \"/var/www/cgi-bin\"> AllowOverride None Options +ExecCGI -Indexes Require all granted AddHandler cgi-script .cgi .pl </Directory> <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key ScriptAlias /cgi-bin/ /var/www/cgi-bin/ <Directory \"/var/www/cgi-bin\"> AllowOverride None Options +ExecCGI -Indexes Require all granted AddHandler cgi-script .cgi .pl </Directory> <Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error_ssl.log CustomLog ${APACHE_LOG_DIR}/access_ssl.log combined </VirtualHost> </IfModule> sudo nano php/apache-servername.conf ServerName localhost Ich habe in den PHP Option die einstellung short_open_tag auf an gestellt – das bewirkt, dass im code auch <? ?> funktioniert statt nur <?php ?> – ich habe gemerkt, dass einige alte Scripte oft nur <? verwenden. sudo nano php/custom.ini short_open_tag = On Nun das Dockerfile sudo nano php/Dockerfile # Debian 'Jessie' als ARM32v7-Basis verwenden FROM arm32v7/debian:jessie # Setze die Paketquellen auf das offizielle Debian-Archiv um RUN echo \"deb http://archive.debian.org/debian/ jessie main\" > /etc/apt/sources.list && \\ echo \"deb http://archive.debian.org/debian-security jessie/updates main\" >> /etc/apt/sources.list # Umgebungsvariablen setzen, um interaktive Abfragen zu vermeiden ENV DEBIAN_FRONTEND=noninteractive # Pakete aus dem Archiv installieren und abgelaufene Signaturen ignorieren RUN apt-get -o Acquire::Check-Valid-Until=false update && \\ apt-get install -y --allow-unauthenticated \\ apache2 \\ php5 \\ libapache2-mod-php5 \\ php5-mysql \\ perl COPY custom.ini /etc/php5/apache2/conf.d/30-custom.ini # Apache Konfiguration anpassen (erlaubt .htaccess) COPY apache-servername.conf /etc/apache2/conf-available/apache-servername.conf RUN a2enconf apache-servername COPY 000-default.conf /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite && a2enmod ssl && cgi COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT [\"entrypoint.sh\"] # Apache als Startbefehl festlegen CMD [\"/usr/sbin/apache2ctl\", \"-D\", \"FOREGROUND\"] Wenn ihr das ganze auf einem x64/x86 Prozessor laufen lassen möchtet könnt ihr die erste Zeile so anpassen # Debian 'Jessie' als Basis FROM debian:jessie Ich hatte das Problem, dass wenn der Server oder Docker nicht sachgemäß beendet wurde, dass die PID von httpd nicht richtig zurück gesetzt wurde. Das habe ich dann so gelöst sudo nano php/entrypoint.sh #!/bin/sh # Störende PID-Datei vom letzten Lauf entfernen, falls vorhanden rm -f /var/run/apache2/apache2.pid # Führe den eigentlichen Startbefehl aus, der vom CMD im Dockerfile kommt exec \"$@\" sudo chmod +x /volume1/docker/altewebseite1/php/entrypoint.sh Für die HTTPS Verbindung brauchen wir noch die Zertifikate sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./php/certs/apache-selfsigned.key -out ./php/certs/apache-selfsigned.crt -subj \"/C=DE/ST=Berlin/L=Berlin/O=Dev/CN=localhost\" Das sind keine signierten Zertifikate, es wird also zu einem Warnhinweis kommen, wenn ihr die Webseite öffnet. Mit dem Nginx Proxy Manager kann man aber z.B. ganz komfortabel echte Let’s Encrypt zerifikate erstellen und einbinden. Nun nur doch den Container mit docker-compose up -d --build erstellen und er sollte unter http://<deineip>:8580 oder https://<deineip>:5443 aufzurufen sein.",
"title": "Server mit PHP5.4 und MySQL5.6 auf dem Raspberry Pi",
"updatedAt": "2026-03-05T21:32:44.000Z"
}