Nguồn : KazeWP
A) CÀI ĐẶT WORDPRESS
1) Chuẩn bị Proxmox / LXC Ubuntu 24.04
Cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y
Cài mấy gói cơ bản:
sudo apt install -y ca-certificates curl gnupg git openssl
Nếu đang bật UFW thì mở port web + SSH:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
sudo ufw status
Lý do mở 443/udp là để Caddy có thể phục vụ HTTP/3 nếu cấu hình/container dùng đến.
2) Cài Docker Engine chuẩn trên Ubuntu 24.04
Chạy lần lượt:
sudo apt remove -y docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc || true
Thêm key và repo Docker:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cài Docker + Compose plugin:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kiểm tra:
sudo docker version
sudo docker compose version
Các bước này bám theo hướng dẫn cài Docker Engine trên Ubuntu và Compose plugin chính thức.
3) Cho user chạy Docker không cần sudo
sudo usermod -aG docker $USER
newgrp docker
Test:
docker ps
Nếu chưa ăn ngay thì logout/login lại SSH một lần.
4) Trỏ domain về VPS
Ví dụ bạn muốn dựng site blog.example.com thì phải tạo bản ghi DNS A hoặc AAAA trỏ về IP máy Ubuntu trước. Caddy chỉ auto HTTPS ngon khi domain public trỏ đúng về máy và máy mở cổng 80/443.
Check nhanh:
ping blog.example.com
IP trả về phải là IP Proxmox của bạn.
5) Clone KazeWP
cd /opt
sudo git clone https://github.com/10h30/kazewp.git
sudo chown -R $USER:$USER /opt/kazewp
cd /opt/kazewp
chmod +x kazewp.sh
find . -type f -name "*.sh" -exec chmod +x {} \;
6) Chạy KazeWP lần đầu
Repo hỗ trợ 2 kiểu:
- chạy menu tương tác:
./kazewp.sh - chạy thẳng:
./kazewp.sh install <domain>
./kazewp.sh install blog.example.com
Trong lúc cài, script sẽ hỏi các thông tin kiểu:
- domain
- email admin
- username admin
- password admin
- site title
Theo mô tả repo, KazeWP sẽ tự:
- tạo site WordPress riêng trong container,
- tạo database MariaDB riêng,
- cấu hình Caddy reverse proxy,
- dùng Bash để tự động hóa tạo/xóa/list site
7) Sau khi install xong, kiểm tra container
Xem container đang chạy:
docker ps
docker logs <ten-container> --tail 100
Nếu KazeWP dựng thành công, bạn sẽ có ít nhất các phần kiểu:
- Caddy
- WordPress container cho domain
- MariaDB riêng cho domain
8) Truy cập domain để hoàn tất / kiểm tra
Mở trình duyệt:
https://blog.example.com
9) Các lệnh quản lý hằng ngày
./kazewp.sh list
./kazewp.sh stop blog.example.com
./kazewp.sh start blog.example.com
./kazewp.sh restart blog.example.com
./kazewp.sh delete blog.example.com
./kazewp.sh delete all
10) Bộ lệnh full, copy-paste
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg git openssl
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
sudo apt remove -y docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc || true
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
cd /opt
sudo git clone https://github.com/10h30/kazewp.git
sudo chown -R $USER:$USER /opt/kazewp
cd /opt/kazewp
chmod +x kazewp.sh
find . -type f -name "*.sh" -exec chmod +x {} \;
./kazewp.sh install blog.example.com
B) Thêm DNS cho web mới trên Cloudflare
Trường hợp thêm subdomain blog.example.com
Vào Cloudflare > DNS > Add record:
- Type:
A - Name:
blog - IPv4 address:
99.199.199.238(ip wan) - Proxy status: DNS only
- TTL:
Auto
Kiểm tra DNS đã ăn chưa
Trên Ubuntu hoặc máy khác, chạy:
nslookup blog.example.com
Phải ra:
99.199.199.238
D. Cài thêm web mới
SSH vào Ubuntu:
cd /opt/kazewp
./kazewp.sh install blog.example.com
Sau đó script sẽ hỏi các thông tin như:
- domain
- admin username
- admin password
- admin email
- site title
Sau khi cài xong, kiểm tra container
docker ps --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}"
Tiếp tục xem danh sách site:
cd /opt/kazewp
./kazewp.sh list
C) DDNS cho Cloudflare cho WAN IP trên Mikrotik
1) Lấy thông tin cần thiết từ Cloudflare
Bạn cần 4 thứ:
A. API Token
Vào Cloudflare tạo API Token mới với quyền:
Zone - DNS - EditZone - Zone - Read
Scope:
- chỉ đúng zone (blog.example.com)
Không dùng Global API Key nếu không cần.
B. Record ID
Hai cái này lấy bằng API.
Bạn thay:
YOUR_TOKENYOUR_ZONE_ID
curl -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records?type=A" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json"
Cách lấy zone_id và record_id
Có thể dùng 2 lệnh này trên Ubuntu/Windows có curl:
Lấy zone:
curl -X GET "https://api.cloudflare.com/client/v4/zones?name=blog.example.com" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json"
Lấy record:
curl -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records?type=A&name=blog.example.com" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json"
2) Tạo script update Cloudflare trên MikroTik
Vào:
System → Scripts → Add
Đặt tên:cf-ddns-website
Nội dung script này:
:local cfToken "PASTE_CLOUDFLARE_API_TOKEN_HERE"
:local zoneId "PASTE_ZONE_ID_HERE"
:local recordRoot "PASTE_RECORD_ID_TYANX_COM_HERE"
:local recordWww "PASTE_RECORD_ID_WWW_HERE"
:local rootName "tyanx.com"
:local wwwName "www.tyanx.com"
:local wanIP ""
:local ddnsHost "hg309kheq7q.sn.mynetname.net"
# Lay IP public tu DDNS hostname cua MikroTik
:do {
:set wanIP [:resolve $ddnsHost]
} on-error={
:log error "CF-DDNS: khong resolve duoc DDNS hostname"
:error "resolve failed"
}
:if ([:len $wanIP] = 0) do={
:log error "CF-DDNS: WAN IP rong"
:error "empty wan ip"
}
:global lastCloudflareIP
:if ($lastCloudflareIP = $wanIP) do={
:log info ("CF-DDNS: IP khong doi, bo qua: " . $wanIP)
:return
}
:local urlRoot ("https://api.cloudflare.com/client/v4/zones/" . $zoneId . "/dns_records/" . $recordRoot)
:local urlWww ("https://api.cloudflare.com/client/v4/zones/" . $zoneId . "/dns_records/" . $recordWww)
:local headers ("Authorization: Bearer " . $cfToken . ",Content-Type: application/json")
:local bodyRoot ("{\"type\":\"A\",\"name\":\"" . $rootName . "\",\"content\":\"" . $wanIP . "\",\"ttl\":1,\"proxied\":false}")
:local bodyWww ("{\"type\":\"A\",\"name\":\"" . $wwwName . "\",\"content\":\"" . $wanIP . "\",\"ttl\":1,\"proxied\":false}")
:do {
/tool fetch url=$urlRoot http-method=put http-header-field=$headers http-data=$bodyRoot output=none
/tool fetch url=$urlWww http-method=put http-header-field=$headers http-data=$bodyWww output=none
:set lastCloudflareIP $wanIP
:log info ("CF-DDNS: da cap nhat Cloudflare -> " . $wanIP)
} on-error={
:log error "CF-DDNS: loi khi goi Cloudflare API"
}
Chạy test ngay
/system script run cf-ddns-website
3) Tạo scheduler chạy tự động
Vào:
System → Scheduler → Add
Đặt như này:
- Name:
cf-ddns-website-scheduler - Interval:
00:05:00 - On Event:
/system script run cf-ddns-website
Như vậy cứ 5 phút router sẽ check 1 lần.
Muốn nhanh hơn có thể để 00:01:00.
Chạy test ngay
nslookup blog.example.com
nslookup www.blog.example.com
Như vậy là đã xong !