This commit is contained in:
2025-09-09 22:46:43 +02:00
parent beffd30f16
commit 2f81de66c7
5 changed files with 76 additions and 39 deletions

1
.gitignore vendored
View File

@@ -25,3 +25,4 @@ bodycomfortphysio.de.code-workspace
*.log
source/.env

View File

@@ -114,6 +114,6 @@ module.exports = {
host: 'bodycomfortphysio@152.53.119.146',
path: '/home/bodycomfortphysio/htdocs/bodycomfortphysio.de',
port: 2222,
excludes: ['.DS_Store', '.git']
excludes: ['.DS_Store', '.git', '.env']
}
};

24
source/.env.example Normal file
View File

@@ -0,0 +1,24 @@
APP_ENV=dev
DB_HOST_DEV=127.0.0.1
DB_PORT_DEV=3307
DB_NAME_DEV=bodycomfort
DB_USER_DEV=appuser
DB_PASS_DEV=change_me_app
DB_HOST_PROD=localhost
DB_PORT_PROD=3306
DB_NAME_PROD=bodycomfort
DB_USER_PROD=appuser
DB_PASS_PROD=CHANGEME
SMTP_HOST=mail.example.com
SMTP_PORT=465
SMTP_USER=noreply@example.com
SMTP_PASS=CHANGEME
FROM_ADDRESS=noreply@example.com
TO_ADDRESS_DEV=dev@example.com
TO_ADDRESS_PROD=prod@example.com
TURNSTILE_SITE_KEY=CHANGEME
TURNSTILE_SECRET=CHANGEME

View File

@@ -18,7 +18,7 @@
<ul class="icons">
<li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/bodycomfortphysio/" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
<li><a href="#" class="icon brands fa-whatsapp"><span class="label">Whatsapp</span></a></li>
<li><a href="https://wa.me/4917680820142" class="icon brands fa-whatsapp"><span class="label">Whatsapp</span></a></li>
</ul>
</li>
</ul>

View File

