Thứ bảy, 20/02/2016 | 00:00 GMT+7

Cách di chuyển một ứng dụng phân tích cú pháp sang server phân tích cú pháp trên Ubuntu 14.04

Parse là một nền tảng Mobile Backend dưới dạng dịch vụ, thuộc sở hữu của Facebook từ năm 2013. Vào tháng 1 năm 2016, Parse thông báo rằng các dịch vụ được lưu trữ của họ sẽ đóng cửa hoàn toàn vào ngày 28 tháng 1 năm 2017.

May mắn là Parse cũng đã phát hành một server API open-souce , tương thích với API của dịch vụ được lưu trữ, được gọi là Server Parse . Parse Server đang được phát triển tích cực và có vẻ như sẽ thu hút một cộng đồng nhà phát triển lớn. Nó có thể được triển khai cho một loạt các môi trường chạy Node.js và MongoDB.

Hướng dẫn này tập trung vào việc di chuyển ứng dụng Phân tích cú pháp có sẵn sang một version độc lập của Server phân tích cú pháp chạy trên Ubuntu 14.04. Nó sử dụng mã hóa TLS / SSL cho tất cả các kết nối, sử dụng certificate được cung cấp bởi Let's Encrypt, Tổ chức phát hành certificate mới cung cấp các certificate miễn phí. Nó bao gồm một số chi tiết cụ thể cho DigitalOcean và Ubuntu 14.04, nhưng sẽ được áp dụng rộng rãi cho các hệ thống chạy các bản phân phối GNU / Linux có nguồn root Debian gần đây.

Cảnh báo: Ta thực sự khuyên bạn nên thử nghiệm quy trình này trước với version phát triển hoặc thử nghiệm của ứng dụng trước khi thử với ứng dụng production hướng tới user . Bạn cũng nên đọc hướng dẫn này cùng với tài liệu di chuyển chính thức .

Yêu cầu

Hướng dẫn này được xây dựng dựa trên Cách chạy Server phân tích cú pháp trên Ubuntu 14.04 . Nó yêu cầu những điều sau:

  • Server Ubuntu 14.04, được cấu hình với user sudo không phải root
  • Node.js 5.6.x
  • MongoDB 3.0.x
  • Tên domain trỏ đến server
  • Một ứng dụng phân tích cú pháp sẽ được di chuyển
  • Nginx đã cài đặt và cấu hình SSL bằng certificate Let's Encrypt. Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 14.04 sẽ hướng dẫn bạn qua quá trình này.

Server đích phải có đủ bộ nhớ để xử lý tất cả dữ liệu của ứng dụng của bạn. Vì phân tích cú pháp nén dữ liệu từ phía họ, họ chính thức khuyên bạn nên cung cấp ít nhất 10 lần dung lượng lưu trữ được sử dụng bởi ứng dụng được lưu trữ của bạn.

Bước 1 - Cấu hình MongoDB để di chuyển

Phân tích cú pháp cung cấp một công cụ di chuyển cho các ứng dụng hiện có. Để sử dụng nó, ta cần mở MongoDB cho các kết nối bên ngoài và bảo mật nó bằng bản sao certificate TLS / SSL từ Let's Encrypt. Bắt đầu bằng cách kết hợp fullchain1.pemprivkey1.pem thành một file mới trong /etc/ssl :

  • sudo cat /etc/letsencrypt/archive/domain_name/{fullchain1.pem,privkey1.pem} | sudo tee /etc/ssl/mongo.pem

Bạn sẽ phải lặp lại lệnh trên sau khi gia hạn certificate Let's Encrypt. Nếu bạn cấu hình tự động gia hạn certificate Let's Encrypt, hãy nhớ bao gồm thao tác này.

Đảm bảo mongo.pem thuộc sở hữu của user mongodb và chỉ chủ sở hữu của nó mới có thể đọc được:

  • sudo chown mongodb:mongodb /etc/ssl/mongo.pem
  • sudo chmod 600 /etc/ssl/mongo.pem

Bây giờ, hãy mở /etc/mongod.conf bằng nano (hoặc editor của bạn mà bạn chọn):

  • sudo nano /etc/mongod.conf

