Sunday, September 5, 2021

Basic rsync for backup source to destination on Ubuntu 20.04 (ทบทวน)

  • ว่าด้วยเรื่องการทำ mirror web server เรา เอาไว้รองรับยามฉุกเฉิน
  • ครั้งที่แล้วใช้ scp เพราะคิดว่า rsync ต้องคอนฟิกยุ่งยาก แต่ไม่ใช่อย่างที่คิดเลย
  • เพราะ source เราเป็น Ubuntu และ destination เราเป็น Ubuntu ขั้นตอนจึงสั้นนิดเดียว
  • ซึ่ง Ubuntu 18 .04 และ 20.04 มันจะลง rsync ให้เรามาตั้งแต่ติดตั้งแล้ว เราแค่ไปเรียกใช้งานเท่านั้น
  • $ rsync [option,...] source destinaton

How to

  • ต้องการ Sync data จาก Server (source) มายัง Client (desitnation)
  • ตัวอย่างนี้ ให้คัดลอกไฟล์ภายใน folder ชื่อ path_server ไปวางไว้ภายใน path_client โดยไม่ได้เอา folder path_server ไปด้วยนะ

$ rsync -avzh --delete user@ip_server:/path_server/ /path_client

  • ส่วนตัวอย่างนี้ ให้คัดลอก folder ชื่อ path_server และ ไฟล์ภายในทั้งหมด ไปวางไว้ภายใน path_client

$ rsync -avzh --delete user@ip_server:/path_server /path_client

  • ทั้ง 2 ตัวอย่างคล้ายกันแค่มี / และ ไม่มี / หลัง path_server
  • ถ้าใช้คำสั่งด้านบนโดยยังไม่เคยใช้ public key authen ระบบจะถาม password ทุกครั้ง
  • แนะนำการ authen ใช้แบบ public key authen ใน profile เรา 1 ครั้ง
  • ครั้งถัดไป มันเอาค่า public key authen เป็น default by pass ให้เลย ไม่ต้องใส่ option -i ให้ยาว
  • เช่น ถ้าเราเคยใช้ คำสั่ง

$ ssh -i /path/privkey user@ip_server

  • ครั้งถัดไปให้เราใช้แค่นี้ไม่ต้องใช้ -i มันก็ เราค่า authen  โดย private key มาใช้โดยอัตโนมัติ จนเรางง เลยว่า ทำไมมันไม่ให้ใส่ password หว่า ทั้งที่ไม่ได้ใช้ -i

$ ssh user@ip_server 

  • และ รวมถึง util อื่นๆ ที่ใช้ผ่านบน client เครื่องนี้ด้วย เช่น scp , rsync เป็นต้น
  • ลืมในกรณีกลับกัน ต้องการ sync เอาไฟล์จาก client ไป update บน server ให้ทำประมาณนี้ คือ  เอาไฟล์ภายในและตัว folder path_client ไปวางไว้ภายใต้ path_server

$ rsync -avzh --delete /path_client  user@ip_server:/path_server

Note

  • ถ้าเราไม่ใส่ --delete มันจะไม่ลบไฟล์ ที่เกินในฝั่ง destination

Related

  • http://juuier.blogspot.com/2021/09/scp-copy-tool-ubuntu-2004.html
  • https://juuier.blogspot.com/2014/03/mirror-website-rsync.html
  • https://juuier.blogspot.com/2021/06/set-remote-ssh-by-public-key.html

Ref

  • https://linuxhint.com/rsync_copy_files_ubuntu/ 
  • man rync

Thursday, September 2, 2021

SCP copy tool ใน ubuntu 20.04

  • ประเด็นมีอยู่ว่า จะทำ mirror site จาก server ubuntu 20.04 มา client ที่เป็น ubuntu 20.04 เหมือนกัน
  • จริงก็ควรใช้ rsync น่ะ แต่ขี้เกียจคอนฟิกซะงั้น
  • งั้นเล่นง่ายๆ แต่เปลือง bandwidth หน่อยใช้ scp แล้วกัน

การคัดลอกไฟล์ file1 จาก server มา client โดยสั่งจาก client

$ scp user@server_ip:/path_server/file1 /path_local/ 

$ scp -i /path_private_key user@server_ip:/path_server/file1 /path_local/ 

 การคัดลอกไฟล์ multi files จาก server มา client โดยสั่งจาก client

