Thứ năm, 29/03/2018 | 00:00 GMT+7

Cách triển khai trang web Jekyll bằng Git Hooks trên Ubuntu 16.04

Jekyll là trình tạo trang web tĩnh cung cấp một số lợi ích của Hệ thống quản lý nội dung (CMS) trong khi tránh các vấn đề về hiệu suất và bảo mật do các trang web hướng database như vậy đưa ra. Nó "biết blog" và bao gồm các tính năng đặc biệt để xử lý nội dung được sắp xếp theo ngày tháng, mặc dù tính hữu ích của nó không giới hạn ở các trang blog. Jekyll rất phù hợp cho những người cần làm việc offline , thích trình soạn thảo nhẹ cho các biểu mẫu web để bảo trì nội dung và muốn sử dụng kiểm soát version để theo dõi các thay đổi đối với trang web của họ.

Trong hướng dẫn này, ta sẽ cấu hình môi trường production để sử dụng Nginx để lưu trữ trang web Jekyll, cũng như Git để theo dõi các thay đổi và tạo lại trang web khi bạn đẩy các thay đổi vào repository trang web. Ta cũng sẽ cài đặt và cấu hình git-shell để bảo vệ thêm server production của bạn khỏi bị truy cập trái phép. Cuối cùng, ta sẽ cấu hình máy phát triển local của bạn để hoạt động và đẩy các thay đổi vào repository từ xa.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

Bước 1 - Cài đặt account user Git

Vì mục đích bảo mật, ta sẽ bắt đầu bằng cách tạo một account user sẽ lưu trữ repository Git cho trang web Jekyll. User này sẽ thực thi tập lệnh Git hooks mà ta sẽ tạo để tạo lại trang web khi nhận được các thay đổi. Lệnh sau sẽ tạo một user có tên git :

  • sudo adduser git

Bạn cần nhập và lặp lại password , sau đó nhập thông tin cơ bản không bắt buộc về user . Cuối cùng, bạn cần xác nhận thông tin bằng lệnh vào Y :

Output
Adding user `git' ... Adding new group `git' (1001) ... Adding new user `git' (1001) with group `git' ... Creating home directory `/home/git' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for git Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n]

Ta cũng sẽ chuẩn bị web root để giữ trang web đã tạo. Đầu tiên, xóa trang web mặc định khỏi folder /var/www/html :

  • sudo rm /var/www/html/index.nginx-debian.html

Bây giờ, hãy đặt quyền sở hữu trên folder cho user git , để user này có thể cập nhật nội dung của trang web khi nhận được các thay đổi và quyền sở hữu group đối với group www-data . Group này đảm bảo các web server có thể truy cập và quản lý các file nằm trong /var/www/html :

  • sudo chown git:www-data /var/www/html

Trước khi tiếp tục hướng dẫn, hãy sao chép SSH key của bạn sang user git mới được tạo của bạn, để bạn có thể truy cập server production của bạn một cách an toàn bằng Git. Bạn có thể thực hiện việc này theo bước bốn của hướng dẫn Cài đặt Server Ban đầu với Ubuntu 16.04 . Phương pháp đơn giản nhất là sử dụng lệnh ssh-copy-id , nhưng bạn cũng có thể sao chép khóa theo cách thủ công.

Bây giờ, hãy tạo một repository Git cho trang web Jekyll của bạn và sau đó cấu hình các móc Git để xây dựng lại nó khi cập nhật.

Bước 2 - Cài đặt repository Git

Kho lưu trữ Git của bạn sẽ chứa dữ liệu về trang Git của bạn, bao gồm lịch sử các thay đổi và commit . Trong bước này, ta sẽ cài đặt repository Git trên server production với một móc sau nhận sẽ tạo lại trang web .

Kho lưu trữ sẽ nằm trong folder chính của user git , vì vậy nếu bạn đã đăng xuất khỏi account user này sau bước trước, hãy sử dụng lệnh su để chuyển đổi role :

  • su - git

Trong folder chính, hãy tạo một folder chứa repository Git của bạn. Thư mục bắt buộc phải nằm trong folder chính và được đặt tên bằng định dạng repo-name .git , vì vậy các lệnh git có thể phát hiện ra nó. Thông thường, repo-name phải là tên của trang web , vì vậy git có thể dễ dàng nhận ra các trang web và repository . Ta sẽ gọi trang web của ta là sammy-blog :

  • mkdir ~/sammy-blog.git

Chuyển sang folder và khởi tạo repository Git bằng git init . Cờ --bare cài đặt repository trên server và cho phép cộng tác giữa nhiều user :

  • cd ~/sammy-blog.git
  • git init --bare

Đầu ra chứa thông tin về repository được khởi tạo thành công:

