Thứ hai, 08/04/2019 | 00:00 GMT+7

Cách backup thư mục lớn với Unison trên Ubuntu 16.04

Unison là một công cụ đồng bộ hóa file open-souce . Nó rất hiệu quả trong việc backup repodata lớn mà chỉ có một số file được thêm vào hoặc cập nhật. Tình huống này xảy ra, chẳng hạn như server file Samba của công ty hoặc server email.

Phần lớn các file trong các server này sẽ được giữ nguyên trong khi một số nhỏ sẽ được thêm vào hoặc sửa đổi mỗi ngày. Unison có thể phát hiện và backup các file mới này cực kỳ nhanh chóng — ngay cả khi có hàng triệu file và terabyte dữ liệu. Trong những tình huống này, các công cụ truyền thống như rsync có thể mất nhiều thời gian hơn để thực hiện cùng một thao tác backup .

Trong hướng dẫn này, bạn sẽ cài đặt và cấu hình Unison trên một cặp server và sử dụng nó để backup một folder . Bạn cũng sẽ cấu hình Unison để sử dụng SSH làm giao thức truyền thông an toàn và tạo cron job để chạy Unison định kỳ.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần các thành phần sau :

Hướng dẫn này sẽ sử dụng hai server :

  • server chính : Server lưu trữ dữ liệu mà bạn sẽ backup .
  • server backup : Server sẽ lưu trữ dữ liệu đã backup .

Bước 1 - Tạo thêm user không phải root

Hướng dẫn Cài đặt Server Ban đầu với Ubuntu 16.04 đã hướng dẫn bạn cách tạo user sudo không phải root được gọi là sammy trên cả máy chủ chính và server dự phòng . Trong bước này, bạn sẽ tạo hai user mới, một trên server chính và một trên server dự phòng . Điều này tránh nhầm lẫn khi bạn làm việc thông qua hướng dẫn và user sudo không phải root thay thế được yêu cầu trên server backup nếu cấu hình bảo mật SSH được bật ở cuối hướng dẫn.

Bạn cần đăng nhập vào cả máy chủ chính và server dự phòng với quyền là user sammy qua SSH trong hai cửa sổ terminal . Hai lệnh SSH sau sẽ đăng nhập bạn vào các server này:

  • ssh sammy@primary_server_ip
  • ssh sammy@backup_server_ip

Đầu tiên, trên server chính, hãy tạo một user mới có tên là primary_user bằng lệnh này:

  • sudo adduser primary_user

Sau đó, cấp cho họ quyền truy cập sudo :

  • sudo usermod -aG sudo primary_user

Cuối cùng, thay đổi sang account primary_user:

  • su - primary_user

Tiếp theo, hãy làm theo các bước tương tự trên server backup , nhưng tạo một user mới được gọi là backup_user . Đảm bảo bạn đã đăng nhập vào máy chủ chính và server dự phòng với quyền là những user này trong phần còn lại của hướng dẫn.

Đến đây bạn đã tạo user cần thiết trên cả hai server , bạn có thể chuyển sang cài đặt phần mềm Unison.

Bước 2 - Cài đặt Unison trên cả hai server

Trong bước này, bạn sẽ cài đặt gói Unison trên cả hai server .

Bạn sẽ sử dụng trình quản lý gói Ubuntu apt để cài đặt Unison trên cả hai server . Khi sử dụng apt lần đầu tiên trong một thời gian, bạn nên cập nhật index gói local bằng lệnh sau:

  • sudo apt-get update

Điều này đảm bảo bạn sẽ cài đặt version Unison mới nhất. Điều này cũng sẽ giúp tránh lỗi cài đặt.

Tiếp theo, cài đặt Unison:

  • sudo apt-get install unison

Đến đây bạn đã hoàn thành cài đặt Unison. Trong bước tiếp theo, bạn sẽ cấu hình SSH để Unison có thể giao tiếp giữa hai server .

Bước 3 - Tạo SSH key và cấu hình SSH

