星期三, 11月 21, 2018

Jenkins HTTPS

依過去官網的說明,啟動 Jenkins 時可透過兩個參數指定憑證檔與金鑰檔的路徑,即可支援 https。由於我們用的是付費憑證,瀏覽器一直也用得沒什麼問題,但在 Jenkins Node 連回主節點時,總是抱怨憑證鍊問題,不得已總是要多加 -noCertificateCheck 來避免,今天總算是找到答案了:指定憑證即使是完整的憑證鍊,Jenkins 也是忽略不管,只能放 Java KeyStore 才算數;而且官網不久前也因此更新這篇說明,以後改給專屬的 JKS 以及保護密碼即可。

星期二, 11月 06, 2018

Most light-weight http(s) server

原本以為 Nginx 夠輕量了,但在考慮還要額外安裝的前提下,似乎就輸給 CentOS 上兩種預先備妥的方案:

  • openssl s_server -accept 443 -www
  • python -m SimpleHTTPServer
python 要搭配 https 其實也不麻煩,執行一個固定內容的檔案即可:
  • import BaseHTTPServer, SimpleHTTPServer
  • import ssl

  • httpd = BaseHTTPServer.HTTPServer(('', 443), SimpleHTTPServer.SimpleHTTPRequestHandler)
  • httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./server.pem', keyfile='./server.key', server_side=True)
  • httpd.serve_forever()

星期三, 9月 26, 2018

Simple and Free SSL

現在這時代處處要求安全,網站若還是走 http:// 已經跟不上潮流了,但我們非得繳這些「安全稅」來維持門面嗎?假設網域的名稱解析、防火牆開 80 埠這些事都已準備好,以下我們就來看看最近的做法:
  • CentOS 7
    • 「不必」準備 Web Server,如果有也請先關掉
      • sudo yum install epel-release 安裝企業版套件庫
      • sudo yum install certbot 這次的主角
      • sudo certbot certonly -n -d acme.com -m abc@acme.com --standalone --agree-tos
    • 如果一切順利,就會在 /etc/letsencrypt/live 目錄下看到新的憑證、金鑰等檔案。
    • sudo certbot renew 就能更新憑證,而且若在未到期前執行,雖然不會生效,但也不會破壞什麼,彌補了免費憑證效期較短,經常需要更新的疑慮。
  • Windows
    • 請先裝好 IIS
    • 這裡下載、解壓縮,不需安裝,執行 letsencrypt.exe,這是一個文字介面互動式程式,可以選擇各種憑證相關工作,像「申請」、「定期更新」都有,而且這是綁 IIS 的,因此憑證檔該放什麼位置,都不需再操心。

星期二, 9月 04, 2018

IIS Manager Import / Export Application

很好奇為什麼有些人能有這樣的截圖(注意右下角):
但我沒有?比較新的版本普遍有類似的問題,但也不是一定要回到舊版。首先把 Web Platform Installer 裝好,再如下找到 Web Deployment Tool 2.1 裝起來:
重啟 IIS Manager 就可以了。
這種工作當然也要有指令版,大致像是:
  • MSDeploy.exe -verb:sync -source:package=WebSite.zip -dest:auto

星期二, 8月 28, 2018

Let's Encrypt shortcut

以前談過了如何將網站對外服務由 http 升級成 https,但畢竟憑證還是有成本。最近再研究 Let's Encrypt 發現,雖然免費僅有三個月效期,但藉由 Certbot 的幫忙,申請 https 憑證非常容易,要準備的是:
  • 公開域名
  • 主機在網際網路上
  • 防火牆允許連入 80 埠
  • Linux OS(在 CentOS 7 試過)
  • Certbot(可能要先裝 EPEL)
如果再加上 ngrok 預演一下,甚至連前兩項都省了,做法是:
  • 在內網虛擬機上,CentOS 7 先裝好 ngrok、Certbot
  • 指令 ./ngrok http 80,取得一個臨時公開域名 xxx.ngrok.io
  • Ctrl+Fn 切到另一個終端機
  • 指令 sudo certbot certonly --standalone -d xxx.ngrok.io
