Sử dụng docker – Xóa mù


Thuở xưa, thời còn mông muội, cả thế giới chỉ biết cài OS lên, nhét app vào rồi bấm chạy.
Khi phần cứng máy chủ trở nên rẻ tiền hơn, đồng thời, có những nhu cầu oái ăm phát sinh trong doanh nghiệp: một số app cần chạy độc lập –> mua máy khác cho nó chạy –> tăng số lượng phần cứng cần quản lý, lãng phí tài nguyên máy chủ do cái app đó dùng có tí tẹo tài nguyên mà không share cho con nào khác được. Và thế là Ảo hoá ra đời.
Như 1 sự cứu tinh, cho phép băm một máy chủ vật lý thành hàng chục OS độc lập chạy song song đồng thời , tương đương với 1 máy chủ vật lý được chia làm rất nhiều máy chủ con có cấu hình vừa đủ khác nhau cho từng nhu cầu. Việc này tận dụng tối đa khả năng sử dụng tài nguyên của doanh nghiệp, tiết kiệm tiền mua máy chủ cho hằng ha sa số công ty đang thắt lưng buộc bụng tìm kiếm lợi nhuận.
Tuy nhiên, không có gì hoàn hảo. Đối với doanh nghiệp to hơn 1 chút, họ cần tối ưu tài nguyên hơn nữa, chu trình phát triển phần mềm của họ muốn tối ưu tự động 1 cách tốt hơn nữa. Họ không muốn quan tâm tới đống máy chủ ảo lổn nhổn kia, chỉ muốn tập trung vào phát triển ứng dụng, triển khai nhanh chóng để đưa vào kinh doanh. Họ nhận ra rằng, nếu họ có 1000 máy chủ ảo giống nhau, thì họ tốn chi phí cho 1000 cái OS đang chạy, quá lãng phí. Và thế là lại có container ra đời.
Container giúp 1000 thằng ở trên dùng chung kernel của thằng OS trên máy vật lý, nhưng vẫn đảm bảo độc lập về mặt môi trường cho app chạy. Tức là, container chỉ là một cái hộp, bọc lấy cái app rồi đặt nó vào OS mà cái app đó cần. Mỗi app 1 hộp, trong hộp cài cắm những gì nó cần, và nó sẽ chỉ hoạt động trong cái hộp dành cho nó mà thôi. Những gì liên quan tới OS, phần cứng, tài nguyên, giờ đây sẽ có người khác lo cho nó. Kéo theo đó, container hiển nhiên nhẹ hơn rất nhiều so với máy ảo cồng kềnh, triển khai cũng nhanh hơn. Từ đây, mỗi 1 môi trường (OS) được gắn liền vào 1 app, quản lý thống nhất, dễ dàng và rẻ tiền hơn.

Docker là một platform để sử dụng container như thế.
– Cài đặt docker: Bấm vào đây
– Các khái niệm cơ bản về docker.
– Tạo một container centos:6.9 và cài đặt app.
– Lưu container để deploy tới nơi khác, hoặc backup.
– Image, docker file.
– Chu trình vòng đời của 1 container.
– Networking trong docker.

Rsync : Công cụ đồng bộ, copy dữ liệu tuyệt vời cho linux

Rsync (Remote Sync) là một công cụ mạng để sao lưu vào đồng bộ dữ liệu trên linux. Rsync có khả năng đồng bộ file giữa:
– 2 thư mục trong 1 máy chủ local
– 2 thư mục giữa máy chủ local và máy chủ remote
So sánh với scp truyền thống, rsync có những ưu điểm nổi trội:
– Hỗ trợ sao chép link, permission, .v.
– Nhanh hơn, do sử dụng cơ chế nén khi copy
– Có những tính năng như giới hạn băng thông truyền tải, bảo tồn được mốc thời gian, permission nguyên vẹn khi chuyển đi.
Syntax cơ bản:
rsync options source destination
Trong đó:
-v : verbose
-r : sao chép dữ liệu theo cách đệ quy ( không bảo tồn mốc thời gian và permission trong quá trình truyền dữ liệu)
-a :chế độ lưu trữ cho phép sao chép các tệp đệ quy và giữ các liên kết, quyền sở hữu, nhóm và mốc thời gian
-z : nén dữ liệu
-h : định dạng số