Điều đầu tiên bạn cần làm là tạo một cặp SSH key trên server chính vì bạn sẽ sử dụng xác thực dựa trên khóa cho kết nối SSH. Ưu điểm của xác thực dựa trên khóa là có thể kết nối an toàn mà không cần nhập password . Điều này rất quan trọng vì bạn sẽ tạo một quy trình backup tự động phải diễn ra mà không cần bạn nhập password mỗi khi nó xảy ra.

Khi bạn có cặp khóa đó trên server chính , bạn sẽ sao chép public key vào server dự phòng và sau đó kiểm tra xem Unison có thể giao tiếp giữa các server bằng SSH hay không.

Khi bạn tạo một cặp SSH key , bạn thường sử dụng một password mạnh. Tuy nhiên, Unison sẽ chạy tự động, vì vậy bạn không thể nhập password theo cách thủ công mỗi khi chạy. Nhấn ENTER mà không cần nhập password . Điều này sẽ tạo ra một cặp SSH key không có password .

Chạy lệnh sau từ folder chính primary_user trên server chính để tạo cặp SSH key :

  • ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary

Các tùy chọn được sử dụng ở đây nghĩa là :

  • -t rsa : Tùy chọn này đặt loại khóa sẽ được tạo. Khóa RSA là loại tương thích nhất.
  • -b 4096 : Điều này đặt độ dài của khóa. Khóa càng dài thì càng an toàn. Độ dài khóa 4096 là độ dài khóa khuyến nghị hiện tại cho khóa RSA.
  • -f .ssh/ unison-primary : Điều này đặt tên của khóa và vị trí nơi nó sẽ được lưu. Trong trường hợp này, bạn sẽ lưu khóa vào thư .ssh mặc định của SSH, .ssh , sử dụng tên bạn chọn.

Lệnh hiển thị ở trên tạo SSH key công khai và riêng tư trong hai file sau:

  • .ssh/unison-primary
  • .ssh/unison-primary.pub

Đầu tiên là SSH key riêng tư và khóa thứ hai là public key . Bạn cần sao chép nội dung của file public key vào server backup . Cách dễ nhất để hiển thị nội dung của file public key để sao chép là sử dụng lệnh cat để in nội dung vào terminal :

cat .ssh/unison-primary.pub 

Trên server backup trong folder chính backup_user , hãy mở file .ssh/authorized_keys allow_keys bằng editor . Ở đây, bạn sẽ sử dụng nano :

  • nano .ssh/authorized_keys

Dán public key vào editor , sau đó lưu và thoát.

Đến đây bạn có thể kiểm tra xem cấu hình SSH có hoạt động hay không bằng cách đăng nhập vào bản backup từ server chính thông qua SSH. Điều này rất quan trọng vì bạn cần phải chấp nhận và lưu dấu fingerprint chính của server SSH của server dự phòng nếu không Unison sẽ không hoạt động. Trong terminal của bạn trên server chính , hãy chạy lệnh sau từ folder chính của primary_user :

  • ssh -i .ssh/unison-primary backup_user@backup_server_ip

Tùy chọn -i .ssh/ unison-primary hướng dẫn SSH sử dụng khóa hoặc file danh tính cụ thể. Ở đây bạn sẽ sử dụng mới unison-primary then chốt mà bạn đã tạo.

Chấp nhận dấu fingerprint bằng cách nhấn Y rồi nhấn ENTER và đăng nhập và đăng xuất. Bạn chỉ cần xác nhận SSH hoạt động giữa các server và lưu dấu fingerprint SSH của server dự phòng . Dấu fingerprint chỉ có thể được lưu theo cách thủ công, vì vậy nó phải được thực hiện trước khi quy trình được tự động hóa ở phần sau của hướng dẫn.

Tiếp theo, kiểm tra xem Unison sẽ kết nối bằng cách chạy lệnh sau từ folder chính primary_user trên server chính :

  • ssh -i .ssh/unison-primary backup_user@backup.example.com unison -version

Trong lệnh này, bạn đã sử dụng chính lệnh SSH mà bạn đã sử dụng để kiểm tra kết nối với việc thêm lệnh Unison ở cuối. Khi một lệnh được đặt ở cuối kết nối SSH, SSH sẽ đăng nhập, chạy lệnh và sau đó thoát. Lệnh unison -version hướng dẫn Unison in số version của nó.