Output
Initialized empty Git repository in /home/git/sammy-blog.git

Nếu bạn không thấy kết quả như vậy, hãy làm theo log trên màn hình để giải quyết sự cố trước khi tiếp tục hướng dẫn.

Thư mục ta đã tạo chứa các folder và file cần thiết để lưu trữ repository của bạn. Bạn có thể kiểm tra nội dung của nó bằng lệnh như sau:

  • ls
Output
branches config description HEAD hooks info objects refs

Nếu bạn không thấy loại kết quả này, hãy đảm bảo bạn đã chuyển sang folder thích hợp và thực thi thành công git init .

Thư mục hooks chứa các script được sử dụng cho các hook Git. Theo mặc định, nó chứa một file ví dụ cho mỗi loại Git hook để bạn có thể dễ dàng bắt đầu. Đối với mục đích của hướng dẫn này, ta sẽ sử dụng móc hậu nhận để tạo lại trang web sau khi repository được cập nhật với những thay đổi mới nhất.

Tạo file có tên post-receive trong folder hooks và mở file đó trong editor mà bạn chọn:

  • nano ~/sammy-blog.git/hooks/post-receive

Ta sẽ cấu hình hook để sao chép những thay đổi mới nhất vào folder tạm thời, sau đó tạo lại nó và lưu trang web đã tạo vào /var/www/html để bạn có thể dễ dàng truy cập.

Sao chép nội dung sau vào file :

~ / sammy-blog.git / hooks / post-accept
#!/usr/bin/env bash  GIT_REPO=$HOME/sammy-blog.git TMP_GIT_CLONE=/tmp/sammy-blog PUBLIC_WWW=/var/www/html  git clone $GIT_REPO $TMP_GIT_CLONE pushd $TMP_GIT_CLONE bundle exec jekyll build -d $PUBLIC_WWW popd rm -rf $TMP_GIT_CLONE  exit 

Sau khi hoàn tất, hãy lưu file và đóng editor .

Đảm bảo rằng tập lệnh có thể thực thi được, vì vậy user git có thể thực thi nó khi nhận được các thay đổi:

  • chmod +x ~/sammy-blog.git/hooks/post-receive

Đến đây, ta có một repository Git được cấu hình đầy đủ và một móc nối sau khi nhận Git để cập nhật trang web khi nhận được các thay đổi. Trước khi đẩy trang web vào repository , ta sẽ bảo mật thêm server production của bạn bằng cách cấu hình git-shell , một shell tương tác có thể cung cấp cho user các lệnh Git khác nhau khi họ kết nối qua SSH.

Bước 3 - Cấu hình Git Shell để vô hiệu hóa đăng nhập tương tác

User có thể triển khai git-shell theo những cách sau: như một shell tương tác, cung cấp cho họ các lệnh khác nhau khi họ kết nối qua SSH cho phép họ tạo repository mới hoặc thêm SSH key mới hoặc dưới dạng shell không tương tác, vô hiệu hóa quyền truy cập vào console của server thông qua SSH, nhưng cho phép chúng sử dụng git để quản lý các repository hiện có.

Nếu bạn chia sẻ SSH key cho user git với bất kỳ ai, họ sẽ có quyền truy cập vào phiên Bash tương tác thông qua SSH. Điều này đại diện cho một mối đe dọa bảo mật, vì user có thể truy cập vào dữ liệu khác, không liên quan đến trang web. Ta sẽ cấu hình git-shell là một git-shell không tương tác, vì vậy bạn không thể bắt đầu phiên Bash tương tác bằng cách sử dụng git user.

Đảm bảo rằng bạn đã đăng nhập với quyền user git . Nếu bạn đã thoát khỏi phiên sau bước trước đó, bạn có thể sử dụng lệnh tương tự như trước để đăng nhập lại:

  • su - git

Bắt đầu bằng cách tạo một folder git-shell-commands , cần thiết để git-shell hoạt động:

  • mkdir ~/git-shell-commands

Tệp no-interactive-shell được sử dụng để xác định hành vi nếu bạn không muốn cho phép truy cập shell tương tác, vì vậy hãy mở nó trong editor mà bạn chọn:

  • nano ~/git-shell-commands/no-interactive-login

Sao chép nội dung sau vào file . Nó sẽ đảm bảo thông báo chào mừng sẽ được hiển thị nếu bạn cố gắng đăng nhập qua SSH:

~ / git-shell-commnads / no-tương tác-đăng nhập
#!/usr/bin/env bash  printf '%s\n' "You've successfully authenticated to the server as $USER user, but interactive sessions are disabled."  exit 128 

Sau khi hoàn tất, hãy lưu file và đóng editor của bạn.

Ta cần đảm bảo file có thể thực thi được, vì vậy git-shell có thể thực thi nó:

  • chmod +x ~/git-shell-commands/no-interactive-login