Tại đây, ta sẽ thực hiện một số thay đổi quan trọng.

Đầu tiên, hãy tìm dòng bindIp trong phần net: và yêu cầu MongoDB lắng nghe tất cả các địa chỉ bằng cách thay đổi 127.0.0.1 thành 0.0.0.0 . Dưới đây, thêm cấu hình SSL vào cùng một phần:

/etc/mongod.conf
# network interfaces net:   port: 27017   bindIp: 0.0.0.0   ssl:     mode: requireSSL     PEMKeyFile: /etc/ssl/mongo.pem 

Tiếp theo, trong # security , hãy bật ủy quyền ứng dụng client :

/etc/mongod.conf
# security security:   authorization: enabled 

Cuối cùng, công cụ di chuyển yêu cầu ta đặt tham số failIndexKeyTooLong thành false :

/etc/mongod.conf
 setParameter:   failIndexKeyTooLong: false 

Lưu ý: Khoảng trắng rất quan trọng trong các file cấu hình MongoDB, dựa trên YAML . Khi sao chép các giá trị cấu hình, hãy đảm bảo bạn duy trì thụt lề.

Thoát và lưu file .

Trước khi khởi động lại dịch vụ mongod , ta cần thêm một user với role admin . Kết nối với version MongoDB đang chạy:

  • mongo --port 27017

Tạo admin-user và thoát. Đảm bảo thay thế sammy bằng tên user và mật khẩu mong muốn của bạn bằng một password mạnh.

use admin db.createUser({   user: "sammy",   pwd: "password",   roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }) exit 

Khởi động lại dịch vụ mongod :

  • sudo service mongod restart

Bước 2 - Di chuyển dữ liệu ứng dụng từ phân tích cú pháp

Đến đây bạn đã có version MongoDB có thể truy cập từ xa, bạn có thể sử dụng công cụ di chuyển Phân tích cú pháp để chuyển dữ liệu của ứng dụng đến server của bạn.

Cấu hình thông tin đăng nhập MongoDB cho Công cụ di chuyển

Ta sẽ bắt đầu bằng cách kết nối local với admin-user mới của ta :

  • mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username sammy --password

Bạn sẽ được yêu cầu nhập password bạn đã đặt trước đó.

Sau khi được kết nối, hãy chọn tên cho database để lưu trữ dữ liệu ứng dụng của bạn. Ví dụ: nếu bạn đang di chuyển một ứng dụng có tên là Todo, bạn có thể sử dụng todo . Bạn cũng cần chọn một password mạnh khác cho user được gọi là phân tích cú pháp .

Từ shell mongo , cấp cho user này quyền truy cập vào database_name :

  • use database_name
  • db.createUser({ user: "parse", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })

Bắt đầu quá trình di chuyển dữ liệu

Trong cửa sổ trình duyệt, đăng nhập vào Phân tích cú pháp và mở cài đặt cho ứng dụng của bạn. Trong phần Chung , tìm nút Di chuyển và nhấp vào nút đó:

Phân tích cú pháp Cài đặt ứng dụng: Chung: Di chuyển

Bạn sẽ được yêu cầu nhập một chuỗi kết nối MongoDB. Sử dụng định dạng sau:

mongodb://parse:password@your_domain_name:27017/database_name?ssl=true 

Ví dụ: nếu bạn đang sử dụng domain example.com , với parse user , password foo và database được gọi là todo , chuỗi kết nối của bạn sẽ trông giống như sau:

mongodb://parse:foo@example.com:27017/todo?ssl=true 

Đừng quên ?ssl=true ở cuối, nếu không kết nối sẽ bị lỗi. Nhập chuỗi kết nối vào hộp thoại như sau:

Phân tích cú pháp ứng dụng: Hộp thoại di chuyển

Nhấp vào Bắt đầu di chuyển . Bạn sẽ thấy các hộp thoại tiến trình sao chép ảnh chụp nhanh của database được lưu trữ Phân tích cú pháp sang server của bạn và sau đó để đồng bộ hóa dữ liệu mới kể từ khi ảnh chụp nhanh được thực hiện. Thời gian của quá trình này sẽ phụ thuộc vào lượng dữ liệu được truyền và có thể là đáng kể.

