Skip to content

Laravel

Instalacja

Laravel z Filament 5 uruchamiany w kontenerze Docker i publikowany przez Caddy pod subdomeną laravel-eim.fulc.ro.

Założenia konfiguracyjne:

  • Compose: /srv/docker/compose/laravel-eim
  • Kod aplikacji: /srv/docker/projects/laravel-eim
  • Dane aplikacji: /srv/docker/data/laravel-eim/storage
  • Sekrety: /srv/docker/secrets/laravel-eim/app.env
  • Sieci Docker: proxy, internal
  • Panel Filament: /admin
  • Reverse proxy: Caddy

Dostęp do sieci Docker

Aplikacja wymaga dostępu do sieci proxy i internal w celu komunikacji z reverse proxy i bazą danych.


Tworzenie katalogów

Tworzymy katalogi wymagane przez aplikację i kontenery.

bash
sudo mkdir -p /srv/docker/compose/laravel-eim
sudo mkdir -p /srv/docker/projects/laravel-eim
sudo mkdir -p /srv/docker/data/laravel-eim/storage/{app/public,framework/{cache,sessions,testing,views},logs}
sudo mkdir -p /srv/docker/secrets/laravel-eim

Nadajemy właściciela katalogów.

bash
sudo chown -R "$USER:$USER" /srv/docker/compose/laravel-eim
sudo chown -R "$USER:$USER" /srv/docker/secrets/laravel-eim
sudo chown -R 33:33 /srv/docker/projects/laravel-eim
sudo chown -R 33:33 /srv/docker/data/laravel-eim

Tworzenie projektu Laravel

Tworzymy projekt Laravel bez instalacji PHP na hoście.

bash
docker run --rm \
  -u 33:33 \
  -v /srv/docker/projects/laravel-eim:/app \
  -w /app \
  composer:2 \
  composer create-project laravel/laravel .

Budowa obrazu PHP

Instalujemy rozszerzenie intl wymagane przez Laravel i Filament.

bash
cd /srv/docker/compose/laravel-eim
micro Dockerfile
Dockerfile
FROM serversideup/php:8.4-fpm-nginx-bookworm

USER root
RUN install-php-extensions intl
USER www-data

Konfiguracja


Tworzenie pliku app.env

Plik zawiera konfigurację aplikacji i dane dostępowe.

bash
micro /srv/docker/secrets/laravel-eim/app.env
app.env
APP_NAME=EIM
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://eim.fulc.ro

APP_TIMEZONE=Europe/Warsaw
APP_LOCALE=pl

LOG_CHANNEL=stderr
LOG_LEVEL=info

DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=laravel-eim
DB_USERNAME=laravel-eim
DB_PASSWORD=SILNE_HASLO_BEZ_$

CACHE_STORE=file
SESSION_DRIVER=file
QUEUE_CONNECTION=database

Konfiguracja Docker Compose

Definiujemy usługę aplikacji oraz sieci.

bash
micro compose.yaml
compose.yaml
services:
  app:
    build:
      context: /srv/docker/compose/laravel-eim
      dockerfile: Dockerfile

    container_name: laravel-eim-app
    restart: unless-stopped

    env_file:
      - /srv/docker/secrets/laravel-eim/app.env

    volumes:
      - /srv/docker/projects/laravel-eim:/var/www/html
      - /srv/docker/data/laravel-eim/storage:/var/www/html/storage

    networks:
      - proxy
      - internal

networks:
  proxy:
    external: true
  internal:
    external: true

Uruchomienie kontenera

Budujemy obraz i uruchamiamy aplikację.

bash
docker compose up -d --build

Generowanie klucza aplikacji

Laravel wymaga klucza szyfrującego.

bash
docker compose run --rm app php artisan key:generate --show

Wklejamy do app.env:

app.env
APP_KEY=base64:...

Restartujemy kontener:

bash
docker compose up -d

Instalacja Filament

Instalujemy panel administracyjny Filament 5.

bash
docker compose run --rm app composer require filament/filament:^5.4
bash
docker compose run --rm app php artisan filament:install --panels
bash
docker compose run --rm app php artisan migrate --force
bash
docker compose run --rm app php artisan storage:link

Naprawa dostępu do panelu (błąd 403)

Dodajemy implementację interfejsu FilamentUser w modelu użytkownika.

bash
micro /srv/docker/projects/laravel-eim/app/Models/User.php
User.php
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;

class User extends Authenticatable implements FilamentUser
{
    public function canAccessPanel(Panel $panel): bool
    {
        return true;
    }
}

Naprawa HTTPS (błąd assetów CSS i JS)

Konfigurujemy zaufanie do proxy dla poprawnego wykrywania HTTPS.

bash
micro /srv/docker/projects/laravel-eim/bootstrap/app.php
app.php
use Illuminate\Http\Request;

->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustProxies(
        at: '*',
        headers: Request::HEADER_X_FORWARDED_FOR |
            Request::HEADER_X_FORWARDED_HOST |
            Request::HEADER_X_FORWARDED_PORT |
            Request::HEADER_X_FORWARDED_PROTO |
            Request::HEADER_X_FORWARDED_AWS_ELB,
    );
})

Budowanie zasobów frontend

Budujemy zasoby Vite w środowisku kontenera Node.js.

bash
docker run --rm \
  -u 33:33 \
  -e HOME=/tmp \
  -e npm_config_cache=/tmp/.npm \
  -v /srv/docker/projects/laravel-eim:/app \
  -w /app \
  node:24-bookworm-slim \
  npm install
bash
docker run --rm \
  -u 33:33 \
  -e HOME=/tmp \
  -e npm_config_cache=/tmp/.npm \
  -v /srv/docker/projects/laravel-eim:/app \
  -w /app \
  node:24-bookworm-slim \
  npm run build

Optymalizacja

Optymalizujemy konfigurację i cache aplikacji.

bash
docker compose run --rm app php artisan optimize:clear
docker compose run --rm app php artisan optimize
docker compose run --rm app php artisan filament:optimize

Konfiguracja reverse proxy

Publikujemy aplikację przez Caddy.

Caddyfile
eim.fulc.ro {
  redir / /admin/login 302

  reverse_proxy laravel-eim:8080 {
    header_up X-Forwarded-Proto {scheme}
    header_up X-Forwarded-Host {host}
    header_up X-Forwarded-For {remote_host}
  }
}
bash
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

Test działania

Sprawdzamy dostęp do panelu administracyjnego.

adres
https://eim.fulc.ro/admin/login

Podgląd logów

Sprawdzamy logi aplikacji.

bash
docker logs -f laravel-eim-app

Uwagi utrzymaniowe

  • Aktualizacje wykonujemy w katalogu projektu
  • Po zmianach uruchamiamy optimize i filament:optimize
  • Po zmianie app.env restartujemy kontener
  • Backup obejmuje katalog data oraz secrets

Tworzenie użytkownika


Tworzenie użytkownika Filament

Tworzymy konto administratora panelu.

bash
docker compose run --rm app php artisan make:filament-user