Skip to content

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-Environment

Priorität (höher überschreibt niedriger):

  1. .env.{APP_ENV}.local
  2. .env.{APP_ENV}
  3. .env.local
  4. .env

Basis-Konfiguration

.env (Committed)

bash
###> 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)

bash
# 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)

bash
APP_ENV=prod
APP_DEBUG=0

# Production sollte Secrets nutzen, nicht .env
# DATABASE_URL wird via Symfony Secrets gesetzt
# Oder via Server-Environment-Variablen

Environment-Variablen

Framework

APP_ENV

bash
APP_ENV=dev|prod|test
  • dev: Development mit Debug-Modus
  • prod: Production, optimiert, kein Debug
  • test: Test-Suite

APP_SECRET

bash
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

bash
APP_DEBUG=0|1
  • 1: Detaillierte Fehlermeldungen
  • 0: Generische Fehlerseiten (Production)

Database

DATABASE_URL

PostgreSQL:

bash
DATABASE_URL="postgresql://user:pass@host:5432/dbname?serverVersion=16&charset=utf8"

MySQL:

bash
DATABASE_URL="mysql://user:pass@host:3306/dbname?serverVersion=8.0.32&charset=utf8mb4"

SQLite (Development):

bash
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

Parameter:

  • user: Datenbank-User
  • pass: Passwort (URL-encode bei Sonderzeichen!)
  • host: Hostname oder IP
  • port: Port (5432 für PostgreSQL, 3306 für MySQL)
  • dbname: Datenbank-Name
  • serverVersion: DB-Version (für Doctrine)

Sonderzeichen escapen:

bash
# Passwort: "p@ss$word"
# Escaped: "p%40ss%24word"
DATABASE_URL="postgresql://user:p%40ss%24word@host:5432/db"

Messenger

MESSENGER_TRANSPORT_DSN

Doctrine (Default):

bash
MESSENGER_TRANSPORT_DSN=doctrine://default

Speichert Messages in DB-Tabelle messenger_messages.

Redis:

bash
MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages

RabbitMQ:

bash
MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages

Email

MAILER_DSN

SMTP:

bash
MAILER_DSN=smtp://user:pass@smtp.example.com:587

Gmail:

bash
MAILER_DSN=gmail+smtp://username:password@default

Mailhog (Development):

bash
MAILER_DSN=smtp://localhost:1025

Mailtrap (Development):

bash
MAILER_DSN=smtp://user:pass@smtp.mailtrap.io:2525

Disabled:

bash
MAILER_DSN=null://null

Appiyon Custom

ADMIN_DOMAIN

bash
ADMIN_DOMAIN=appisym.go4family.net

Domain für Admin-Panel-Zugriff. AdminDomainRestrictionSubscriber prüft dies.

Development:

bash
# In .env.local
ADMIN_DOMAIN=localhost:8000
# Oder
ADMIN_DOMAIN=dev.appiyon.test

Production:

bash
ADMIN_DOMAIN=admin.appiyon.com

Secrets Management

Symfony Secrets (Empfohlen für Production)

bash
# 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=prod

Secrets werden verschlüsselt in config/secrets/ gespeichert.

Server Environment Variables

Alternativ: Environment-Variablen im Server/Container setzen.

Apache (.htaccess):

apache
SetEnv APP_ENV prod
SetEnv APP_SECRET xxxxx
SetEnv DATABASE_URL postgresql://...

Nginx (php-fpm):

nginx
location ~ ^/index\.php(/|$) {
    fastcgi_param APP_ENV prod;
    fastcgi_param APP_SECRET xxxxx;
    # ...
}

Docker:

yaml
environment:
  - APP_ENV=prod
  - APP_SECRET=xxxxx
  - DATABASE_URL=postgresql://...

Accessing Environment Variables

In PHP (Service)

php
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

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

twig
{{ app.environment }}  {# dev, prod, test #}
{{ app.debug }}        {# true, false #}

Environment-specific Configuration

config/packages/dev/

Development-spezifische Package-Config:

yaml
# config/packages/dev/web_profiler.yaml
web_profiler:
    toolbar: true
    intercept_redirects: false

config/packages/prod/

Production-spezifische Package-Config:

yaml
# config/packages/prod/doctrine.yaml
doctrine:
    orm:
        metadata_cache_driver:
            type: pool
            pool: doctrine.system_cache_pool

Validation

Environment-Variablen validieren:

bash
# Alle Env-Vars anzeigen
php bin/console debug:container --env-vars

# Spezifische Env-Var
php bin/console debug:container --env-var=DATABASE_URL

Development Setup

1. .env.local erstellen

bash
cp .env .env.local

2. Lokale Werte anpassen

bash
# .env.local
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/appiyon_dev?serverVersion=16"
ADMIN_DOMAIN=localhost:8000
MAILER_DSN=smtp://localhost:1025

3. 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

bash
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=prod

3. Oder Server Env-Vars

Setze alle sensitiven Variablen via Server/Container.

Security Checklist

  • [ ] .env.local in .gitignore
  • [ ] .env.*.local in .gitignore
  • [ ] Keine Credentials in .env committed
  • [ ] APP_SECRET für Production neu generiert
  • [ ] APP_DEBUG=0 in Production
  • [ ] APP_ENV=prod in Production
  • [ ] Database-Passwort stark und unique
  • [ ] Symfony Secrets für Production-Credentials
  • [ ] Server Env-Vars richtig gesetzt

Troubleshooting

"Environment variable not found"

bash
# 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"

bash
# services.yaml
parameters:
    my_param: '%env(MY_VAR)%'  # Richtig
    my_param: '%MY_VAR%'       # Falsch (sucht Parameter, nicht Env-Var)

Cached Values

bash
# Cache leeren nach .env Änderung
php bin/console cache:clear

Special Characters in URLs

bash
# Password: "p@ss#word"
# URL-encoded:
DATABASE_URL="postgresql://user:p%40ss%23word@host/db"

Examples

Full Development .env.local

bash
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:8000

Full Production (via Secrets)

bash
# 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

Further Reading

Built with VitePress