Cách cài đặt Ghost CMS với Docker trên Ubuntu 20.04

theanh

Administrator
Nhân viên
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.

Đ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
Bạn sẽ nhận được kết quả sau.
Mã:
Trạng thái: không hoạt động
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ó.
Mã:
$ sudo ufw allow OpenSSH
Cũng cho phép các cổng HTTP và HTTPS.
Mã:
$ sudo ufw allow 80$ sudo ufw allow 443
Bật Tường lửa
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
Kiểm tra lại trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy kết quả tương tự.
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
Xóa mọi phiên bản cũ của Certbot.
Mã:
$ sudo apt remove certbot
Cài đặt Certbot.
Mã:
$ sudo snap install --classic 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 /usr/bin.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Tạo SSL chứng chỉ.
Mã:
$ sudo certbot certonly --standalone -d example.com
Lệnh trên sẽ tải chứng chỉ xuống thư mục /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
Cài đặt một số gói cần thiết để Docker chạy.
Mã:
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
Thêm khóa GPG chính thức của Docker.
Mã:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Thêm kho lưu trữ chính thức của Docker.
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
Cập nhật kho lưu trữ hệ thống.
Mã:
$ sudo apt update
Cài đặt phiên bản mới nhất của Docker Engine.
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io
Xác minh rằng Docker Engine đang chạy và được cài đặt đúng cách.
Mã:
$ sudo docker run hello-world
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 docker.
Mã:
$ sudo usermod -aG docker ${USER}
Để á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.
Mã:
$ su - ${USER}
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.
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
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.
Mã:
$ sudo chmod +x /usr/local/bin/docker-compose
Kiểm tra cài đặt.
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
Tạo một tệp có tên docker-compose.yml và mở tệp đó bằng trình soạn thảo Nano.
Mã:
$ nano docker-compose.yml
Dán mã sau vào tệp. Thay thế 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__passwordMYSQL_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 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ệ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/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ỉ.
Trong tệp trên, chúng tôi cũng đã bao gồm các tùy chọn để thiết lập thư. Nếu bạn đang sử dụng dịch vụ thư SMTP phổ biến như Mailgun, Mailjet, Mandrill, Postmark, Sendgrid, SendCloud, SES, Zoho hoặc Gmail, bạn chỉ cần thêm tên dịch vụ và tên người dùng và mật khẩu SMTP của mình và bỏ qua các trường còn lại. Nếu không, hãy điền tất cả các tùy chọn khác và xóa tên dịch vụ và nó vẫn hoạt động. Bạn có thể kiểm tra thêm các tùy chọn thư trên tài liệu của Ghost về các tùy chọn Thư.

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
Tạo một tệp có tên Dockerfile trong thư mục này.
Mã:
$ touch nginx/Dockerfile
Dán mã sau vào Dockerfile.
Mã:
FROM nginx:latestRUN rm /etc/nginx/conf.d/default.confCOPY ghost.conf /etc/nginx/conf.d
Đ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 ghost.conf trong thư mục nginx.
Mã:
$ touch nginx/ghost.conf
Dán mã sau vào tệp 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; }}
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ước 5 - Chạy Site​

Chạy lệnh sau từ thư mục ghost để khởi động dịch vụ Ghost.
Mã:
$ docker-compose up -d
Bây giờ, bạn có thể xác minh cài đặt của mình bằng cách mở 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
Chạy Docker compose ở trạng thái được đính kèm để xem nhật ký do từng container tạo ra.
Mã:
$ docker-compose up
Để đóng container và quay lại dấu nhắc bash, hãy nhấn 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ập https://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
Dán dòng sau vào cuối, Certbot sẽ chạy lúc 11 giờ tối hàng ngày. Thay 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'
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 --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'"

Kết luận​

Như vậy là kết thúc hướng dẫn của chúng tôi về cách thiết lập Ghost CMS trên máy chủ chạy Ubuntu 20.04 của bạn bằng Docker. Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, hãy chia sẻ chúng trong phần bình luận bên dưới.
 
Back
Bên trên