Phân tích cú pháp ứng dụng: Tiến trình di chuyển

Phân tích cú pháp ứng dụng: Quá trình di chuyển

Xác minh di chuyển dữ liệu

Sau khi hoàn tất, quá trình di chuyển sẽ bước vào bước xác minh. Chưa kết thúc quá trình di chuyển. Trước tiên, bạn cần đảm bảo dữ liệu đã thực sự được chuyển và kiểm tra version local của Server phân tích cú pháp.

Phân tích cú pháp ứng dụng: Đã di chuyển xong, đang chờ hoàn thiện

Quay lại shell mongo của bạn và kiểm tra database local của bạn. Bắt đầu bằng cách truy cập database_name và kiểm tra các bộ sưu tập mà nó chứa:

  • use database_name
  • show collections
Sample Output for Todo App
Todo _Index _SCHEMA _Session _User _dummy system.indexes

Bạn có thể kiểm tra nội dung của một tập hợp cụ thể bằng phương thức .find() :

  • db.ApplicationName.find()
Sample Output for Todo App
> db.Todo.find() { "_id" : "hhbrhmBrs0", "order" : NumberLong(1), "_p_user" : "_User$dceklyR50A", "done" : false, "_acl" : { "dceklyR50A" : { "r" : true, "w" : true } }, "_rperm" : [ "dceklyR50A" ], "content" : "Migrate this app to my own server.", "_updated_at" : ISODate("2016-02-08T20:44:26.157Z"), "_wperm" : [ "dceklyR50A" ], "_created_at" : ISODate("2016-02-08T20:44:26.157Z") }

Đầu ra cụ thể của bạn sẽ khác nhau, nhưng bạn sẽ thấy dữ liệu cho ứng dụng của bạn . Sau khi hài lòng, hãy thoát khỏi mongo và quay lại shell:

  • exit

Bước 3 - Cài đặt và cấu hình server phân tích cú pháp và PM2

Với dữ liệu ứng dụng của bạn trong MongoDB, ta có thể chuyển sang cài đặt chính Server phân tích cú pháp và tích hợp với phần còn lại của hệ thống. Ta sẽ cung cấp cho Parse Server một user chuyên dụng và sử dụng trình có tên là PM2 để cấu hình nó và đảm bảo nó luôn chạy.

Cài đặt Server phân tích cú pháp và PM2 Global

Sử dụng npm để cài đặt tiện ích parse-server , trình quản lý tiến trình pm2 và các phụ thuộc của chúng trên phạm vi global :

  • sudo npm install -g parse-server pm2

Tạo User Phân tích cú pháp Chuyên dụng và Thư mục Trang chủ

Thay vì chạy parse-server như là user root hoặc bạn sudo user , ta sẽ tạo một user hệ thống được gọi là phân tích cú pháp:

  • sudo useradd --create-home --system parse

Bây giờ đặt password để phân tích cú pháp :

  • sudo passwd parse

Bạn sẽ được yêu cầu nhập password hai lần.

Bây giờ, sử dụng lệnh su để trở thành user phân tích cú pháp :

  • sudo su parse

Thay đổi thành folder chính của phân tích cú pháp :

  • cd ~

Viết hoặc di chuyển file mã cloud

Tạo một folder mã cloud :

  • mkdir -p ~/cloud

Chỉnh sửa /home/parse/cloud/main.js :

  • nano ~/cloud/main.js

Đối với mục đích thử nghiệm, bạn có thể dán như sau:

/home/parse/cloud/main.js
Parse.Cloud.define('hello', function(req, res) {   res.success('Hi'); }); 

Ngoài ra, bạn có thể di chuyển bất kỳ mã cloud nào được xác định cho ứng dụng của bạn bằng cách sao chép mã đó từ phần Mã cloud trong cài đặt của ứng dụng trên Control panel phân tích cú pháp.

Thoát và lưu.

Lấy các phím và ghi /home/parse/ecosystem.json

PM2 là một trình quản lý tiến trình giàu tính năng, phổ biến với các nhà phát triển Node.js. Ta sẽ sử dụng trình pm2 để cấu hình parse-server và giữ cho nó hoạt động lâu dài.