Nếu mọi thứ đang hoạt động, bạn sẽ thấy phản hồi hiển thị version Unison trên server backup :

Output
unison version 2.48.3

Đến đây bạn đã xác nhận Unison có thể giao tiếp giữa các server bằng các SSH key , bạn đã sẵn sàng chuyển sang cấu hình Unison.

Bước 4 - Cấu hình Unison

Trong bước này, bạn sẽ cấu hình Unison để chạy backup một chiều đơn giản trên một folder từ server chính đến server backup .

Để cấu hình Unison, trước tiên bạn cần tạo folder cấu hình trong folder chính của primary_user trên server chính :

  • mkdir .unison

Tiếp theo, bạn cần mở một file mới với tên default.prf trong một editor trong folder .unison . Tệp này chứa cấu hình Unison. Mở file bằng lệnh sau:

  • nano .unison/default.prf

Sau đó nhập như sau:

default.prf
force = /home/primary_user/data sshargs = -i /home/primary_user/.ssh/unison-primary 

Hai dòng này có nghĩa như sau:

  • force : Điều này đảm bảo các thay đổi chỉ được đẩy từ server chính sang server dự phòng . Đường dẫn /home/ primary_user /data là vị trí của folder chứa dữ liệu mà bạn muốn backup .
  • sshargs : Tùy chọn này hướng dẫn Unison sử dụng SSH key mà bạn đã tạo.

Nếu folder chứa dữ liệu mà bạn muốn backup không phải là dưới folder primary_user nhà, sau đó bạn phải chắc chắn rằng nó có thể đọc và ghi bởi primary_user. Nếu bạn không quen thuộc với quyền sở hữu và quyền của Linux, hãy xem hướng dẫn Giới thiệu về Quyền của Linux để tìm hiểu thêm.

Unison hiện đã được cấu hình để bạn có thể chuyển sang thử nghiệm bằng cách backup một folder .

Bước 5 - Backup một folder với Unison

Đến đây bạn đã sẵn sàng backup một folder mà Unison đã được cấu hình. Bạn sẽ backup folder /home/ primary_user /data trên server chính vào folder /home/ backup_user /data/ trên server backup . Thư mục chứa dữ liệu cần backup phải cùng folder mà bạn đặt trong .unison/default.prf bên cạnh tùy chọn force .

Bạn cần một số dữ liệu để backup để kiểm tra xem Unison có đang hoạt động hay không. Tạo một số file trống trên server chính , sau đó kiểm tra xem Unison đã chuyển chúng sang server backup chưa .

Đầu tiên, tạo folder chứa dữ liệu để backup bằng cách chạy lệnh sau từ folder chính primary_user :

  • mkdir data/

Tiếp theo, sử dụng lệnh touch để tạo năm file trống:

  • touch data/file{1..5}

Phần cuối cùng của lệnh, file{1..5} , sử dụng mở rộng dấu ngoặc nhọn Bash để tạo năm file . Khi cho bash {1..5} , nó sẽ tự động điền vào các số còn thiếu, 2 , 34 . Kỹ thuật này rất hữu ích để nhanh chóng liệt kê nhiều file .

Đến đây bạn đã có folder data và một số file thử nghiệm để backup , bạn có thể chạy Unison để backup các file vào server backup . Lệnh sau sẽ thực hiện việc này:

  • unison -batch -auto /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

Các tùy chọn này có nghĩa như sau:

  • batch : Chạy mà không hỏi bất kỳ câu hỏi nào.
  • auto : Tự động chấp nhận mọi hành động không xung đột.

Vì bạn đang sử dụng Unison ở chế độ đồng bộ một chiều, đơn giản, bạn sẽ không phải giải quyết bất kỳ xung đột nào. Điều này nghĩa là bạn có thể đặt các tùy chọn này một cách an toàn.

