PostgreSQL Docker SSL Config

Docker 官方有提供 Postgres Docker ,還蠻方便的。 先用 Docker Compose 初始化 PostgreSQL , 這樣會先產生一些預設的設定檔。 docker-compose.yml postgresql: image: postgres:9.4.1 environment: - POSTGRES_USER=alice - POSTGRES_PASSWORD=change.password ports: - 5432:5432 volumes: - postgresql/data:/var/lib/postgresql/data 接下來就用 openssl 產生 SSL 的相關檔案。 openssl genrsa -out server.key 4096 openssl req -new -key server.key -out server.csr openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt 這邊要注意一點, key size 不能設太小,我本來想說測試的時候先設定個 512 來試, 沒想到這邊雷了我好久…. 產生的 server.crt server.key 丟到 postgresql/data postgresql/data/postgresql.conf ssl =

SSH Agent Forward in Mac OS X Yosemite

在原生的 Ubuntu ssh agent forward 只要多加一個參數就可以搞定了,沒想到在我的 MBA 上 面搞了好久才搞定。在 Google 上面找了一堆參考資料,但是大多都不完整,還有找到要用 brew 裝新 的 openssh 的解法,不過其實也沒那麼麻煩,就弄個指令,加上修改個檔案而已。 先把你的 private key 存到系統裡面 ssh-add -K ~/.ssh/id_rsa 修改 bashrc eval $(ssh-agent) function _cleanup_ssh_agent { echo "Killing SSH-Agent" kill -9 $SSH_AGENT_PID } trap _cleanup_ssh_agent EXIT 開新的 terminal 的時候就可以用 agent forward 啦

Hack Hugo to GitHub compatiable

在很久之前的文章(練習用 markdown 的形式來寫 blog) 裡面有提到用 gor 來產生靜態的 Blog 網站,不過最近有個叫 Hugo 的東西看起來好像比較 威猛一點,就花了一些時間試看看,雖然最後有達到基本的需求,不過中間花了不少時間在 Hack Hugo >"< ,紀錄一下修改的過程跟一些我自己想要的額外效果給大家參考。 因為 Hugo 的改版還蠻快的,而且我不是很喜歡 git merge 的樹狀結構長的很醜,所以就附上 相關的 Patch 檔案,如果是直接看我的 GitHub Hugo 的話,那個 commit hash 是會一直變動的唷! 檢查副檔名改成全用小寫檢查 因為有時後會遇到副檔名大小寫混用的情況,統一用小寫檢查比較方便。 直接複製檔案到發布目錄 Hugo 遇到不認識的副檔名會報錯,加個 handler 讓他把一些檔案直接丟到發布目錄裡面, 其實在 Hugo 的官方說明文件是要用一個 asset 的目錄去放奇奇怪怪的檔案的,但是我覺得 如果可以跟 Markdown 文件放在一起的話,還是比較方便,因為這樣就可以用相對路徑了。 新增 ModTime 資訊 Hugo 原本產生 Sitemap 的時間欄位是用文件內容提供的 date 欄位,但是我覺 得應該要用,檔案系統上面的 modtime 資訊會比較好。 處理 GitHub 的 README.md 把 README.md 變成 index.html 批量修改相依性程式碼 因為有 Hack 一些程式碼,所以相依性的設定要一併修改,檔案很多,跑

中等規模環境下的集中式 Log 管理及分析