Bạn cần truy xuất một số khóa cho ứng dụng của bạn . Trong console Phân tích cú pháp, nhấp vào Cài đặt ứng dụng, sau đó nhấp vào Bảo mật & Khóa :

Trang tổng quan phân tích cú pháp: Cài đặt ứng dụng: Bảo mật và khóa

Trong số này, chỉ cần có ID ứng dụngKhóa chính . Các khóa khác (khóa API client , JavaScript, .NET và REST) thể cần thiết để hỗ trợ các bản dựng client cũ hơn, nhưng, nếu được đặt, sẽ được yêu cầu trong tất cả các yêu cầu. Trừ khi bạn có lý do để tin rằng khác, bạn nên bắt đầu bằng cách chỉ sử dụng ID ứng dụng và Master Key.

Với các phím này đã sẵn sàng, hãy chỉnh sửa một file mới có tên /home/parse/ecosystem.json :

  • nano ecosystem.json

Dán các giá trị cấu hình thay đổi sau để phản ánh chuỗi kết nối MongoDB, ID ứng dụng và Khóa chính của bạn:

{   "apps" : [{     "name"        : "parse-wrapper",     "script"      : "/usr/bin/parse-server",     "watch"       : true,     "merge_logs"  : true,     "cwd"         : "/home/parse",     "env": {       "PARSE_SERVER_CLOUD_CODE_MAIN": "/home/parse/cloud/main.js",       "PARSE_SERVER_DATABASE_URI": "mongodb://parse:password@your_domain_name:27017/database_name?ssl=true",       "PARSE_SERVER_APPLICATION_ID": "your_application_id",       "PARSE_SERVER_MASTER_KEY": "your_master_key",     }   }] } 

Đối tượng env được sử dụng để cài đặt các biến môi trường. Nếu bạn cần cấu hình các khóa bổ sung, parse-server cũng nhận ra các biến sau:

  • PARSE_SERVER_COLLECTION_PREFIX
  • PARSE_SERVER_CLIENT_KEY
  • PARSE_SERVER_REST_API_KEY
  • PARSE_SERVER_DOTNET_KEY
  • PARSE_SERVER_JAVASCRIPT_KEY
  • PARSE_SERVER_DOTNET_KEY
  • PARSE_SERVER_FILE_KEY
  • PARSE_SERVER_FACEBOOK_APP_IDS

Thoát và lưu ecosystem.json .

Bây giờ, chạy tập lệnh với pm2 :

  • pm2 start ecosystem.json
Sample Output
... [PM2] Spawning PM2 daemon [PM2] PM2 Successfully daemonized [PM2] Process launched ┌───────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ ├───────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ │ parse-wrapper │ 0 │ fork │ 3499 │ online │ 0 │ 0s │ 13.680 MB │ enabled │ └───────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

Bây giờ pm2 lưu danh sách tiến trình này:

  • pm2 save
Sample Output
[PM2] Dumping processes

Danh sách các quy trình pm2 đang chạy cho user phân tích cú pháp bây giờ sẽ được lưu trữ trong /home/parse/.pm2 .

Bây giờ ta cần đảm bảo quá trình parse-wrapper mà ta đã xác định trước đó trong ecosystem.json được khôi phục mỗi khi server được khởi động lại. May mắn là pm2 có thể tự tạo và cài đặt tập lệnh.

Thoát khỏi user sudo thông thường của bạn:

  • exit

Yêu cầu pm2 cài đặt các tập lệnh khởi tạo cho Ubuntu, được chạy với quyền user phân tích cú pháp , sử dụng /home/parse làm folder chính của nó:

  • sudo pm2 startup ubuntu -u parse --hp /home/parse/
Đầu ra
[PM2] Spawning PM2 daemon [PM2] PM2 Successfully daemonized [PM2] Generating system init script in /etc/init.d/pm2-init.sh [PM2] Making script booting at startup... [PM2] -ubuntu- Using the command:       su -c "chmod +x /etc/init.d/pm2-init.sh && update-rc.d pm2-init.sh defaults"  System start/stop links for /etc/init.d/pm2-init.sh already exist. [PM2] Done. 

Bước 4 - Cài đặt và cấu hình Nginx

