Hosting WordPress tại nhà với Docker, Docker Compose, Portainer, Caddy, Cloudflare DNS và bảo mật HTTPS.

Estimated read time 8 min read

Hosting WordPress tại nhà với sự kết hợp của Docker, Docker Compose, Portainer, Caddy, và Cloudflare DDNS là một giải pháp mạnh mẽ và linh hoạt. Đặc biệt, việc sử dụng HTTPS đảm bảo an toàn cho trang web của bạn. Hướng dẫn này sẽ chỉ bạn cách thiết lập mọi thứ một cách chi tiết, từ việc cài đặt Docker và Docker Compose, quản lý container với Portainer, cấu hình Caddy để tự động cấp chứng chỉ SSL miễn phí, đến việc sử dụng Cloudflare DNS để quản lý tên miền của bạn. Kết quả là một trang web WordPress an toàn và hiệu quả, chạy trên nền tảng đáng tin cậy.
Giả định là bạn có 1 tên miền trên cloudflare, một đường Internet với router cấu hình được, 1 máy chủ có quyền sudo, đề xuất là Ubuntu 22.04.
Ở đây tôi làm với trang web https://blog.hpradar.com

1. Cài đặt Docker và Docker Compose

Bước 1: Cài đặt Docker
Sử dụng script từ repository chính thức của Docker để cài đặt Docker.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Bước 2: Cài đặt Docker Compose
Cài đặt Docker Compose từ GitHub releases:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Kiểm tra phiên bản Docker Compose:

docker compose version

Xử lý các vấn đề sau khi cài docker
https://docs.docker.com/engine/install/linux-postinstall/
Để tạo nhóm docker và thêm người dùng của bạn:

Tạo nhóm docker.

sudo groupadd docker

Thêm người dùng của bạn vào nhóm docker.

sudo usermod -aG docker $USER

Đăng xuất và đăng nhập lại để quyền thành viên nhóm của bạn được đánh giá lại.

Nếu bạn đang chạy Linux trong một máy ảo, có thể cần phải khởi động lại máy ảo để các thay đổi có hiệu lực.

Bạn cũng có thể chạy lệnh sau để kích hoạt các thay đổi nhóm:

newgrp docker

Xác minh rằng bạn có thể chạy các lệnh docker mà không cần sudo.

docker run hello-world

2. Tạo các thư mục /opt/ cho các ứng dụng

Trước khi cài đặt các dịch vụ, tạo các thư mục /opt/ riêng biệt cho Caddy, WordPress và Cloudflare DDNS trên máy host:

sudo mkdir -p /opt/caddy /opt/wp /opt/clfddns
cd /opt

Tạo docker network tên là wp-network như sau:

docker network create wp-network

3. Cài đặt Portainer để quản lý Docker (option)

Portainer là một công cụ quản lý Docker qua giao diện web. Cài đặt Portainer bằng Docker:

docker volume create portainer_data
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Truy cập Portainer qua trình duyệt tại địa chỉ http://<IP-cua-ban>:9000 và làm theo hướng dẫn để cấu hình ban đầu.

4. Cài đặt Caddy bằng Docker Compose để làm Reverse Proxy

Truy cập vào thư mục caddy, tạo file docker-compose.yml

cd caddy
nano docker-compose.yml

chép vào file docker-compose.yml nội dung sau:

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
      - /opt/caddy:/opt/caddy   # Thêm dòng này
    networks:
      - wp-network
    restart: unless-stopped

networks:
  wp-network:

volumes:
  caddy_data:
  caddy_config:

Tạo file Caddyfile trong thư mục caddy và để trống, chúng ta sẽ cấu hình sau.

nano Caddyfile

Tham khảo https://github.com/ngtrthanh/docker_caddy

Khởi động Caddy:

docker compose up -d
cd ..

5. Cài đặt Cloudflare DNS để trỏ tên miền về router nếu không có IP tĩnh

Truy cập vào thư mục clfddns, tạo file docker-compose.yml

cd clfddns
nano docker-compose.yml

tạo file docker-compose.yml:

