[Laravel series] 2. Cài đặt môi trường local

Hôm nay chúng ta cùng tìm hiểu cách cài đặt và tuỳ chỉnh cấu hình Laravel sao cho phù hợp với nhu cầu sử dụng. Ngoài ra chúng ta cũng tìm hiểu thêm về các công cụ liên quan như git, docker, sail, composer, laravel installer.
Trong bài này hướng dẫn cách cài đặt có thể áp dụng cho cả 3 hđh đang phổ biến hiện nay bao gồm Windows, MacOS và Linux

Các bạn có thể xem trước project tại đây: phuongdm1987/laravel-tutorial (github.com)

  • Cài đặt docker
    Chúng ta có thể cài đặt docker bằng nhiều cách khác nhau, mình thấy cài qua https://get.docker.com là cách nhanh nhất cho tất cả các hđh, nên là chúng ta cùng làm theo cách này nhé.

    Vào termial nhập lệnh dưới để tải file get-docker.sh
    curl -fsSL https://get.docker.com -o get-docker.sh
    Tiếp theo chạy lệnh dưới để cài đặt docker
    sh get-docker.sh

  • Cài đặt git
    Mình không đi chi tiết phần này nữa vì trên trang chủ của git đã có hướng dẫn cài đặt cụ thể cho từng hđh, mọi người có thể tham khảo Git - Downloads (git-scm.com)

  • Cài đặt composer
    Mọi người tham khảo cách cài đặt trên trang chủ của composer nhé Introduction - Composer (getcomposer.org), có đầy đủ thông tin luôn.

  • Tải project laravel về máy
    Bước này chúng ta có nhiều cách để thực hiện, riêng mình chọn dùng git clone project từ github về máy vì không muốn cài composer trực tiếp vô máy. Mình dùng git, sau đó composer và php sẽ được cài trong docker để tạo môi trường phát triển giống với môi trường trên production.
    Trước tiên chúng ta di chuyển đến thư mục muốn lưu code.
    Sau đó chạy lệnh dưới để tải laravel về máy (bản mình đang dùng là laravel 8x)
    curl -s https://laravel.build/laravel_tutorial | bash
    hoặc dùng composer để tạo laravel project

    COMPOSER_MEMORY_LIMIT=-1 MSYS_NO_PATHCONV=1 docker run --rm --interactive --tty --
    volume "$(pwd)":/app composer create-project laravel/laravel test-api
  • Setup docker để chạy được dự án

    • cd đến thư mục dự án mới tải về
    • Tạo mới file docker-compose.yml ở thư mục root của dự án với nội dung như sau:
      File docker-compose.yml dùng để tổng hợp lại các dịch vụ chạy chung với nhau tạo ra một application hoàn chỉnh.
version: '3'  #version của docker compose
services: #nơi khai báo các dịch vụ (php, mysql, supervisor ...)
app_base: # khởi tạo app base (dịch vụ để chạy ứng dụng của chúng ta)
build:
context: docker/php
container_name: tutorial-app-base # tên container của dịch vụ
volumes:
- .:/var/www:rw #mount - đồng bộ dữ liệu ở máy và bên trong container
networks: # tên mạng của project
- tutorial_network
env_file: # load các env từ file chỉ định
- docker/env/main.env
- docker/env/mail.env
- docker/env/mysql.env
- docker/env/redis.env
- .env

app: # extends từ app_base và tạo image tag `tutorial-app-dev` để dùng cho các dịch vụ khác như cron, supervisor
extends:
service: app_base
container_name: tutorial-app
image: tutorial-app-dev
depends_on: # phụ thuộc vào các dịch vụ khác
- mysql
- redis

nginx:
build:
context: docker/nginx
container_name: tutorial-nginx
volumes:
- ./:/var/www
networks:
tutorial_network:
aliases:
- project_name.local
ports:
- 88:80 #port của dịch vụ (external port:internal port)
depends_on:
- app