Ta sẽ sử dụng web server Nginx để cung cấp reverse-proxy cho parse-server , để ta có thể phân phát API parse-server một cách an toàn qua TLS / SSL.

Trong yêu cầu , bạn cài đặt server default để phản hồi domain của bạn, với SSL được cung cấp bởi certificate Let's Encrypt. Ta sẽ cập nhật file cấu hình này với thông tin proxy của ta .

Mở /etc/nginx/sites-enabled/default trong nano (hoặc trình soạn thảo bạn chọn):

  • sudo nano /etc/nginx/sites-enabled/default

Trong khối server chính (nó phải chứa một location / khối), hãy thêm một khối location khác để xử lý ủy quyền của /parse/ URL:

/ etc / nginx / sites-enable / default
. . .         # Pass requests for /parse/ to Parse Server instance at localhost:1337         location /parse/ {                 proxy_set_header X-Real-IP $remote_addr;                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                 proxy_set_header X-NginX-Proxy true;                 proxy_pass http://localhost:1337/;                 proxy_ssl_session_reuse off;                 proxy_set_header Host $http_host;                 proxy_redirect off;         } 

Thoát khỏi editor và lưu file . Khởi động lại Nginx để các thay đổi có hiệu lực:

  • sudo service nginx restart
Output
* Restarting nginx nginx ...done.

Bước 5 - Kiểm tra server phân tích cú pháp

Ở giai đoạn này, bạn nên có những điều sau:

  • Chứng chỉ TLS / SSL do Let's Encrypt cung cấp
  • MongoDB, được bảo mật bằng certificate Let's Encrypt
  • parse-server chạy dưới phân tích cú pháp user trên cổng 1337, được cấu hình bằng các khóa mà ứng dụng của bạn mong đợi
  • pm2 quản lý quá trình parse-server dưới user phân tích cú pháp và tập lệnh khởi động để khởi động lại pm2 khi khởi động
  • nginx , được bảo mật bằng certificate Let's Encrypt và được cấu hình để kết nối proxy tới https:// your_domain_name /parse tới version parse-server

Bây giờ có thể kiểm tra việc đọc, ghi và thực thi mã cloud bằng cách sử dụng curl .

Lưu ý: Các lệnh curl trong phần này sẽ vô hại khi được sử dụng với ứng dụng thử nghiệm hoặc phát triển. Hãy thận trọng khi ghi dữ liệu vào ứng dụng production .

Viết dữ liệu bằng BÀI ĐĂNG

Bạn cần đưa ra một số tùy chọn quan trọng về curl :

Lựa chọn Sự miêu tả
-X POST Đặt loại yêu cầu, nếu không sẽ mặc định là GET
-H "X-Parse-Application-Id: your_application_id " Gửi tiêu đề xác định ứng dụng của bạn tới parse-server
-H "Content-Type: application/json" Gửi tiêu đề cho phép parse-server biết mong đợi dữ liệu có định dạng JSON
-d '{ json_data } Tự gửi dữ liệu

Kết hợp tất cả những thứ này lại với nhau, ta nhận được:

curl -X POST \   -H "X-Parse-Application-Id: your_application_id" \   -H "Content-Type: application/json" \   -d '{"score":1337,"playerName":"Sammy","cheatMode":false}' \   https://your_domain_name/parse/classes/GameScore 
Đầu ra mẫu
{"objectId":"YpxFdzox3u","createdAt":"2016-02-18T18:03:43.188Z"} 

Đọc dữ liệu với GET

curl gửi yêu cầu GET theo mặc định và ta không cung cấp bất kỳ dữ liệu nào, bạn chỉ cần gửi ID ứng dụng để đọc lại một số dữ liệu mẫu:

  • curl -H "X-Parse-Application-Id: your_application_id" https://your_domain_name/parse/classes/GameScore