Xung đột chỉ có thể xảy ra trong chế độ hoạt động khác của Unison, nơi nó đồng bộ theo cả hai hướng. Trường hợp sử dụng như vậy sẽ là đồng bộ hóa một folder trên notebook và máy tính để bàn của ai đó. Khi họ cập nhật file trên máy tính để bàn, họ muốn thay đổi đó được đẩy sang notebook và ngược lại. Xung đột xảy ra nếu cùng một file được sửa đổi ở cả hai đầu trước khi đồng bộ Unison xảy ra và Unison không thể tự động quyết định file nào sẽ giữ và file nào sẽ overrides .

Trong chế độ đẩy một chiều, dữ liệu trên bản chính luôn được giữ lại và dữ liệu trên bản backup sẽ bị overrides .

Lệnh này sẽ in một thông báo dài lần đầu tiên nó được chạy. Nội dung tin nhắn như sau:

Output
Contacting server... Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data] Looking for changes Warning: No archive files were found for these roots, whose canonical names are: /home/primary_user/data //backup_server_ip//home/backup_user/data This can happen either because this is the first time you have synchronized these roots, or because you have upgraded Unison to a new version with a different archive format. Update detection may take a while on this run if the replicas are large. Unison will assume that the 'last synchronized state' of both replicas was completely empty. This means that any files that are different will be reported as conflicts, and any files that exist only on one replica will be judged as new and propagated to the other replica. If the two replicas are identical, then no changes will be reported. If you see this message repeatedly, it may be because one of your machines is getting its address from DHCP, which is causing its host name to change between synchronizations. See the documentation for the UNISONLOCALHOSTNAME environment variable for advice on how to correct this. Donations to the Unison project are gratefully accepted: http://www.cis.upenn.edu/~bcpierce/unison Waiting for changes from server Reconciling changes dir ----> / Propagating updates UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019 [BGN] Copying from /home/primary_user/data to //backup_server_ip//home/backup_user/data [END] Copying UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019 Saving synchronizer state Synchronization complete at 16:30:43 (1 item transferred, 0 skipped, 0 failed)

Thông tin này cảnh báo rằng đây là lần đồng bộ hóa đầu tiên. Nó cũng cung cấp các mẹo về cách giải quyết sự cố nếu bạn thấy thông báo này cho mỗi lần chạy đồng bộ hóa. Phần cuối cùng cho bạn biết dữ liệu nào Unison đã đồng bộ hóa trong quá trình chạy này.

Trong mỗi lần chạy tiếp theo, nó sẽ in ít thông tin hơn nhiều. Đây là kết quả kết quả khi không có file nào được cập nhật:

Output
Contacting server... Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data] Looking for changes Waiting for changes from server Reconciling changes Nothing to do: replicas have not changed since last sync.

Đây là kết quả kết quả khi /data/file1 được sửa đổi trên server chính :

Output
Contacting server... Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data] Looking for changes Waiting for changes from server Reconciling changes changed ----> file1 Propagating updates UNISON 2.48.3 started propagating changes at 16:38:37.11 on 03 Apr 2019 [BGN] Updating file file1 from /home/primary_user/data to //backup_server_ip//home/backup_user/data [END] Updating file file1 UNISON 2.48.3 finished propagating changes at 16:38:37.16 on 03 Apr 2019 Saving synchronizer state Synchronization complete at 16:38:37 (1 item transferred, 0 skipped, 0 failed)

Sau mỗi lần chạy đồng bộ, server backup sẽ có một bản sao chính xác của folder data trên server chính .

Cảnh báo: Mọi file mới hoặc thay đổi trong folder data trên server backup sẽ bị mất khi bạn chạy Unison.

Đến đây bạn có thể chạy Unison để backup một folder . Trong bước tiếp theo, bạn sẽ tự động hóa quá trình backup bằng cách chạy Unison với cron .

Bước 6 - Tạo công việc Unison Cron

Trong phần này, bạn sẽ tạo một công việc cron sẽ chạy Unison và backup folder data vào server backup theo một tần suất xác định.

Crontab là một file được đọc bởi quá trình cron. Các lệnh mà nó chứa được tải vào quy trình cron và được thực hiện theo các khoảng thời gian xác định.

