LoginSignup
1
3

More than 3 years have passed since last update.

GCP無料枠で個人用Gitサーバ

Posted at

モチベーション

偉い人は言いました。

常にソースコード管理システムを使用すること
出典:達人プログラマー

ということで、プライベートな開発環境構築の第一歩として個人用の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で一発ドン。

docker-compose.yml
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のように適当なドメイン名からアクセスできるようにします。
アカウントの新規登録を無効にする設定も一緒に。

gogs/app.ini(抜粋)
DOMAIN                = xxx.example.net
ROOT_URL              = http://%(DOMAIN)s/
DISABLE_REGISTRATION  = true

gogsはDockerfileから起動するように変更します。

docker-compose.yml(抜粋)
services:
  gogs:
      container_name: gogs
      image: ./gogs

Dockerfileは設定ファイルをコピーしてイメージ起動するだけのかんたん設定。

gogs/Dockerfile
FROM gogs/gogs:latest
COPY app.ini /data/gogs/conf/app.ini

動作確認

クライアントに名前解決の設定追加。

/etc/hosts
{サーバのIPアドレス}  xxx.example.net

これでhttp://xxx.example.net/でGitにアクセスできるようになりました。めでたしめでたし。

TODO

  • Nginx(リバプロ)追加
    随時他のウェブサービスを追加したいので、Nginxを使って振り分け。
  • DNS設定
    /etc/hostsを書くのは面倒なのでDNSにおまかせしたい。
  • SSL化
  • SSO化
  • データの永続化
    docker-composeを初めて触ったので永続化の仕組みをさっぱり理解してません。 IaCにおけるデータの位置づけとかも含めて勉強して綺麗にしたいです。
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3