services:
  clf-d5-blog:
    image: oznu/cloudflare-ddns:latest
    restart: always
    environment:
      - API_KEY=<global API key của bạn>
      - ZONE=hpradar.com
      - SUBDOMAIN=blog
    volumes:
      - /opt/clfddns:/opt/clfddns
    networks:
      - wp-network

networks:
  wp-network:

Tham khảo https://developers.cloudflare.com/fundamentals/api/get-started/keys/
Khởi động dịch vụ Cloudflare DDNS:

docker compose up -d

6. Chỉnh Port Forwarding trên router về Caddy

Truy cập vào giao diện quản lý của router và tìm mục Port Forwarding hoặc Virtual Server. Tạo các rule để forward cổng 80 và 443 từ router về địa chỉ IP máy chủ Caddy của bạn.

7. Cài đặt WordPress bằng Docker Compose

cd wp, trong đó tạo file docker-compose.yml:

cd wp
nano docker-compose.yml
services:
  wordpress:
    image: wordpress
    restart: always
    hostname: wp
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./wpdata/wordpress:/var/www/html
    networks:
      - wp-network
  db:
    image: mariadb:latest
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_ROOT_PASSWORD: examplerootpass
    volumes:
      - ./wpdata/db:/var/lib/mysql
    networks:
      - wp-network

volumes:
  wordpress:
  db:

networks:
  wp-network:

Khởi động WordPress:

docker compose up -d

8. Chỉnh sửa wp-config.php cho WordPress

Chỉnh sửa /opt/wp/wpdata/wordpress/wp-config.php cho WordPress để hoạt động với Caddy làm reverse proxy. Thêm đoạn mã sau vào sau <?php và trước dòng /* The base configuration for WordPress */:

nano /opt/wp/wpdata/wordpress/wp-config.php
<?php

define('.COOKIE_DOMAIN.', 'blog.hpradar.com');
define('.SITECOOKIEPATH.', '.');

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $list[0];
  }
define( 'WP_HOME', 'https://blog.hpradar.com' );
define( 'WP_SITEURL', 'https://blog.hpradar.com' );
$_SERVER['HTTP_HOST'] = 'blog.hpradar.com';
$_SERVER['REMOTE_ADDR'] = 'https://blog.hpradar.com';
$_SERVER[ 'SERVER_ADDR' ] = 'blog.hpradar.com';

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
       $_SERVER['HTTPS']='on';

/**
 * The base configuration for WordPress
 *

Nhớ thay blog.hpradar.com = tên miền của bạn

9. Cấu hình Caddyfile trỏ tên miền về WordPress

Quay lại thư mục caddy và chỉnh sửa file Caddyfile để trỏ tên miền của bạn về container WordPress:
của tôi là /opt/caddy/Caddyfile

nano /opt/caddy/Caddyfile
{
	email ng.tr.thanh@gmail.com
}


blog.hpradar.com {
	reverse_proxy http://192.168.1.2:8080
}

Hoặc:
lấy tên của WP hostname là wp

{
	email ng.tr.thanh@gmail.com
}


blog.hpradar.com {
	reverse_proxy wp:8080
}

Thay email, tên miền và địa chỉ IP + cổng của WP, lưu ý là file Caddy rất kén việc canh dòng, tab.

10. Khởi động lại Caddy

Khởi động lại Caddy để áp dụng cấu hình mới:

cd ../caddy
docker-compose restart caddy

11. Xong!

Bây giờ bạn đã có một trang web WordPress hoạt động trên máy chủ của mình, được quản lý qua Portainer và bảo vệ bằng Caddy làm reverse proxy. Truy cập vào trang web của bạn bằng tên miền để kiểm tra kết quả.

Nếu vẫn gặp lỗi, bạn có thể kiểm tra log của các container để tìm hiểu thêm về nguyên nhân.

Lưu ý là với phiên bản docker mới nhất, dùng lệnh

docker compose 
# thay cho
docker-compose

# loại bỏ 
version = 3.8

Chúc may mắn.

+ There are no comments

Add yours