Bạn có thể xem nội dung của crontab cho user hiện tại của bạn bằng cách chạy lệnh sau:

  • crontab -l

Tùy chọn -l liệt kê nội dung của crontab của user hiện tại. Nếu bạn chưa chỉnh sửa crontab trước đó, bạn sẽ thấy thông tin sau:

# Edit this file to introduce tasks to be run by cron. #  # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task #  # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').#  # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. #  # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). #  # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ #  # For more information see the manual pages of crontab(5) and cron(8) #  # m h  dom mon dow   command 

Tiếp theo, chạy lệnh crontab trên server chính với cờ -e để mở nó ở chế độ chỉnh sửa:

  • crontab -e

Nếu bạn chưa cấu hình trình soạn thảo dòng lệnh mặc định, bạn cần chọn editor trong lần đầu tiên chạy lệnh. Chọn editor bạn chọn để mở crontab.

Khi bạn đã mở crontab, hãy thêm lệnh sau vào dòng trống đầu tiên bên dưới văn bản hiện có:

... * */3 * * * /usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data  

Lệnh bạn sẽ sử dụng gần giống như lệnh bạn đã sử dụng ở trên trong backup thủ công, nhưng có thêm một số tùy chọn. Các tùy chọn bổ sung này như sau:

  • -silent : Vô hiệu hóa tất cả kết quả ngoại trừ lỗi. Đầu ra bình thường không bắt buộc khi Unison được thực thi từ crontab vì không có ai đọc nó.
  • -log : Hướng dẫn Unison đăng nhập các hành động của nó.
  • -logfile : Chỉ định nơi Unison sẽ ghi các hành động của nó.

Trong ví dụ này, Unison được chạy 3 giờ một lần. Bạn có thể thay đổi tần số này thành bất kỳ tần suất nào đáp ứng tốt hơn yêu cầu của bạn.

Khi nào bạn chỉnh sửa crontab, bạn phải luôn đặt một dòng trống ở dưới cùng trước khi lưu và thoát, nếu không cron có thể không tải file crontab một cách chính xác. Điều này có thể khiến các lệnh không được thực thi.

Khi bạn đã thực hiện những thay đổi này, hãy lưu file .

Tiếp theo, tạo file log Unison sẽ ghi vào server chính . Lệnh sau sẽ tạo file này:

  • sudo touch /var/log/unison.log

Tiếp theo, làm cho primary_user chủ sở hữu của file .

  • sudo chown primary_user /var/log/unison.log

Bạn có thể kiểm tra trạng thái của các bản backup Unison bằng cách đọc file log tại /var/log/unison.log . Unison sẽ chỉ ghi lại nội dung nào đó khi nó đã backup một file mới hoặc cập nhật hoặc nếu nó gặp lỗi.

Unison hiện đang backup định kỳ từ crontab. Bước cuối cùng và tùy chọn là làm cho cấu hình SSH an toàn hơn.

Bước 7 (Tùy chọn) - Bảo mật SSH

Trong hướng dẫn này, bạn đã tạo và sử dụng SSH key không có password . Đây là một mối lo ngại về bảo mật mà bạn có thể giải quyết bằng cách giới hạn những gì backup_user có thể làm khi họ đăng nhập qua SSH vào server backup .

Bạn sẽ thực hiện việc này bằng cách cấu hình SSH để chỉ cho phép backup_user thực thi một lệnh duy nhất khi đã đăng nhập qua SSH. Điều này nghĩa là SSH key mà bạn đã tạo chỉ được dùng để thực hiện các bản backup Unison và không có gì khác. Điều này dẫn đến hậu quả là bạn sẽ không thể SSH vào server backup dưới dạng backup_user . Điều này là do việc đăng nhập yêu cầu nhiều hơn lệnh được phép duy nhất.

Nếu bạn cần truy cập server backup dưới dạng backup_user, trước tiên bạn nên đăng nhập với quyền user sammy , sau đó thay đổi thành backup_user bằng su - backup_user .

Chỉnh sửa file cấu hình SSH trên server backup tại /etc/ssh/sshd_config :

  • sudo nano /etc/ssh/sshd_config

Sau đó, thêm các dòng sau vào cuối file :

