Một số tùy chỉnh với Devilbox

Đây là phần thứ 13 trong tổng số 13 phần thuộc loạt bài nói về Devilbox

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 đó.

Cấu trúc thư mục dự án trong Devilbox

├── 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 pathdevilboxNơi chứa mã nguồn Devilbox
vhost-gen template directorycfg/vhost-genNơi chứa virtual host template ở mức global
data directoryprojectsNơi chứa toàn bộ dự án
project directorylaravelTên dự án
project template directory.devilboxNơi chứa virtual host template hoặc cấu hình backend ở mức project
docroot directorypublicNơi dự án chứa các tập tin có thể truy cập trực tiếp từ bên ngoài
domainlaravel.dvl.toTên miền của dự án
domain suffixdvl.toHậ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 dirdocroot 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ờ.

Thay đổi hậu tố tên miền

Đâ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:

  • Không sử dụng giá trị 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.
  • Không nên dùng giá trị là 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 Documentationdraft-west-let-localhost-be-localhost-06 (ietf.org)
  • Không nên dùng các giá trị là các top level domain như 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ỡ!

Thay đổi thư mục chứa cấu hình web server

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

Thay đổi cấu hình cho cơ sở dữ liệu

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, usernamepassword. Dưới đây chi tiết là từng loại cơ sở dữ liệu

MySQL

  1. Phiên bản sử dụng khóa MYSQL_SERVER
MYSQL_SERVER=mariadb-10.6
  1. Mật khẩu cho tài khoản root là khóa MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=
  1. Port sẽ là khóa HOST_PORT_MYSQL
HOST_PORT_MYSQL=3306

PostgreSQL

  1. Khóa cho phiên bản là PGSQL_SERVER:
PGSQL_SERVER=14-alpine
  1. Thông tin tài khoản root lần lượt là các khóa PGSQL_ROOT_USER & PGSQL_ROOT_PASSWORD:
PGSQL_ROOT_USER=postgres
PGSQL_ROOT_PASSWORD=
  1. Ngoài ra còn có thêm khóa 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.

  1. Port sẽ là khóa HOST_PORT_PGSQL:
HOST_PORT_PGSQL=5432

MongoDB

  1. Phiên bản của Mongo sẽ là khóa MONGO_SERVER:
MONGO_SERVER=5.0
  1. Port sẽ là khóa 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

  1. Phiên bản sẽ tương ứng với khóa REDIS_SERVER:
REDIS_SERVER=6.2-alpine
  1. Khóa REDIS_ARGS hỗ trợ cấu hình Redis khi khởi động
REDIS_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.

  1. Port sẽ là khóa 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ư Redisredis-cli, MySQLmysql, PostgreSQLpsql. 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.

Đồng bộ quyền giữa môi trường gốc và Devilbox

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:

  1. Tại môi trường gốc, tìm user idgroup 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.

  1. Thay thế giá trị 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 cho tập tin .env

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.

Kết luận

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.

© 2024 - 2025
Khuyên Nguyễn
Made with in CT