Cài đặt:
#Đối với họ redhat
yum install rsync
#Đối với họ debian
apt-get install rsync

Sao lưu, đồng bộ file trên local:
[root@devopsvn.xyz]# rsync -zvh backup.tar /tmp/backups/
created directory /tmp/backups
backup.tar
sent 12.31M bytes received 51 bytes 9.27M bytes/sec
total size is 21.49M speedup is 2.10

Nếu thư mục đích chưa tồn tại, thì rsync sẽ tự tạo folder
Ví dụ về đồng bộ folder 1 và folder 2
[root@devopsvn.xyz]# rsync -avzh /folder1 /folder2/

Đồng bộ dữ liệu giữa local và remote server, hoặc ngược lại:
Ví dụ 1: sao chép folder /tmp/vidu lên thư mục /opt của server 1.2.3.4
[root@devopsvn.xyz]$ rsync -avz /tmp/vidu/ root@1.2.3.4:/opt/
Ví dụ 2: Sao chép /opt/sex/ trên 1.2.3.4 về /opt/sex_backup của local
[root@devopsvn.xyz]# rsync -avzh root@1.2.3.4:/opt/sex/ /opt/sex_backup/

Các tham số khác khi sử dụng rsync:
--progress Hiển thị dung lượng và thời gian còn lại trong quá trình truyền.
--delete nếu file/folder có tồn tại ở thư mục đích nhưng không có ở thư mục nguồn thì xoá ở thư mục đích.
--max-size='200k' Giới hạn chỉ truyền file dung lượng tối đa là 200k (thích 200k thành gì thì sửa)
--remove-source-files Truyền xong thì xoá thư mục/file cũ
--bwlimit=100 Giới hạn băng thông truyền tải.

Cấu hình firewalld và ipset (tạo country blacklist cho firewalld)

Case: bọn trung quốc scan nhiều quá, nên mong muốn block hết IP từ trung quốc lại. Với các hệ thống chuyên nghiệp, FW đời mới hiện nay có thể làm một cách dễ dàng với tính năng GeoIP. Vậy còn các webmaster cá nhân, đơn vị nhỏ chỉ với 1 server public ra ngoài? Họ có thể lựa chọn các giải pháp của cloudflare, akamai, .v. Hoặc cây nhà lá vườn hơn là tận dụng firewalld của centos 7 để làm việc này. Dưới dây là hướng dẫn cách thực hiện:

Bước 1: tạo blacklist cho firewalld
firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000


–permanent : lưu cấu hình vĩnh viễn vào firewalld, nếu không có, sau khi khởi động lại firewall thì lệnh này sẽ mất hiệu lực
–new-ipset : tên của danh sách IP, ở đây chúng ta đặt là blacklist cho dễ quản lý, k thích có thể dùng tên khác như là danhsachden chẳng hạn
–type : kiểu lưu trữ, net dành cho subnet, nếu là 1 IP đơn lẻ thì dùng ip (–type=hash:ip)
–option=family : IPv4 or IPv6 network, inet is for IPv4
–option=hashsize : the initial hash size of the list
–option=maxelem : Số lượng phần tử tối đa của list, ở đây để 200k

Bước 2: tiếp theo chúng ta cần danh sách cái subnet tương ứng với đám IP cần block, ở đây là danh sách các subnet tương ứng với vùng Trung Quốc (CN)_
May thay, trên mạng có sẵn rồi, ở trang ipdeny có đủ toàn bộ thông tin này cho chúng ta. Download về mà xài thôi
wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
tar -vxzf all-zones.tar.gz

cd vào thư mục vừa giải nén, sẽ thấy cả loạt các file text .zone tương ứng với từng quốc gia. Add file của Trung Quốc vào list đã tạo ở trên:
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=./cn.zone
Chỗ đường dẫn file cn.zone nhớ sửa cho đúng, mình đang đứng trong folder chứa nó nên chỉ là ./ thôi

