restic 常用指令

使用情境是依不同系統 , 建立多個備份倉, 一個倉別若要備份不同目錄, 可用tag區分.

備份倉盡量用簡單的方式, 當然也可以掛載sftp ,或是 rclone.

要備份的目錄, 盡量用掛載的, 變成一個目錄, rclone是個好選擇

備份後,執行保留策略(7天或是30天), 備份可以從目錄, 也可以從stdin ,

還原就比較沒甚麼好談的

至於密碼, 我覺得用環境變數就好了, 用檔案存密碼, 我覺得指令看起來好複雜

  • 建立備份倉
export RESTIC_PASSWORD=123456
restic -r <備份倉目錄> init
  • 備份
#Linux
export RESTIC_PASSWORD=123456
restic -r <備份倉目錄> backup <想要備份的目錄>  --cleanup-cache --verbose --verbose >> restic.log 2>&1

#windows powershell
$Env:RESTIC_PASSWORD='password'
restic -r <備份倉目錄> backup <想要備份的目錄> | Out-File C:\temp\files.log -Encoding UTF8
  • 備份(mysql資料庫)
export RESTIC_PASSWORD=123456
mysqldump -u root -p<密碼>  --all-databases -h <主機ip> |  restic --repo <備份倉目錄> backup --stdin --stdin-filename all.sql
  • tag 以上備份可以加上tag區分不同目錄, tag 名稱可以一樣
restic -r <備份倉目錄> backup <想要備份的目錄> --tag:名稱  --cleanup-cache --verbose --verbose >> restic.log 2>&1
  • 查看備份
export RESTIC_PASSWORD=123456
restic -r <備份倉目錄> snapshots
  • 還原指定的snap
export RESTIC_PASSWORD=123456
restic -r <備份倉目錄> restore <snapshots id> --target <要還原的目錄>
  • 備份完畢,刪除過多的備份
export RESTIC_PASSWORD=123456
restic -r <備份倉目錄> forget --prune --keep-daily 7
restic -r <備份倉目錄> forget --prune --keep-last 7

QNap不正常關機, 造成vm開機失敗的修復小心得

一直以來QNap 純粹用來當作儲存設備, 花俏功能我都直接關掉, 只開放iSCSI , NFS 與CIFS , 而且限定內部ip才能連線(Qlocker遠離我).
但是最近公司停電,開機後, 我發現有一個插槽壞了, 換硬碟也顯示無硬碟狀態, 有夠麻煩的, 手忙腳亂了一番, 不小心造成QNap不正常關機(不要笑我啊).

悲劇來了, windows 的主要網域主控站, 與Sharepoint Server直接GG 慘, 而Linux也有狀況例如這個網站也GG, 好險Linux自帶工具, 告訴我可以執行xfs修復, 至少可以開機成功, windows就不多說了, 直接拿備份重建, 但是一波好幾折, 辛酸阿.

先說 linux 的docker server中 mariadb server container也再起不能了, 哭,
於是我另開一個可啟動的 mariadb container , 把有問題的volume中的額外table放到乾淨的mysql目錄中, 想像這樣或許可以救起來其他資料庫, 一開始啟動成功, show database, show tables也看到, 真是高興, 但是要select tables時候, 出現錯誤訊息

mysql error unknown table engine

又哭… 找了好久終於找到可以在my.cnf中加上以下參數, 但是我的container沒有mapping到/etc中的my.cnf , 於是又搞了一次, 才可以進行修復.

innodb_force_recovery = 1 
or 
innodb_force_recovery = 4

終於完成了, 我的網站修復完成.

— added 2021/5/10 —-

後來發現以上innodb_force_recovery參數只能暫時使用, 需要趕緊使用mysqldump把資料備份下來,

mysqldump --user=root -h 127.0.0.1 --password --lock-tables --databases 資料庫名稱 > xxx.sqlmysqldump --user=root -h 127.0.0.1 --password  --databases 資料庫名稱 > xxx.sql

然後再重新跑一個全新 server 把相關資料倒回去, 才能真正高枕無憂

安裝wordpress權當公司內部訊息公告網站

以前安裝wordpress(包括目前這個網站)都只用陽春功能, 沒遇到什麼問題,也可以一直更新到最新版.

直到最近想要幫公司裝一個簡單的內部訊息公告網站, 需要安裝兩個插件, 但其中一個插件需要額外安裝php 7.x extension ,
安裝extension這倒是沒什麼問題, 問題是官方的wordpress居然安裝失敗, 要用很多方法才能解決, 實在有夠麻煩.

這個插件就是用來新訊息公告的時候, 可以自動發信給相關的人 , 請參考 mailpoet , 這個插件乾脆就自己弄一個wordpress, 直接將相關的插件都裝起來
雖然mailpoet對於安裝沒有過多的著墨, 其實就跟自己手動安裝一樣簡單, 交由wordrepss wizard就可以了

貼上自己簡單的安裝方式

1. 安裝mariadb container(name:mariadb)
   安裝完畢記得新增一個database名稱叫做wordpress    
   create database wordperss character set utf8mb4 collate utf8mb4_unicode_ci
2. 安裝mailpoet/wordpress
   docker volume create wp-content
   docker run --name mywordpress -v wp-content:/var/www/html/wp-content -p 8080:80 \\
   -d --restart always  mailpoet/wordpress:wp-5.4_php7.4_20200617.1
3. 停用mywordpress , mariadb
   docker stop mywordperss
4. 讓mywordpress與mariadb成為羈絆
   docker network connect myNetwork mariadb
   docker network connect myNetwork mywordpress
5. 啟用mywordpress, mariadb , 進入網頁的wizard , 就可以輸入mariadb的名字進行安裝了
   docker start mariadb
   docker start mywordpress
   

單一docker server,多個Container如何互相認識

安裝非官方的wordpress(mailpoet/wordpress) , 發現指定mysql的ip失敗(一樣是docker) , 原來是忘了將mysql與wordpress這兩個container 綁定相同網路, 這樣兩個container可以互相ping對方的名字, 也可以互相認識了

docker network connect myNetwork <container name>

myNetwork 可修改

簡易筆記-使用docker安裝iredmail

iredmail 是一個很強大的軟件,看文件開發者應該是大陸人,很牛!

我12年前就開始用這個軟件, 而且現在還在用!

雖說免費版不支持微軟的AD, 但很多小公司本來就沒有這些配置, 所以沒差.

目前這系統現在已經很穩定很成熟, 非常很適合小公司使用, 大推薦,

而且最近我才發現一位應該是俄羅斯人有持續提供docker安裝方式. https://hub.docker.com/r/lejmr/iredmail , 又更方便了.

以下是我安裝的心得, 有空會持續更新

1. 用volume的方式與docker建立對應, 方便以後備份升級
2. 與官網建議的不同,我移除灰名單模組,這東西又愛又恨,愛的是擋廣告很猛,恨的是要對方重發信,常常被使用者罵收信很慢.
3. 安裝後, 輸入 https://ip:8443/iredadmin  就可以用postmaster@<網域> 登入, 接下來就可以新增網域,或是使用者.
4. 輸入https://ip:8443/mail , 或是 https://ip:8443/sogo 
   使用者登入@<網域>  就可以收發信了
5. 使用管理者也可以收信, 最初系統自行發送的三封信很重要, 例如要dns設定DKIM之類的
6. 我有將/etc/letsencrypt 對應到iRedMal,打算用來取代自簽的證書
docker volume create iredmail_mysql
docker volume create iredmail_vmail
docker volume create iredmail_clamav
docker volume create iredmail_log
docker volume create iredmail_postfix_conf
docker volume create iredmail_amavisd_conf
docker run -p 8443:443 -p 110:110 -p 25:25 -p 587:587 -p 143:143 -p 993:993 -p 995:995 \
            -h <主機名稱(含網域),hostname.domain> \
            -d --restart always \
            -e "MYSQL_ROOT_PASSWORD=password" \
            -e "SOGO_WORKERS=1" \
            -e "TZ=Asia/Taipei" \
            -e "POSTMASTER_PASSWORD={PLAIN}password" \
            -e "IREDAPD_PLUGINS=['reject_null_sender', 'reject_sender_login_mismatch', 'throttle', 'amavisd_wblist', 'sql_alias_access_policy']" \
            -v iredmail_mysql:/var/lib/mysql \
            -v iredmail_vmail:/var/vmail \
            -v iredmail_clamav:/var/lib/clamav \
            -v iredmail_log:/var/log \
            -v iredmail_postfix_conf:/etc/postfix \
            -v iredmail_amavisd_conf:/etc/amavisd \
            -v /etc/letsencrypt:/etc/letsencrypt \
            -v /etc/letsencrypt/live/<主機網域>/privkey.pem:/etc/ssl/private/iRedMail.key \
            -v /etc/letsencrypt/live/<主機網域>/fullchain.pem:/etc/pki/tls/certs/iRedMail.crt \
            --name=iredmail lejmr/iredmail:mysql-latest

經過試用一個月, 有一個目前無法解決的問題,就是重開docker時,dovecot或mysql會殘留舊的pid,造成dovecot與mysql啟動失敗的狀況, 此時只能手動刪除 /var/run/dovecot/master.pd or /var/lib/mysql/mysql.sock 等檔案, 然後再切換目錄到/services 找出重啟的shell scripts ,才能解決問題

好消息是官方也著手進行iredmail docker官方版 https://hub.docker.com/r/iredmail/mariadb
目前還是beta狀態,不適合正式上戰場,但我很期待 - 2020/05/06

如何安裝php加解密套件 ionCube

php網站開發商為了保護自己的程式, 常常使用ionCube這個套件將程式加密,

因此咖啡偶拿到廠商的程式, 需要安裝ionCube解開執行:

1 下載並解開
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

2 複製與php對應版本之so或是dll檔案
例如php是5.6
cp ioncube_loader_lin_5.6.so /usr/lib64/php/modules/

3. php.ini新增一筆
zend_extension = /usr/lib64/php/modules/ioncube_loader_lin_5.6.so

4. 檢查是否成功

php -m

mysql(mariadb) java 連線設定(connection string)

每次都會忘記, 因此寫下來

 
jdbc:mysql://localhost:3306/database?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

有時候透過別人寫好的web設定界面, 會造成寫入xml錯誤 , 因此要注意所搭配系統是否使用xml當作設定檔.

例如&useUnicode=true ,寫到xml會出現  &amp;amp;useUnicode=true

請將多餘的amp;移除,只要留下 &amp;useUnicode=true 即可

mysql(mariadb)新增資料庫(UTF-8)與使用者權限

每次都會忘記, 而且之前一點都不在意把使用者與root權限分開,但資安還是要顧著.

MariaDB>CREATE DATABASE 資料庫名稱 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

新增使用者,密碼與權限

MariaDB> create database 資料庫名稱;
MariaDB> create user 使用者帳號@localhost identified by '使用者登入密碼';
MariaDB> grant all privileges on 資料庫名稱.* to 使用者帳號@localhost;
MariaDB> flush privileges;
MariaDB> quit
1 2 3