Quay lại user sudo không phải root của bạn, vì vậy bạn có thể sửa đổi các thuộc tính của user git của ta . Nếu bạn đã sử dụng lệnh su trước đó, bạn có thể đóng phiên bằng cách sử dụng:

  • exit

Cuối cùng, ta cần phải thay đổi vỏ cho người sử dụng git với git-shell :

  • sudo usermod -s $(which git-shell) git

Xác minh bạn không thể truy cập shell tương tác bằng cách chạy SSH từ máy phát triển:

  • ssh git@production_server_ip

Bạn sẽ thấy một thông báo như bên dưới. Nếu không, hãy đảm bảo bạn có các SSH key thích hợp và truy xuất lại các bước trước đó để giải quyết vấn đề trước khi tiếp tục hướng dẫn.

Output
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64) ... You've successfully authenticated to the server as git user, but interactive sessions are disabled. Connection to production_server_ip closed.

Tiếp theo, bạn sẽ cấu hình máy phát triển local của bạn để sử dụng repository Git này và sau đó ta sẽ đẩy trang web vào repository . Cuối cùng, ta đảm bảo trang web đã được tạo và bạn có thể truy cập nó từ trình duyệt web.

Bước 4 - Đẩy các thay đổi vào Kho lưu trữ

Bây giờ ta đã khởi tạo và cấu hình repository Git trên server production . Trên máy phát triển, ta cần khởi tạo repository local chứa dữ liệu về repository từ xa và các thay đổi được thực hiện trong repository lưu trữ local .

Trên máy phát triển của bạn, chuyển đến folder chứa trang web:

  • cd ~/www

Ta cần khởi tạo một repository Git trong folder root của trang web để ta có thể đẩy nội dung đến repository từ xa:

  • git init

Đầu ra chứa thông báo về việc khởi tạo repository thành công:

Output
Initialized empty Git repository in /home/sammy/www

Nếu bạn không thấy kết quả như vậy, hãy làm theo thông báo trên màn hình để giải quyết sự cố trước khi tiếp tục.

Bây giờ, hãy tạo một đối tượng từ xa, đại diện cho đối tượng Git được sử dụng để theo dõi các kho và chi nhánh từ xa mà bạn làm việc. Thông thường, điều khiển từ xa mặc định được gọi là origin , vì vậy ta sẽ sử dụng nó cho các mục đích của hướng dẫn này.

Lệnh sau sẽ tạo một điều khiển từ xa gốc , sẽ theo dõi repository sammy-blog trên server production bằng cách sử dụng git user:

  • git remote add origin git@production_server_ip:sammy-blog.git

Không có kết quả cho biết hoạt động thành công. Nếu bạn thấy thông báo lỗi, hãy đảm bảo giải quyết nó trước khi chuyển sang bước tiếp theo.

Mỗi khi bạn muốn đẩy các thay đổi vào repository từ xa, bạn cần phải commit chúng và sau đó đẩy commit đến repository từ xa. Khi repository từ xa nhận được commit , trang web sẽ được tạo lại với những thay đổi mới nhất tại chỗ.

Commit được sử dụng để theo dõi những thay đổi bạn thực hiện. Chúng chứa một thông báo commit được sử dụng để mô tả những thay đổi được thực hiện trong commit đó. Bạn nên giữ các thông điệp ngắn gọn nhưng súc tích, bao gồm các chi tiết về những thay đổi quan trọng nhất được thực hiện trong commit .

Trước khi áp dụng các thay đổi , ta cần chọn những file ta muốn commit . Lệnh sau đánh dấu tất cả các file để commit :

  • git add .

Không có kết quả cho biết thực hiện lệnh thành công. Nếu bạn thấy bất kỳ lỗi nào, hãy đảm bảo giải quyết chúng trước khi tiếp tục.

Tiếp theo, commit tất cả các thay đổi bằng cách sử dụng cờ -m , cờ này sẽ bao gồm thông báo commit . Vì đây là commit đầu tiên của ta , ta sẽ gọi nó là “ Commit ban đầu” :

  • git commit -m "Initial commit."

Đầu ra chứa danh sách các folder và file được thay đổi trong commit đó:

Commit output
10 files changed, 212 insertions(+) create mode 100644 .gitignore create mode 100644 404.html create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 _config.yml create mode 100644 _posts/2017-09-04-link-test.md create mode 100644 about.md create mode 100644 assets/postcard.jpg create mode 100644 contact.md create mode 100644 index.md

Nếu bạn thấy bất kỳ lỗi nào, hãy đảm bảo giải quyết chúng trước khi tiếp tục hướng dẫn.