Bước 3: Chuyển cái list đã add IP ở 2 bước trên sang vùng drop của firewalld
firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
firewall-cmd --reload

Như vậy, IP source tương ứng với ipset:blacklist sẽ bị firwalld drop 1 cách tự động.
Muốn thêm vùng cần chặn vào thì chỉ cần cho các subnet vào file text theo format của đám .zone đã download ở trên. sau đó
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=đường dẫn file
Muốn remove 1 số ông khỏi cái list đen đó, thì cũng chỉ add hết subnet cần remove vào 1 file text, ví dụ /tmp/remove_ip.txt
Sau đó chạy:
firewall-cmd --permanent --ipset=test --remove-entries-from-file=/tmp/remove_ip.txt
firewall-cmd --reload

—–

Trick:
Đôi khi cần chặn gấp 1 subnet nào đó. Ngoài cách dùng file như trên, có thể sử dụng script:
firewall-cmd --permanent --ipset=blacklist --add-entry=$1
firewall-cmd --ipset=blacklist --add-entry=$1
firewall-cmd --reload

Lưu lại dưới tên /bin/ban (nhớ chmod +x cho nó nhé)
Mỗi lần cần chặn ai đó, ví dụ chặn khẩn cấp thằng 10.0.5.0/24
Chỉ cần gõ lệnh:
ban 10.0.5.0/24
Nhanh và gọn
Chúc các bạn thành công! (k thành công cũng thành nhân)

Sửa lại chuột logitech bị mất đầu thu

Chuột logitech bị mất đầu thu, có thể fix bằng 2 cách:
– Mua 1 đầu thu unify mới và kết nối lại với chuột bằng phần mềm UNIFYING SOFTWARE
Link download từ logitech
https://support.logitech.com/en_us/software/unifying
Hoặc
https://app.box.com/s/wfkgrgtuozzefrl86s3izzpdccp0vfb1
Phần lớn chuột của logitech đều hỗ trợ unify, tuy nhiên đầu thu loại này đắt, có khi hơn cả tiền chuột mới.
– Cách 2: kiếm 1 cái đầu thu của chuột logitech khác, sử dụng app ConnectUtility của Logitech để nối lại. Chỉ cần cắm đầu thu vào máy tính, bật app lên và làm theo hướng dẫn
https://app.box.com/s/79cotp6vwa3if1vj64zca1xd8kl23akj
Mình đã thử test: sử dụng đầu thu của logitech B175 thành công cho M221 silent
Chúc các bạn thànhcoong

Mount google drive, onedrive vào folder của linux

Case study: Cần giải pháp backup file rẻ tiền cho cái blog devopsvn.xyz

Hàng ngày source code và database được dump ra file à đồng bộ file đó lên google drive

Tiến hành:

Để mount folder sử dụng rclone

curl https://rclone.org/install.sh | sudo bash

  • Cấu hình với goole drive: cần chuẩn bị các thông tin dưới đây:
    • https://developers.google.com/identity/sign-in/web/sign-in?refresh=1 truy cập trang này và tạo 1 project, sau đó làm theo hướng dẫn. sẽ thu được client id và client_secret
      • client_secret
      • client_id
    • Trong quá trình chạy thử sẽ thấy không đăng nhập được, trên màn hình console sẽ hướng dẫn truy cập các đường link để xác thực và cấp quyền. Lưu ý theo dõi

