Mình đã chia sẻ cách cài đặt WordPress chạy trên nền Caddy Server trong bài viết trước: Cài đặt WordPress chạy trên nền Caddy Server sử dụng Docker Compose. Cách này phù hợp cho các bạn đã thiết lập sẵn Caddy, và muốn dùng Caddy làm reverse proxy cho site WordPress mới.
Bài viết lần này sẽ giới thiệu về wordpress-caddy-docker – repo mình đã thiết lập trên Github giúp đơn giản hoán việc thiết lập một website WordPress chạy trên nền Caddy Server.
Ưu điểm của wordpress-caddy-docker:
- Cài đặt WordPress chạy trên nền Caddy nhanh gọn trong 1′
- Tích hợp sẵn tính năng cài đặt thêm plugins, themes mặc định.
- Tích hợp WP-CLI để quản lý WordPress bằng dòng lệnh.
- Tương thích plugin Cache Enabler.
So với combo ols-docker-env đã chia sẻ trước đây, combo wordpress-caddy-docker mới này giúp việc cài đặt WordPress đơn giản và nhanh gọn hơn rất nhiều.
Mục Lục
I. Tải wordpress-caddy-docker
Clone repo wordpress-caddy-docker từ Github về server của bạn
cd /home
git clone https://github.com/10h30/wordpress-caddy-docker
Code language: Bash (bash)
Truy cập vào thư mục wordpress-caddy-docker
cd ./wordpress-caddy-docker
Code language: Bash (bash)
Cấu trúc thư mục ban đầu sẽ như dưới đây
.
|-- caddy
| `-- Caddyfile
|-- compose.yml
|-- .env
|-- LICENSE
|-- README.md
|-- wordpress
| `-- custom.ini
|-- wp-init.sh
|-- wp-install.sh
`-- wp-uninstall.sh
Code language: JavaScript (javascript)
II. Cấu hình thông số .env
Bạn cần phải thay đổi thông số trong file .env cho phù hợp với nhu cầu sử dụng của mình. Nội dung mặc định như bên dưới:
## Caddy ##
SERVER_NAME = 10h30.net
## WordPress ##
WORDPRESS_DB_USER=siteuser
WORDPRESS_DB_PASSWORD=sitepassword
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_CONFIG_EXTRA=define('WP_REDIS_HOST','redis');
# Website Credentials
WORDPRESS_ADMIN_USER = admin
WORDPRESS_ADMIN_PASSWORD = thuanbuidepchai
WORDPRESS_ADMIN_EMAIL = admin@domain.com
# Blog Settings
WORDPRESS_TITLE = 'Blog Title Here'
WORDPRESS_PERMALINK_STRUCTURE = /%postname%/
WORDPRESS_THEME_TO_INSTALL = "kadence"
WORDPRESS_PLUGINS_TO_INSTALL = "redis-cache cache-enabler seo-by-rank-math"
## MYSQL ##
MYSQL_USER=siteuser
MYSQL_PASSWORD=sitepassword
MYSQL_DATABASE=wordpress
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_RANDOM_ROOT_PASSWORD=1
MARIADB_RANDOM_ROOT_PASSWORD=1
Code language: Nginx (nginx)
Các mục bắt buộc cần phải thay đổi
- Dòng 2 – SERVER_NAME: thay đổi thành tên domain bạn muốn cài đặt WordPres
- Dòng 12-14 – # Website Credentials: thay đổi tên đăng nhập / password / email của tài khoản admin
III. Cài đặt WordPress
Cấp quyền thực thi cho các file .sh có sẵn
find . -type f -iname "*.sh" -exec chmod +x {} \;
Code language: Bash (bash)
Kích hoạt hệ thống
./wp-install.sh
Chờ vài giây để Docker Compose khởi tạo các container cần thiết. Sau đó bạn có thể truy cập vào tên miền đã thiết lập ở bước III để cài đặt WordPress.
Tuy nhiên, bạn có thể cài đặt tự động từ command line bằng cách sử dụng file wp-init.sh
. File này sẽ tự động cấu hình WordPress và cài đặt thêm các plugins và themes cần thiết đã được cấu hình trong file .env
ở bước III
./wp-init.sh
Trong quá trình cài đặt, hệ thống sẽ hỏi bạn có muốn cài đặt thêm plugins và themes không:
Do you want to install recommended plugins? [Y/n]
. Mặc định sẽ cài thêm 3 plugins: Redis Cache, Cache Enabler và Rank Math.Do you want to install recommended theme? [Y/n]
. Mặc định sẽ cài thêm Kadence theme.
Quá trình cài đặt mất khoảng 1-2′. Sau khi cài xong, bạn sẽ thấy hiện ra báo cáo như dưới đây
REPORT
== User List ==
[+] Creating 2/0
✔ Container wordpress-caddy-docker-db-1 Running 0.0s
✔ Container wordpress Running 0.0s
+----+------------+--------------+------------------+---------------------+---------------+
| ID | user_login | display_name | user_email | user_registered | roles |
+----+------------+--------------+------------------+---------------------+---------------+
| 1 | admin | admin | admin@domain.com | 2024-07-08 10:51:12 | administrator |
+----+------------+--------------+------------------+---------------------+---------------+
== Theme List ==
[+] Creating 2/0
✔ Container wordpress-caddy-docker-db-1 Running 0.0s
✔ Container wordpress Running 0.0s
+-------------------+----------+--------+---------+----------------+-------------+
| name | status | update | version | update_version | auto_update |
+-------------------+----------+--------+---------+----------------+-------------+
| kadence | active | none | 1.2.6 | | off |
| twentytwentyfour | inactive | none | 1.1 | | off |
| twentytwentythree | inactive | none | 1.4 | | off |
| twentytwentytwo | inactive | none | 1.7 | | off |
+-------------------+----------+--------+---------+----------------+-------------+
== Plugin List ==
[+] Creating 2/0
✔ Container wordpress-caddy-docker-db-1 Running 0.0s
✔ Container wordpress Running 0.0s
+--------------------+----------+--------+---------+----------------+-------------+
| name | status | update | version | update_version | auto_update |
+--------------------+----------+--------+---------+----------------+-------------+
| akismet | inactive | none | 5.3.2 | | off |
| cache-enabler | active | none | 1.8.15 | | off |
| hello | inactive | none | 1.7.2 | | off |
| seo-by-rank-math | active | none | 1.0.222 | | off |
| redis-cache | active | none | 2.5.2 | | off |
| advanced-cache.php | dropin | none | | | off |
+--------------------+----------+--------+---------+----------------+-------------+
Code language: Nginx (nginx)
Website đã được cài đặt thành công, và đã được kích hoạt dùng theme Kadence và cấu hình sẵn plugin Cache Enabler để tối ưu tốc độ.
Chứng chỉ SSL Let’s Encrypt cho tên miền được Caddy cấu hình tự động nên bạn không cần phải làm thêm gì cả để cấu hình https cho website.
Nếu muốn xóa website vừa tạo, bạn kích hoạt file
./wp-uninstall.sh
rồi cài đặt lại từ đầu từ bước III.
IV. Cấu hình PHP nâng cao
Bạn có thể cấu hình thông số PHP nâng cao bằng cách edit file custom.ini
nano wordpress/custom.ini
Code language: Nginx (nginx)
Sau đó khởi động hệ thống lại bằng lệnh
docker compose restart
Code language: Nginx (nginx)
V. Quản lý WordPress bằng WP-CLI
Mình cũng đã tích hợp sẵn công cụ WP-CLI trong combo này để có thể nhanh chóng quản lý WordPress bằng dòng lệnh.
Ví dụ xem thông tin hệ thống bằng lệnh sau
docker compose run wpcli
Code language: Dockerfile (dockerfile)
Kết quả trả về
OS: Linux 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
Shell:
PHP binary: /usr/local/bin/php
PHP version: 8.2.21
php.ini used:
MySQL binary: /usr/bin/mysql
MySQL version: mysql Ver 15.1 Distrib 10.11.8-MariaDB, for Linux (x86_64) using readline 5.1
SQL modes:
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir: phar://wp-cli.phar/vendor
WP_CLI phar path: /var/www/html
WP-CLI packages dir:
WP-CLI cache dir: /home/www-data/.wp-cli/cache
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.10.0
Code language: YAML (yaml)
Cài đặt thêm plugin bằng lệnh sau (cài đặt plugin Fluent Form)
docker compose run wpcli plugin install fluentform
Code language: Dockerfile (dockerfile)
Kích hoạt plugin vừa cài đặt
docker compose run wpcli plugin activate fluentform
Code language: Dockerfile (dockerfile)
Backup dabatase bằng lệnh sau
docker compose run wpcli db export --add-drop-table
Code language: Dockerfile (dockerfile)
File sql sẽ được lưu trong thư mục wordpress/html
VI. Đánh giá hiệu năng
Mình đã chuyển blog Thuanbui.me này qua chạy trên nền Caddy từ tháng 03/2024. Trước đó blog chạy trên nền OpenLiteSpeed, và trước đó là Nginx.
Mình không có thời gian so sánh trực tiếp hiệu năng của WordPress trên nền Caddy vs OpenLiteSpeed (OLS) vs Nginx. Mình chuyển qua dùng Caddy ban đầu để thử nghiệm, rồi thấy nó hoạt động quá ngon nên xài luôn tới giờ.
Ưu điểm khi dùng Caddy so với OLS và Nginx:
- Tự động thiết lập chứng chỉ Let’s Encrypt SSL cho tên miền. Không cần phải cài đặt và cấu hình gì thêm rắc rối như khi dùng Nginx hay OLS
- Cài đặt nhanh gọn (khi sử dụng repo wordpress-caddy-docker mình đã cấu hình sẵn). Chỉ mất chưa tới 5′ là website đã sẵn sàng.
- Kết hợp với plugin Cache Enabler (miễn phí) để tạo cache, cải thiện tốc độ tải trang cho website. Plugin này đơn giản, dễ sử dụng hơn hẳn so với plugin LiteSpeed Cache.
Hướng dẫn trong bài viết này chỉ áp dụng khi bạn chỉ cài đặt duy nhất 1 website trên server. Nếu muốn cài đặt nhiều website, bạn cần tùy chỉnh lại cấu trúc thư mục, đồng thời phải cấu hình lại file compose.yml
và Caddyfile
cho phù hợp.
Mình đang thiết lập 2 website: blog Thuanbui.me này và blog Yeuchaybo.com trên cùng 1 server, và cấu hình thư mục như bên dưới
├── caddy
│ ├── Caddyfile
│ ├── caddy_config
│ ├── caddy_data
│ └── compose.yml
├── thuanbui.me
│ ├── compose.yml
│ ├── conf
│ ├── dbdata
│ └── html
└── yeuchaybo.com
├── compose.yml
├── conf
├── dbdata
└── html
Code language: CSS (css)
Khi nào rãnh mình sẽ hướng dẫn cách cấu hình Caddy làm server cho nhiều website WordPress trên cùng 1 server sau.
Chúc bạn cài đặt thành công!
Cảm ơn anh đã chia sẻ!!!
Cho em hỏi chút là thằng ssh của synology nas hình như không cho chạy .sh file, cho em hỏi làm thế nào để khai báo các thứ trong file wp-init.sh vào cấu hình ạ
SSH của Synology chạy .sh file bình thường mà. Cái wordpress-caddy-docker này không chạy được do trong cái file .sh dùng lệnh
docker compose
chỉ tương thích với Docker v2 trở lên. Còn Docker trên Synology là v1 nên em cần phải vô sửa thànhdocker-compose
mới chạy được.e đã chuyển toàn bộ các lệnh docker compose trong các file .sh thành docker-compose rồi. nhưng khi gõ lệnh .sh thì toàn bị báo là:
wp-install.sh
-ash: wp-install.sh: command not found
Mong a chỉ, e đang dùng NAS DS220+ DSM 7
Toàn cứ hỏi a xong thì lại tìm ra cách, e thêm bash trước lệnh sh là lại dùng được rồi ạ, thx anh
Thường thì chỉ cần gõ ./file.sh là được. Phải có ./ mới được
Anh ơi e đã cài thành công rồi, kết hợp 2 bài vì:
1. caddy e đã cài sẵn nên e dùng lại caddy đã cài đó
2. E đã chỉnh lại nội dung các file của a để loại bỏ caddy cũ đi, tuy nhiên trong quá trình cài file ini.sh thì bị một lỗi như sau:
[17-Jul-2024 11:41:31 UTC] PHP Warning: Undefined array key “HTTP_HOST” in /var/www/html/wp-includes/functions.php on line 6298
Warning: Undefined array key “HTTP_HOST” in /var/www/html/wp-includes/functions.php on line 6298
3. Em muốn đặt hẳn một folder làm host để nhận các file web sau này thì cấu hình Caddy như thế nào ạ
2. Cái thông báo kia không phải lỗi, nó chỉ là cảnh báo khi cài đặt bằng WP-CLI, có thể bỏ qua nhé.
3. Anh không hiểu ý này nhé. Nếu em muốn caddy luôn hiện ra trang mặc định nào đó cho tất cả các domain trỏ về IP của Caddy thì có thể thiết lập 1 block trong Caddyfile, khai báo đại loại như sau
:80 {
respond “Hello”
}
ý 3 của em là, ở web station trong synology khi cài nó ra folder web, ném tất cả code hoặc các trang html vào đó thì mình có thể truy cập bằng domain.com/tên trang.html đến được.
Caddy server có thể set một folder cố định kiểu đó để nhét những code mình làm hoặc trang chủ lên đó để chạy không anh!
Cái này a đã trả lời ở đây: https://thuanbui.me/caddy-server/#comment-1536
PHP trên Caddy Server thì có thể tham khảo FrankenPHP.
Em có một thỉnh cầu mong anh có thể làm kèm gói myphpadmin vào không ạ? kết hợp cũng wordpress + caddy và phpmyadmin
Em xem ở đây: https://github.com/10h30/wordpress-caddy-docker/blob/main/compose.yml . Bỏ # ở phần khai báo phpmyadmin đi để kích hoạt container phpmyadmin
Dạ anh,
Em có làm được rồi mà em không thể dùng account root để đăng nhậpmysql ở docker hay đăng nhập bằng myphpadmin bằng root,
Thực ra em đang cố gắng đẩy 1 cái theme vào, nhưng cố gắng vào quyền quản trị để tạo db : siteuser thì có thể vào được nhưng không có quyền nào cả,
Anh có thể giải thích giúp em 2 dòng
MYSQL_RANDOM_ROOT_PASSWORD=1
MARIADB_RANDOM_ROOT_PASSWORD=1
ở file .env được không ạ ?
Em cũng đã thử nhiều cách thêm vào
MYSQL_ROOT_PASSWORD=rootpassword
nhưng k chạy được ạ. ^^
Lần nữa cám ơn anh .
Hai dòng *RANDOM_ROOT* đó để mysql / mariadb tự động tạo password bất kỳ cho root user. Nhưng do mình đã set thông số root password trong file .env rồi nên 2 dòng đó không có tác dụng. Thông số MYSQL_ROOT_PASSWORD phải được set từ ban đầu khi khởi tạo container thì nó mới có tác dụng. Mình đã thử và thấy login vào bằng tài khoản root / pass: rootpassword bình thường.
dạ anh
đây là lỗi hiện ra khi em cố gắng login tại web phpmyadmin ạ :
mysqli::real_connect(): (HY000/1045): Access denied for user ‘root’@’172.18.0.2’ (using password: YES)
chắc em lỗi đâu đó, nhưng nghe anh bảo em cũng làm mà không thể nào vào thành công ^^
Chào anh! Chúc anh một buổi tối tốt lành, anh cho em hỏi chút ạ!! Trong theme kadence này thì làm sao để đưa một ảnh ra làm ảnh bìa phía trên tiêu đề và một chút thông tin của bài viết như của anh ạ
Vào customizer để chỉnh nhé.
Cho mình hỏi dùng cái này muốn thêm site 2, 3 thì làm thế nào vậy bạn? Mình muốn chạy nhiều site trên 1 vps
Muốn cài 2-3 sites thì bạn phải tùy biến lại cấu hình caddy tương tự như hướng dẫn này: https://thuanbui.me/cau-hinh-caddy-reverse-proxy-cho-homelab
Em đã cài đặt theo hướng dẫn, nhưng khi truy cập vào web thì chỉ thấy hiện “This domain has recently been registered with Namecheap”.
Cần chỉnh DNS của tên miền trỏ về IP của server nhé.
Chào anh, chúc anh nhiều sức khoẻ.
Anh cho em hỏi chút là cài xong rồi, sau này em muốn đổi domain của site thì làm cách nào vậy anh.
Với lại khi em cần backup dữ liệu để mang sang vps khác thì cách làm như thế nào ạ
Để đổi domain sang tên miền khác thì em cần thao tác 2 bước:
1. Đổi thông số SERVER_NAME = trong file .env qua tên miền mới
2. Sử dụng WP-CLI, dùng lệnh này để thay đổi tên miền cũ qua tên miền mới trong database của WordPress
wp search-replace 'http://tenmiencu.com' 'http://tenmienmoi.com' --recurse-objects --skip-columns=guid --skip-tables=wp_users
Khi cần mang qua VPS thì chỉ cần chạy docker compose down cho ngưng toàn bộ, rysnc qua server mới. Rồi docker compose up -d lại là xong
Dạ em hiểu rồi ạ.
Em vừa mới thử cài theo cách của anh trên VPS của em thì em nhận được thông báo là {/home/wordpress-caddy-docker/compose.yml: the attribute `version` is obsolete, it will be ig nored, please remove it to avoid potential confusion}
Em có tra google nhưng vẫn chưa hiểu và tìm ra cách giải quyết ạ
Cái thông số version đó cần khai báo ở các phiên bản Docker cũ. Các phiên bản mới giờ không cần khai báo nữa, em có thể để nguyên không ảnh hưởng gì hoặc có thể bỏ dòng đó đi.
Anh cũng đã cập nhật lại code trên github
Làm theo cách này tên miền cần trỏ về IP của server trước, chỉnh ấu hình code, sau đó dùng reverse proxy để trỏ đúng ip-lan đang cài code. sau đó mới tiến hành cài đặt. Có phải vậy không anh?
Đúng rồi nhé.
dạ em cám ơn