mysql:
image: 'mysql:8.0'
container_name: tutorial-mysql
ports:
- '3309:3306'
environment: # khai báo biến môi trường
MYSQL_ROOT_PASSWORD: ''
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'mysql:/var/lib/mysql'
networks:
- tutorial_network

redis:
image: 'redis:alpine'
container_name: tutorial-redis
ports:
- '6318:6379'
volumes:
- 'redis:/data'
networks:
- tutorial_network

mailhog:
image: 'mailhog/mailhog:latest'
container_name: tutorial-mailhog
ports:
- 1025:1025
- 8025:8025
networks:
- tutorial_network

supervisor:
build:
context: docker/supervisor
container_name: tutorial-supervisor
volumes:
- .:/var/www
- ${PWD}/docker/supervisor/supervisord:/etc/supervisord.d
networks:
- tutorial_network

cron:
build:
context: docker/cron
container_name: tutorial-cron
volumes:
- .:/var/www
networks:
- tutorial_network

networks:
tutorial_network:
driver: bridge

volumes: # khai báo nơi lưu trữ dữ liệu của container
mysql:
driver: local
redis:
driver: local
cron:
driver: local
    • Tạo thư mục docker ở thư mục `root` của dự án
    • Tạo các thư mục sau trong thư mục `docker` vừa tạo: cron, env, mysql, nginx, php, supervisor
    • Tạo các file env đã khai báo trong file `docker-compose.yml`
    • Tạo file `/docker/env/main.env` file chứa các config chung của dự án:
APP_NAME=laravel_tutorial
APP_ENV=local
APP_DEBUG=true
APP_URL=http://laravel_tutorial.local:88
LOG_CHANNEL=stack
LOG_LEVEL=debug
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_CONNECTION=default
    • Tạo file `/docker/env/mail.env` file chứa email config:
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=laravel_tutorial@coccoc.com
MAIL_FROM_NAME=laravel_tutorial
MAIL_RECEIVE_ADDRESS=laravel_tutorial@coccoc.com
    • Tạo file `/docker/env/mysql.env`
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel_tutorial
DB_USERNAME=root
DB_PASSWORD=
    • Tạo file `/docler/env/redis.env`
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
    • Tạo file .env
APP_KEY=secret
XDEBUG_REMOTE_HOST=host.docker.internal
XDEBUG_REMOTE_PORT=9000
COMPOSE_CONVERT_WINDOWS_PATHS=true

XDEBUG_MODE=debug
XDEBUG_CONFIG="client_host=${XDEBUG_REMOTE_HOST} client_port=${XDEBUG_REMOTE_PORT}"
PHP_IDE_CONFIG="serverName=laravel_tutorial.local"

    • Tiếp theo chúng ta sẽ cấu hình docker chi tiết cho từng dịch vụ
      • Cấu hình docker cho cron
        • Tạo file `crontab` trong thư mục `/docker/cron` với nội dụng:
* * * * * cd /var/www && php artisan schedule:run >> /var/www/storage/logs/schedule/schedule.log 2>>/var/www/storage/logs/schedule/schedule.error.log
        • Tạo file `Dockerfile` trong thư mục `/docker/cron` với nội dụng:
# build từ image tutorial-app-dev được khai báo trong file docker-compose.yml
FROM tutorial-app-dev
# Change current user to www
USER root
RUN apt-get install -y cron
ADD crontab /etc/cron.d/tutorial
RUN chmod 0644 /etc/cron.d/tutorial
RUN crontab /etc/cron.d/tutorial
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
      • Cấu hình docker cho nginx
        • Tạo file `/docker/nginx/docker-conf.d/app.conf`
server {
listen 80;
server_name laravel_tutorial.local;
root /var/www/public;

index index.php;
charset utf-8;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

error_page 404 /index.php;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass tutorial-app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.(?!well-known).* {
deny all;
}
}
        • Tạo file `/docker/nginx/Dockerfile`