rclone config
No remotes found - make a new one
n) New remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
n/r/c/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
10 / Google Drive
\ "drive"
[snip]
Storage> drive
Google Application Client Id - leave blank normally.
client_id>
Google Application Client Secret - leave blank normally.
client_secret>
Scope that rclone should use when requesting access from drive.
Choose a number from below, or type in your own value
1 / Full access all files, excluding Application Data Folder.
\ "drive"
2 / Read-only access to file metadata and file contents.
\ "drive.readonly"
/ Access to files created by rclone only.
3 | These are visible in the drive website.
| File authorization is revoked when the user deauthorizes the app.
\ "drive.file"
/ Allows read and write access to the Application Data folder.
4 | This is not visible in the drive website.
\ "drive.appfolder"
/ Allows read-only access to file metadata but
5 | does not allow any access to read or download file content.
\ "drive.metadata.readonly"
scope> 1
ID of the root folder - leave blank normally. Fill in to access "Computers" folders. (see docs).
root_folder_id>
Service Account Credentials JSON file path - needed only if you want use SA instead of interactive login.
service_account_file>
Remote config
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Configure this as a team drive?
y) Yes
n) No
y/n> n
--------------------
[remote]
client_id =
client_secret =
scope = drive
root_folder_id =
service_account_file =
token = {"access_token":"XXX","token_type":"Bearer","refresh_token":"XXX","expiry":"2014-03-16T13:57:58.955387075Z"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

Chú ý: trong quá trình config có thông tin scope, ở trên thông tin này là drive

Thông tin này sử dụng để thao tác sau này:

Cú pháp mount

rclone mount <scope>:<đường dẫn trên google drive> <đường dẫn thư mục local> --daemon
					

ví dụ

rclone mount  homthucuatao1:backup-rclone/ /opt/homthucuatao1/ --daemon

Tham số –daemon thể hiện tiến trình mount chạy ẩn dưới background.    

Cấu hình Virtual Host trong Apache

Virtual Host

Virtual Host là một cấu hình trong Apache để cho phép nhiều domain cùng chạy trên một máy chủ. Có một khái niệm khác được đề cập tới trong Nginx cũng có chức năng tương tự như Virtual Host được gọi là Server Block. Trong Log này mình chỉ muốn chia sẻ với các bạn còn lạ lẫm về Vhost cách để cấu hình một Virtual Host trong Windows, ở đây mình sử dụng XAMPP làm môi trường pháp triển.

Các bạn có thể tải XAMPP từ trang chủ: https://www.apachefriends.org
Sau khi tiến hành cài đặt xong các bạn mở 
<thu_muc_cai_dat_xampp>/apache/conf/httpd.conf

Tìm dòng Include conf/extra/httpd-vhosts.conf nếu thấy có dấu # ở đầu dòng thì xóa bỏ dấu # đi chỉ giữ lại Include conf/extra/httpd-vhosts.conf dòng này chỉ là để load config từ một file khác vào trong file httpd.conf. Với Xampp thì tập tin này được include mặc định. Nhưng mình vẫn muốn nói bước này để nếu các bạn có sử dụng các phần mềm khác để tạo Web Server như là Vertrigo, WAMP,App Server… thì vẫn có thể sử dụng được cấu hình Vhost. Đặc biệt là các bạn cũng có thể cài sử dụng một tập tin với tên khác ( Điều này không quan trọng lắm vì miễn sao các bạn Include được phần cấu hình Vhost vào trong httpd.conf là được.)

Giờ các bạn mở tệp tin<thu_muc_cai_dat_xampp>/apache/conf/extra/httpd-vhosts.conf copy đoạn code bên dưới và paste vào trong file httpd-vhosts.conf.

    ServerAdmin webmaster@yourdomain.com
    DocumentRoot "<đường dẫn thư mục sẽ được gọi tới khi truy cập vào youdomain.com"
    ServerName  youdomain.com
    ErrorLog "logs/yourdomain.com-error.log"
    CustomLog "logs/yourdomain.com-access.log" common
    <Directory "<đường dẫn thư mục">
        Options FollowSymLinks
        AllowOverride All
        DirectoryIndex index.php
        Require all granted
    </Directory>
</VirtualHost>
  • <VirtualHost></VirtualHost> Đây là cặp thẻ báo hiệu mở đầu và kết thúc của một khai báo về Vhost. Có một lưu ý nhỏ là nếu bạn nào đổi port của Apache (8080,81,v.v…) thì cũng phải đổi số 80 theo port các bạn chuyển sang nhé.
  • ServerAdmin Từ khóa khai báo địa chỉ email của admin (Không bắt buộc).
  • DocumentRoot Đây là từ khóa khai báo đường dẫn của thư mục sẽ được gọi khi người dùng truy cập vào domain được cấu hình. Đường dẫn này có thể nằm ở bất kỳ một phân vùng nào.
  • ServerName Chính là domain mà bạn muốn đặt.
  • ErrorLog Chỉ định đường dẫn của file log khi có lỗi (không bắt buộc) <thu_muc_cai_dat_xampp>/apache/logs là thư mục chứa file log.
  • CustomLog Log lại tất cả các Uri mà người dùng request không bắt buộc) <thu_muc_cai_dat_xampp>/apache/logs là thư mục chứa file log.
  • <Directory></Directory> Đây là cặp thẻ dùng để cấp quyền truy cập cho thư mục nếu thư mục không được cấp quyền sẽ gặp lỗi 403 khi các bạn cố gắng truy cập. Đường dẫn thư mục của bạn có thể là một regular expression. Nếu các bạn không rõ về Regex thì các bạn có thể dùng đường dẫn thư mục giống với khai báo trong DocumentRoot hoặc tham khảo thêm tại: http://httpd.apache.org/docs/2.4/en/mod/core.html#directory
  • Options FollowSymLinks Option này cho phép bạn truy cập theo symbolic link (giống như shortcut trong windows vậy). Ngoài ra còn có nhiều các options khác, các bạn có thể tham khảo thêm tại: http://httpd.apache.org/docs/2.4/en/mod/core.html#options
  • AllowOverride All cho phép bạn overwrite các config bằng file htaccess.
  • DirectoryIndex index.php Khi các bạn truy cập vào thư mục ( không chỉ rõ cụ thể là file nào) thì file index.php sẽ được gọi.
  • Require all granted là cho phép tất cả các máy khác được truy cập vào thư mục đang được cấu hình. Chú ý: từ phiên bản 2.2 trở về trước thì Apache sử dụng Allow from all để thay thế cho Require all granted

