モチベーション
偉い人は言いました。
常にソースコード管理システムを使用すること
出典:達人プログラマー
ということで、プライベートな開発環境構築の第一歩として個人用のGitサーバを立てることにしました。
以下のような方針で進めていきます。
- クラウドインフラ利用
- Infrastructure as Code (IaC) の実現
- 無料(重要)
Git立てるついでに無料でクラウドでIaCやろう!みたいな感じです。
具体的には、GCPの無料枠インスタンス上でGogsを立てつつdocker-composeで構成管理します。
1. GCPの無料枠でインスタンスを立てる
この記事の通りにやれば特に問題なくインスタンス作成からssh接続までいけました。感謝。
インスタンス作成時に月額予測が$5.08と出てて首を捻ったけど、無料枠内の設定でも金額を表示しているみたい。
手順的に異なる点だけを列挙します。
OSはCentOS7を採用
一番利用経験があるから。特にこだわりはないです。
http/https用に80と443番ポートを開放
インスタンス作成時に
- HTTP トラフィックを許可する
- HTTPS トラフィックを許可する
の2つにチェックを入れるだけでOK。もちろん後からルール追加も可能です。
(参考:ファイアーウォール ルールの設定)
rootパスワードを設定
不慮の事故でSSHが使えなくなったときの緊急策として、GCPのダッシュボードからコンソール接続するために設定しました。
他のリカバリ方法があるかもしれない。
2. docker-composeのインストール
先人がまとめてくださっています。バッチリ後追いしました。
バージョン指定はしていませんが、インストールされたバージョンは以下の通り。
Docker version 19.03.0, build aeac9490dc
docker-compose version 1.18.0, build 8dd22a9
3. Gogsのセットアップ
GitサーバにはGogsを採用しました。
軽量であることと、Go言語が勉強できればいいなと思ったことが選定理由です。
事前準備
事前にswap領域を作っておきます。
OSデフォルトでswap領域が用意されておらず、これがないとCannot allocate memory for the buffer pool
と言われてMySqlのコンテナ起動に失敗しました。
サイズは1024MBで作成。インスタンスのメモリが600MBとかなので、もう少し大きくても良かったかもしれません。
起動
起動はdocker-compose up -d
で一発ドン。
version: "3"
services:
gogs:
container_name: gogs
image: gogs/gogs:latest
restart: always
ports:
- "80:3000"
- "{インスタンスのsshポート}:22"
environment:
- RUN_CROND=true
volumes:
- /data
depends_on:
- gogs-db
gogs-db:
container_name: gogs-db
image: mysql:5.7
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=false
- MYSQL_ROOT_PASSWORD=gogs
- MYSQL_DATABASE=gogs
volumes:
- /var/lib/mysql
これでインスタンスへブラウザからアクセスするとGogsのインストール設定画面が開くので、docker-composeを参考にしつつDB接続などを設定します。
アカウントを作成し、作成した非公開リポジトリに上記のdocker-composeをpushしてひとまず動作確認完了。
4. Gogsの設定追加
このままだとアカウントが作り放題だったり、gitのURLにインスタンスのIPが丸見えだったり、リポジトリのアドレスがhttp://localhost(以下略
だったりとイケてないところが多いので、設定を追加します。
設定ファイルをコンテナ外に
以下の構成で、設定ファイルを外出し。
infra/
├ docker-compose.yml
├ gogs/
├ Dockerfile
└ app.ini
設定ファイルの元ネタはコンテナの中身から抜いてきました。
docker cp gogs:/data/gogs/conf/app.ini ./gogs/
設定追加
Gogsにxxx.example.netのように適当なドメイン名からアクセスできるようにします。
アカウントの新規登録を無効にする設定も一緒に。
DOMAIN = xxx.example.net
ROOT_URL = http://%(DOMAIN)s/
DISABLE_REGISTRATION = true
gogsはDockerfileから起動するように変更します。
services:
gogs:
container_name: gogs
image: ./gogs
Dockerfileは設定ファイルをコピーしてイメージ起動するだけのかんたん設定。
FROM gogs/gogs:latest
COPY app.ini /data/gogs/conf/app.ini
動作確認
クライアントに名前解決の設定追加。
{サーバのIPアドレス} xxx.example.net
これでhttp://xxx.example.net/
でGitにアクセスできるようになりました。めでたしめでたし。
TODO
- Nginx(リバプロ)追加
随時他のウェブサービスを追加したいので、Nginxを使って振り分け。 - DNS設定
/etc/hostsを書くのは面倒なのでDNSにおまかせしたい。 - SSL化
- SSO化
- データの永続化
docker-composeを初めて触ったので永続化の仕組みをさっぱり理解してません。
IaCにおけるデータの位置づけとかも含めて勉強して綺麗にしたいです。