Khi làm việc với Devilbox, tôi tin chắc rằng bạn cũng như tôi đều đã thấy được sự đơn giản và linh hoạt của nó. Cho dù chỉ là một tay mơ về Docker, bạn vẫn có thể dễ dàng tiếp cận được với Devilbox. Vì như bạn đã thấy, Devilbox được thiết kế như một phần mềm độc lập. Chỉ là nó vận hành trên nền tảng Docker. Tất cả những gì chúng ta cần tìm hiểu là cách cấu hình theo những gì mà Devilbox cung cấp.
Để có thể trở thành một tay chơi Devilbox thực thụ thì trong nội dung này, tôi sẽ cùng bạn tìm hiểu thêm một số cấu hình khác nữa của Devilbox. Những thứ vẫn chưa được nhắc đến trong các phần trước đó. Hoặc những thứ mà có thể các bạn đã từng nghĩ là không thể cấu hình được.
Đầu tiên, hãy điểm lại một chút về cấu trúc thư mục mà chúng ta đã xây dựng trước đó.
├── devilbox
└── cfg
└── vhost-gen
├── projects
└── laravel
├── .devilbox
└── public
Trong phần tái cấu trúc dự án, chúng ta đã cùng nhau tái cấu trúc lại thư mục dự án và của cả Devilbox. Điều này nhằm mục đích dễ dàng quản lý dự án mới cũng như giữ nguyên cấu trúc dự án cũ. Đồng thời tách biệt phần dự án với Devilbox, xem Devilbox chỉ là nền tảng phát triển. Từ đó nâng cao tính linh động.
Quay lại cấu trúc ứng trên, tôi sẽ tổng hợp lại các thuật ngữ được sử dụng trong Devilbox. Ví dụ với ứng dụng Laravel:
Thuật ngữ | Giá trị | Giải thích |
---|---|---|
Devilbox path | devilbox | Nơi chứa mã nguồn Devilbox |
vhost-gen template directory | cfg/vhost-gen | Nơi chứa virtual host template ở mức global |
data directory | projects | Nơi chứa toàn bộ dự án |
project directory | laravel | Tên dự án |
project template directory | .devilbox | Nơi chứa virtual host template hoặc cấu hình backend ở mức project |
docroot directory | public | Nơi dự án chứa các tập tin có thể truy cập trực tiếp từ bên ngoài |
domain | laravel.dvl.to | Tên miền của dự án |
domain suffix | dvl.to | Hậu tố tên miền của dự án |
Nếu bạn còn nhớ thì trong các phần trước chúng ta đã thay đổi data dir
và docroot dir
. Vậy thì còn gì chúng ta có thể thay đổi nữa? Hãy cùng nhau tìm hiểu ngay bây giờ.
Đây có lẽ là thứ mà các bạn muốn đổi nhiều nhất. Như bạn thấy đó, sau khi tạo và cấu hình dự án hoàn chỉnh, chúng ta sẽ có một tên miền theo dự án theo công thức sau:
<project-dir>.<domain-suffix>
Để thay đổi domain suffix, hãy mở tập tin env lên và tìm tới khóa TLD_SUFFIX
, sau đó thay đổi theo ý muốn.
TLD_SUFFIX=dvl.to
Mặc định giá trị của nó là dvl.to
. Bạn có thể chọn bất kỳ giá trị nào như local
, test
,… Tuy nhiên, hãy lưu rằng:
dev
, vì đây là tên miền thuộc Google và luôn yêu cầu giao thức HTTPS. Tham khảo tại đây.localhost
, vì đã có đề xuất ánh xạ các tên miền có hậu tố localhost
đến 127.0.0.1
. Tuy nhiên, Docker lại release phiên bản ngăn chặn điều này vì một số lý do. Tham khảo tại đây: Release notes for previous versions | Docker Documentation và draft-west-let-localhost-be-localhost-06 (ietf.org)com
, net
, org
,… Vì lúc này tất cả các tên miền có liên quan ví dụ như google.com đều sẽ trỏ về Devilbox.Cách tốt nhất là sử dụng các giá trị dạng sub-domain ví dụ như local.com
. Hoặc sử dụng các giá trị không nằm trong danh sách top level domain như local
, test
. Lưu ý khi thay đổi giá trị, hãy kiểm tra lại trong trang Virtual Host:
Nếu bạn thấy những thông báo lỗi này, hãy thêm DNS record vào tập tin /ect/hosts
như chỉ dẫn:
Sau đó, tải lại trang Virtual Hosts và xem lại kết quả:
Truy cập lại vào trang dự án:
Tadaaa, thành công rực rỡ!
Cái mà tôi nói đến chính là project template dir
, tức là cái thư mục .devilbox
nằm trong mỗi dự án. Mặc định trong dự án nó không tồn tại mà chỉ khi nào cần phải cấu hình cho web server thì chúng ta mới tạo nó. Trong tập tin .env
nó chính là khóa HTTPD_TEMPLATE_DIR
:
HTTPD_TEMPLATE_DIR=.devilbox
Nếu bạn vẫn còn nhớ trong các phần trước, tôi đã hướng dẫn cách thay đổi phiên bản của các loại cơ sở dữ liệu được tích hợp sẵn với Devilbox. Ngoài thay đổi phiên bản ra, Devilbox còn hỗ trợ thay đổi port
, username
và password
. Dưới đây chi tiết là từng loại cơ sở dữ liệu
MYSQL_SERVER
MYSQL_SERVER=mariadb-10.6
root
là khóa MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=
HOST_PORT_MYSQL
HOST_PORT_MYSQL=3306
PGSQL_SERVER
:PGSQL_SERVER=14-alpine
PGSQL_ROOT_USER
& PGSQL_ROOT_PASSWORD
:PGSQL_ROOT_USER=postgres
PGSQL_ROOT_PASSWORD=
POSTGRES_HOST_AUTH_METHOD
được sử dụng để điều khiển phương thức xác thực khi kết nối đến database.PGSQL_HOST_AUTH_METHOD=trust
Giá trị mặc định là trust cho phép kết nối mà không yêu cầu mật khẩu. Các bạn có thể tìm hiểu thêm về các phương thức xác thực của PostgreSQL tại đây.
HOST_PORT_PGSQL
:HOST_PORT_PGSQL=5432
MONGO_SERVER
:MONGO_SERVER=5.0
HOST_PORT_MONGO
:HOST_PORT_MONGO=27017
Hiện tại Devilbox chỉ hỗ trợ cấu hình nhanh như vậy mà thôi. Muốn thiết lập sâu hơn, các bạn có thể chỉnh sửa trực tiếp tập tin docker-compose.yml
hoặc truy cập vào PHP container và sử dụng Mongo Shell.
REDIS_SERVER
:REDIS_SERVER=6.2-alpine
REDIS_ARGS
hỗ trợ cấu hình Redis khi khởi độngREDIS_ARGS=
Ví dụ để đặt mật khẩu, chúng ta sẽ chỉnh sửa lại như sau:
REDIS_ARGS=--requirepass my_password
Giá trị truyền vào khóa này phải đảm bảo hợp lệ với câu lệnh redis-server
. Các bạn có thể tham khảo thêm tại đây.
HOST_PORT_REDIS
:HOST_PORT_REDIS=6379
Cũng như MongoDB hay các loại database khác. Muốn thiết lập sâu hơn, các bạn có thể chỉnh sửa trực tiếp trong tập tin docker-compose.yml
. Hoặc truy cập vào PHP container và sử dụng giao diện dòng lệnh tương ứng với loại database đó. Ví dụ như Redis là redis-cli
, MySQL là mysql
, PostgreSQL là psql
. Ngoài ra, các bạn còn thấy rằng cổng mặc định của các dịch vụ trên đều là cổng mặc định. Đó là lý do ở các phần đầu tiên, tôi đã yêu cầu chuẩn bị một máy tính chưa từng cài đặt dịch vụ nào để tránh xung đột cổng. Sau khi hiểu được các cấu hình về port này, tôi tin là các bạn đã có thể làm chủ được nó.
OK! Trên đây là một số cấu hình đơn giản. Nếu các bạn muốn tìm hiểu thêm về tập tin này, có thể tham khảo tại đây. Tiếp theo tôi sẽ trình bày một vấn đề rất có thể trong tương lại bạn sẽ gặp phải.
Vấn đề này nói chính xác hơn là đồng bộ quyền giữa môi trường gốc với Docker hay chính là PHP container của Devilbox. Như đã biết, những tập tin trong PHP container (thư mục /shared/httpd
) sẽ ánh xạ lên data dir
của chúng ta. Mà PHP container này lại sử dụng user là devilbox
để vận hành:
Nhưng môi trường gốc thì làm gì có user nào là devilbox
đâu? Ví dụ môi trường của tôi thì là k10n
cơ mà.
Vấn đề sẽ xảy ra khi xây dựng các tính năng upload hoặc ứng dụng có sử dụng PHP-FPM để tạo các tập tin tạm trong thư mục tmp
. Tại sao vậy?
Nói một cách đơn giản, các tập tin và thư mục bên trong PHP container và môi trường gốc thuộc sở hữu của hai user khác nhau, đều này sẽ dẫn đến lỗi Permission Denied khi thao tác do không có quyền. Vậy chúng ta sẽ giải quyết vấn đề này như thế nào?
Rất may là lỗi này ít khi nào xảy ra nếu như môi trường mà bạn sử dụng (trên Linux và MacOS) chỉ có duy nhất một user. Còn nếu vô tình gặp phải, hãy xử lý theo các bước sau:
user id
và group id
của người dùng hiện tại đang sử dụng Devilbox:id -u
id -g
Thông thường giá trị này là 1000
trong hầu hết trường hợp như đã đề cập.
user id
vào khóa NEW_UID
, còn group id
vào khóa NEW_GID
.NEW_UID=1000
NEW_GID=1000
Như bạn thấy đó, các khóa này cũng có giá trị mặc định là 1000
. Đó là lý do vì sao tôi nói lỗi này ít khi xảy ra vì mặc định Devilbox đã cấu hình giúp chúng ta rồi.
Vấn đề này về bản chất là của Docker nên tôi sẽ không trình bày quá chi tiết. Bạn muốn tìm hiểu sâu hơn có thể xem thêm tại đây hoặc tìm hiểu các vấn đề liên quan đến việc vận hành Docker với non-root user.
Quản lý phiên bản ở đây chẳng phải là tính năng gì của Devilbox đâu mà ý tôi chính là cách chúng ta lưu trữ tập tin .env
này vào git
. Do mặc định các dự án sẽ bỏ qua tập tin này vì thường nó chứa các cấu hình nhạy cảm hoặc thông tin của riêng bạn. Cho nên với tình huống này, bạn có thể lợi dụng tính năng symlink mà tôi đã đề cập ở các phần trước.
Nghĩa là bạn sẽ đổi tên tập tin .env
thành bất cứ tên gì và lưu trữ ở đâu đó với git
. Ví dụ như env-laravel
chẳng hạn. Sau đó dùng tính năng symlink và trỏ nó đến thư mục chứa Devilbox. Vậy là xong. Ngoài ra, để chắc chắn rằng tập tin .env
không có vấn đề, bạn hãy vào thư mục chứa Devilbox và thực thi tập tin check-config.sh
:
./check-config.sh
Nếu có bất kỳ vấn đề gì, Devilbox sẽ cho bạn biết ngay bên dưới.
Nội dung về tập tin .env
tạm thời sẽ dừng lại ở đây. Tuy có rất nhiều thứ bên trong tập tin này nhưng với một người vừa tiếp xúc với nó, tôi tin rằng bao nhiêu đây là quá đủ. Bạn có thể tự mình tìm hiểu sâu hơn nếu cảm thấy tự tin.
Đến lúc này, tôi cũng tin rằng bạn đã có thêm một “món đồ chơi” mới cho bộ sưu tập của mình. Và việc xây dựng môi trường phát triển với PHP đã trở nên dễ dàng hơn bao giờ hết. Trong các nội dung tiếp theo, tôi sẽ cập nhật thêm về các vấn đề có thể bạn sẽ gặp phải và hướng giải quyết với Devilbox. Giờ thì hãy tạm thời nghỉ ngơi một chút trước khi tiếp tục.