docker-gitlab 與 container registry

之前有試了兩三次,但都卡在憑證部份,昨天終於搞定了。

主要參考文件是 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

第一步是產生憑證,不要用上面文章提供的 openssl 指令,用 https://gitlab.com/gitlab-org/gitlab-ce/issues/25967 所提供的:

# 假定是在 docker-compose.yml 所在的目錄下
mkdir -p certs
cd certs
openssl req -nodes -newkey rsa:4096 -keyout registry-auth.key -out registry-auth.csr -subj "/CN=gitlab-issuer"
openssl x509 -in registry-auth.csr -out registry-auth.crt -req -signkey registry-auth.key -days 3650

第二步是修改、調整原有的 docker-compose.yml

# gitlab
gitlab:
  environments:
    # ... other environment variables
    # ...
    # Registry
    - GITLAB_REGISTRY_ENABLED=true
    - GITLAB_REGISTRY_HOST=registry.example.com
    - GITLAB_REGISTRY_PORT=443
    - GITLAB_REGISTRY_API_URL=http://registry:5000
    - GITLAB_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_CERT_PATH=/certs/registry-auth.crt
  volumes:
    # ... other volumes
    # ...
    # 將前面建立的 certs 資料夾掛載到 /certs
    - ./certs:/certs
  links:
    # ... other service links
    # ...
    - registry
registry:
  image: registry:2.4.1
  expose:
    - "5000"
  ports:
    - "5000:5000"
  volumes:
    - /var/gitlab/shared/registry:/registry
    - ./certs:/certs
  environment:
    - REGISTRY_LOG_LEVEL=info
    - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
    - REGISTRY_AUTH_TOKEN_REALM=https://git.example.com/jwt/auth
    # 如果你用的 gitlab 設定為 relative url root,那就是
    # - REGISTRY_AUTH_TOKEN_REALM=https://example.com/git/jwt/auth
    - REGISTRY_AUTH_TOKEN_SERVICE=container_registry
    - REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
    - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry-auth.crt
    - REGISTRY_STORAGE_DELETE_ENABLED=true

第三步是改 Apache 或 Nginx 的設定,Nginx 的設定可以參考 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

我用的是 Apache ,所以我是參考 https://gist.github.com/dkarlovi/5f6ab416aa882086c7305b004b590dd4 來做修改,改完記得重新啟動 Apache 或 Nginx。

修改完以後,執行 docker-compose up ,應該就沒問題了。

我遇過以下問題:

  1. 瀏覽 https://git.example.com/group1/project1/container_registry 時,出現 Internal server error:主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE 沒有設定好,當然其他的也有可能,儘可能都檢查一次。
  2. docker login 失敗:其實也是上面提的那幾個環境變數沒設定好。

檢討之前為什麼沒能架設好,原因如下:

  1. 對 SSL 憑證不了解:我的 git.example.com / registry.example.com 都使用 SSL 憑證,但又跟 registry-auth 的憑證搞混,總的來說,總共三個憑證,git.example.com 一個,registry.example.com 一個,registry-auth 一個。gitlab.example.com/registry.example.com 的憑證是給網頁伺服器(Apache/Nginx)使用,Apache/Nginx 設定裡要設定,然後 docker-compose.yml gitlab 服務裡只用到 gitlab.example.com 的憑證,要用 SSL_KEY_PATH, SSL_CERTIFICATE_PATH 跟 SSL_DHPARAM_PATH 這三個環境變數來設定。而 registry-auth 則是 gitlab 服務與 registry 服務作 token 認証用的,主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE。
  2. Apache 的 SSL 設定錯誤:SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile 跟 SSLCACertificateFile 都要設定,我少設了 SSLCertificateChainFile,導致 registry 服務去問 gitlab 時,有憑證錯而有 HTTP request fail 的問題。

電影流水帳(2017/11/7~2017/12/5)

Embed from Getty Images