Các bạn khởi động lại Apache bằng cách là khởi động phần mềm XAMPP Control Panel dòng nếu dòng Apache đang running thì các bạn stop và start lại, còn nếu đang ở chế độ tắt rồi thì các bạn chỉ cần start là được.

Ok vậy là bạn đã cấu hình xong về phần của Apache giờ chỉ việc đăng ký DNS cho domain của bạn nữa là mọi việc hoàn tất.
Các bạn mở file 
%windir%/system32/drivers/etc/hosts bằng notepad hoặc bất kỳ trình editor nào. Thêm vào cuối file và lưu lại. Nếu bạn không lưu được file hosts thì nhớ tắt tình năng readonly và thử chạy lại bằng mode Administrator nhé.

127.0.0.1 yourdomain.com

Khi các bạn gõ địa chỉ yourdomain.com thì máy sẽ ưu tiên tìm địa chỉ IP của domain đó trong file hosts của hệ điều hành trước tiên.
Nếu không có thì nó sẽ đi tìm địa chỉ IP của domain này thông qua các DNS Server trên Internet. Vì bạn đã khai báo trong file hosts nên nó sẽ sử dụng địa chỉ IP được khai báo trong đó luôn. Ở đây địa chỉ IP 
127.0.0.1 trỏ về chính máy đang truy cập (chính là máy của bạn – còn nếu cấu hình trên server thì đó chính là bản thân máy server luôn). Bạn có thể sử dụng dài IP từ 127.0.0.1 -> 127.255.225.254 đây là dải IP trỏ về máy của bạn ( Nguyên dải luôn chứ không phải chỉ là 127.0.0.1 nhé ).

Giờ các bạn mở trình duyệt và gõ vào thanh địa chỉ thay thế dòng localhost xấu xí bằng một domain của riêng bạn. http://yourdomain.com yourdomain cũng có thể là tuan.tv, doan-totnghiep.com(chấm local. chấm canh, chấm mắm, hay chấm bất kì thứ gì bạn thích nhé, chỉ cần nhớ là đã khai báo trong ServerName và file host là được).

Tổng kết

Việc sử dụng Virtual Host có vài lợi ích sau.

  • Bạn có thể truy cập vào bất kỳ thư mục code nào mà không cần phải copy vào htdocs trong XAMPP.
  • Nếu bạn dùng folder code ở một phân vùng khác thì bạn không cần phải lo lắng backup lại folder code mỗi lần cài lại windows.
  • Nhìn có vẻ nguy hiểm hơn :v