Cuối cùng, sử dụng lệnh sau để đẩy các thay đổi đã commit vào repository từ xa:

  • git push origin master

Đầu ra sẽ chứa thông tin về tiến trình đẩy. Khi hoàn tất, bạn sẽ thấy thông tin như sau:

Push output
Counting objects: 14, done. Delta compression using up to 4 threads. Compressing objects: 100% (12/12), done. Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done. Total 14 (delta 0), reused 0 (delta 0) remote: Cloning into '/tmp/sammy-blog'... remote: done. remote: /tmp/sammy-blog ~/sammy-blog.git remote: Configuration file: /tmp/sammy-blog/_config.yml remote: Source: /tmp/sammy-blog remote: Destination: /var/www/html remote: Incremental build: disabled. Enable with --incremental remote: Generating... remote: done in 0.403 seconds. remote: Auto-regeneration: disabled. Use --watch to enable. remote: ~/sammy-blog.git To git@188.166.57.145:sammy-blog.git * [new branch] master -> master

Nếu không, hãy làm theo log trên màn hình để giải quyết sự cố trước khi tiếp tục hướng dẫn.

Đến đây, trang web được tải lên server và sau một thời gian ngắn, nó sẽ được tạo lại. Điều hướng trình duyệt web đến http:// production_server_ip . Bạn sẽ thấy trang web của bạn đang hoạt động. Nếu không, hãy xem lại các bước trước đó đảm bảo rằng bạn đã làm mọi thứ như dự định.

Để tạo lại trang web khi bạn thay đổi nội dung nào đó, bạn cần thêm file vào commit , commit chúng và sau đó đẩy các thay đổi, như bạn đã làm với commit ban đầu.

Khi bạn đã áp dụng các thay đổi đối với file của bạn , hãy sử dụng các lệnh sau để thêm tất cả các file đã thay đổi vào commit . Nếu bạn đã tạo các file mới, bạn cũng cần thêm chúng bằng git add , như ta đã làm với commit ban đầu. Khi đã sẵn sàng commit các file của bạn , bạn cần đưa vào một thông báo commit khác mô tả các thay đổi của bạn . Ta sẽ gọi thông báo của ta là “tệp cập nhật” :

  • git commit -am "updated files"

Cuối cùng, đẩy các thay đổi vào repository từ xa.

  • git push origin master

Đầu ra sẽ tương tự như những gì bạn đã thấy với lần đẩy ban đầu:

Push output
Counting objects: 14, done. Delta compression using up to 4 threads. Compressing objects: 100% (12/12), done. Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done. Total 14 (delta 0), reused 0 (delta 0) remote: Cloning into '/tmp/sammy-blog'... remote: done. remote: /tmp/sammy-blog ~/sammy-blog.git remote: Configuration file: /tmp/sammy-blog/_config.yml remote: Source: /tmp/sammy-blog remote: Destination: /var/www/html remote: Incremental build: disabled. Enable with --incremental remote: Generating... remote: done in 0.403 seconds. remote: Auto-regeneration: disabled. Use --watch to enable. remote: ~/sammy-blog.git To git@188.166.57.145:sammy-blog.git * [new branch] master -> master

Đến đây, trang web đã được tạo mới và các thay đổi mới nhất đã có.

Kết luận

Trong hướng dẫn này, bạn đã học cách triển khai trang web của bạn sau khi đẩy các thay đổi vào repository Git của bạn. Nếu bạn muốn tìm hiểu thêm về Git, hãy xem loạt bài hướng dẫn Git của ta .

Và nếu bạn muốn tìm hiểu thêm về các móc Git khác, bạn có thể xem Cách sử dụng Git Hooks để tự động hóa các nhiệm vụ triển khai và phát triển .


Tags:

Các tin liên quan

Cách chặn nỗ lực đăng nhập SSH không mong muốn với PyFilter trên Ubuntu 16.04
2018-03-27
Cách tự động triển khai ứng dụng Laravel với Trình triển khai trên Ubuntu 16.04
2018-03-23
Cách thiết lập trang web phát triển Jekyll trên Ubuntu 16.04
2018-03-20
Cách cài đặt Ruby on Rails với rbenv trên Ubuntu 16.04
2018-03-15
Cách cài đặt Node.js trên Ubuntu 16.04
2018-03-07
Cách cài đặt và bảo mật Memcached trên Ubuntu 16.04
2018-03-06
Cách cài đặt Buildbot trên Ubuntu 16.04
2018-03-06
Cách quản lý an toàn bí mật với HashiCorp Vault trên Ubuntu 16.04
2018-02-28
Cách bảo mật Roundcube trên Ubuntu 16.04
2018-02-24
Cách cài đặt ứng dụng Webmail của riêng bạn với Roundcube trên Ubuntu 16.04
2018-02-24