Sarah Dumont ,在 Scouts Guide to the Zombie Apocalypse 飾演脫衣舞孃酒吧裡的侍應生,在僵屍肆虐下以強悍的姿態與三個高中生童軍一同殺出重圍。身材實在太搶眼,很難把眼光從她身上拉開啊!

  • 拆彈專家 (IMDB, Wikipedia)。之前有看過預告,覺得應該還不錯,就看了。看完以後,覺得是個殺時間的電影,不能算很好,但也不能算太差。
    章在山一開始在炸彈客裡當臥底,在一次行動逮住了主嫌的弟弟,章在山高升,主嫌洪繼鵬遠走國外。過了幾年,洪繼鵬回到香港,展開行動,一方面要救出弟弟,一方面報復章在山,於是在隧道劫持了人質,與警方展開拉鋸。在拉鉅的這一兩天,擁有隧道的公司股價開始攀升,這時才帶出另外一個陰謀,原來洪繼鵬與擁有隧道的公司合作炒股價。洪繼鵬在拿到錢之後,翻臉不認人,殺了公司的主席。而警方不妥協,進行攻堅,進行掃蕩以後,仍避免不了拆炸彈,最後章在山在徵詢隧道工程師意見之後,決定賭上一把,結果賭輸了,章在山壯烈犧牲,僅僅讓炸彈爆炸了一半,保住隧道。
    電影的副線,一條是章在山與李家雯的愛情,這段感覺沒有帶的很好,飾演李家雯的宋佳,僅僅只能算是點綴,沒有很多發揮的空間;一條是帶父親去洗三溫暖的警察,卡在隧道時,因為被歹徒發現是警察,洪繼鵬在他身上綁上炸彈,犧牲了;遊覽車司機的戲份也不少,但可能被剪掉了;姜皓文飾演的警司則有不少心裡戲,不過也不多。整個來說,看的出導演想說的更多,但是很可惜,沒有帶的很好。
  • The accountant (IMDB, Wikipedia),台譯:會計師。網路上一片好評的電影,再加上有亞斯柏格症跟類似英雄電影的題材,讓我蠻想看看。剛好最近 HBO 有上演,就把它看完了。
    Christian 是個古怪的會計師,主要的服務客戶都是些牛鬼蛇神,這次他服務的對象是個生技公司,在調查的過程裡,就在要查出問題時,公司的某個高層被迫自殺,調查也被中斷。隨後,Christian 跟協助調查的 Dana 也被追殺,Christian 認定不對勁,開始更進一步的介入。最後發現就是請他來調查的 CEO 搞鬼,一場血拼之後,發現 CEO 請來的殺手就是他弟弟,意外的認親,與弟弟和解之後,幹掉 CEO。
    副線故事之一,是 FinCEN 的 Ray 勒索了局內的 Marybeth 進行調查,Marybeth 以影片跟錄音的方式縮小範圍,再透過稅務資料找到 Christian 的過程,堪稱奇蹟。結果發現 Christian 就是 Accountant ,在背地幫助 FinCEN 破案的人。
    副線故事之二,是有著亞斯柏格症的 Christian 小時候的經歷以及他怎麼練就超人身體以及應用自身對數字敏感度成為會計師的過程。
    電影的最後,揭露了在電話裡協助會計師的女聲是誰,原來就是會計師的姊姊,住在照護機構裡,以超級電腦以及語音合成器協助 Christian。
  • Blackhat (IMDB, Wikipedia),台譯:黑帽駭客。雷神索爾來到地球以後拍的電影,故事講的是駭客,之前在第四台看了一些片斷,這次在 Netflix 上完整看完。
    香港筌灣的核電廠發生爆炸,高層派出 Dawei 去調查,經過初步調查,判定可能是駭客侵入所導致,Dawei 認為需要與美方 FBI 合作,就找了他的妹妹 Lien,一同到美國找他以前的同學雷神索爾 Hathaway。Hathaway 因為之前的事件入獄服刑,Dawei 以合作為由,讓 FBI 找他出來一同進行調查。經過調查以後,他們找到了駭客以及發動攻擊的真正原因,但 Dawei 跟 FBI 的 Carol 等人也被幹掉,這時劇情變成徇私報仇的橋段,Hathway 跟 Lien 利用了社交的手段,將駭客的錢轉走,並勒索他們。他們約在某個地方打算談判,但實際上 Hathaway 跟 Lien 早打算報哥哥的仇,要把他們幹掉。在肉博戰之後,Hathaway 幹掉駭客及其同黨,跟 Lien 帶著駭客的錢躲起來逃逸無蹤。
    裡面對於駭客的描寫相當寫實,不管是在螢幕上所輸入的指令,或者是利用社交工程侵入他人電腦等手段,相信導演跟編劇一定有找相關的專家來合作,讓電影貼近現實。我個人覺得故事算是不錯,但最後的徇私械鬥有點讓人失望,不過仔細想一想,在擔任與中方高層橋樑的 Dawei 與 FBI 的 Carol 死掉後,Hathaway 要怎麼同時讓中方跟美方相信他?似乎不太可能,所以徇私械鬥也算是相當合理的結局。
  • Scouts Guide to the Zombie Apocalypse (IMDB, Wikipedia),台譯:僵屍教戰守則。記得去年還前年有看過網路上的影評,評價都不錯,所以一直想看。最近在 Netflix 上架了,趕緊來看。果然沒有讓我失望,是部有著趣味、溫馨友情跟砍殺僵屍的 B 級片。
    小鎮突然出現了僵屍,僵屍就像瘟疫一樣,開始蔓延出去。三個高中童軍跟脫衣舞吧裡的侍應生聯合起來殺出重圍,救出姊姊跟其他人,順利讓國民軍以炸彈消滅僵屍。劇情相當的…簡單。

