Obsah článku
V dnešním článku se podíváme na novou instalaci frameworku Laravel. Již dříve jsme si ukázali postup instalace Laravelu na lokální prostředí pomocí Homestead (Win10). Jelikož jsem si však v průběhu času pořídil Maca (MacBook Pro 16″ / M1 Pro / 16GB – mrk mrk, musím jen a jen doporučit), změnilo se i mé pracovní prostředí. Homestead jsem se rozhodl nahradit za Docker – tedy další způsob, jak využít virtualizované prostředí pro běh webových aplikací.
Ono způsobů, jak si lze spustit Laravel aplikaci na lokálním prostředí je opravdu mnoho. Ať už máte server přímo na daném stroji (implementovaný výchozí server Laravel aplikace, XAMP, …), využíváte Valet či Sail, apod. Jelikož jsem si oblíbil Docker (alespoň základy), rozhodl jsem se osobní projekty spouštět pomocí Sail.
Předpoklady
- Win 10 a vyšší (možnost využít WSL2)
- Nainstalovaný Docker Desktop
Ve stručnosti
- Zahájíme instalaci MVC frameworku Laravel
- Nastavíme soubor hosts
- Nastavíme Docker / docker-compose.yml + .env
Zahájení instalace Laravel
Spustíme si terminál, přejdeme do složky, ve které chceme nainstalovat Laravel a spustíme tento příkaz:
curl -s "https://laravel.build/laratest" | bash
Tím dojde ke stažení a instalaci frameworku. Podrobnosti o instalaci, včetně možnosti nastavení služeb už během tohoto příkazu, naleznete v oficiální dokumentaci Laravelu / Sail.
Na konci byste měli vidět info o zdárné instalaci.
Můžete si všimnout, že nám v posledním řádku radí, abychom přešli do složky s aplikací a spustili samotnou aplikaci, resp. prostředí pro lokální vývoj. (Ačkoliv jste viděli v příkladu, že jsem aplikaci instaloval do adresáře „laratest“, dále budu pokračovat z adresáře „laravel.laratest.test“ – kvůli dalším nástrojům udržuji určitou konvenci – tedy adresář laratest jsem přejmenoval na laravel.laratest.test).
Nastavení souboru hosts
Opět přejdeme do terminálu a spustíme následující příkaz, který nám dovolí upravit soubor hosts s právy administrátora.
sudo nano /etc/hosts
Do souboru hosts potřebujeme přidat následující řádek:
...
127.0.0.1 laravel.laratest.test
...
Úpravu uložíme, soubor zavřeme a můžeme pokračovat otevřením Vašeho IDE, v mém případě Visual Studio Code.
Úprava Docker / docker-compose.yml + .env
Nyní, než přejdeme na samotný build aplikace, upravíme docker-compose.yml. Otevřete si tedy aplikaci ve Vašem oblíbeném editoru a podívejme se soubor docker-compose.yml. Měl by vypadat podobně jako níže (Laravel v9.19, Sail v1.0.1, instalace ze 7.8.2022)
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- meilisearch
- selenium
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
- './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sail-redis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
retries: 3
timeout: 5s
meilisearch:
image: 'getmeili/meilisearch:latest'
ports:
- '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
volumes:
- 'sail-meilisearch:/meili_data'
networks:
- sail
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"]
retries: 3
timeout: 5s
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
selenium:
image: 'selenium/standalone-chrome'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sail-mysql:
driver: local
sail-redis:
driver: local
sail-meilisearch:
driver: local
Ještě se můžeme podívat na předpřipravený .env soubor.
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:NejakyVasVygenerovanyKlic
APP_DEBUG=true
APP_URL=http://laratest.test
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laratest
DB_USERNAME=sail
DB_PASSWORD=password
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=memcached
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700
Tedy ve výchozí instalaci vidíme 6 kontejnerů – aplikace, mysql, redis, meilisearch, mailhog a selenium.
Jelikož pár služeb v této aplikaci nevyužiji, maily rovnou budu odesílat skrze Mailgun a MySQL databázi chci nahradit za MariaDB, udělám pár úprav v obou souborech.
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mariadb
- redis
mariadb:
image: 'mariadb:10'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sail-mariadb:/var/lib/mysql'
- './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sail-redis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sail-mariadb:
driver: local
sail-redis:
driver: local
Tedy pár služeb jsem odstranil, mysql kontejner jsem nahradil za mariadb. Tudíž je zapotřebí upravit i .env soubor.
APP_NAME=LaraTest
APP_ENV=local
APP_KEY=base64:NejakyVasVygenerovanyKlic
APP_DEBUG=true
APP_URL="http://laravel.laratest.test:8240"
APP_PORT=8240
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
FORWARD_DB_PORT=3390
DB_DATABASE=laratest
DB_USERNAME=sail
DB_PASSWORD=password
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120
MEMCACHED_HOST=memcached
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
FORWARD_REDIS_PORT=6425
MAIL_MAILER=mailgun
MAIL_USERNAME=TadyByPripadneBylVasMailgunUsername
MAILGUN_DOMAIN=TadyByPripadneBylaVaseMailgunDomena
MAILGUN_SECRET=TadyByPripadneBylVasMailgunSecret
MAIL_PORT=1025
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="info@pavelzanek.com"
MAIL_FROM_NAME="${APP_NAME}"
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
Do .env jsem si doplnil porty, protože v jeden čas mám spuštěno několik projektů a ty jsou zpravidla zcela odděleny. Zároveň jsem upravil DB_HOST, aby se připojovalo ke kontejneru s mariadb. U cache a sessions rovnou využiji sílu Redisu 🙂
Nyní můžeme projekt vybuildit. To provedeme následujícím příkazem:
sail build --no-cache
Po úspěšném dokončení buildu uvidíte přibližně toto:
Nyní můžete aplikaci spustit, resp. spustit všechny kontejnery uvedené v docker-compose.yml. To můžete provést například po mocí těchto příkazů – první spustí kontejnery a uvidíte jejich operace, ve druhém případě se spustí kontejnery na pozadí a vy můžete nadále používat terminál.
sail up
sail up -d
Tím tedy spustíte kontejnery a opět při úspěchu uvidíte přibližně toto:
Nyní můžete přejít na URL adresu uvedenou v .env souboru v rámci proměnné „APP_URL“. V mém případě „http://laravel.laratest.test:8240“. Měli byste vidět čerstvou instalaci Laravel frameworku.
A tím jsme dokončili instalaci a můžeme vytvářet něco nového. Je důležité si uvědomit, že chcete Artisan příkazy spouštět uvnitř kontejneru s aplikací. Toho můžete docílit tak, že u artisan příkazů nahradíte část „php“ za „sail.“ Tedy například:
php artisan migrate -> sail artisan migrate
php artisan optimize:clear -> sail artisan optimize:clear
composer update -> sail composer update
composer require xyz -> sail composer require xyz