/ etc / ssh / sshd_config
Match User backup_user   ForceCommand unison -server 

Các tùy chọn cấu hình này sẽ thực hiện những việc sau:

  • Match User : Khi user được liệt kê đăng nhập, SSH sẽ áp dụng tùy chọn cấu hình sau và thụt lề.
  • ForceCommand : Điều này hạn chế user phù hợp với lệnh sau. Trong trường hợp này, backup_user chỉ có thể chạy lệnh unison -server .

Lưu và thoát khỏi editor của bạn. Tiếp theo, reload dịch vụ SSH để kích hoạt cấu hình mới:

  • sudo systemctl reload ssh.service

Bạn có thể kiểm tra bằng cách cố gắng đăng nhập vào server backup dưới dạng backup_user qua SSH từ server chính .

  • ssh -i .ssh/unison-primary backup_user@backup_server_ip

Nếu cài đặt /etc/ssh/sshd_config đang hoạt động, thì bạn sẽ thấy như sau:

Output
Unison 2.48

Phiên SSH sẽ bị treo cho đến khi phiên bị CTRL bằng CTRLC vì Unison đang đợi lệnh.

Điều này cho thấy rằng server Unison được gọi tự động khi đăng nhập và không thể truy cập nào khác ngoài giao tiếp với server Unison.

Như vậy, bạn đã có một hệ thống backup Unison hoạt động và an toàn, sẽ backup dữ liệu thường xuyên nếu bạn muốn.

Kết luận

Trong hướng dẫn này, bạn đã cài đặt và cấu hình phần mềm đồng bộ hóa file Unison để backup một folder qua SSH. Bạn cũng đã cấu hình cron để tự động chạy các bản backup theo một lịch trình cụ thể và SSH được bảo mật để khóa không có password không thể bị lạm dụng.

Khi xác định xem bạn có nên sử dụng Unison hay không, có một số điều bạn nên cân nhắc:

  • Unison có thể không phải là lựa chọn tốt nhất khi bạn có số lượng file nhỏ hơn hoặc lượng dữ liệu thấp hơn. Trong trường hợp này, rsync sẽ là lựa chọn thích hợp hơn. Bạn có thể đọc thêm về cách sử dụng rsync trong Hướng dẫn Sử dụng Rsync để Đồng bộ hóa Thư mục Cục bộ và Từ xa trên VPS hướng dẫn.

  • Việc backup một lượng lớn dữ liệu có thể mất nhiều thời gian và có thể sử dụng hết phân bổ băng thông của bạn trên các network interface công cộng. Nếu server chính và server dự phòng của bạn đều là DigitalOcean Server, thì bạn có thể hoàn thành backup Unison nhanh chóng và an toàn hơn nhiều nếu bạn sử dụng mạng riêng. Để biết thêm thông tin về các mạng riêng DigitalOcean miễn phí, vui lòng xem tài liệu Tổng quan về Mạng riêng .


Tags:

Các tin liên quan

Cách cài đặt và sử dụng TensorFlow trên Ubuntu 18.04
2019-03-20
Cách thu thập số liệu cơ sở hạ tầng với Metricbeat trên Ubuntu 18.04
2019-03-15
Cách cài đặt và sử dụng ClickHouse trên Ubuntu 18.04
2019-03-11
Cách cấu hình xác thực đa yếu tố trên Ubuntu 18.04
2019-02-28
Cách thiết lập ứng dụng CakePHP với LAMP trên Ubuntu 18.04
2019-02-22
Cách đặt quota hệ thống tệp trên Ubuntu 18.04
2019-02-21
Cách thực hiện kiểm tra liên tục các vai trò không thể phục hồi bằng Molecule và Travis CI trên Ubuntu 18.04
2019-02-01
Cách đảm bảo chất lượng mã bằng SonarQube trên Ubuntu 18.04
2019-01-11
Cách cài đặt và bảo mật Memcached trên Ubuntu 18.04
2019-01-04
Cách cài đặt Elasticsearch, Logstash và Kibana (Elastic Stack) trên Ubuntu 16.04
2018-11-20