$ scp user@server_ip:/path_server/* /path_local/ 

$ scp -i /path_private_key user@server_ip:/path_server/* /path_local/ 

# กรณีนี้ ถ้าใช้ * มันจะ copy เฉพาะไฟล์ เท่านั้น ถ้าเจอ folder มันจะไม่ copy ลงมา

การคัดลอก folder จาก server มา client โดยสั่งจาก client

$ scp -r user@server_ip:/path_server/folder /path_local/

# folder จะ copy มาวางที่ /path_local/folder

# กรณี scp -r มันจะเอาทั้ง file และ subfolder ใน folder ที่คัดลอกมาให้ทั้งหมดเลย

การคัดลอก file หรือ folder จาก client ไป server โดยสั่งจาก client 

$ scp  /path_local/file1 user@server_ip:/path_server/

$ scp -r /path_local/folder user@server_ip:/path_server/

# folder มันจะไปอยู่ที่ /path_server/folder

Related

  • https://juuier.blogspot.com/2009/01/command-line.html

Ref

  • https://linuxconfig.org/how-to-setup-the-rsync-daemon-on-linux
  • https://stackabuse.com/using-scp-to-copy-and-securely-transfer-files-and-folders/
  • https://stackabuse.com/copying-a-directory-with-scp/

Wednesday, September 1, 2021

Create & set permission for user MySQL Server Ubuntu 20.04

  • เคยสร้าง และ กำหนดสิทธิ์บรรทัดเดียวกัน 

GRANT ALL ON *.* TO 'user2'@'localhost' IDENTIFIED BY 'pass1';

  • แต่ทำไม Ubuntu 20.04 มัน syntax error หว่า
  • หาคำสั่งล่าสุด สำหรับ MySQl Server CE Ver8.0.26 on Ubuntu 20.04.2

สำหรับ Localhost user

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_user_password';
grant all privileges on *.* to 'new_user_name'@'localhost' with grant option;
grant all privileges on some_db.some_tb to 'new_user_name'@'localhost' with grant option;
grant all privileges on some_db.* to 'new_user_name'@'localhost' with grant option;

สำหรับ % user

CREATE USER 'new_user'@'%' IDENTIFIED BY 'new_user_password';
grant all privileges on *.* to 'new_user_name'@'%' with grant option;
grant all privileges on some_db.some_tb to 'new_user_name'@'%' with grant option;
grant all privileges on some_db.* to 'new_user_name'@'%' with grant option;

/** ให้สิทธิ์แค่ select อย่างเดียว */ 

grant select on some_db.* to 'new_user_name'@'%' with grant option; 


คำสั่งด้านล่างเพิ่มสิทธิ์ เทียบเท่า root ให้จัดการเรื่องอื่นๆ ได้ (create user ก่อนใช้คำสั่งนี้)

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'localhost' WITH GRANT OPTION;

Related 

  • https://juuier.blogspot.com/2011/05/mysql-create-user.html

Ref

  • https://programmingfields.com/create-mysql-user-and-grant-privileges-in-ubuntu-20-04/
  • https://stackoverflow.com/questions/20036547/mysql-how-to-grant-read-only-permissions-to-a-user

LAMP & Vhost SSL Clone on Ubuntu 20.04 Server to Client same version os

  • เตรียม LAMP สำหรับ wordpress ประมาณนี้ ใน Ubuntu 20.04

sudo apt install apache2
sudo apt install mysql
sudo apt install php7.4
sudo apt install php7.4-common php7.4-cli php7.4-bcmath php7.4-bz2 php7.4-curl php7.4-intl php7.4-mbstring php7.4-mysql php7.4-readline php7.4-xml php7.4-zip php7.4-gd php7.4-gmp

  • คัดลอก apache2 config จาก server มา client ไว้พาธเดียวกัน
  • /etc/apache2/sites-available/xxx.go.th.conf
  • /etc/apache2/sites-available/xxx.go.th-le-ssl.conf
  • ตรวจสอบ mod ที่จำเป็นต่อการรัน https บน client

sudo a2enmod ssl
sudo a2enmod headers
sudo a2ensite xxx.go.th
sudo a2ensite xxx.go.th-le-ssl
sudo a2enmod rewrite

  • คัดลอก ssl ไฟล์ที่จำเป็นจาก Server to Client ไว้พาธชื่อเดียวกัน

/etc/letsencrypt/options-ssl-apache.conf

/etc/letsencrypt/live/xxx.go.th/fullchain.pem

/etc/letsencrypt/live/xxx.go.th/privkey.pem

  • เปลี่ยนค่า /etc/hosts ให้ชี้มาที่ client เพื่อทดสอบ cert ที่ clone มาใช้ที่ client
  • สรุปใช้งานได้ ปกติ เช่นกัน

Ref

  • https://www.arubacloud.com/tutorial/how-to-enable-https-protocol-with-apache-2-on-ubuntu-20-04.aspx
  • https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04

Instead software ipmsg on Ubuntu 20.04 use iptux

sudo apt-get install -y iptux

  • แก้ปัญหาภาษาไทย เข้าเมนู Tools => Preferences => System
  • เปลี่ยน coding จาก utf-16 และ utf-8 เป็น tis-620

Ref

  • https://zoomadmin.com/HowToInstall/UbuntuPackage/iptux 
  • https://github.com/iptux-src/iptux

Tar + Gzip folder and file

$ tar -zcvf outputFileName folderToCompress

Exam Compress by tar + gzip folder

$ tar -zcvf html.tar.gz /var/www/html/

$ cd /var/www/html

$ tar -zcvf html.tar.gz html

Exam Compress by tar + gzip files

$ tar czf file.tar.gz file

$ tar czf file.tar.gz file1 file2

Exam Compress by tar + gzip files and folder

$ tar -cvf - file1 file2 dir3 | gzip > archive.tar.gz

Exam Extract files gz

$ tar -zxvf prog-1-jan-2005.tar.gz
$ tar -zxvf prog-1-jan-2005.tar.gz -C /tmp

Related

  • https://juuier.blogspot.com/2009/01/command-line.html

Ref

  • https://mkyong.com/linux/linux-how-to-gzip-a-folder/ 
  • https://www.cyberciti.biz/faq/how-do-i-compress-a-whole-linux-or-unix-directory/

Manual renew wildcard certificate Let's Encrypt

  • ประเด็นมีอยู่ว่า ก่อนทำ cer เป็นแบบ wildcard (*.domain) ก็สามารถทำ auto renew cer ได้
  • แต่พอเปลี่ยนเป็นแบบ wildcard มัน auto renew ไม่ได้ซะงั้น

Solved

sudo certbot certonly --manual -d 'your_domain.com,*.your_domain.com'

  • จากนั้นมันจะได้ค่า hash มาให้ไปเพิ่มใน dns control panel ของเราโดยเพิ่ม TXT Record
  • ช่องแรกด้านซ้ายสุดใส่เป็น

_acme-challenge

  • ซ่องด้านขวาก็ใส่ค่า hash

eWX6lEavBKmWPm4waFyxxxxxxxxxxxxxxxxxxxxxxxxxx

  • แล้วกดเพิ่ม และ บันทึกให้เรียบร้อย
  • มันจะได้ประมาณภาพนี้
  • จากนั้นรอประมาณ 5 นาที หรือ แล้วแต่ dns service ว่าต้องใช้เวลา update นานขนาดใหน
  • เจ้านี้รอประมาณ 3-5 นาที จากนั้นให้เราไปตรวจสอบ txt record ว่า update ใหม่ยัง
  • โดยเข้า https://mxtoolbox.com/TXTLookup.aspx แล้วพิมพ์ประมาณ

_acme-challenge.your_domain

  • และถ้า record  ได้ค่า hash ใหม่แล้ว ใน terminal ที่เรารันคำสั่งแบบ manual renew ให้ enter ได้เลย
  • Let's Encrypt จะตรวจสอบว่า เราเป็นเจ้าของ domain ถูกต้องผ่าน txt record นี่แหละ
  • เป็นอัน manual renew wildcard certificate เรียบร้อย 
  • ก่อนถึง 90 วัน (expire range day) ก็ manual renew อีกรอบ
Edit 26-04-2002
  • การ renew cert มันอัพเดทเพิ่มเติม คือ หลังจาก  dns อัพเดท txt record ได้ค่าใหม่ที่เราบันทึกแล้ว กด enter  มันจะให้เราสร้างไฟล์ตามพาธของเว็บไซต์เรา โดยใส่ content ตามที่มันแจ้ง
  • เมื่อเราสร้างไฟล์นั้นเสร็จก็กด enter  อีกครั้ง เป็นอันเสร็จสิ้นขบวนการ renew cert
  • สุดท้ายอย่างลืม restart web server เรา
$ sudo /etc/init.d/apache2 restart

Ref

  • https://community.letsencrypt.org/t/an-authentication-script-must-be-provided-with-manual-auth-hook/74301

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Env

  • Server Ubuntu 18.04, MySQL Server
  • Client Ubuntu 20.04, MySQL Server 8

Problem

  • เขียน bash script + python script เพื่อ clone db จาก server มา client
  • โดย export db structure exclude trigger, export data by load outfile
  • จากนั้นที่ client สร้าง db sturcture และ load infile data เข้า db จากนั้น import trigger 
  • ตอน export structure และ data จาก server ไม่พบปัญหา
  • ปัญหาเกิดตอนพยายาม import data เข้าใน client
  • มันแสดงใน python exception แบบนี้

1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Solved

  • ที่ฝั่ง client ให้เปิดคอนฟิกไฟล์ (MySQL Server 8, Ubuntu 20.04)

sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf

  • เพิ่ม คอนฟิกประมาณนี้

secure-file-priv = ""

  • ในคอนฟิกก็จะได้ประมาณนี้

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
log-error    = /var/log/mysql/error.log
secure-file-priv = ""
local-infile = 1
Ref

  • https://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql
  • https://computingforgeeks.com/how-to-solve-mysql-server-is-running-with-the-secure-file-priv-error/