Laravel .env en storage instellen voor productie

Een correct geconfigureerd .env bestand en werkende storage zijn essentieel voor elke Laravel applicatie. In deze handleiding leer je hoe je deze correct instelt voor een productieomgeving.

Het .env bestand begrijpen

Het .env bestand bevat environment-specifieke configuratie die niet in versiebeheer hoort.

Waarom .env gebruiken

  • Scheidt configuratie van code
  • Voorkomt gevoelige data in Git
  • Maakt deployment naar verschillende omgevingen eenvoudig
  • Elke omgeving (dev, staging, productie) heeft eigen .env

.env aanmaken

Als je Laravel cloont, maak je een .env aan:

cd ~/domains/jouwdomein.nl/project
# Kopieer het voorbeeld bestand
cp .env.example .env
# Genereer de app key
php artisan key:generate

Essentiële .env instellingen

Configureer deze instellingen voor productie.

Applicatie instellingen

APP_NAME="Mijn Laravel App"
APP_ENV=production
APP_KEY=base64:gegenereerde-key-hier
APP_DEBUG=false
APP_TIMEZONE=Europe/Amsterdam
APP_URL=https://jouwdomein.nl

Belangrijk:

  • APP_ENV=production activeert productie optimalisaties
  • APP_DEBUG=false voorkomt dat foutmeldingen zichtbaar zijn
  • APP_URL moet je volledige URL bevatten met https

Database configuratie

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=jouw_database
DB_USERNAME=jouw_user
DB_PASSWORD=jouw_wachtwoord
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

Logging configuratie

LOG_CHANNEL=daily
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=error

Voor productie:

  • daily maakt per dag een nieuw logbestand
  • LOG_LEVEL=error logt alleen errors, niet waarschuwingen

Cache en Session

CACHE_STORE=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_ENCRYPT=true
SESSION_PATH=/
SESSION_DOMAIN=.jouwdomein.nl

Voor betere performance op shared hosting is file de beste keuze.

Queue configuratie

QUEUE_CONNECTION=database

Of voor shared hosting zonder workers:

QUEUE_CONNECTION=sync

Mail configuratie

MAIL_MAILER=smtp
MAIL_HOST=mail.jouwdomein.nl
MAIL_PORT=587
MAIL_USERNAME=info@jouwdomein.nl
MAIL_PASSWORD=je-mail-wachtwoord
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=info@jouwdomein.nl
MAIL_FROM_NAME="${APP_NAME}"

Storage configureren

Laravel gebruikt de storage map voor logs, cache en uploads.

Storage structuur

storage/
├── app/
│   ├── public/      # Publiek toegankelijke uploads
│   └── private/     # Private bestanden
├── framework/
│   ├── cache/       # File cache
│   ├── sessions/    # Sessie bestanden
│   └── views/       # Compiled views
└── logs/            # Log bestanden

De public storage moet toegankelijk zijn via het web:

# Maak de symlink
php artisan storage:link

Dit creëert: public/storage -> storage/app/public Controleer of de link werkt:

ls -la public/
# Je ziet: storage -> /path/to/storage/app/public

Als het artisan commando niet werkt:

cd public
ln -s ../storage/app/public storage

Storage rechten instellen

Zorg dat Laravel kan schrijven:

# Recursief schrijfbaar maken
chmod -R 775 storage
chmod -R 775 bootstrap/cache
# Eigenaar instellen (indien nodig)
chown -R www-data:www-data storage
chown -R www-data:www-data bootstrap/cache

Op shared hosting is meestal alleen chmod nodig.

Productie beveiliging

Beveilig je .env en storage.

.env beveiligen

Het .env bestand mag nooit publiek toegankelijk zijn:

  1. Laravel's public map is de document root
  2. .env staat een niveau hoger
  3. .htaccess blokkeert toegang Controleer met:
curl https://jouwdomein.nl/.env
# Moet 403 of 404 geven, NOOIT de inhoud!

.env in .gitignore

Zorg dat .env nooit in Git komt:

.env
.env.backup
.env.production

Storage beschermen

Private uploads beschermen:

// In routes/web.php
Route::get('/download/{file}', function ($file) {
    // Autorisatie check
    if (!auth()->check()) {
        abort(403);
    }
    return Storage::download('private/' . $file);
});

Cache configuratie

Optimaliseer caching voor productie.

Config cache

php artisan config:cache

Dit combineert alle config bestanden in een cached bestand. Let op: Na config:cache wordt .env niet meer direct gelezen. Wijzigingen in .env vereisen:

php artisan config:clear
php artisan config:cache

Route cache

php artisan route:cache

Versnelt route resolution aanzienlijk.

View cache

php artisan view:cache

Pre-compileert alle Blade templates.

Alles tegelijk

php artisan optimize

Of bij deployment:

php artisan optimize:clear
php artisan optimize

Veelvoorkomende problemen

Storage permission denied

# Reset rechten
chmod -R 775 storage bootstrap/cache
# SELinux context (CentOS/RHEL)
chcon -R -t httpd_sys_rw_content_t storage

Op sommige servers zijn symlinks uitgeschakeld:

# Kopieer in plaats van symlink
cp -r storage/app/public/* public/storage/

Of pas de FileController aan om bestanden te serveren.

.env wijzigingen werken niet

# Leeg config cache
php artisan config:clear
# Of als je geen SSH hebt
# Verwijder: bootstrap/cache/config.php

APP_KEY problemen

Als je APP_KEY mist of fout is:

php artisan key:generate

Dit regenereert de key. Let op: bestaande encrypted data wordt onleesbaar.

Environment detectie

Check de huidige environment in code:

// In code
if (app()->environment('production')) {
    // Productie specifieke code
}
// In Blade
@production
    <!-- Alleen op productie -->
@endproduction

Best practices

.env management

  • Gebruik nooit dezelfde .env op dev en productie
  • Bewaar productie .env veilig (password manager)
  • Gebruik sterke, unieke wachtwoorden
  • Roteer credentials regelmatig

Storage management

  • Configureer backup voor storage/app
  • Overweeg cloud storage voor schaling
  • Ruim oude logs regelmatig op

Gerelateerde artikelen

Hulp nodig?

We staan voor je klaar! Loop je ergens tegenaan of heb je vragen? Ons supportteam helpt je graag persoonlijk verder. Stuur ons een berichtje via het ticketsysteem - we reageren meestal binnen een paar uur en denken graag met je mee.