[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 projectCOMPOSER_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ụcrootcủa dự án với nội dung như sau:
Filedocker-compose.ymldù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.ymlFROM 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 --interactive --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ớiTạ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à npmnpm | 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\hoststhêm dòng sau - Linux & MacOS: sửa file
/etc/hoststhêm dòng sau
127.0.0.1 laravel_tutorial.local
- Windows: sửa file
-
Bật trình duyệt lên với url
http://laravel_tutorial.local:88và thưởng thức thành quả :).


Nhận xét
Đăng nhận xét