這次發現 Ngrok 還是比 Serveo 略勝一籌,後者是拿不到憑證的。
三個月是限制嗎?Certbot 也支援 renew,放在排程裡,比那些一兩年效期的憑證強多了。

[2018/08/29]
這篇的做法也值得參考,只要看 Step 1,不用安裝 Certbot,透過 Docker 開一個臨時的 Certbot,取完憑證就收了,拿到的檔案哪一個是什麼用途則可參考這篇。可惜的是在 -v /var/lib/letsencrypt 打錯字,應該是 /var/log/letsencrypt 才對。
另外,若是在 CentOS 7 SELinux 環境下,掛載的 Volume 後面要加 :Z 才能寫入哦!

星期六, 8月 25, 2018

Serveo, Ngrok alternative

Ngrok 非常好用,不過就是免費僅限一個,也要安裝稍嫌麻煩。若是臨時在 Linux 上要用此功能,倒是可考慮免安裝的 Serveo,只需打一行指令:
  • ssh -R 80:localhost:3000 serveo.net
如果順利,就能把本機的 3000 曝露到網際網路上,外界可訪問的主機名稱會出現在這指令的回應中。一種更厲害的用法:
  • ssh -R abc:80:localhost:3000 serveo.net
理想中可固定外界可訪問的主機名稱為 abc.serveo.net,如果沒跟別人撞名的話。

[2019/01/07]
想保持較長期的連線,需增加一個參數:
  • ssh -o ServerAliveInterval=60 -R abc:80:localhost:3000 serveo.net

星期三, 8月 22, 2018

LDAP for testing environment

想在測試環境管理另一套帳號,雖然 OpenLDAP 安裝不算太複雜,不過要寫小程式或準備 ldif 建帳號都有點麻煩,可以考慮 LDAP Admin。不像以前常用的 jxplorer 需要 Java,它可以直接裝在 Windows 上(不能跨平台就是了),可以直接視覺化看到目錄結構(這不希奇),可以直接增刪修查物件(厲害了吧),而且像新增使用者這麼多必填屬性的情況,只要 Second name 填好,其他有些欄位會連動,再補個 Home Directory 輸入正斜線就夠了。
為了資安與權限,還要讓使用者有機會修改預設密碼,雖然 ldappasswd 很簡單,但不是每個使用者都有 Linux 環境,也都願意下指令。替代方案是這個 Docker Image,一個最單純的啟動範例:
  • docker run -d -p 80:80 --name lssp
  • -e LDAP_HOST=172.16.1.2
  • -e LDAP_PORT=389
  • -e LDAP_BASE=dc=acme,dc=com
  • -e LDAP_USER=cn=Manager,dc=acme,dc=com
  • -e LDAP_PASS=xxxx
  • dtwardow/ldap-self-service-password
如此一來,使用者就有個容易使用的介面可以修改密碼了。特別要注意的是 LDAP_HOST,因為是從 docker container 往外看,真正的 DNS 不一定幫得上忙,用位址還是比較保險。
奉送一首小插曲:明明在 ubuntu 試過可以了,搬到 CentOS7 結果出個莫名其妙的狀況,「AH00534: apache2: Configuration error: No MPM loaded.」,似乎是檔案系統的問題。雖然看不太懂,不過以下解法有用(出處有些錯字,校正後如下):
  • docker stop lssp
  • systemctl stop docker
  • dd if=/dev/zero of=docker_fs bs=1G count=2(開 2G 的空間,不夠的話加大 count)
  • mkfs -t xfs -n ftype=1 docker_fs
  • mount -o loop docker_fs /var/lib/docker
  • 在 /etc/fstab 新增一行 /path/to/docker_fs /var/lib/docker xfs rw,loop,auto 0 0
  • systemctl start docker
  • docker start lssp

星期一, 8月 20, 2018

Change port expose after run

已 run 起來的 docker container 若要增加曝露對外的網路埠,除了 stop / commit / start 之外,也有更漂亮的方式:
  • docker stop ...
  • systemctl stop docker
  • vi /var/lib/docker/containers/.../hostconfig.json
  • systemctl start docker
  • docker start ...