Các bạn cũng có thể cấu hình Vhost với WAMP, APPServer, USBServer các cấu hình cũng không khác nhiều lắm. Vì tất cả các phần mềm này đều dùng Apache, Mysql và PHP. Vhost là một tình năng của Apache chứ không phải của XAMPP nên phần mềm nào dùng Apache thì đều có thể cấu hình Vhost theo cách tương tự, điểm khác biệt chỉ là khác về nơi đặt file httpd.conf. Chúc các bạn thành công.

Xử lý lỗi KeyError khi ghép chuỗi python

Case:
chat_id=428519060
noidung='test'
body='''{"chat_id":"{}","text":"{}"}'''.format(chat_id,noi_dung)
KeyError: '"chat_id"'

Nguyên nhân: do sử dụng hàm format, nên trong chuỗi có dấu { hoặc } sẽ bị lỗi.
Xử lý: bằng cách thay { bằng {{ và } bằng }}
body='''{{"chat_id":"{}","text":"{}"}}'''.format(chat_id,noidung)
'{"chat_id":"428519060","text":"test"}'

Cài đặt docker trên centos 6

yum install docker-io
service docker start

Nếu có lỗi không tìm thấy service docker, gõ lệnh docker thấy:

Segmentation Fault or Critical Error encountered. Dumping core and abort

Nguyên nhân do máy này đã cài đặt gói docker trước đó. Khi đó cần gỡ bỏ gói docker ra, cài lại:

yum -y remove docker.x86_64
yum install docker-io
service docker start

TÌm tin nhắn trong skype với nhiều điều kiện

Skype lưu đường dẫn profile của mỗi user trong folder C:\Users\<user name>\AppData\Roaming\Skype\<Skype name, tên đăng nhập>\main.db

Mở file này bằng sqlite brower, bảng lưu tin nhắn thuộc bảng Messages, một số trường chính:

  • body_xml: trường lưu nội dung message
  • timestamp: thời gian tin nhắn, hiển thi dưới dạng unixtime
  • author: người gửi

Một số câu truy vẫn

select date(timestamp, ‘unixepoch’, ‘localtime’), body_xml from Messages where

timestamp >= 1540479600 and

body_xml like ‘%【アロー価格取込バッチログ確認】%’

  • lọc ra các message có thời gian sau thời gian cần tìm (convert thời gian cần tìm sang unixtime để truy vấn) chưa từ khoá 【アロー価格取込バッチログ確認】

Kill zombie process linux

[root@abc-kvm93 123_redmine_alert]# ps aux | grep phantom

root 23858 0.1 0.0 0 0 pts/2 Z 11:09 0:01 [phantomjs] <defunct>

root 25464 0.1 0.0 0 0 pts/2 Z 11:16 0:01 [phantomjs] <defunct>

root 27425 0.2 0.0 0 0 pts/2 Z 11:24 0:01 [phantomjs] <defunct>

root 29398 4.4 0.3 2640400 53688 pts/2 Sl 11:32 0:01 /home/huybk/chip1stop_redmine_alert/phantomjs –cookies-file=/tmp/tmp48bddbr7 –webdriver=37998

root 29434 6.4 0.3 2640440 53456 pts/2 Sl 11:32 0:01 /home/huybk/chip1stop_redmine_alert/phantomjs –cookies-file=/tmp/tmpi3guirm8 –webdriver=53345

root 29475 17.7 0.3 2641020 53296 pts/2 Sl 11:32 0:01 /home/huybk/chip1stop_redmine_alert/phantomjs –cookies-file=/tmp/tmprgkv3jhr –webdriver=53106

root 29520 0.0 0.0 103332 876 pts/3 S+ 11:32 0:00 grep phantom

Các process defunct luôn ko mất, gọi là zombie. Do các process này đã ngừng xử lý nhưng vẫn không biến mất khỏi process entry.

Để kill các process này cần giết tiến trình bố của nó. Tìm thằng bố bằng cách chạy
ps -xal

Trường thứ 4 chính là PID của thằng bố nó, kill -9 là xong