Đầu ra mẫu
{"results":[{"objectId":"BNGLzgF6KB","score":1337,"playerName":"Sammy","cheatMode":false,"updatedAt":"2016-02-17T20:53:59.947Z","createdAt":"2016-02-17T20:53:59.947Z"},{"objectId":"0l1yE3ivB6","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T03:57:00.932Z","createdAt":"2016-02-18T03:57:00.932Z"},{"objectId":"aKgvFqDkXh","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T04:44:01.275Z","createdAt":"2016-02-18T04:44:01.275Z"},{"objectId":"zCKTgKzCRH","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T16:56:51.245Z","createdAt":"2016-02-18T16:56:51.245Z"},{"objectId":"YpxFdzox3u","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T18:03:43.188Z","createdAt":"2016-02-18T18:03:43.188Z"}]} 

Thực thi mã cloud mẫu

Một POST đơn giản không có dữ liệu thực tới https:// your_domain_name /parse/functions/hello sẽ chạy hàm hello() được định nghĩa trong /home/parse/cloud/main.js :

curl -X POST \   -H "X-Parse-Application-Id: your_application_id" \   -H "Content-Type: application/json" \   -d '{}' \   https://your_domain_name/parse/functions/hello 
Đầu ra mẫu
{"result":"Hi"} 

Nếu thay vào đó, bạn đã di chuyển mã cloud tùy chỉnh của riêng mình, bạn có thể kiểm tra bằng một hàm đã biết từ main.js

Bước 6 - Cấu hình ứng dụng của bạn cho server phân tích cú pháp và hoàn thiện quá trình di chuyển

Bước tiếp theo của bạn sẽ là thay đổi chính ứng dụng client của bạn để sử dụng điểm cuối Parse Server API. Tham khảo tài liệu chính thức về cách sử dụng phân tích cú pháp SDK với Server phân tích cú pháp. Bạn cần version SDK mới nhất cho nền tảng của bạn . Như với các bài kiểm tra dựa trên curl ở trên, hãy sử dụng chuỗi này cho URL server :

https://your_domain_name/parse 

Quay lại trang tổng quan Phân tích cú pháp trong trình duyệt của bạn và tab Di chuyển :

Phân tích cú pháp ứng dụng: Quá trình di chuyển

Nhấp vào nút Hoàn thiện :

Hộp thoại hoàn tất quá trình di chuyển phân tích cú pháp

Ứng dụng của bạn bây giờ sẽ được di chuyển.

Kết luận và các bước tiếp theo

Hướng dẫn này cung cấp một điểm khởi đầu chức năng để di chuyển ứng dụng được lưu trữ trên server phân tích cú pháp sang bản cài đặt Server phân tích cú pháp trên một hệ thống Ubuntu, chẳng hạn như server DigitalOcean. Cấu hình ta đã mô tả phải đủ cho một ứng dụng có lưu lượng truy cập thấp với cơ sở user khiêm tốn. Lưu trữ cho một ứng dụng lớn hơn có thể yêu cầu nhiều hệ thống cung cấp bộ nhớ dữ liệu dự phòng và cân bằng tải giữa các điểm cuối API. Ngay cả các dự án nhỏ cũng có thể liên quan đến các cân nhắc về cơ sở hạ tầng mà ta chưa trực tiếp giải quyết.

Ngoài việc đọc tài liệu Server phân tích cú pháp chính thức và theo dõi các sự cố GitHub cho dự án khi khắc phục sự cố, bạn có thể cần khám phá các chủ đề sau:


Tags:

Các tin liên quan

Cách sử dụng Ansible và Tinc VPN để bảo mật cơ sở hạ tầng server của bạn
2016-02-18
Cách chạy server phân tích cú pháp trên Ubuntu 14.04
2016-02-03
Cách thiết lập server VNC trên Debian 8
2015-09-29
Cách cấu hình dịch vụ Linux để khởi động tự động sau khi gặp sự cố hoặc khởi động lại - Phần 2: Tham khảo
2015-09-04
Cách thiết lập server IRC trên Ubuntu 14.04 với InspIRCd 2.0 và Shaltúre
2015-08-26
Cách chuyển tiếp cổng thông qua cổng Linux với Iptables
2015-08-20
Cách cấu hình dịch vụ Linux để khởi động tự động sau khi gặp sự cố hoặc khởi động lại - Phần 1: Ví dụ thực tế
2015-08-19
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 7
2015-07-16
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 7
2015-07-16
Thiết lập ban đầu của server Fedora 22
2015-07-08