星期六, 8月 18, 2018

Android SD card upgrade

當舊的記憶卡空間不足,買了更大容量的新卡,升級時需注意:
  • Android 關機、取出記憶卡。在這件事情做完之前,都不會用到手機。
  • 「搬檔案」可能造成 Android 讀不到卡,不論新舊,千萬別這麼做。
  • 「複製磁碟分區」Clone Partition 可行,用過這篇文章推薦的 Partition Wizard。
  • 新、舊卡可用時接上電腦會比較方便,但只有一條線/讀卡機可接電腦?將舊卡備份在電腦,再還原到新卡。只是電腦要準備一塊「超過備份容量」的未使用空間,如果所有空間都已分配到 Partition,就要重新分割;如果舊卡不是塞得很滿,也可以「縮減」磁碟分區再備份。
  • 複製的 Partition 跟舊卡一樣大小,浪費了新卡的空間?也是一樣用上面提到的軟體「擴展」磁碟分區。

星期日, 8月 05, 2018

offline install yum package - MariaDB

以安裝 MariaDB 為例,由於 CentOS YUM repository 並沒有最新版,要自己上 Maria 官網看這個說明下載,常做也是有點麻煩。這次希望準備一個「離線版」安裝包,既不用等網路,又可減少安裝程序。首先參考這篇的前置動作,下載與目錄準備:
  • sudo yum install yum-plugin-downloadonly yum-utils createrepo
  • mkdir /var/tmp/maria
  • mkdir /var/tmp/maria-installroot
再來是準備 /etc/yum.repos.d/mariadb.repo,內容如下:
  • [mariadb]
  • name = MariaDB
  • baseurl = http://yum.mariadb.org/10.3/centos7-amd64
  • gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
  • gpgcheck = 1
接著把 yum maria 下載安裝分開,下載是:
  • sudo yum install --downloadonly --installroot=/var/tmp/maria-installroot --releasever=7 --downloaddir=/var/tmp/maria MariaDB-server MariaDB-client
  • sudo curl https://yum.mariadb.org/RPM-GPG-KEY-MariaDB -o /etc/pki/rpm-gpg/RPM-GPG-KEY-MariaDB
包裹成離線安裝資源:
  • createrepo --database /var/tmp/maria
  • sudo rm -rf /var/tmp/maria-installroot
再準備「離線版」/etc/yum.repos.d/mariadb-offline.repo:
  • [mariadb-offline]
  • name = MariaDB-offline
  • baseurl = file:///var/tmp/maria
  • enabled = 0
  • checkgpg = 1
  • gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MariaDB
可以多檢查一下完整性:
  • repoclosure --repoid=mariadb-offline
如果沒問題的話,把 /var/tmp/maria 目錄壓成一個檔案:
  • tar -cvf mariadb-offline.tar /var/tmp/maria
未來就解壓 mariadb-offline.tar,以及 /etc/yum.repos.d/mariadb-offline.repo /etc/pki/rpm-gpg/RPM-GPG-KEY-MariaDB 搬到要安裝 MariaDB 的 CentOS 7 主機上,即使對外無網路,也可以順利安裝 MariaDB:
  • tar -xvf mariadb-offline.tar -C /
  • sudo yum --disablerepo=\* --enablerepo=mariadb-offline install MariaDB-server MariaDB-client
安裝後再人工啟動:
  • systemctl start mariadb
[2018/08/09]
java-1.8.0-openjdk 類似的過程:雖然官方 yum 有收此套件,省了多一組 GPG-KEY 的問題,但可能另外遇到目標主機沒有經過 yum update,以致 nss 比 openjdk 所需版本要舊。解決之道二選一:
  • 出貨端要求各被安裝系統需求為「近日曾做過 yum update」,而且每次出貨前都先 yum update 再包離線安裝檔。(顯然是個爛方法)
  • 離線安裝包增加 nss nss-tools(如果有需要的話,可能也要納入更多版本不符的套件),並且在安裝時額外指定一併安裝 nss 套件。

星期三, 8月 01, 2018

NextCloud WebDAV Client's API username

