Thứ hai, 10/08/2015 | 00:00 GMT+7

Cách cài đặt CouchDB và Futon trên Ubuntu 14.04

Apache CouchDB , như Redis, Cassandra và MongoDB, là một cơ sở dữ liệu NoSQL . CouchDB lưu trữ dữ liệu dưới dạng tài liệu JSON về bản chất không quan hệ. Điều này cho phép user CouchDB lưu trữ dữ liệu theo những cách trông rất giống với các đối tác trong thế giới thực của họ.

Bạn có thể quản lý CouchDB từ dòng lệnh hoặc từ giao diện web có tên Futon. Futon được dùng để thực hiện các việc quản trị như tạo và thao tác database , tài liệu và user cho CouchDB.

Bàn thắng

Đến cuối bài viết này, bạn sẽ:

  • Đã cài đặt CouchDB trên Server chạy Ubuntu 14.04
  • Đã cài đặt Futon trên cùng một server
  • Đã bảo đảm cài đặt CouchDB
  • Truy cập CouchDB bằng Futon từ máy local của bạn, sử dụng tunnel an toàn
  • Biết cách thêm admin-user vào CouchDB
  • Thực hiện các hoạt động CRUD với CouchDB bằng Futon
  • Thực hiện các hoạt động CRUD với CouchDB từ dòng lệnh

Yêu cầu

Vui lòng hoàn thành các yêu cầu sau:

Lưu ý: Mặc dù hướng dẫn này giả định user không phải root, bạn cũng có thể thực hiện các bước bên dưới với quyền là user root , trong trường hợp bạn không muốn tạo user sudo. Xin lưu ý nếu bạn sử dụng user không phải root, bạn cần nhập password vào lần đầu tiên thực thi lệnh với sudo .

Bước 1 - Chuẩn bị server

Trước khi có thể cài đặt CouchDB, ta cần đảm bảo server được cài đặt cho nó.

Bắt đầu bằng cách cập nhật hệ thống:

  • sudo apt-get update

Cài đặt phần mềm cho phép bạn quản lý các repository nguồn:

  • sudo apt-get install software-properties-common -y

Lưu ý: Cờ -y yêu cầu apt-get giả sử phản hồi Yes cho tất cả các dấu nhắc có thể xuất hiện trong quá trình cài đặt. Bạn có thể bỏ cờ này nếu bạn muốn trả lời thủ công các dấu nhắc .

Thêm PPA sẽ giúp ta tìm nạp version CouchDB mới nhất từ repository thích hợp:

  • sudo add-apt-repository ppa:couchdb/stable -y

Cảnh báo: Cần hết sức cẩn thận khi thêm Bản lưu trữ gói cá nhân (PPA) mới vào server của bạn. Vì bất kỳ ai cũng có thể tạo PPA nên không có gì đảm bảo nó có thể được tin cậy hoặc rằng nó an toàn. Trong trường hợp này, PPA trên là bản chính thức, do group Apache CouchDB duy trì.

Bây giờ ta đã thêm PPA mới, hãy cập nhật hệ thống để hệ thống có thông tin gói mới nhất:

  • sudo apt-get update

Bây giờ ta đã sẵn sàng cài đặt CouchDB và Futon.

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

Nếu trước đó bạn đã cài đặt CouchDB trên server này, hãy bắt đầu bằng cách xóa version hiện có:

  • sudo apt-get remove couchdb couchdb-bin couchdb-common -yf

Lưu ý: Nếu bạn có Server tươi, bạn có thể bỏ qua bước này.

Bây giờ cài đặt CouchDB:

  • sudo apt-get install couchdb -y

Thao tác này sẽ cài đặt CouchDB và Futon trên server của bạn.

Theo mặc định, CouchDB chạy trên localhost và sử dụng cổng 5984 . Bạn có thể truy xuất thông tin cơ bản này bằng cách chạy curl từ dòng lệnh:

  • curl localhost:5984

Lưu ý: Nếu bạn chưa cài đặt curl , bạn có thể sử dụng sudo apt-get install curl để cài đặt.

Bạn sẽ nhận được một cái gì đó tương tự như sau:

Output
{"couchdb":"Welcome","uuid":"b9f278c743b5fc0b971c4e587d77582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}

Đến đây bạn có thể tạo một database mới bằng lệnh curl -X PUT :

  • curl -X PUT localhost:5984/new_database

Kết quả sẽ như thế này:

Output
{"ok":true}

Bước 3 - Bảo mật cài đặt CouchDB

Theo mặc định, một số file và folder được tạo khi cài đặt CouchDB thuộc về user gốc và group . Mặc dù điều này là tốt (mặc dù không được khuyến khích) trong quá trình phát triển, nó có thể là một rủi ro bảo mật trong production .

Khi CouchDB được cài đặt, nó sẽ tạo ra một user và một group có tên couchdb . Trong phần này, ta sẽ thay đổi quyền sở hữu và quyền của các file CouchDB cho user và group couchdb .

Việc thay đổi quyền sở hữu sẽ kiểm soát những gì quy trình CouchDB có thể truy cập và thay đổi các điều khiển quyền ai có thể truy cập vào các file và folder CouchDB.

Trước khi thay đổi quyền sở hữu và quyền, hãy dừng CouchDB:

  • sudo stop couchdb

Thay đổi quyền sở hữu của các folder /usr/lib/couchdb , /usr/share/couchdb/etc/couchdb và file thực thi /usr/bin/couchdb , sao cho chủ sở hữu của chúng là couchdb và họ thuộc group couchdb .

  • sudo chown -R couchdb:couchdb /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb

Bây giờ, hãy thay đổi quyền của các folder /usr/lib/couchdb , /usr/share/couchdb/etc/couchdb và file thực thi /usr/bin/couchdb , sao cho user couchdb và group couchdb đã hoàn thành truy cập (vào cài đặt CouchDB) trong khi không có user nào khác có quyền truy cập vào các file và folder này.

  • sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb

Tất cả những gì còn lại cần làm là khởi động lại CouchDB:

  • sudo start couchdb

CouchDB bây giờ sẽ được cài đặt và chạy mà không có các file hoặc folder nào của nó thuộc về user gốc hoặc group gốc .

Bước 4 - Truy cập Futon

CouchDB cung cấp một console dựa trên web tiện lợi được gọi là Futon. Ta sẽ truy cập nó từ máy trạm local của bạn, đào tunnel lưu lượng thông qua kết nối SSH đến server của bạn. Điều này nghĩa là chỉ những user có đăng nhập SSH vào server của bạn mới có thể truy cập vào console Futon.

Để kết nối an toàn với CouchDB mà không cần công bố công khai, bạn có thể tạo tunnel SSH từ cổng local 5984 đến cổng 5984 của server từ xa.

Bạn có thể sử dụng lệnh sau, chạy từ máy tính local của bạn , để cài đặt tunnel :

  • ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

Lưu ý: Hãy nhớ thay sammy bằng tên user của bạn và your_server_ip bằng địa chỉ IP của Server.

Trong khi kết nối đang mở, bạn có thể truy cập Futon từ trình duyệt web yêu thích của bạn , sử dụng cổng 5984. Hãy truy cập URL này để hiển thị trang Futon hữu ích:

http://localhost:5984/_utils 

Ảnh chụp màn hình Trang chủ Futon

Theo mặc định, tất cả user CouchDB truy cập Futon đều làm như vậy với quyền quản trị. Điều này được thông báo ở góc dưới cùng bên phải:

Chào mừng bạn đến với  Group  quản trị! Mọi người đều là  administrator . Sửa lỗi này

Bạn có thể thay đổi điều này bằng cách nhấp vào liên kết nhỏ Sửa lỗi này và tạo administrator mới.

Bước 5 - Thêm admin-user

Bây giờ ta đã cài đặt và chạy CouchDB, hãy bắt đầu sử dụng nó.

Trước khi admin-user được tạo, tất cả user có thể truy cập CouchDB với quyền quản trị (mặc dù họ yêu cầu quyền truy cập SSH vào server trước).

Bạn nên tạo một account quản trị cho CouchDB, để tránh mất mát dữ liệu ngẫu nhiên hoặc trái phép.

Để thực hiện việc này, hãy nhấp vào liên kết Khắc phục sự cố này xuất hiện ở góc dưới cùng bên phải của Futon. Thao tác này sẽ hiển thị một màn hình cho phép bạn tạo admin-user CouchDB, như sau:

Màn hình tạo  admin-user

Nhập tên user và password mong muốn:

Nhập tên  user , chẳng hạn như " administrator " và password

Sau khi nhập tên user CouchDB mới và password an toàn, hãy nhấp vào nút Tạo . Thao tác này sẽ tạo admin-user mới. Thông báo ở góc dưới cùng bên phải của Futon sẽ xác nhận điều này bằng cách hiển thị thông báo tương tự như sau:

Chào mừng  administrator !  Cài đặt  thêm  administrator  hoặc Thay đổi password  hoặc Đăng xuất

Lưu ý: Việc tạo admin-user ngăn user lạ xóa và sửa đổi database , tài liệu thiết kế và cấu hình CouchDB. Tuy nhiên, nó không ngăn họ tạo hoặc truy cập tài liệu.

Hãy cẩn thận về việc cung cấp quyền truy cập SSH vào server của bạn.

Đó là nó! Server CouchDB của ta hiện đã được cấu hình đầy đủ.

Để tìm hiểu thêm về cách sử dụng database , hãy tiếp tục đọc.

Thực hiện các hoạt động CRUD từ Futon

Futon có giao diện user rất đơn giản nhưng hữu ích cho phép bạn thực hiện các thao tác CRUD cơ bản (tạo, đọc, cập nhật và xóa).

Trong phần này, ta sẽ tạo một database mới có tên là todos , thêm một tài liệu mới vào nó, sau đó truy xuất, cập nhật và xóa tài liệu này.

Lưu ý: Nếu bạn đã tạo admin-user , bạn sẽ phải đăng nhập với quyền administrator để tạo database mới.

Đảm bảo rằng bạn vẫn mở tunnel SSH. Nếu không, hãy mở kết nối của bạn với server từ máy tính local của bạn bằng lệnh sau:

  • ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

Hãy bắt đầu bằng cách truy cập trang Futon tại http://localhost:5984/_utils/ .

Lưu ý: Phần này giả định CouchDB đang được truy cập bằng tunnel SSH đã được cài đặt như mô tả trong phần Truy cập Futon ở trên. Nếu cài đặt của bạn khác, hãy đảm bảo bạn truy cập Futon theo đúng URL.

Tạo database và tài liệu

Trang chủ Futon

Để tạo database mới có tên là todos , hãy nhấp vào liên kết Tạo database trên màn hình. Thao tác này sẽ hiển thị một hộp thoại như sau:

Hộp thoại  Database  Mới; nhập Tên database

Nhập tên của database và nhấp vào nút Tạo .

Thao tác này sẽ tạo một database mới có tên là todos và đưa bạn đến một trang nơi bạn có thể bắt đầu tạo và sửa đổi tài liệu trong database mới được tạo.

Trang database  "todos"

Tạo tài liệu

Để tạo một tài liệu mới, hãy nhấp vào liên kết Tài liệu Mới trên trang.

Thao tác này sẽ mở ra một màn hình với một tài liệu mới. Tài liệu này sẽ chỉ có trường _id . Bạn có thể thay đổi giá trị của trường này nếu bạn cần hoặc bạn có thể để nguyên.

Nhấp vào liên kết Thêm Trường; bấm đúp vào giá trị null để cập nhật nó

Bấm vào liên kết Thêm Trường để thêm một trường mới vào tài liệu này.

Như có thể thấy ở trên, ta đã thêm hai trường có tên là tododone . Theo mặc định, các trường mới có null trị null .

Bấm đúp vào giá trị để thay đổi nó.

Trong ví dụ này, ta phải nhấn đúp chuột trường giá trị của tododone và đã nhập các giá trị Task 1false tương ứng.

Khi bạn đã nhập các giá trị, hãy nhấn ENTER hoặc nhấp vào dấu kiểm nhỏ màu xanh lục bên cạnh trường để lưu nội dung của nó. (Không làm điều này sẽ để lại giá trị của trường là null .) Điều này sẽ trông như sau:

Tạo và Lưu Trường và Giá trị

Để lưu tài liệu, hãy nhấp vào liên kết Lưu tài liệu . Sau khi tài liệu được lưu, bạn sẽ thấy rằng trường _rev đã được thêm vào nó như sau:

_rev trường

Đọc tài liệu

Click vào todos liên kết (ở thanh trên cùng bên cạnh Overview liên kết) để xem các tài liệu mới được tạo ra, như là tài liệu duy nhất trong todos database .

Trang database  Todos

Bấm vào khóa của tài liệu (ID) trong bảng để truy cập trang chi tiết tài liệu.

Chỉnh sửa tài liệu

Trên trang này, bạn có thể chỉnh sửa và cập nhật các trường tài liệu như sau:

Trang chi tiết tài liệu

Để chỉnh sửa giá trị trường, hãy nhấp đúp vào nó và bắt đầu chỉnh sửa.

Bạn có thể xóa bất kỳ trường nào (ngoài trường _id_rev ), thêm trường mới hoặc thay đổi giá trị của các trường hiện có. Trong ví dụ này, ta đã thay đổi giá trị của trường done từ false thành true như sau:

Thay đổi giá trị trường: trường "xong" từ "sai" thành "đúng"

Sau khi thấy ổn với các thay đổi, hãy nhấp vào liên kết Lưu tài liệu để cập nhật tài liệu. Sau khi làm như vậy, bạn sẽ nhận thấy rằng giá trị của trường _rev cũng đã được cập nhật.

Lưu các thay đổi

Xóa tài liệu

Để xóa tài liệu, bạn có thể nhấp vào liên kết Xóa tài liệu sẽ nhắc bạn xác nhận:

Bạn có chắc chắn muốn xóa tài liệu này không?

Xác nhận bằng cách nhấn nút Xóa .

Futon sẽ xóa tài liệu và đưa bạn đến trang database todos , trang này sẽ trống, xác nhận tài liệu đã thực sự bị xóa.

Trang database  Todos

Thực hiện các hoạt động CRUD từ Dòng lệnh

Phần này sẽ minh họa cách ta có thể thực hiện các thao tác CRUD (tạo, đọc, cập nhật và xóa) cơ bản trên database CouchDB từ dòng lệnh sử dụng curl .

Đảm bảo rằng bạn vẫn mở tunnel SSH. Nếu không, hãy mở kết nối của bạn với server từ máy tính local của bạn bằng lệnh sau:

  • ssh -L5984:127.0.0.1:5984 sammy@your_server_ip

Lưu ý: Phần này sẽ sử dụng database new_database đã được tạo ở Bước 2 ( Cài đặt CouchDB ) ở trên. Phần này cũng sẽ giả định ta đang truy cập CouchDB bằng tunnel SSH như được mô tả trong bước Truy cập Futon ở trên. Nếu cài đặt của bạn khác, hãy đảm bảo bạn thay thế URL, PORT và tên database một cách thích hợp trong khi thực hiện các lệnh được sử dụng bên dưới.

Tạo database

Nếu bạn chưa tạo database new_database , hãy làm như vậy ngay bây giờ. Lệnh này sẽ được thực thi từ máy trạm local của bạn:

  • curl -X PUT http://localhost:5984/new_database -u "admin:password"
  • {"ok":true}

Vì ta đã thêm admin-user viên vào CouchDB, nên bây giờ ta phải gửi tên user và password administrator khi tạo database mới.

Kết quả sẽ như thế này:

Output
{"ok":true}

Tạo tài liệu

Hãy bắt đầu bằng cách tạo một tài liệu mới.

  • curl -X POST -d '{"todo":"task 1", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"

Lệnh này tạo một tài liệu mới trong database new_database .

Cờ -X cho biết rằng ta đang thực hiện thao tác ĐĂNG HTTP. Cờ -H theo sau là tiêu đề đặt loại nội dung của yêu cầu này là application/json vì ta đang ĐĂNG một tài liệu JSON. Cuối cùng, tài liệu JSON được bao gồm cùng với cờ -d .

Phản ứng của thao tác này như sau:

Output
{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}

Phần "ok":true của phản hồi này cho biết rằng thao tác đã thành công. Phản hồi bao gồm các trường idrev , đại diện cho ID tài liệu và bản sửa đổi tài liệu tương ứng. Cả hai trường này sẽ được yêu cầu trong trường hợp tài liệu này cần được sửa đổi hoặc xóa.

Trong ví dụ này, ID tài liệu được tạo bởi CouchDB vì ta không cung cấp nó bằng lệnh. Nếu được yêu cầu, ta có thể tạo một tài liệu với một ID duy nhất mà ta đã tạo.

Tạo với ID được chỉ định

Tạo tài liệu với ID random_task :

  • curl -X POST -d '{"_id":"random_task", "todo":"task 2", "done":false}' http://localhost:5984/new_database -H "Content-Type:application/json"

Lệnh này tạo một tài liệu mới với ID được đặt thành random_task . Phản hồi cho lệnh này như sau:

Output
{"ok":true,"id":"random_task","rev":"1-bceeae3c4a9154c87db1649473316e44"}

Tạo nhiều tài liệu

Ngoài việc tạo tài liệu đơn lẻ, ta cũng có thể tạo tài liệu hàng loạt.

  • curl -X POST -d '{"docs": [{"todo":"task 3", "done":false}, {"todo":"task 4", "done":false}]}' http://localhost:5984/new_database/_bulk_docs -H "Content-Type:application/json"

Lệnh này sẽ tạo hai tài liệu như được chỉ định trong phần nội dung POST. Có hai điểm khác biệt nhỏ so với các phụ trang tài liệu đơn lẻ:

  1. Trong khi chèn một tài liệu, phần nội dung POST chỉ là một đối tượng JSON tiêu chuẩn. Trong trường hợp chèn hàng loạt, nội dung POST bao gồm một đối tượng với trường docs . Trường này chứa mảng tài liệu sẽ được chèn.
  2. Trong khi chèn một tài liệu, yêu cầu POST đã được gửi đến URL trỏ tới database ( http://localhost:5984/new_database ). Tuy nhiên, yêu cầu chèn số lượng lớn http://localhost:5984/new_database/_bulk_docs URL http://localhost:5984/new_database/_bulk_docs .

Phản ứng của hoạt động chèn hàng loạt như sau:

Output
[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]

Đọc tài liệu

Lấy một tài liệu từ database CouchDB là một vấn đề đơn giản khi phát hành một lệnh HTTP GET. Hãy thử truy xuất một trong các tài liệu mà ta đã tạo ở trên: tài liệu có tên là random_task .

  • curl -X GET http://localhost:5984/new_database/random_task

Lưu ý URL bao gồm ID ( random_task ) của tài liệu đang được truy xuất. Phản hồi cho yêu cầu GET này, như được hiển thị bên dưới, chứa toàn bộ tài liệu cùng với các trường _id_rev , được dùng để cập nhật hoặc xóa tài liệu này.

Output
{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}

Chỉnh sửa tài liệu

Trong khi cố gắng cập nhật tài liệu, điều quan trọng là phải bao gồm trường _rev . CouchDB sẽ từ chối bất kỳ yêu cầu cập nhật nào không bao gồm trường _rev . Vì CouchDB cập nhật toàn bộ tài liệu chứ không chỉ các phần của nó, nên toàn bộ tài liệu phải được gửi trong phần thân yêu cầu trong quá trình cập nhật.

Để cập nhật tài liệu được tạo bằng ID random_task , ta cần đưa ra yêu cầu HTTP PUT như sau:

  • curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new_database/random_task

Đảm bảo thay thế giá trị _rev bằng chuỗi bạn nhận được trong kết quả trước đó.

Điều này sửa đổi tài liệu và cập nhật trường done thành true . Phản hồi cho yêu cầu này như sau:

Output
{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}

Như có thể thấy trong phản hồi, trường rev của tài liệu cụ thể này sẽ thay đổi sau khi nó được cập nhật. Mọi yêu cầu cập nhật hoặc xóa tài liệu này trong tương lai sẽ phải sử dụng giá trị rev mới nhất.

Xóa tài liệu

Hãy sử dụng giá trị rev mới này để xóa tài liệu này bằng cách sử dụng yêu cầu HTTP DELETE như sau:

  • curl -X DELETE http://localhost:5984/new_database/random_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c

Cũng giống như các yêu cầu GET & PUT ở trên, yêu cầu DELETE sử dụng URL trỏ đến tài liệu. Tuy nhiên, nó cũng bao gồm một tham số truy vấn bổ sung trong URL. Tham số này, rev , phải có giá trị _rev mới nhất để thao tác xóa thành công.

Trong trường hợp cụ thể này, ta sử dụng giá trị được trả về sau thao tác cập nhật ở bước trước. Phản hồi cho yêu cầu trên được hiển thị bên dưới.

Output
{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}

Khởi động lại, dừng và bắt đầu dịch vụ CouchDB

Việc bắt đầu, dừng và khởi động lại dịch vụ CouchDB khá đơn giản. Hoàn thành các bước này từ server .

Khởi động lại

Để khởi động lại version CouchDB đang chạy, hãy thực hiện lệnh sau:

  • sudo restart couchdb

Lệnh này sẽ khởi động lại một version CouchDB đang chạy và hiển thị ID tiến trình của version mới. Trong trường hợp không có version CouchDB nào đang chạy, việc thực hiện lệnh này sẽ đưa ra thông báo như

Output
restart: Unknown instance:

Dừng lại

Để dừng một version CouchDB đang chạy, hãy thực hiện lệnh sau:

  • sudo stop couchdb

Việc thực thi lệnh này sẽ dừng mọi version CouchDB đang chạy và cung cấp một thông báo xác nhận như sau:

Output
couchdb stop/waiting

Khởi đầu

Để khởi động CouchDB, hãy thực hiện lệnh sau:

  • sudo start couchdb

Nếu CouchDB chưa chạy, việc thực thi lệnh này sẽ khởi động CouchDB và cung cấp một thông báo xác nhận như sau:

Output
couchdb start/running, process 12345

Mặt khác, nếu đã có một version CouchDB đang chạy thì việc thực hiện lệnh trên sẽ dẫn đến một thông báo như sau:

Output
start: Job is already running: couchdb

Trạng thái

Trong trường hợp bạn muốn kiểm tra trạng thái của CouchDB, bạn có thể thực hiện việc này bằng cách sử dụng lệnh sau:

  • sudo status couchdb

Nếu CouchDB đang chạy, điều này sẽ đưa ra một thông báo tương tự như sau:

Output
couchdb start/running, process 12345

Nếu CouchDB không chạy, việc kiểm tra trạng thái sẽ dẫn đến kết quả như:

Output
couchdb stop/waiting

Kết luận

Bây giờ, bạn đã có một cài đặt CouchDB đầy đủ chức năng trên Server của bạn , bạn có thể quản lý an toàn từ máy local của bạn bằng Futon hoặc dòng lệnh.


Tags:

Các tin liên quan

Cách thiết lập firewall với UFW trên Ubuntu 14.04
2015-08-05
Cách đánh giá độ trễ HTTP theo chuẩn với wrk trên Ubuntu 14.04
2015-07-21
Cách cài đặt và sử dụng Command Line Cheat Sheets trên Ubuntu 14.04
2015-07-21
Cách cài đặt và sử dụng CFEngine Community Edition trên Ubuntu 14.04
2015-07-17
Cách cài đặt và cấu hình Riak2 với Python3 trên Ubuntu 14.04
2015-07-14
Cách cài đặt Solr 5.2.1 trên Ubuntu 14.04
2015-07-14
Cách thiết lập R trên Ubuntu 14.04
2015-07-13
Cách triển khai ứng dụng Rails với Git Hooks trên Ubuntu 14.04
2015-07-09
Cách sử dụng Prometheus để giám sát server Ubuntu 14.04 của bạn
2015-06-30
Cách cài đặt control panel Ajenti và Ajenti V trên Ubuntu 14.04
2015-06-26