JetBrainsのTeamCityをさくらのクラウド上に構築した時のメモです。
概要
構成
- サーバ1台(パケットフィルタ込み)
- エンハンスドロードバランサ(100cps プラン)
- SSL終端
- Let's Encryptでの証明書取得/更新
- TeamCityはDockerで起動
サーバ上で直接証明書取得 & SSL終端してもよかったのですが、環境構築がめんどくさかったのでエンハンスドロードバランサを利用します。
また、サーバへのアクセスはエンハンスドロードバランサに限定するためにパケットフィルタも合わせて利用します。
構築手順
- サーバ作成/Dockerインストール
- エンハンスドロードバランサ作成
- エンハンスドロードバランサで発行されたVIP or FQDNをDNS登録(A or CNAMEレコード)
- エンハンスドロードバランサの設定(待ち受けポート/実サーバ/Let's Encryptなど)
- パケットフィルタ作成 & サーバにアタッチ
- TeamCityをDocker上で起動
- TeamCityのエージェントをDocker上で起動
各手順の詳細
サーバ作成/Dockerインストール
まずはサーバを作成します。今回は2CPU/4GBメモリ/共有セグメントに接続、というスペックで作成しました。
サーバ作成後はDockerがインストールされていない場合はインストールしておきます。
エンハンスドロードバランサ作成
次にエンハンスドロードバランサを作成します。
VIPフェイルオーバ
を有効にする/しないでこの後作成するDNSレコードの種別が変わりますのでご注意ください。
エンハンスドロードバランサで発行されたVIP or FQDNをDNS登録(A or CNAMEレコード)
エンハンスドロードバランサを作成したらFQDN or VIPが払い出されます。この値をDNS登録しておきます。
前述の通りVIPフェイルオーバ
の有効/無効に応じて登録するDNSレコード種別が変わります。
VIPフェイルオーバを有効にした場合
FQDNが発行されますのでCNAMEレコードを登録します。
VIPフェイルオーバを無効にした場合:
VIP(Virtual IP Address)が発行されますのでAレコードを登録します。
エンハンスドロードバランサの設定
次にエンハンスドロードバランサの設定を行います。
待ち受けポート
以下のように2つ登録します。
(1) HTTP
- プロキシ方式:
http
- 待受ポート番号:
80
- httpsへのリダイレクト:
有効
(2) HTTPS
- プロキシ方式:
https
- 待受ポート番号:
443
- HTTP/2のサポート:
無効
実サーバ
IPアドレスに先ほど作成したサーバのIPを入力して登録します。
ポート番号は8111
、サーバグループは空のままとします。
Let's Encryptの設定
次に右上のSSH証明書の設定
-> Let's Encryptの設定
に進み、Let's Encryptでの証明書自動取得/更新を有効化します。
先ほどCNAMEレコードまたはAレコードを登録したFQDNを指定してください。 (エンハンスドロードバランサから払い出されたFQDNではありません)
パケットフィルタ作成 & サーバにアタッチ
次にサーバへのアクセスをエンハンスドロードバランサからだけに絞るためにパケットフィルタを作成してサーバにアタッチします。
まず、エンハンスドロードバランサが実サーバにアクセスする際のアクセス元IPレンジをメモしておきます。
エンハンスドロードバランサの詳細画面のプロキシ元ネットワーク
という項目です。
次にパケットフィルタを作成し、エンハンスドロードバランサからのアクセスだけ許可、以外は拒否するルールを設定します。
(この例では管理用にtcp/10022
ポートの許可を追加してます)
作成したらサーバの詳細画面からNICに対してパケットフィルタを接続(アタッチ)しておきましょう。サーバを起動したままでアタッチ可能です。
TeamCityをDocker上で起動
ようやくTeamCityのインストールです。 以下のマニュアルからDockerでのインストール周りへと辿ります。
余談ですが、日本語版マニュアルが
jetbrains.com
じゃなくてpleiades.io
なのが気になって調べたら↓↓が出てきました。
https://blog.jetbrains.com/jp/2018/10/18/1355
Pleiadesは昔大変お世話になりました。
今回は以下のように起動しました。
# bridgeネットワークを作成しておく $ docker network create teamcity # TeamCityサーバ起動 $ docker run -d --name teamcity-server-instance \ -v teamcity-data:/data/teamcity_server/datadir \ -v teamcity-log:/opt/teamcity/logs \ -p 8111:8111 \ --network teamcity \ jetbrains/teamcity-server
面倒だったのでDocker ComposeやKubernetesを使わずにDockerコマンドを直接使ってます。
TeamCityのエージェントをDocker上で起動
次にTeamCityのエージェントをDocker上で起動します。 (リスクのある方法ですので以下のドキュメントをちゃんと読んでおきましょう)
https://hub.docker.com/r/jetbrains/teamcity-agent/
今回は以下のように起動しました。
$ docker run -d --name teamcity-agent-01 \ -e SERVER_URL="http://teamcity-server-instance:8111" \ -e AGENT_NAME="agent-01" \ -v teamcity-agent-data:/data/teamcity_agent/conf \ --network teamcity \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /opt/buildagent/work:/opt/buildagent/work \ -v /opt/buildagent/temp:/opt/buildagent/temp \ -v /opt/buildagent/tools:/opt/buildagent/tools \ -v /opt/buildagent/plugins:/opt/buildagent/plugins \ -v /opt/buildagent/system:/opt/buildagent/system \ jetbrains/teamcity-agent
アクセスしてみる
ブラウザでAレコード or CNAMEレコードを登録したFQDNにアクセスするとTeamCityの画面が開くはずです。
あとは画面の指示/マニュアルを参考に進めていけばOKなはずです。
終わりに
今回はバックアップなど運用面をあまり気にしてませんので実運用の際はオプションの精査などをしっかり行ってください。
以上です。