依據這篇,NextCloud 似乎很容易透過 API 存取,但試過自已裝的沒問題,公司的不行。原來在這個簡單的呼叫範例:
  • curl -X PROPFIND -u username:password https://nextcloud.acme.com/remote.php/dav/files/username
其中第一個 username 與第二個不同:第一個是帳號,但第二個 username 要如下圖取得 @ 前面那段 UUID

接著想必可問,為何自已裝的沒這麼複雜?應該是受了什麼外掛的影響,同步進 NextCloud 的帳號多隔了一層,不再直接用帳號名稱,以保持唯一性。

星期一, 6月 25, 2018

Enable Https by Nginx in docker

對於那些提供 Web Service 的 docker image(如圖左側),要如何賦予 https 的連線能力?當然依各種服務都有不同的做法可行,例如 GitLab 要改 gitlab.rb,Jenkins 是個 war 等等,不過有沒有更簡單一致的做法?那就是隔壁也開一個 Nginx docker container,配置如圖:
假設申請簽署的網站名為 nginx.acme.com,pem 格式的金鑰對紀錄在 nginx.acme.com.key 檔案內,nginx.acme.com.crt 是 pem 格式的憑證檔, Nginx 設定當有以下段落:
  • server {
    • listen 443 ssl;
    • server_name nginx.acme.com;
    • ssl_certificate /etc/ssl/certs/nginx.acme.com.crt;
    • ssl_certificate_key /etc/ssl/certs/nginx.acme.com.key;
    • ...
    • location / {
      • proxy_pass http://172.17.0.2:80;
      • proxy_set_header Host $host;
      • proxy_set_header X-Real-IP $remote_addr;
      • proxy_set_header X-Forwarded-Proto https;
    • }
    • ...
  • }
東拼西湊來的有些不踏實,這裡有比較完整的說明。

[2018/06/27]
這件事似乎有個常見的名詞 SSL Termination,用 HAProxy 也可以,請參考這篇

[2018/08/17]
由於 Nginx 官方 docker image 只聽著 port 80,在不想改官方產出的前提下,可以:

  • 由外面的 443 對應到裡面的 80,-p 443:80
  • Nginx 設定檔 listen 80 ssl;
  • 在某些虛擬機環境,因為防火牆的規則比較亂,可能讓這個 image 開不起來,在這篇有人提到解法:
    • iptables -t filter -F
    • iptables -t filter -X
    • systemctl restart docker

星期四, 6月 21, 2018

Change your microsoft account password carefully

這次被迫修改密碼原不以為意,想說立刻改回來就好,結果糟了!原來五年前微軟已限制我們自己挑的密碼一生只能用一次。
看來我只好再找一張紙把這次的密碼抄起來。

星期三, 6月 20, 2018

Azure VM note

在 Azure 上的 VM 還不是隨便開開就好:
  • 開任何虛擬機之前,可以先備好共用的 Resource Group、Storage 與 Virtual Network。
  • Linux 必須開 port 22 讓 SSH 能進去控制。
  • Windows 必須開 port 3389 讓遠端桌面能進去控制。
  • 不論從地端或雲端,公開或私有位址,都無法用 Ping 確認虛擬機的狀況(天生不懂 ICMP),只能用 Port Ping,例如 telnet 之類的。
  • 即使取得公開位址,防火牆設定正確,虛擬機還必須佔有所在子網段 Subnet 的第一個位址,否則外界仍然連不進去(是 Bug 嗎?)。
因為防火牆被拉到外面,稱為 Network Security Group,所以要多玩玩才能適應。

星期五, 6月 15, 2018

GitLab Jenkins Integrated Authentication

這兩個服務除了各自有許多驗證方式之外,若要輕量化地使用者單一帳號管理,只要在 GitLab 自建帳號,再搭配 Jenkins 上有個 GitLab Authentication Plugin,即可達到通用的目的。首先來開兩部機器:
  • docker run -d --name gitlab -p 80:80 gitlab/gitlab-ce
  • docker run -d --name jenkins -p 8080:8080 jenkins/jenkins:lts
