Ghost là một nền tảng blog mã nguồn mở giúp bạn tạo blog trông chuyên nghiệp. Nó được ra mắt vào năm 2013 như một giải pháp thay thế cho WordPress vì nó quá phức tạp. Ghost được viết bằng JavaScript và được hỗ trợ bởi Node.js.
Trong hướng dẫn này, chúng ta sẽ khám phá cách cài đặt Ghost CMS bằng Docker trên máy chủ chạy Ubuntu 20.04. Chúng tôi cũng sẽ sử dụng Nginx làm proxy và chứng chỉ SSL Let's Encrypt để bảo mật cài đặt của mình.
Kiểm tra xem tường lửa có đang chạy không.
Bạn sẽ nhận được kết quả sau.
Cho phép cổng SSH để tường lửa không làm gián đoạn kết nối hiện tại khi bật nó.
Cũng cho phép các cổng HTTP và HTTPS.
Bật Tường lửa
Kiểm tra lại trạng thái của tường lửa.
Bạn sẽ thấy kết quả tương tự.
Để cài đặt Certbot, chúng ta sẽ sử dụng trình cài đặt gói Snapd. Kho lưu trữ chính thức của Certbot đã không còn được sử dụng nữa và gói Certbot của Ubuntu đã hơn một năm tuổi. Snapd luôn mang theo phiên bản ổn định mới nhất của Certbot và bạn nên sử dụng phiên bản đó. May mắn thay, Ubuntu 20.04 đi kèm Snapd được cài đặt sẵn.
Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Xóa mọi phiên bản cũ của Certbot.
Cài đặt Certbot.
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot có thể chạy được bằng cách tạo liên kết tượng trưng đến thư mục
Tạo SSL chứng chỉ.
Lệnh trên sẽ tải chứng chỉ xuống thư mục
Cài đặt một số gói cần thiết để Docker chạy.
Thêm khóa GPG chính thức của Docker.
Thêm kho lưu trữ chính thức của Docker.
Cập nhật kho lưu trữ hệ thống.
Cài đặt phiên bản mới nhất của Docker Engine.
Xác minh rằng Docker Engine đang chạy và được cài đặt đúng cách.
Theo mặc định, Docker yêu cầu sudo để chạy. Để giải quyết vấn đề đó, chúng ta có thể thêm tài khoản người dùng hiện tại vào nhóm người dùng
Để áp dụng tư cách thành viên nhóm mới, hãy đăng xuất và đăng nhập lại hoặc sử dụng lệnh sau.
Bây giờ, bạn có thể chạy lệnh docker mà không cần sử dụng sudo.
Tiếp theo, hãy tải xuống bản phát hành ổn định hiện tại của Docker compose.
Tại thời điểm viết hướng dẫn này, 1.28.6 là phiên bản mới nhất phiên bản Docker compose. Bạn luôn có thể thay đổi hoặc chọn phiên bản khác trong lệnh bằng cách kiểm tra từ Trang phát hành Github của Docker compose.
Áp dụng quyền thực thi cho phiên bản Docker compose đã cài đặt.
Kiểm tra cài đặt.
Tạo một tệp có tên
Dán mã sau vào tệp. Thay thế
Tệp Docker compose tạo một vài điểm gắn kết, tức là nó ánh xạ một số thư mục nhất định trên máy chủ tới các thư mục bên trong vùng chứa.
Tạo các thư mục cho tất cả các bind mount được mô tả ở trên (trừ
Tạo một thư mục cho hình ảnh này trong thư mục hiện tại.
Tạo một tệp có tên Dockerfile trong thư mục này.
Dán mã sau vào
Đoạn mã trên hướng dẫn Docker sử dụng hình ảnh Nginx mới nhất. Nó cũng xóa tệp cấu hình Nginx mặc định và sao chép tệp cấu hình tùy chỉnh mà chúng tôi đã tạo cho Ghost CMS của mình.
Tạo một tệp có tên
Dán mã sau vào tệp
Cấu hình trên sẽ chuyển hướng tất cả các yêu cầu HTTP sang HTTPS và sẽ đóng vai trò là proxy cho dịch vụ Ghost để phục vụ dịch vụ này thông qua tên miền của bạn.
Bây giờ, bạn có thể xác minh cài đặt của mình bằng cách mở
Nếu trang web của bạn không hiển thị trong trình duyệt, bạn cần xem lại nhật ký Docker. Để thực hiện điều đó, trước tiên hãy đóng container của bạn.
Chạy Docker compose ở trạng thái được đính kèm để xem nhật ký do từng container tạo ra.
Để đóng container và quay lại dấu nhắc bash, hãy nhấn
Tại đây, bạn sẽ được yêu cầu tạo tài khoản Quản trị viên và chọn tiêu đề blog.
Bạn cũng có thể mời thêm nhân viên hoặc cộng tác viên cho blog của mình, bạn cũng có thể thực hiện sau nếu muốn bỏ qua ngay bây giờ.
Khi kết thúc quá trình thiết lập, bạn sẽ thấy bảng Quản trị của Ghost.
Nếu muốn chuyển sang chế độ tối, bạn có thể thực hiện bằng cách nhấp vào công tắc chuyển đổi bên cạnh nút bánh răng cài đặt ở cuối trang cài đặt.
Bạn sẽ thấy một số bài đăng mặc định về cơ bản là hướng dẫn giúp bạn điều hướng và sử dụng Ghost. Bạn có thể hủy xuất bản hoặc xóa chúng và bắt đầu đăng.
Để cập nhật, bạn cần tắt vùng chứa của mình, kéo lên các hình ảnh mới nhất rồi chạy lại vùng chứa.
Mở Crontab trong trình soạn thảo của bạn.
Dán dòng sau vào cuối, Certbot sẽ chạy lúc 11 giờ tối hàng ngày. Thay
Chạy lúc 11 giờ tối hàng ngày không có nghĩa là chứng chỉ của bạn sẽ được gia hạn hàng ngày vì Certbot sẽ chỉ gia hạn chứng chỉ của bạn nếu ngày hết hạn của chứng chỉ đó nằm trong vòng 30 ngày. Chạy lệnh này mỗi đêm sẽ cho tập lệnh một số cơ hội để thử trước khi hết hạn.
Lệnh trên cũng sẽ khởi động lại máy chủ Nginx bên trong vùng chứa Docker sau khi gia hạn thành công.
Bạn có thể kiểm tra cronjob bằng tùy chọn
Trong hướng dẫn này, chúng ta sẽ khám phá cách cài đặt Ghost CMS bằng Docker trên máy chủ chạy Ubuntu 20.04. Chúng tôi cũng sẽ sử dụng Nginx làm proxy và chứng chỉ SSL Let's Encrypt để bảo mật cài đặt của mình.
Điều kiện tiên quyết
-
Máy chủ chạy Ubuntu 20.04.
-
Người dùng sudo không phải root.
-
Đảm bảo mọi thứ đã được cập nhật.
Mã:
$ sudo apt update$ sudo apt upgrade
Bước 1 - Cấu hình Tường lửa UFW
Bước đầu tiên là cấu hình tường lửa. Ubuntu mặc định có ufw (Uncomplicated Firewall).Kiểm tra xem tường lửa có đang chạy không.
Mã:
$ sudo ufw status
Mã:
Trạng thái: không hoạt động
Mã:
$ sudo ufw allow OpenSSH
Mã:
$ sudo ufw allow 80$ sudo ufw allow 443
Mã:
$ sudo ufw enableLệnh có thể làm gián đoạn các kết nối ssh hiện có. Tiến hành thao tác (y|n)? yTường lửa đang hoạt động và được bật khi khởi động hệ thống
Mã:
$ sudo ufw status
Mã:
Trạng thái: đang hoạt độngĐến Hành động Từ-- ------ ----OpenSSH ALLOW Anywhere80 ALLOW Anywhere443 ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)80 (v6) ALLOW Anywhere (v6)443 (v6) ALLOW Anywhere (v6)
Bước 2 - Cài đặt Certbot và lấy chứng chỉ SSL
Trước khi tiến hành, chúng ta cần cài đặt công cụ Certbot và cài đặt chứng chỉ SSL cho tên miền của mình.Để cài đặt Certbot, chúng ta sẽ sử dụng trình cài đặt gói Snapd. Kho lưu trữ chính thức của Certbot đã không còn được sử dụng nữa và gói Certbot của Ubuntu đã hơn một năm tuổi. Snapd luôn mang theo phiên bản ổn định mới nhất của Certbot và bạn nên sử dụng phiên bản đó. May mắn thay, Ubuntu 20.04 đi kèm Snapd được cài đặt sẵn.
Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core$ sudo snap refresh core
Mã:
$ sudo apt remove certbot
Mã:
$ sudo snap install --classic certbot
/usr/bin
.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Mã:
$ sudo certbot certonly --standalone -d example.com
/etc/letsencrypt/live/example.com
trên máy chủ của bạn.Bước 3 - Cài đặt Docker và Docker Compose
Bước đầu tiên là cài đặt Docker Engine và Docker Compose. Trước tiên, hãy gỡ cài đặt mọi phiên bản Docker cũ.
Mã:
$ sudo apt remove docker docker-engine docker.io containerd runc
Mã:
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
Mã:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Mã:
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Mã:
$ sudo apt update
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io
Mã:
$ sudo docker run hello-world
docker
.
Mã:
$ sudo usermod -aG docker ${USER}
Mã:
$ su - ${USER}
Tiếp theo, hãy tải xuống bản phát hành ổn định hiện tại của Docker compose.
Mã:
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Áp dụng quyền thực thi cho phiên bản Docker compose đã cài đặt.
Mã:
$ sudo chmod +x /usr/local/bin/docker-compose
Mã:
$ docker-compose --versiondocker-compose phiên bản 1.28.6, bản dựng 5db8d86f
Bước 4 - Cài đặt Ghost
Cài đặt Ghost sẽ bao gồm ba thành phần - Gói Ghost, máy chủ cơ sở dữ liệu như MySQL và máy chủ web (Nginx). Tất cả các dịch vụ này có thể được cài đặt bằng một tệp Docker compose duy nhất.Tạo tệp Docker Compose
Trước tiên, hãy tạo một thư mục để lưu trữ và khởi chạy tệp Docker compose của bạn.
Mã:
$ mkdir ghost && cd ghost
docker-compose.yml
và mở tệp đó bằng trình soạn thảo Nano.
Mã:
$ nano docker-compose.yml
example.com
bằng tên miền của bạn và chèn mật khẩu cơ sở dữ liệu vào vị trí giá trị your_password
. Giữ nguyên các giá trị cho database__connection__password
và MYSQL_ROOT_PASSWORD
. Thay thế
bằng tên người dùng máy chủ của bạn.
Mã:
version: '3.3'services: ghost: image: ghost:latest restart: always depends_on: - db environment: url: https://example.com database__client: mysql database__connection__host: db database__connection__user: ghost database__connection__password: ghostdbpass database__connection__database: ghostdb mail__transport: SMTP mail__options__host: {Máy chủ dịch vụ thư của bạn} mail__options__port: {Cổng dịch vụ thư của bạn} mail__options__secureConnection: {true/false} mail__options__service: {Dịch vụ thư của bạn} mail__options__auth__user: {Tên người dùng của bạn} mail__options__auth__pass: {Mật khẩu của bạn} volumes: - /home//ghost/content:/var/lib/ghost/content db: image: mariadb:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_mysql_root_password MYSQL_USER: ghost MYSQL_PASSWORD: ghostdbpass MYSQL_DATABASE: ghostdb volumes: - /home//ghost/mysql:/var/lib/mysql nginx: build: context: ./nginx dockerfile: Dockerfile restart: always depends_on: - ghost ports: - "80:80" - "443:443" volumes: - /etc/letsencrypt/:/etc/letsencrypt/ - /usr/share/nginx/html:/usr/share/nginx/html
- Tệp
/var/lib/ghost/content
và Các thư mục/var/lib/mysql
bên trong vùng chứa của bạn được ánh xạ tới/home//ghost/content
và/home//ghost/mysql
trên máy chủ. - Nginx sử dụng liên kết
/etc/letsencrypt/
để truy cập chứng chỉ Let's Encrypt từ máy chủ. - Nginx cũng cần truy cập vào thư mục người dùng
/usr/share/nginx/html
để có thể truy cập các tệp Let's Encrypt Challenge cho chứng chỉ.
Tạo các thư mục cho tất cả các bind mount được mô tả ở trên (trừ
/etc/letsencrypt
, đã được tạo khi chúng ta tạo chứng chỉ trước đó)
Mã:
$ cd ~/ghost$ mkdir content$ mkdir mysql$ sudo mkdir -p /usr/share/nginx/html
Tạo Nginx Docker Image
Tệp Docker compose mà chúng ta đã tạo dựa trên Nginx Docker image. Để làm cho nó hoạt động, chúng ta cần bao gồm một tệp cấu hình tùy chỉnh cho Nginx sẽ hoạt động với Ghost.Tạo một thư mục cho hình ảnh này trong thư mục hiện tại.
Mã:
$ mkdir nginx
Mã:
$ touch nginx/Dockerfile
Dockerfile
.
Mã:
FROM nginx:latestRUN rm /etc/nginx/conf.d/default.confCOPY ghost.conf /etc/nginx/conf.d
Tạo một tệp có tên
ghost.conf
trong thư mục nginx
.
Mã:
$ touch nginx/ghost.conf
ghost.conf
. Thay thế tất cả các trường hợp của example.com
bằng tên miền của bạn.
Mã:
server { listen 80; listen [::]:80; server_name example.com; # Hữu ích cho Let's Encrypt location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; } location / { return 301 https://$server_name$request_uri; }}máy chủ { lắng nghe 443 ssl http2; lắng nghe [::]:443 ssl http2; tên máy chủ example.com; nhật ký truy cập /var/log/nginx/ghost.access.log; nhật ký lỗi /var/log/nginx/ghost.error.log; kích thước thân máy khách tối đa 20m; giao thức ssl TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers bật; ssl_session_timeout 1 ngày; ssl_session_cache chia sẻ:SSL:10 phút; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; vị trí / { proxy_set_header Máy chủ $http_host; proxy_set_header X-Địa chỉ IP thực $remote_addr; proxy_set_header X-Giao thức chuyển tiếp https; proxy_set_header X-Chuyển tiếp cho $proxy_add_x_chuyển tiếp cho; proxy_pass http://ghost:2368; }}
Bước 5 - Chạy Site
Chạy lệnh sau từ thư mụcghost
để khởi động dịch vụ Ghost.
Mã:
$ docker-compose up -d
https://example.com
trong trình duyệt web của mình. Docker có thể mất vài phút để khởi động tất cả các dịch vụ, vì vậy bạn có thể cần làm mới nếu không thấy blog của mình ngay lập tức.Nếu trang web của bạn không hiển thị trong trình duyệt, bạn cần xem lại nhật ký Docker. Để thực hiện điều đó, trước tiên hãy đóng container của bạn.
Mã:
$ cd ghost$ docker-compose down
Mã:
$ docker-compose up
CTRL+C
. Sau khi hoàn tất quá trình khắc phục sự cố, bạn có thể chạy lại container và blog của bạn sẽ hiển thị lần này.Bước 6 - Hoàn tất thiết lập
Để hoàn tất quá trình thiết lập blog Ghost của bạn, hãy truy cậphttps://example.com/ghost
trong trình duyệt của bạn. Phần /ghost
bổ sung ở cuối tên miền blog của bạn sẽ chuyển hướng bạn đến Bảng điều khiển quản trị của Ghost hoặc trong trường hợp này là thiết lập vì đây là lần đầu tiên bạn truy cập vào đó.Tại đây, bạn sẽ được yêu cầu tạo tài khoản Quản trị viên và chọn tiêu đề blog.
Bạn cũng có thể mời thêm nhân viên hoặc cộng tác viên cho blog của mình, bạn cũng có thể thực hiện sau nếu muốn bỏ qua ngay bây giờ.
Khi kết thúc quá trình thiết lập, bạn sẽ thấy bảng Quản trị của Ghost.
Nếu muốn chuyển sang chế độ tối, bạn có thể thực hiện bằng cách nhấp vào công tắc chuyển đổi bên cạnh nút bánh răng cài đặt ở cuối trang cài đặt.
Bạn sẽ thấy một số bài đăng mặc định về cơ bản là hướng dẫn giúp bạn điều hướng và sử dụng Ghost. Bạn có thể hủy xuất bản hoặc xóa chúng và bắt đầu đăng.
Bước 7 - Cập nhật Ghost
Trong tệp Docker compose của chúng tôi, chúng tôi đang kéo phiên bản Ghost mới nhất có sẵn tại thời điểm cài đặt, giúp bạn dễ dàng cập nhật blog Ghost của mình.Để cập nhật, bạn cần tắt vùng chứa của mình, kéo lên các hình ảnh mới nhất rồi chạy lại vùng chứa.
Mã:
$ docker-compose down$ docker-compose pull && docker-compose up -d
Bước 8 - Gia hạn Chứng chỉ SSL Let's Encrypt của bạn
Chứng chỉ Let's Encrypt chỉ có hiệu lực trong 90 ngày. Do đó, chúng ta cần thiết lập một cronjob sẽ tự động gia hạn chứng chỉ.Mở Crontab trong trình soạn thảo của bạn.
Mã:
$ sudo crontab -e
example.com
bằng tên miền của bạn.
Mã:
0 23 * * * certbot certonly -n --webroot -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'
Lệnh trên cũng sẽ khởi động lại máy chủ Nginx bên trong vùng chứa Docker sau khi gia hạn thành công.
Bạn có thể kiểm tra cronjob bằng tùy chọn
--dry-run
của Certbot.
Mã:
$ sudo bash -c "certbot certonly -n --webroot --dry-run -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'"