Log 集中管理可以提供進一步的分析,讓系統管理者在發生問題的時候可以更快的排除錯誤 ,也可以看出某些趨勢,提早做出一些可能有影響的決策。目前其實有不少的工具都可以用 在處理 Log 集中管理的問題,我這邊也提供一個中等規模的解決方案。 在小型的環境(單機,少量程式) Log 其實隨便亂放都沒差,通常都只有在出問題的時候才 會去撈 Log 協助排除問題。在大型的環境(數以百計的主機跟 App 以上),ㄜ~~~~我沒經驗 不敢隨意猜測。所以這邊是用一個數十台 MongoDB 的環境來討論 Log 集中管理的處理 方式。 在 Logstash 的使用情境下,有幾種典型角色: 這邊偷用了 Logstash Document 的圖 Shipper 蒐集 Broker 暫存 Indexer 解析 Storage & Search 永久儲存 Web Interface 分析界面 Shipper + Broker + Indexer 在小型的環境其實可以整合在同一個 Logstash 裡面一次 處理,不過一開始也有提到,在小型的環境,哪有人在搞複雜的 Log 分析…XD,既然要做 就一次做到位吧。 不過這邊還有另一個問題,就是 Logstash 是用 Ruby 寫的,然 後透過 Java 來執行,所以需要安裝 Java,但是像在 MongoDB 的環境,我不 想在機器上安裝太多額外的東西,而且 Java 其實還蠻肥的,如果只是單純的 Shipper 角色,沒有必要搞那麼多有的沒的套件把系統弄髒,所以我另外開發了一個小工具 gogstash 來做 Shipper 的工作。 Broker 選用 Redis,聽說效能不錯? Indexer 仍然使用 Logstash ,因為 Logstash 已經有蠻多方便的設定可以快速的 解析各式各樣的 Log 。 Storage & Search 選擇 ElasticSearch ,它使用了 Lucene 當基底,可以有效率 的分析及處理各種自然語言,不過其實對一般的 Log 來說,大部分的情況不會用到太深入的 功能,有點用牛刀殺雞的感覺,反正 ElasticSearch 也還蠻好用的,就這樣吧…^_^ Web Interface 選擇 3.x 版的 Kibana ,它可以在網頁上展示還不錯看的報表。 Shipper 設定 MongoDB 的部份這邊先不討論,只是拿來當個案例而已。 Shipper 的重點就是要把所有 機器上的 Log 都送到 Broker ,我這邊想要蒐集的資料包括了 MongoDB 本身的 Log , 還有機器的狀態也想要一併分析,所以有幾個 gogstash 的設定。 蒐集 /var/log/mongodb/mongodb.log 蒐集 MongoDB 服務狀態 蒐集系統基本資訊 Broker 設定 Redis 要做一個稱職的 Broker 其實有點麻煩,因為它可能是因為效率的問題,在 High availability 方面的設計不是很理想,不過也還算堪用,只是設定上有點難搞…Orz ,我目前使用 Docker 來建構 Redis 環境,裡面有用我 Patch 過的 Fig ,另外 Docker Image 是用 Docker Builder 建出來的, Redis 的 sentinel 情況 比較麻煩,可能還是要參考一下Redis Sentinel 官方文件才比較容易理解。底下列出一 些相關的設定方式給大家參考。 fig.yml redis/redis.conf Redis 基本設定 redis/sentinel.conf Redis Sentinel 設定 redis/start.sh Docker Builder 啟動腳本 Indexer 設定 Indexer 其實是 Log 分析的一大重點,因為 Log 可能會有各式各樣的描述,再加上每個人 想分析的東西不盡相同,所以很難用一個標準化的設定就能通吃所有情況,這邊我是用 MongoDB 系統管理者的角度來處理 Log。 fig.yml logstash/index-mongodb.conf 分析 MongoDB Log logstash/index-mongodb-status.conf 分析 MongoDB 服務狀態 logstash/index-ubuntu-sys.conf 分析系統基本資訊 logstash/start.sh Docker Builder 啟動腳本 Storage & Search 設定 ElasticSearch 最常見的問題其實是它預設在建索引的時候會自動分詞之後才儲存,這 樣會在做分組統計的時候出現狀況,像是 “connection accepted” 這個詞會被拆成 “connection” “accepted” 這兩個詞來做統計,但是其實我想要的是 “connection accepted” 整個詞來進 行統計,所以某些欄位需要額外設定讓它不要分詞,詳細的設定還是要參考 ElasticSearch 相關文件,底下設定給大家參考。 fig.yml eslogstash/elasticsearch.yml ElasticSearch 基本設定 eslogstash/logging.yml 這個檔案基本上沒有修改,只是方便 Fig 直接把整個目錄掛進去 eslogstash/analysis/stopword.txt 用來排除某些特定(不感興趣)的詞 eslogstash/analysis/synonym.txt 設定同義詞 eslogstash/templates/kdtmpl.json 動態模板,把 *_facet 欄位預設成不分詞 Web Interface 設定 Kibana 的設定就相對簡單很多,主要是因為我用 Docker 把 Kibana 跟 ElasticSearch 的環境分開,不然可以免設定就直接用了。 fig.yml kibana/config.js 設定 ElasticSearch 位置 kibana/sys.js 建立系統基本資訊的樣板,可以用 URL 帶參數的方式將客製化的查詢條件傳進 Kibana , e.g.

Docker Infra 架構簡介與實例

這邊介紹的架構可以做到什麼效果? 開新的 Web App 就可以立刻透過新的 domain name 去連線 開一大堆同名的 Web App 就可以立刻分流 系統基本架構圖 Etcd 存放設定的 Cluster DB SkyDNS 從 Etcd 讀取設定, 讓使用者查詢的 DNS Server Confd 從 Etcd 讀取設定, Reload Nginx Registrator 監聽 Docker Events, 將 Container 資訊寫入 Etcd Nginx 網頁 r-Proxy 實作部份 準備 VM/Host 如果只是要先測試的話, 可以只用一台 VM/Host, 不過考慮到系統容錯的話, 建議準備至少三台不同的機器來建構底層架構 設定 Docker 這邊在 Ubuntu 上安裝 Docker 做為範例, 其他平台請參考官網說明文件 利用 apt 安裝 lxc-docker echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list apt-get update