編譯 Android 裡能用的 tcpdump

已經有人提供腳本了:chatch/tcpdump-android: Build tcpdump for Android

很方便,照著 README 做就可以,自己試了以後,發現需要對 build-tcpdump 腳本做些調整,要不然會失敗,先用熟悉的編輯器開啟 build-tcpdump,然後:

  1. 找到 make-standalone-toolchain.sh ,加入 –force 。不加的話,會因為事先建了 toolchain 而警告。
  2. 找到 CFLAGS,在雙引號裏面加入 -D__ANDROID_API__=$android_api 。不加的話,會因為 checking for pcap_loop… no 而停止 tcpdump 的 configure。

然後再執行 ./build-tcpdump 就可以囉。

如果有任何問題想重來什麼的,砍掉 tcpdumpbuild 這資料夾就可以了。

參考資料:

電影流水帳(2017/9/10~2017/11/6)

Margot Robbie Margot Elise Robbie ,飾演 Suicide Squad 裡的小丑女,造型實在太出色,很難讓人忽視。後來才發現,她也有在華爾街之狼、決勝焦點與大賣空裡演出。

  • Suicide Squad (IMDB, Wikipedia),台譯:自殺突擊隊。天眼局阿曼達·華勒利用了這些被捕入獄壞蛋的弱點,在這些人的脖子裡埋入小型炸彈,將這些人納入組織裡使用。但是人算不如天算,媚惑女巫意外遇到了哥哥,脫離了掌控,透過哥哥的幫助,要報復人類。於是天眼局就讓這些壞蛋組隊去打媚惑女巫,經過一番苦戰及糾結之後,終於打敗媚惑女巫,但壞蛋仍然沒能脫離天眼局的控制,只是交換到比較人性一點的條件。
    說真的,裏面除了小丑女、媚惑女巫跟燄魔的故事讓我比較有印象之外,其他好像就沒了。個人覺得普普,但蠻適合用來打發時間。
  • 運轉手之戀 (IMDB, Wikipedia)。一個關於計程車駕駛的故事,從駕駛父母相識到生下他跟妹妹,再帶到妹妹跟自己認識警察太太並結婚的故事,故事中穿插了他目前遇到的狀況,非常的有趣。這部電影我看了超過十次以上,每次都覺得這故事真的很妙。
    故事的最後雖然是車禍,但我覺得是一個帶有開放性的結局,很難說駕駛怎麼了,因為他的父母、妻子、孩子在家殷殷期盼著,而他掙扎著爬出車外,雖然受了傷,但看起來應該還行,而且有聽到救護車的聲音,所以駕駛最後到底怎麼了呢?希望他沒事。
  • Doctor Strange (IMDB, Wikipedia),台譯:奇異博士。交代奇異博士起源的故事。
    Strange 本來是一個技術高超的外科醫師,但是一場車禍 (開車真的不要分心拿手機什麼的,太容易出意外) 使得他的手無法再像以前一樣開刀,醫師生涯等於是毀了。Strange 從復健師那兒意外得知有個人之前也是半身癱瘓,去了某個地方回來之後就一切如常了,於是他前往西藏尋訪卡瑪泰姬。在尋訪時,Strange 被搶劫,透過莫度的幫忙,Strange 沒事,而且找到卡瑪泰姬。卡瑪泰姬的古一原本是不想收他的,但是後來 Strange 的固執,讓他能留下學習魔法。在學習魔法的過程裡,他慢慢得知之前卡西流斯搶走了魔法書的一頁,想要讓多瑪暮來到地球。沒多久,卡西流斯就開始破壞三個聖殿,以便打破三個聖殿所組成的用來防禦多瑪暮的咒語。Strange 只能加入戰鬥阻止卡西流斯,在一場戰鬥中,古一受了重傷,Strange 看到古一的靈魂出竅,於是跟古一對談。古一終究沒有留下,將事業傳承給 Strange。Strange 協同莫度跟王前往最後的聖殿 – 香港阻止卡西流斯。在香港戰鬥時,Strange 從之前跟卡西流斯戰鬥中得到的靈感,使用了時間魔法消耗多瑪暮,以一種截然不同的方式讓多瑪暮知難而退,拯救了地球。
    片尾的彩蛋是雷神來請求協助找父親的,正好是最近上映的雷神3-諸神黃昏的引子。
  • The Great Wall (IMDB, Wikipedia),台譯:長城。歐洲來的一行人來到中國,想尋找黑火藥,但是意外遇到可怕的怪獸,只剩下威廉與托瓦爾僥倖逃出,來到長城。駐守長城的無影禁衛軍正是為了防禦這怪獸而在此的,捉到這兩人,非常懷疑這兩人能從怪獸攻擊下逃出。但這兩人展露本事後,確實地讓禁衛軍信服了。原本兩人打算串通之前來到此的外國人偷取黑火藥之後就離開,但是一段時間相處下來,威廉動搖了,反而留了下來幫助禁衛軍抵禦怪獸。總之最後就打敗了怪獸的頭頭,一瞬間所有怪獸都失去了控制而倒下來。大戰結束,威廉跟托瓦爾之後帶著黑火藥順利離開。
    特效是很棒,但是電影裡的突兀感很讓人不小心笑出來。像威廉兩人被逮住,禁衛軍傳了懂外國語言的林將軍來問話,講了半天,殿帥叫人押他們兩人下去。在往監牢途中,他們在談話,這時剛剛明明也在場的軍師突然也用外國語言插了話。明明就懂外國語言,為什麼剛剛都不作聲,還硬要傳林將軍上來,擺明就是給景甜(林將軍)戲份。
  • Kong:Skull Island (IMDB, Wikipedia),台譯:金剛骷髏島。還不錯看的電影,故事跟之前的金剛不同,但保留了金剛、美女的元素。
    越戰結束,一個冒險家跟一個科學家爭取到經費,找了打完越戰的軍人,一起到南美洲附近的島嶼探險。
    這些人開直昇機一上島就開始亂炸,炸彈導致金剛的不悅,將直昇機都打了下來。帶頭的長官帕卡德因為下屬死去,很不開心,決定要幹掉金剛,於是帶著剩下的人去找有重裝備的直昇機墜落點。另外,康拉德一行人則是意外在島上遇到之前漂流至此的二次大戰軍人與原住民,得知了金剛只是要避免地底的大蜥蜴出來作亂,維持島上的平衡。於是兩票人會合以後,康拉德一票人主張要前往預定的集結點離開這個島,而帕卡德一票人主張要幹掉金剛,兩方談不攏,就各自表述。
    康拉德一行人到了集結點以後,覺得應該回去救金剛,就又回去阻止帕卡德。帕卡德見到金剛,就以武器攻擊,康拉德等人還來不及阻止,金剛就被打到倒地不起。這時候地底的大蜥蜴出來咬金剛,帕卡德才知道自己錯了,也幫忙打蜥蜴。總之一場大戰以金剛甦醒,在人類幫助下打敗大蜥蜴告終。
  • 名探偵コナン から紅の恋歌 (IMDB, Wikipedia),台譯:名偵探柯南-唐紅的戀歌。這次主題是競技歌牌,像我不了解歌牌,就不太容易融入劇情,只感覺這個似乎跟夏日大作戰裡的花札有相似之處。
    劇情跟平次的女友-和葉比較有關係,因為競技歌牌比賽,平次一行人遇到大岡紅葉,紅葉明顯的對和葉表現出敵意。表現出敵意的原因是平次在小時候為了安慰紅葉說出了要娶她的話,紅葉一直記在心裡,並且努力練習競技歌牌。在比賽的過程中,陸續出現爆炸事件,有一次平次、和葉跟柯南差點就被炸死。經過柯南與平次的調查之後,終於找到凶手,而比賽也到了總冠軍戰,柯南跟平次就騎著機車到位於瀑布頂端的比賽場地揭露真相,解決這次事件。
  • Mechanic: Resurrection (IMDB, Wikipedia),台譯:極速秒殺2。沒看過極速秒殺,劇情看起來是接著演。
    Arthur Bishop 過著退休的生活,但是卻被昔日的伙伴 Riah Crain 找到,逼他幫忙殺了三個人,Bishop 不肯,逃到泰國找 Mei,Mei 是他以前幫助過的人,在泰國開渡假村。在渡假村,Bishop 遇到一個疑似被暴力對待的女子 Gina ,Mei 要求 Bishop 幫她,於是就認識了。Bishop 對 Gina 起了疑心,於是打開天窗說亮話,才知道 Gina 是為了人道慈善世界而不得不聽 Riah 的話。這時 Riah 的人馬趕到,擄走 Gina ,Bishop 為了救 Gina 只好聽命 Riah ,去殺三個人。暗殺的過程相當精彩,但是暗殺到最後一個人時,Bishop 決定幹掉 Riah 以絕後患,於是劇情出現轉折。
    除了 Bishop 跟 Gina 相識相愛的過程有點不大合理之外,其他倒是還可以。我必須承認,我只是要看 Jessica Alba ~
  • The Darkest Hour (IMDB, Wikipedia),台譯:黑暗時刻。兩個去俄羅斯尋求創投資金的美國人,尋求失敗以後,去酒吧喝酒。人運氣差的時候,連喝酒都會遇到外星人。他們認識了兩個來俄羅斯玩的女生以後,遇到外星人入侵,於是一路逃,很幸運的逃過一劫。之後為了尋求援助,就開始一路邊走邊逃,在這過程裡觀察到外星人的模式。後來又遇到俄羅斯的電工,進而找到弱點。他們意外的收聽到收音機,得知可以搭潛水艇逃出,就決定要穿過市區。應該是他們開始轉運了吧,他們遇到了當地的游擊隊,透過游擊隊的幫助,他們一同消滅了幾個外星人,並且順利搭乘潛水艇離開俄羅斯。