FROM nginx:1.19.6
COPY docker-conf.d/* /etc/nginx/conf.d/
      • Cấu hình docker cho php
        • Tạo file `/docker/php/xdebug.ini`
[XDebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = true
        • Tạo file `/docker/php/Dockerfile`
FROM php:8.0.1-fpm-buster

WORKDIR /var/www

RUN apt-get update && apt-get install -y locales

RUN pecl install apcu redis xdebug

RUN docker-php-ext-install pdo pdo_mysql pcntl opcache
RUN docker-php-ext-enable pdo pdo_mysql pcntl apcu redis xdebug

COPY xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

#RUN apt-get install -y git \
# && git clone https://github.com/arnaud-lb/php-rdkafka.git \# && cd php-rdkafka \
# && phpize \
# && ./configure \
# && make all -j 5 \
# && make install \
# && echo "extension=rdkafka.so" > /usr/local/etc/php/conf.d/rdkaka.ini \
# && cd .. \
# && rm -rf php-rdkafka \
# && apt-get purge -y git \
# && apt-get autoremove -y

# Add UID '1000' to www-data
RUN groupmod -o -g 1000 www-data && \
usermod -o -u 1000 -g www-data www-data

# Copy existing application directory permissions
COPY --chown=www-data:www-data . /var/www

USER www-data
      • Cấu hình docker cho supervisor
        • Tạo file `/docker/supervisor/supervisord/queue.conf`
[program:laravel_tutorial_worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=3
stdout_logfile=/var/www/storage/logs/queue/queue.log
stderr_logfile=/var/www/storage/logs/queue/queue.error.log
stopwaitsecs=3600
        • Tạo file `/docker/supervisor/supervisord.conf`
[supervisord]
nodaemon=true
[supervisorctl]

[include]
files = supervisord.d/*.conf
        • Tạo file `/docker/supervisor/Dockerfile`
FROM tutorial-app-dev

# Change current user to www
USER root

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
supervisor

COPY supervisord.conf /etc/supervisord.conf

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

WORKDIR /etc/supervisor/conf.d/
      • Cấu hình file bash script để chạy các lệnh trong docker /docker/run
#!/usr/bin/env bash

PROJECT_PATH="$(
cd "$(dirname "$0")/.."
pwd
)"


print_usage() {
echo "Usage:"
echo " run artisan "
echo " run composer "
echo ""
}

case "$1" in
'artisan')
docker exec -i tutorial-app php artisan ${@:2}
;;

'composer')
COMPOSER_MEMORY_LIMIT=-1 MSYS_NO_PATHCONV=1 docker run --rm --in
teractive --tty --volume ${PROJECT_PATH}:/app composer ${@:2} --ignore-platform-reqs
;;

'--help')
echo "Run tools from docker containers."
echo ""
print_usage
;;

*)
echo "Invalid command: $1"
echo ""
print_usage
exit 1
;;
esac

Sau khi cấu hình xong thư mục dự án sẽ trông ntn:

  • Cài đặt các package dependence thông qua composer
    docker/run composer install

  • Chạy lệnh docker/run artisan key:generate --show để tạo ra app key mới, sau đó copy giá trị vào APP_KEY trong file .env. Mọi người lưu ý khi có cập nhật env chúng ta cần up lại docker để docker có thể nhận được update mới

  • Tạo mysql database cho dự án docker-compose exec mysql mysql
    create database laravel_tutorial character set utf8mb4 collate utf8mb4_unicode_ci;
    exit;

  • Cài đặt Nodejs và npm npm | get npm (npmjs.com)

  • Khởi chạy docker cho dự án
    docker-compose up -d
    docker/run composer install
    docker/run artisan migrate

  • Thêm vhost cho dự án

    • Windows: sửa file C:\Windows\System32\drivers\etc\hosts thêm dòng sau
    • Linux & MacOS: sửa file /etc/hosts thêm dòng sau
      127.0.0.1 laravel_tutorial.local
  • Bật trình duyệt lên với url http://laravel_tutorial.local:88 và thưởng thức thành quả :).


Nhận xét

Bài đăng phổ biến từ blog này

[Laravel series] 3. Sử dụng Laravel Breeze để xác thực người dùng

[Laravel series] 5. Build blog - Sử dụng route, controller để hiển thị bài viết