Environment Setup
Anleitung zur Konfiguration der Environment-Variablen für die Appiyon-Plattform.
Übersicht
Environment-Variablen werden in .env Dateien verwaltet. Symfony lädt automatisch die richtige Datei basierend auf APP_ENV.
File Hierarchy
.env # Committed, Default-Werte
.env.local # Nicht committed, lokale Overrides
.env.dev # Committed, Development-spezifisch
.env.dev.local # Nicht committed, lokale Dev-Overrides
.env.prod # Committed, Production-spezifisch
.env.prod.local # Nicht committed, lokale Prod-Overrides
.env.test # Committed, Test-EnvironmentPriorität (höher überschreibt niedriger):
.env.{APP_ENV}.local.env.{APP_ENV}.env.local.env
Basis-Konfiguration
.env (Committed)
###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=3c1018f881484e9dbcab9afc81030896
###< symfony/framework-bundle ###
###> symfony/routing ###
DEFAULT_URI=http://localhost
###< symfony/routing ###
###> doctrine/doctrine-bundle ###
DATABASE_URL="postgresql://appiyonadmin:password@127.0.0.1:5432/symfony?serverVersion=16&charset=utf8"
###< doctrine/doctrine-bundle ###
###> symfony/messenger ###
MESSENGER_TRANSPORT_DSN=doctrine://default
###< symfony/messenger ###
###> appiyon/admin ###
ADMIN_DOMAIN=appisym.go4family.net
###< appiyon/admin ###.env.local (NICHT committen)
# Lokale Overrides
APP_ENV=dev
APP_DEBUG=1
# Lokale DB-Credentials
DATABASE_URL="postgresql://lokaluser:lokalpass@localhost:5432/appiyon_dev?serverVersion=16&charset=utf8"
# Lokales Admin-Domain
ADMIN_DOMAIN=localhost:8000
# Lokale Email-Konfiguration
MAILER_DSN=smtp://localhost:1025.env.prod (Production)
APP_ENV=prod
APP_DEBUG=0
# Production sollte Secrets nutzen, nicht .env
# DATABASE_URL wird via Symfony Secrets gesetzt
# Oder via Server-Environment-VariablenEnvironment-Variablen
Framework
APP_ENV
APP_ENV=dev|prod|testdev: Development mit Debug-Modusprod: Production, optimiert, kein Debugtest: Test-Suite
APP_SECRET
APP_SECRET=random_32_character_string- Für CSRF-Tokens, Session-Signing, etc.
- MUSS in Production geheim bleiben
- Neu generieren:
php -r "echo bin2hex(random_bytes(16));"
APP_DEBUG
APP_DEBUG=0|11: Detaillierte Fehlermeldungen0: Generische Fehlerseiten (Production)
Database
DATABASE_URL
PostgreSQL:
DATABASE_URL="postgresql://user:pass@host:5432/dbname?serverVersion=16&charset=utf8"MySQL:
DATABASE_URL="mysql://user:pass@host:3306/dbname?serverVersion=8.0.32&charset=utf8mb4"SQLite (Development):
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"Parameter:
user: Datenbank-Userpass: Passwort (URL-encode bei Sonderzeichen!)host: Hostname oder IPport: Port (5432 für PostgreSQL, 3306 für MySQL)dbname: Datenbank-NameserverVersion: DB-Version (für Doctrine)
Sonderzeichen escapen:
# Passwort: "p@ss$word"
# Escaped: "p%40ss%24word"
DATABASE_URL="postgresql://user:p%40ss%24word@host:5432/db"Messenger
MESSENGER_TRANSPORT_DSN
Doctrine (Default):
MESSENGER_TRANSPORT_DSN=doctrine://defaultSpeichert Messages in DB-Tabelle messenger_messages.
Redis:
MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messagesRabbitMQ:
MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messagesEmail
MAILER_DSN
SMTP:
MAILER_DSN=smtp://user:pass@smtp.example.com:587Gmail:
MAILER_DSN=gmail+smtp://username:password@defaultMailhog (Development):
MAILER_DSN=smtp://localhost:1025Mailtrap (Development):
MAILER_DSN=smtp://user:pass@smtp.mailtrap.io:2525Disabled:
MAILER_DSN=null://nullAppiyon Custom
ADMIN_DOMAIN
ADMIN_DOMAIN=appisym.go4family.netDomain für Admin-Panel-Zugriff. AdminDomainRestrictionSubscriber prüft dies.
Development:
# In .env.local
ADMIN_DOMAIN=localhost:8000
# Oder
ADMIN_DOMAIN=dev.appiyon.testProduction:
ADMIN_DOMAIN=admin.appiyon.comSecrets Management
Symfony Secrets (Empfohlen für Production)
# Secret erstellen
php bin/console secrets:set DATABASE_URL
# Secret auslesen
php bin/console secrets:list
# Secret für Production
php bin/console secrets:set DATABASE_URL --env=prodSecrets werden verschlüsselt in config/secrets/ gespeichert.
Server Environment Variables
Alternativ: Environment-Variablen im Server/Container setzen.
Apache (.htaccess):
SetEnv APP_ENV prod
SetEnv APP_SECRET xxxxx
SetEnv DATABASE_URL postgresql://...Nginx (php-fpm):
location ~ ^/index\.php(/|$) {
fastcgi_param APP_ENV prod;
fastcgi_param APP_SECRET xxxxx;
# ...
}Docker:
environment:
- APP_ENV=prod
- APP_SECRET=xxxxx
- DATABASE_URL=postgresql://...Accessing Environment Variables
In PHP (Service)
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class MyService
{
public function __construct(
private readonly ParameterBagInterface $params
) {
}
public function doSomething(): void
{
$adminDomain = $this->params->get('admin.allowed_domain');
// Oder direkt aus $_ENV
$appEnv = $_ENV['APP_ENV'];
}
}In services.yaml
parameters:
admin.allowed_domain: '%env(ADMIN_DOMAIN)%'
app.version: '1.0.0'
services:
App\Service\MyService:
arguments:
$adminDomain: '%admin.allowed_domain%'In Twig Templates
{{ app.environment }} {# dev, prod, test #}
{{ app.debug }} {# true, false #}Environment-specific Configuration
config/packages/dev/
Development-spezifische Package-Config:
# config/packages/dev/web_profiler.yaml
web_profiler:
toolbar: true
intercept_redirects: falseconfig/packages/prod/
Production-spezifische Package-Config:
# config/packages/prod/doctrine.yaml
doctrine:
orm:
metadata_cache_driver:
type: pool
pool: doctrine.system_cache_poolValidation
Environment-Variablen validieren:
# Alle Env-Vars anzeigen
php bin/console debug:container --env-vars
# Spezifische Env-Var
php bin/console debug:container --env-var=DATABASE_URLDevelopment Setup
1. .env.local erstellen
cp .env .env.local2. Lokale Werte anpassen
# .env.local
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/appiyon_dev?serverVersion=16"
ADMIN_DOMAIN=localhost:8000
MAILER_DSN=smtp://localhost:10253. Secrets nicht in .env.local
Niemals echte Credentials in .env.local für committed Code.
Production Setup
1. .env minimal halten
Nur nicht-sensitive Defaults in .env.
2. Secrets nutzen
php bin/console secrets:set DATABASE_URL --env=prod
php bin/console secrets:set APP_SECRET --env=prod
php bin/console secrets:set MAILER_DSN --env=prod3. Oder Server Env-Vars
Setze alle sensitiven Variablen via Server/Container.
Security Checklist
- [ ]
.env.localin.gitignore - [ ]
.env.*.localin.gitignore - [ ] Keine Credentials in
.envcommitted - [ ]
APP_SECRETfür Production neu generiert - [ ]
APP_DEBUG=0in Production - [ ]
APP_ENV=prodin Production - [ ] Database-Passwort stark und unique
- [ ] Symfony Secrets für Production-Credentials
- [ ] Server Env-Vars richtig gesetzt
Troubleshooting
"Environment variable not found"
# Variable existiert nicht
php bin/console debug:container --env-var=MY_VAR
# Lösung: In .env oder .env.local hinzufügen
MY_VAR=value"Cannot use environment variable"
# services.yaml
parameters:
my_param: '%env(MY_VAR)%' # Richtig
my_param: '%MY_VAR%' # Falsch (sucht Parameter, nicht Env-Var)Cached Values
# Cache leeren nach .env Änderung
php bin/console cache:clearSpecial Characters in URLs
# Password: "p@ss#word"
# URL-encoded:
DATABASE_URL="postgresql://user:p%40ss%23word@host/db"Examples
Full Development .env.local
APP_ENV=dev
APP_DEBUG=1
APP_SECRET=dev_secret_not_for_production
DATABASE_URL="postgresql://appiyon:appiyon@localhost:5432/appiyon_dev?serverVersion=16"
MESSENGER_TRANSPORT_DSN=doctrine://default
MAILER_DSN=smtp://localhost:1025
ADMIN_DOMAIN=localhost:8000Full Production (via Secrets)
# Nur in .env (committed)
APP_ENV=prod
ADMIN_DOMAIN=admin.appiyon.com
MESSENGER_TRANSPORT_DSN=redis://redis:6379/messages
# Via Symfony Secrets (nicht committed)
php bin/console secrets:set APP_SECRET --env=prod
php bin/console secrets:set DATABASE_URL --env=prod
php bin/console secrets:set MAILER_DSN --env=prod