在 GitLab 除了要建帳號給使用者之外,還有設定的工作,註冊一個應用程式,如圖:
完成後,有些東西要抄起來:
在 Jenkins 外掛 GitLab Authentication Plugin 後的設定用得上:
以上其實還算單純的整合,在 Mac 硬是搞了好久,重點是那些位址究竟是要讓 Client 能找到 Server,還是 Server 要找到另一部 Server?因為 Mac 上的 Host (Client) 網路上無法看到 Container (Servers),但 Linux 沒這問題,Windows 則依這篇小加一條繞送規則即可。

星期四, 6月 07, 2018

tw.archive.ubuntu.com unreachable

為了讓 Ubuntu 認得 exfat 隨身碟,在安裝套件時遇到 tw.archive.ubuntu.com 連不上的問題。因為並不清楚這是否僅是暫時性的,捨棄了幾篇教人修改 /etc/apt/sources.list 的做法,換成:
  • ping archive.ubuntu.com 查出一個 IP 位址
  • 在 /etc/hosts 加一條,將上述位址定名為 tw.archive.ubuntu.com
如此便可暫時改道取套件。

星期一, 6月 04, 2018

Bootcamp stuck while Win10 setup

在 MBP Sierra 利用 Bootcamp 製作雙開機系統已算是非常方便了,騰出磁碟空間、重新分割、抓驅動程式、製作開機 USB Disk 幾乎都是自動的,不過還是卡了一整個週末:
  • 官方文件強調 USB 2.0 才可以,事實上我的 MBP 2013 early 兩個 USB port 都是 3.0 的,Disk 要有 16GB 的空間大概也不可能太舊,如今應該是很難找得到符合的硬體。別擔心,USB 3.0 沒問題。
  • 從微軟下載的 iso 並不會被懷疑有問題,事實上如果像我一樣在另一部電腦下載,再透過 USB 移到 Mac 上讓 Bootcamp 準備過程中用到,可能就會破壞了內容,即使看起來還是 4.69GB 大小。驗證的方法就是開個虛擬機,看能否用這 iso 裝機完成?
  • 需要的驅動程式也都由 Bootcamp 代勞了,舊文很多提到要自己準備第二個 USB Disk 或第二個磁碟分割等等很多麻煩的事,其實都不需要。
  • 也有看過一篇舊文寫到,給 Win10 的分割區要有 55GB,我這小得可憐的 SSD 可很難擠得出來,幸好這也不是真的。

星期五, 5月 25, 2018

GCB CentOS 7 Account / Password Expired

玩 Linux 這麼久,還沒遇過這麼嚴格的,幾個月不見就不跟你玩了?首先要想辦法進入單人模式,再展延逾期的帳號或密碼。

星期三, 5月 16, 2018

SSH Server on Windows

這篇所述,在 Windows 作業系統下,安裝微軟官方的 SSH Server,有些值得一記:
  • 不必堅持穩定版,最新會少些問題。
  • 看到錯誤代碼?快 Google 一下,早有許多先烈。
  • 安裝程序沒有考慮到各版本(Server / Desktop / 新 / 舊)的差異,因此很容易起不了服務。專門建帳號並給更高的權限,先通了再縮限會比較好處理。
  • 連進去之後並不接受 Linux bash 之類的指令,可用的是 PowerShell 精簡版。
衝著最後一點,與我原意要接 Jenkins Publish Over SSH 統一 Windows / Linux 指令,以解決部署需求不符,快改用 MobaSSH 吧!蠻有趣的,下載解壓後唯一的檔案,既是安裝精𩆜,又可做管理介面。

[2018/05/24]
如果在 Windows Server 環境,Free 的 MobaSSH Home Edition 並不支援,窮人們還是再想想微軟官方版的存在價值吧?在 Linux Shell 還沒統一天下之前,PowerShell 不容易閃躲,原來 Ansible 2.0 也是這麼玩的呀。

星期二, 3月 20, 2018

Auto sync CentOS server time

要讓眾 Client 向 Server 對時已是很多系統的基本需求,所以我們得先搞懂 Server 如何讓自己的時間準確?
  • yum install ntp
  • 根據這個網站挑選合適的時間伺服器列表,ping 確認網路通暢後,加在 /etc/ntp.conf
  • systemctl start ntpd
  • systemctl enable ntpd
  • timedatectl set-ntp true
  • 等五分鐘