@@ -4,60 +4,72 @@ declare(strict_types=1);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
// Umgebung bestimmen: .env (lokal) oder Domain-Match
$host = $_SERVER['HTTP_HOST'] ?? '';
$appEnv = getenv('APP_ENV') ?: '';
$isProd = in_array(strtolower($appEnv), ['prod','production'], true)
|| preg_match('~(^|\.)bodycomfortphysio\.de$~i', $host);
// .env nur lokal laden (PHP läuft lokal; DB in Docker)
if (!$isProd) {
$dotenv = __DIR__.'/../.env';
if (is_file($dotenv)) {
foreach (file($dotenv, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) as $line) {
if ($line[0]==='#' || !str_contains($line,'=')) continue;
[$k,$v] = array_map('trim', explode('=', $line, 2));
if ($k !== '' && getenv($k) === false) putenv("$k=$v");
}
}
// Helper: env mit Fallback
function envv(string $key, $default = null) {
$v = getenv($key);
if ($v !== false && $v !== '') return $v;
if (isset($_ENV[$key]) && $_ENV[$key] !== '') return $_ENV[$key];
if (isset($_SERVER[$key]) && $_SERVER[$key] !== '') return $_SERVER[$key];
return $default;
}
// .env immer laden (falls vorhanden)
// überschreibt nur fehlende Variablen
$dotenvFile = __DIR__ . '/../.env';
if (is_file($dotenvFile)) {
foreach (file($dotenvFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
if ($line[0] === '#' || !str_contains($line, '=')) continue;
[$k, $v] = array_map('trim', explode('=', $line, 2));
if ($k !== '' && getenv($k) === false) {
putenv("$k=$v");
$_ENV[$k] = $v;
}
}
}
// Umgebung bestimmen: per Variable oder Domain-Match
$host = $_SERVER['HTTP_HOST'] ?? '';
$appEnv = strtolower(envv('APP_ENV', ''));
$isProd = in_array($appEnv, ['prod','production'], true)
|| preg_match('~(^|\.)bodycomfortphysio\.de$~i', $host);
date_default_timezone_set('Europe/Berlin');
$CFG = [
'env' => $isProd ? 'prod' : 'dev',
// DB: DEV = Docker auf 127.0.0.1:3307, PROD = Cloudpanel
// DB
'db' => $isProd ? [
'host' => getenv('DB_HOST_PROD') ?: '127.0.0.1',
'port' => (int)(getenv('DB_PORT_PROD') ?: 3306),
'name' => getenv('DB_NAME_PROD') ?: 'bodycomfort',
'user' => getenv('DB_USER_PROD') ?: 'appuser',
'pass' => getenv('DB_PASS_PROD') ?: '',
'host' => envv('DB_HOST_PROD', '127.0.0.1'),
'port' => (int)envv('DB_PORT_PROD', 3306),
'name' => envv('DB_NAME_PROD', 'bodycomfort'),
'user' => envv('DB_USER_PROD', 'appuser'),
'pass' => envv('DB_PASS_PROD', ''), // leerer String => Fehler erzwingen
] : [
'host' => getenv('DB_HOST_DEV') ?: '127.0.0.1', // Docker-DB erreichbar vom Host
'port' => (int)(getenv('DB_PORT_DEV') ?: 3307), // dein Compose-Port
'name' => getenv('DB_NAME_DEV') ?: 'bodycomfort',
'user' => getenv('DB_USER_DEV') ?: 'appuser',
'pass' => getenv('DB_PASS_DEV') ?: 'change_me_app',
'host' => envv('DB_HOST_DEV', '127.0.0.1'),
'port' => (int)envv('DB_PORT_DEV', 3307),
'name' => envv('DB_NAME_DEV', 'bodycomfort'),
'user' => envv('DB_USER_DEV', 'appuser'),
'pass' => envv('DB_PASS_DEV', 'change_me_app'),
],
// Mail: DEV zu dir, PROD zur Kundin
// Mail
'mail' => [
'smtp_host' => getenv('SMTP_HOST') ?: 'mail.davidt.cloud',
'smtp_port' => (int)(getenv('SMTP_PORT') ?: 465),
'smtp_user' => getenv('SMTP_USER') ?: 'noreply@bodycomfortphysio.de',
'smtp_pass' => getenv('SMTP_PASS') ?: '',
'from_address' => getenv('FROM_ADDRESS') ?: 'noreply@bodycomfortphysio.de',
'smtp_host' => envv('SMTP_HOST', 'mail.davidt.cloud'),
'smtp_port' => (int)envv('SMTP_PORT', 465),
'smtp_user' => envv('SMTP_USER', 'noreply@bodycomfortphysio.de'),
'smtp_pass' => envv('SMTP_PASS', ''),
'from_address' => envv('FROM_ADDRESS', 'noreply@bodycomfortphysio.de'),
'from_name' => 'Body Comfort Physio',
'to_address' => $isProd
? (getenv('TO_ADDRESS_PROD') ?: 'praxis@bodycomfortphysio.de')
: (getenv('TO_ADDRESS_DEV') ?: 'info@davidt.de'),
? envv('TO_ADDRESS_PROD', 'praxis@bodycomfortphysio.de')
: envv('TO_ADDRESS_DEV', 'info@davidt.de'),
],
'captcha' => [
'site_key' => getenv('TURNSTILE_SITE_KEY') ?: '0x4AAAAAABz-U5tRwpxNWlwM',
'secret' => getenv('TURNSTILE_SECRET') ?: '0x4AAAAAABz-U5ZZW8H32c3exvRib8gs9E8',
'site_key' => envv('TURNSTILE_SITE_KEY', ''),
'secret' => envv('TURNSTILE_SECRET', ''),
],
'practice' => ['address' => 'Herrenpfad-Süd 12, 41334 Nettetal'],
@@ -72,7 +84,7 @@ function cfg(string $path, $default=null) {
} return $n;
}
// DB helper (optional)
// DB helper
function db(): PDO {
static $pdo;
if ($pdo) return $pdo;