Docker Support: Added Dockerfile, updated DB connection for ENVs, and documented Docker usage in README

This commit is contained in:
Gemini Agent
2025-12-05 16:53:37 +00:00
parent ae9ab01421
commit 1d9424046e
3 changed files with 66 additions and 23 deletions

View File

@@ -1,4 +1,23 @@
FROM php:8.2-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
# Enable mod_rewrite for cleaner URLs if needed, though not strictly requested, it's good practice.
# Install dependencies
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd mysqli
# Enable Apache rewrite module
RUN a2enmod rewrite
# Copy application source
COPY . /var/www/html/
# Set permissions for upload directory
RUN mkdir -p /var/www/html/uploads/images && \
chown -R www-data:www-data /var/www/html/uploads && \
chmod -R 755 /var/www/html/uploads
# Expose port 80
EXPOSE 80

View File

@@ -65,6 +65,29 @@ Eine moderne, webbasierte Anwendung zur Verwaltung von Packlisten für Wanderung
1. Führe das SQL-Skript `mysql_update.sql` auf deiner Datenbank aus.
2. Überschreibe die PHP-Dateien mit der neuesten Version.
### Docker Deployment
Die Anwendung ist vollständig containerisiert ("Dockerized"). Du kannst sie direkt als Container starten und mit einer beliebigen externen MySQL/MariaDB-Datenbank verbinden.
1. **Image bauen:**
```bash
docker build -t packliste-app .
```
2. **Container starten:**
(Ersetze die Platzhalter durch deine Datenbank-Zugangsdaten)
```bash
docker run -d \
-p 8080:80 \
-e DB_HOST="deine-datenbank-ip" \
-e DB_USER="dein_db_user" \
-e DB_PASSWORD="dein_db_passwort" \
-e DB_NAME="packliste" \
--name packliste-container \
packliste-app
```
Die App ist anschließend unter `http://localhost:8080` erreichbar.
---
## Bedienungsanleitung

43
db_connect.php Executable file → Normal file
View File

@@ -1,41 +1,42 @@
<?php
// db_connect.php - Zentrale Datei für die Datenbankverbindung
// NEU: Lade Zugangsdaten aus einer sicheren Konfigurationsdatei.
// Diese Datei sollte außerhalb deines öffentlichen Web-Verzeichnisses liegen!
// z.B. in /var/www/config/packliste.ini
$config_path = __DIR__ . '/config.ini'; // Pfad für flache Struktur angepasst
// 1. Priorität: Umgebungsvariablen (Docker / Environment)
$servername = getenv('DB_HOST');
$username = getenv('DB_USER');
$password = getenv('DB_PASSWORD');
$dbname = getenv('DB_NAME');
if (!file_exists($config_path)) {
die("Kritischer Fehler: Die Konfigurationsdatei wurde nicht gefunden. Bitte erstellen Sie die 'config.ini'.");
// 2. Fallback: config.ini (Lokale Entwicklung)
if (!$servername || !$username || !$dbname) {
$config_path = __DIR__ . '/config.ini';
if (file_exists($config_path)) {
$config = parse_ini_file($config_path);
if ($config) {
$servername = $config['servername'] ?? null;
$username = $config['username'] ?? null;
$password = $config['password'] ?? null;
$dbname = $config['dbname'] ?? null;
}
}
}
$config = parse_ini_file($config_path);
if ($config === false) {
die("Kritischer Fehler: Konfigurationsdatei konnte nicht gelesen werden.");
if (!$servername || !$username || !$dbname) {
die("Kritischer Fehler: Keine Datenbank-Konfiguration gefunden (Weder ENV noch config.ini).");
}
$servername = $config['servername'];
$username = $config['username'];
$password = $config['password'];
$dbname = $config['dbname'];
// Verbindung herstellen
$conn = new mysqli($servername, $username, $password, $dbname);
// Verbindung prüfen
if ($conn->connect_error) {
// In einer Produktivumgebung sollte der Fehler geloggt, aber nicht dem Benutzer angezeigt werden.
error_log("Datenbankverbindungsfehler: " . $conn->connect_error);
die("Verbindung zur Datenbank konnte nicht hergestellt werden. Bitte versuchen Sie es später erneut.");
die("Verbindung zur Datenbank konnte nicht hergestellt werden.");
}
// Zeichensatz auf UTF-8 setzen, um Probleme mit Sonderzeichen zu vermeiden
// Zeichensatz auf UTF-8 setzen
$conn->set_charset("utf8mb4");
// NEU: Setze eine Standard-Zeitzone, um konsistente Zeitstempel zu gewährleisten.
// Zeitzone setzen
date_default_timezone_set('Europe/Berlin');
?>