以前不知要有點耐心,下完指令總以為還缺什麼,就是沒有校正時間?「等五分鐘」值得一記。

Testing your private key and certificate for HTTPS

雖然各種 Web Application Server 很容易安裝私鑰與憑證來支援 HTTPS,但如何確認安裝是成功的?連連看應該有分幾個層次,否則一旦連不上,也不知道要找誰求救:
  • check ip
    • ping <Host_IP>
  • check name resolution
    • nslookup <Host_Name>
  • check port from client
    • telnet <Host> <Port>
    • echo > /dev/tcp/<Host>/<Port> && echo open || echo closed
  • check port from server
    • ss -tnlp
    • firewall-cmd --list-all
  • check response
    • curl <Url>
    • Browser
其實在最後一關,有時也必須再細分 HTTP / HTTPS,若在 Server 端一好一壞,可以檢查:
  • 檔案路徑
  • 存取權限
  • 私鑰密碼
  • 憑證串鍊
  • 加密協定
若是 Server 端正常,但 Client 端一好一壞,只剩一招:
  • openssl s_client -connect <Host>:<Port>
至少有一次檔案傳壞了就是這麼找到的。

星期五, 3月 02, 2018

ngrok + NextCloud + WebDAV + cURL

過去常在用 SCP + bakop.com 做為沒有圖形介面、沒有 VPN 時的抓檔來源,但畢竟是外部資源,用得不太安心。雖然以前也對 OwnCloud 下過功夫研究,但苦於必須有圖形介面瀏覽器限制,這次終於有突破:
  • 檔案分享-NextCloud
  • 指令存取-WebDAV + cURL
  • 內網外露-ngrok
其實公司早就在推 NextCloud,但並非網管,我一直試不成功。這次差別是我自己在內網用 docker 開了有絕對管理權限的一台新的,才知原來整合 LDAP 之後,各使用者有個 UUID 代表 UserName,並不等於登入帳號,所以取檔案大約像這樣:
  • curl -u 'user:pass' -O http://nc.acme.com/remote.php/dav/files/UUID/path/to/file
[2018/03/14]
原來 UUID 還是可以改的,不至於太難用,可參考 Internal Username 這段。

[2018/03/30]
ngrok 取來的主機名稱可以保留蠻久的,直到最近一次斷電。因為重新連上一定會換名字,每次都要進 config/config.php 改 trusted_domain 也實在麻煩,尤其是 docker 裡面連 vi 都沒有。一個修改訣竅是:
  • 'trusted_domains' =>
  • array (
  • 0 => '*.ngrok.io',
  • ),
另外提到在 docker 裡面不容易編輯 config.php,可以運用 occ 這個工具:
  • ./occ config:system:set 0 --value=*.ngrok.io
  • ./occ config:system:get
[2018/04/04]
單開一組帳密給外人使用似乎是管理者的特權,那我們一般小老百姓呢?也是可以在自己的管理範圍內開出共享目錄,以 http://nc.acme.com/s/<shareLink> 允許讀寫、不設密碼保護為例,上傳:
  • curl -u '<shareLink>:' -T <fileName> http://nc.acme.com/public.php/webdav/ [--progress-bar -o /dev/null]
下載:
  • curl -u '<shareLink>:' -O http://nc.acme.com/public.php/webdav/<fileName>
查詢目錄內容:
  • curl -u '<shareLink>:' -X PROPFIND http://nc.acme.com/public.php/webdav/ | grep -o '<d:href>[^<]*</d:href>'
[2018/09/06]
共享匿名個別檔案有些不同:
  • curl http://nc.acme.com/s/<shareLink>/download -o <fileName>

星期三, 2月 14, 2018

DNS SRV record missing

在 CentOS 7 新裝的 Openfire 有這樣的問題

點進去看到的是

意思是 Openfire 本身希望能找到最下面兩行類似的資訊,所以來幫忙如願即可。首先需要安裝名稱解析伺服器:
  • sudo yum install bind bind-utils
裝好後先增加設定,依據網域名稱(假設是 acme.com)修改 /etc/named.conf,增加以下幾行新增一個區域:
  • zone "acme.com" {
  •     type master;
  •     file "/etc/named/acme.com.hosts";
  • };
依據該主機名為 openfire.acme.com,IP 位址為 10.1.2.3,管理者郵件位址為 root@mail.acme.com 的前提,再新增這個區域的設定檔 /etc/named/acme.com.hosts,內容如下:
  • $ORIGIN acme.com.
  • @ IN SOA openfire root.mail (
  • 180214 ; serial
  • 21600 ; refresh after 6 hours
  • 3600 ; retry after 1 hour
  • 604800 ; expire after 1 week
  • 86400 ) ; minimum TTL of 1 day
  • IN NS openfire
  • openfire IN A 10.1.2.3
  • _xmpp-client._tcp 86400 IN SRV 0 5 5222 openfire
  • _xmpp-server._tcp 86400 IN SRV 0 5 5269 openfire
其實最後兩行就是照抄管理介面上的提示,要特別注意的是很多結尾處的 . 不可省略。接著啟動服務並測試看看:
  • systemctl start named
  • nslookup -type=srv _xmpp-client._tcp.acme.com
如果找不到,可以試試指定本機擔任名稱伺服器:
  • nslookup -type=srv _xmpp-client._tcp.acme.com localhost
若這樣才行,代表預設的名稱伺服器在別處,不是剛裝的這套,可以修改 /etc/resolv.conf 以解決。

星期日, 2月 04, 2018

application as a service on CentOS 6 / 7

在部署要求中,常會希望某個指令啟動的應用程式,不會因重開機而停止服務。以 Single Sign-On CAS 為例,若在 CentOS 6,可參考這篇準備以下內容的 /etc/rc.d/init.d/<serviceName>:
  • #!/bin/bash
  • # chkconfig: 35 90 10
  • # description: CAS server

  • . /etc/init.d/functions

  • SERVICE=cas
  • WORKDIR=/opt/$SERVICE
  • LOCK=/var/lock/subsys/$SERVICE

  • start() {
  •   cd $WORKDIR
  •   /usr/bin/java -jar cas.war &
  •   touch $LOCK
  • }

  • stop() {
  •   killproc $SERVICE
  •   rm -f $LOCK
  • }

  • case "$1" in
  •   start)
  •     start
  •     ;;
  •   stop)
  •     stop
  •     ;;
  •   status)
  •     status $SERVICE
  •     ;;
  •   restart)
  •     stop
  •     start
  •     ;;
  •   *)
  •     echo "Usage: $0 {start|stop|restart|status}"
  •     exit 1
  • esac

  • exit 0
下指令載入為服務:
  • chmod +x /etc/rc.d/init.d/<serviceName>
  • chkconfig --add <serviceName>
  • service <serviceName> start
若是 CentOS 7 環境下,似乎更簡單一些,準備 /etc/systemd/system/<serviceName>.service
  • [Unit]
  • Description=CAS Service
  • After=network.target
  • [Service]
  • WorkingDirectory=/opt/cas
  • "ExecStart=/usr/bin/java -jar cas.war"
  • Restart=on-failure
  • [Install]
  • WantedBy=multi-user.target
下指令載入為服務:
  • chmod +x /etc/systemd/system/<serviceName>.service
  • systemctl enable <serviceName>
  • systemctl start <serviceName>

星期四, 1月 04, 2018

LDAP search result size limit

照預設的 OpenLDAP,查詢結果若很多時,會限制僅回傳 500 筆資料,這原本不是什麼大問題,不過最近遇到了查詢結果多於上限,且在交易中不得分批處理的問題。原來改變上限也不是什麼困難的事,可先準備以下的 changeSizeLimit.ldif:
  • dn: cn=config
  • changetype: modify
  • replace: olcSizeLimit
  • olcSizeLimit: nnn
再下指令執行:
  • sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f changeSizeLimit.ldif
更進一步,也可以把產 ldif 跟下指令都放在一個 shell script。