找 git repository commits 裡的特定字串

因為在目前的程式碼裡找不到特定的字串,但是之前應該有,可能被移掉了,所以想找找之前提交的程式碼有沒有特定的字串。

請 Google 大神幫忙了一下,在 StackOverflow 上找到答案:How to grep (search) committed code in the git history? – Stack Overflow ,原來用 git grep 搭配 git rev-list 就可以做到:

# 找全部
git grep <regexp> $(git rev-list --all)

# 只找特定目錄下的
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

sudo 免輸入密碼

這篇 command line – Execute sudo without Password? – Ask Ubuntu 講的很仔細,簡單說就是用 visudo 加入

username ALL=(ALL) NOPASSWD: ALL

就可以了。

我的作法是:

  1. 新增 sudo_nopass 的 group:
    sudo groupadd sudo_nopass
  2. visudo 之後,加入:
    sudo_nopass ALL=(ALL) NOPASSWD: ALL
  3. 將 user 加入 sudo_nopass 群組:
    sudo usermod -a -G sudo_nopass user
  4. 重新登入或重開機

這樣 user 用 sudo 時,就不需要再輸入密碼了。

在 javascript 裡將 dict/object 轉換為 xml

照一般的作法,會是用操作 DOM 的方式來產生出 XML,但這樣很繁瑣,找了好幾個函式庫,最後是找到 object-to-xml (Github網址),使用方法很簡單:

var objectToXML = require('object-to-xml');

var obj = { 
  '?xml version=\"1.0\" encoding=\"iso-8859-1\"?' : null,
  request : {
    '@' : {
      type : 'product',
      id : 12344556
    },
    '#' : {
      query : {
        vendor : 'redhat',
        name : 'linux'
      }
    }
  }
};

console.log(objectToXML(obj));
/*
<?xml version="1.0" encoding="iso-8859-1"?>
<request type="product" id="12344556">
  <query>
    <vendor>redhat</vendor>
    <name>linux</name>
  </query>
</request>
*/

在 ‘@’ 裡的,都是屬性,而在 ‘#’ 裡的則是子 element 。

在 typescript 裡,要用

import * as objectToXML from 'object-to-xml';

來匯入使用。

sqlite3 的 alter table

sqlite3 的 alter table 不能刪除 column 或是修改 column ,只能新增!!

是故,如果要修改或刪除,只能先將原來的 table 更名,然後重新建立,再使用 insert into + select 來插入。

語法示意如下:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

寫這篇,才想到 django migration 可能也因為這限制,所以當資料庫是 sqlite3 時,有刪除或更動 model 屬性時,並沒有真的更動資料表格。

Run ansible in gitlab runner

在 gitlab runner 裡想要執行 ansible playbook 進行佈署,幾個問題以及我的應對:

  1. ansible 的安裝:是可以自己加 ansible 的 package repository ,然後用 apt 安裝,但已經有好心人打包了裝好 ansible 的 docker image ,只要在 .gitlab-ci.yml 加入 image 設定即可:
    image: williamyeh/ansible:ubuntu14.04
  2. playbook 要放在哪裡?因為要直接在專案進行佈署,所以 playbook 也要放在專案裡,我在專案裡建立了一個 ansible 的目錄,把 playbook 放在這裡。
  3. 私密資料如何保存?gitlab 在專案設定裡提供了 variables,可以用來存放這些私密的資料,在 .gitlab-ci.yml 裡,只要用 $VAR_NAME 就可以使用這些變數。.gitlab-ci.yml 裡也可以自訂 variables ,但這些 variables 是進到 git repository 的,要視情況使用。
  4. Ansible 連到目的機器需要 SSH Key:這比較麻煩一點,好在 gitlab 有提供如何使用 SSH key 的文件,步驟很詳細,簡述如下:
    1. 在專案設定的 variables 裡新增有 SSH private key 的變數。
    2. 檢查 ssh-agent ,如果沒有就安裝 openssh-client
    3. 執行 ssh-agent
    4. 用 ssh-add 匯入第一個步驟所設定好的變數
    5. 在 ~/.ssh/config 裡加入不檢查 host key 的設定:
      Host *
          StrictHostKeyChecking no

參考資料: