macOS に GitHub 風の軽量 Git サーバーを一発で建てるワンライナー

## 簡単に Git サーバーを Mac で建てたい

> GitHub のような **Git サーバーを自宅／オフィス用に <ruby>Mac<rt>・・・</rt></ruby> で<ruby>簡単に<rt>・・・</rt></ruby>建てたい**。

しかし、MySQL や Postgres などの DB サーバーや面倒な設定のいらない**俺様専用レベルの Git サーバーはないものか** 

- 検証済： HighSierra (OSX 10.13.6）〜Monterey (macOS 12.7.2) 

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. バイナリ１つで動作する「[Gitea](https://gitea.io/en-us/)」はいかがでしょう。
1. `brew` でインストール可能（要 `tap` と各種設定）
1. コマンド １ 行で SQLie3 + 日本語化 + 空きポートで安定版 Gitea がインストールできるスクリプトを用意しました。
1. でも `docker` が入っているなら `docker compose` の方が便利。

### いんふぉ

- Gitea は Golang で作られており、バイナリ本体のサイズも 51 MB 程度です。
- [日本語表記に対応](https://github.com/go-gitea/gitea/blob/master/CONTRIBUTING.md#translation)しています。（[日本語化対応状況](https://crowdin.com/project/gitea)）
- 公式サイト「Gitea」 https://gitea.io/en-us/
- 公式リポジトリ https://github.com/go-gitea/gitea （気に入ったらスターをつけてあげてください）
- 公式フォーラム https://discourse.gitea.io/ （質問など。日本語<font color=red>不可</font>）
- 公式不具合報告先 https://github.com/go-gitea/gitea/issues （日本語<font color=red>不可</font>）

### インストール

この記事で紹介するインストール方法は以下の 4 種類です。

1. `brew` でインストール
1. 手動インストール
1. 一発インストールコマンド
1. docker + compose でインストール （← docker 入ってるなら一番お勧め）

#### brew でインストール

[Homebrew](https://www.google.co.jp/search?q=site:qiita.com+homebrew+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) が入っている場合は `brew` コマンドで `Gitea` のインストールが可能です。<font color=darkorange>おそらく、この方法が一番一般的</font>でしょう。

しかし、その場合は**未使用の空きポート確認や各種設定などはしてくれません**ので自身で諸設定を行う必要があります。また、`brew upgrade` で他のアプリケーションと併せてアップデートできる反面、意図しないバージョン（不具合のあるバージョン）になる可能性を留意します。

```shell-session
$ brew tap gitea/tap https://gitea.com/gitea/homebrew-gitea
$ brew install gitea
$ gitea -h
```

#### 手動インストール

- 「[Giteaのインストール](https://qiita.com/0xffffff/items/ae38a464a342c985b2e4)」@ Qiita

`Gitea` は上記記事のように、[バイナリのダウンロード・ページ](https://dl.gitea.io/gitea/)から最新版をダウンロードして自身でセットアップするのが王道です。

しかし、**最新の安定バージョン確認 + SQLite3 + 日本語化の設定 + 未使用のポートを探すといった諸作業が面倒**な方は、次の「一発インストール・コマンド）」をご覧ください。

#### 一発インストール・コマンド

楽をするために苦労する性癖がウズいたので、一発でインストールするスクリプトを用意しました。

以下のコマンドを、インストールしたいディレクトリ先で叩くとインストールできます。**Mac 用（64bit版）の最新の安定版バイナリをダウンロード＆検証して、基本的な設定がされた状態でインストールされます**。<br>（2019/01/07 追記：同じコマンドで[ Gitea のアップデートにも対応](#20190107-%E6%9B%B4%E6%96%B0)しました）

```bash:インストール・コマンド
bash <(curl -s https://keinos.github.io/gitea_darwin/install.sh)
```

```shell-session:サイズ
$ ls -lah
total 105344
drwxr-xr-x    4 admin  staff   136B  1  7 19:58 .
drwxr-xr-x  118 admin  staff   3.9K  1  7 19:57 ..
drwxr-xr-x    3 admin  staff   102B  1  7 19:58 custom
-rwxr-xr-x    1 admin  staff    51M  1  7 19:58 gitea
```

- [動作確認済み環境一覧](https://github.com/KEINOS/gitea_darwin/issues/1)
- [インストーラーのリポジトリ](https://github.com/KEINOS/gitea_darwin/) @ GitHub
- [インストーラーのソースコード](https://github.com/KEINOS/gitea_darwin/blob/master/install.sh) @ GitHub
- [インストーラーの不具合報告先（Issue）](https://github.com/KEINOS/gitea_darwin/issues)（日本語<font color=darkorange>可</font>）
- インストーラーに関する質問などは、この記事にコメントしてください。

このインストーラーを使うと、Gitea のビルトイン SSH/WEB サーバー用のポートがバッティングしている（他のアプリが利用している）場合に、別の[ランダムな空きポートを検索し](https://qiita.com/tags/%E7%A9%BA%E3%81%8D%E3%83%9D%E3%83%BC%E3%83%88)デフォルトに設定します。

あとは、ブラウザでアクセスして、設定画面でサイトの名前を設定し、アカウントを作成するだけです。（詳しくは下記 TS;DR 参照）

#### docker compose でインストール

`docker` を利用しているのであれば、`docker compose` での利用をお勧めします。以下は最新の Gitea をルートレス（`root` 権限なし）で起動する `docker-compose.yml` です。

このファイルを設置したディレクトリで `docker compose up -d` すると `http://localhost:3000` で Gitea にアクセスできます。`docker compose down` しない限り、パソコンを再起動しても `docker` のデーモンの起動と同時に `Gitea` も起動します。

```yaml:docker-compose.yml
version: "3"

services:
  server:
    image: gitea/gitea:latest-rootless
    restart: unless-stopped
    volumes:
      - ./data:/var/lib/gitea
      - ./config:/etc/gitea
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:2222"
```

### 参考文献

- [OSSのGitサーバ4種類を主観的に比較する](https://jyn.jp/git-server-comparison/) @ 純規の暇人趣味ブログ
- [GitBucket / Gogs / Gitea / GitLab のベンチマーク on Raspberry Pi 3](https://qiita.com/kounoike/items/7c42db90c42e280e1cab) @ Qiita
- [Gogs vs Gitea detailed comparison as of 2018](https://www.slant.co/versus/1395/19087/~gogs_vs_gitea) @ Slant
- [Giteaのインストール](https://qiita.com/0xffffff/items/ae38a464a342c985b2e4) @ Qiita
- [Gitea - バイナリ一個で動作する簡単設置タイプのGitサーバ](https://www.softantenna.com/wp/review/gitea/) @ SOFTANTENNA BLOG

## TS; DR <sub><sup><sub><sup>（一発インストーラーに関するコマケーこと）</sup></sub></sup></sub>

### Gitea のインストール

以下は自分のホームディレクトリ（`~/`）に `gitea` ディレクトリを作成し、そこに Gitea を一発インストールする例です。

```shell-session:実行例
$ # Gitea ディレクトリの作成と移動
$ cd ~
$ mkdir -p gitea && cd "$_"

$ # インストールの実行
$ bash <(curl -s https://keinos.github.io/gitea_darwin/install.sh)
- Checking existing binary: no binary found ... installing newly
- Fetching latest release: OK
- Downloading files: 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   622    0   622    0     0    775      0 --:--:-- --:--:-- --:--:--   774
100 23.1M  100 23.1M    0     0  1540k      0  0:00:15  0:00:15 --:--:-- 1563k
100   626    0   626    0     0   2132      0 --:--:-- --:--:-- --:--:--  2143
100   833  100   833    0     0    859      0 --:--:-- --:--:-- --:--:--  2359
100   629    0   629    0     0   2323      0 --:--:-- --:--:-- --:--:--  2323
100    99  100    99    0     0    211      0 --:--:-- --:--:-- --:--:--   211

- Comparing checksum: gitea-1.6.3-darwin-10.6-amd64.xz: OK
- Decompressing XZ archive: OK
- Removing un-necessary files: OK
- Renaming binary file: OK
- Changing mode of the binary as executable: OK
- Installed path: 
	/Volumes/Macintosh_SD/Users/admin/gitea
- Installed version: 
	Gitea version 1.6.3 built with: bindata, sqlite
- Creating directory for application settings: OK
- Fetching ports in use: OK
- Fetching unused ports for builtin Webserver: OK (PORT: 8080)
- Fetching unused ports for builtin SSH: OK (PORT: 22)
- Creating application ini file: OK

* DONE. gitea installed successfuly.

Would you like to launch the browser to setup gitea now? (y/n):
```

### Gitea サーバーの起動

インストール・スクリプトからインストールした場合は、「`Would you like to launch the browser to setup gitea now? (y/n):`」と聞かれるので「`y`」を入力すると、Gitea サーバーとブラウザが起動します。

:::note info
この時、「`n`」（`y` 以外）を選んだ場合は別途手動で起動させる必要があります。
:::

Gitea サーバ終了後に再度起動したい場合など、**手動で起動させるには `./gitea web` と打つ**と Gitea のビルトイン WEB サーバーが起動します。

```shell_session:サーバーの起動
$ # Gitea のインストール先に移動
$ cd ~/gitea
$ # Gitea サーバーの起動
$ ./gitea web
2018/08/27 17:12:45 [T] AppPath: /path/to/your/installed/gitea/gitea
2018/08/27 17:12:45 [T] AppWorkPath: /path/to/your/installed/gitea
2018/08/27 17:12:45 [T] Custom path: /path/to/your/installed/gitea/custom
2018/08/27 17:12:45 [T] Log path: /path/to/your/installed/gitea/log
2018/08/27 17:12:45 [I] Gitea v1.5.0 built with: bindata, sqlite
2018/08/27 17:12:45 [I] Log Mode: Console(Info)
2018/08/27 17:12:45 [I] XORM Log Mode: Console(Info)
2018/08/27 17:12:45 [I] Cache Service Enabled
2018/08/27 17:12:45 [I] Session Service Enabled
2018/08/27 17:12:45 [I] SQLite3 Supported
2018/08/27 17:12:45 [I] Run Mode: Development
2018/08/27 17:12:45 [I] Listen: http://0.0.0.0:8080
```

上記の最終行「`Listen: http://〜:8080`」の「`8080`」が **HTTP のポート番号**になります。Gitea インストール時のポートの空き状況によって番号は変わります。

**サーバーを終了する場合は `Control+c` で終了**させます。

#### ネットワーク・アクセスの許可確認画面

Gitea サーバーを起動して、ネットワークのアクセス権を聞いて来た場合は、忘れずに（間違えずに）「許可」を行います。「拒否」をしてしまうとブロックされ、他の端末からもアクセスできなくなります。

<img width="100%" alt="スクリーンショット 2018-08-27 17.12.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/29856109-8452-15f7-6eaa-37ce5aa3bb08.png">

#### Gitea の起動スクリプト（サンプル）

この**インストール・スクリプトは環境変数やサービスの登録などは行いません**。Gitea サーバーを終了させたり Mac を再起動した場合は、別途サーバーを起動する必要があります。

そこで、**Gitea サーバー起動をバックグラウンドで行う起動スクリプト**のサンプルを用意しました。

<details><summary>Gitea 起動スクリプトのサンプル</summary><div>

- 最新のスクリプトは[ここ](https://github.com/KEINOS/gitea_darwin/blob/master/start.sh) @ GitHub

```bash:start.sh
#!/bin/bash

NAME_BIN_GITEA='gitea'
CMD_RUN_BIN="${NAME_BIN_GITEA} web"
PID_GITEA=$(pgrep -fo "$CMD_RUN_BIN")
PATH_DIR_SCRIPT=$(cd $(dirname $0); pwd)

function getPathFileBin() {

    which $NAME_BIN_GITEA > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        echo $(which $NAME_BIN_GITEA)
        return 0
    fi

    ./$NAME_BIN_GITEA --version > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        echo ./$NAME_BIN_GITEA
        return 0
    fi

    $PATH_DIR_SCRIPT/$NAME_BIN_GITEA --version > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        echo $PATH_DIR_SCRIPT/$NAME_BIN_GITEA
        return 0
    fi

    echo 'No Gitea bin found.'
    exit $LINENO
}

function getPathFileLog() {
    PATH_FILE_BIN=$(getPathFileBin)
    PATH_DIR_BIN=$(dirname $PATH_FILE_BIN)
    echo $PATH_DIR_BIN/log/gitea.log
}

if [ -n "$PID_GITEA" ]; then
    echo "Gitea server is already running. (PID: ${PID_GITEA})" >&2
    PATH_FILE_LOG=$(getPathFileLog) && \
    cat $PATH_FILE_LOG | grep -o "Listen: [0-9htps:\/\.]*" | tail -1
    exit $?
fi

echo -n 'Starting Gitea server ... '

PATH_DIR_BIN=$(dirname $(getPathFileBin))
cd $PATH_DIR_BIN
nohup ./$CMD_RUN_BIN > /dev/null 2>&1 &

sleep 2

PID_GITEA=$(pgrep -fo "$CMD_RUN_BIN")
if [ -n "$PID_GITEA" ]; then
    echo 'OK'
    PATH_FILE_LOG=$(getPathFileLog) && \
    cat $PATH_FILE_LOG | grep -o "Listen: [0-9htps:\/\.]*" | tail -1
    exit $?
else
    echo 'Fail starting server'
    exit $LINENO
fi

```

```shell-session:動作例
$ # 起動
$ /path/to/start.sh
Starting Gitea server ... OK
Listen: http://0.0.0.0:8080
$ 
$ # 起動の確認
$ /path/to/start.sh
Gitea server is already running. (PID: 3405)
Listen: http://0.0.0.0:8080
$ 
$ # 終了
$ kill 3405
```

</div></details>



### Gitea のセットアップ

サーバーが起動したら（まだ起動していない場合は `./gitea web` で起動させてから）、ブラウザからサーバにアクセスします。この時、サーバーの IP アドレスもしくはホスト名に、サーバー起動時に確認したポート番号（上記参照）を添えます。

問題なくアクセスできると、初回アクセスの「`Initial Configuration`」のセットアップ画面になります。

- ホスト名によるブラウザ・アクセス

    ```
    http://XXXXX.local:<ポート番号>/
    ```
    ```text:例
    http://KEINOS-no-MacBookPro.local:8080/
    ```

    DHCP など、IP アドレスが固定されていない場合は、サーバーのターミナルから `hostname` コマンドを打つと「XXXXX.local」といったコンピューター名のついた [Bonjour](https://ja.wikipedia.org/wiki/Bonjour) によるホスト名が取得できます。もしくは「システム環境設定」-「共有」から「編集」を押した時に表示される「ローカルホスト名」で確認できます。

    <details><summary>クライアント（利用者）が Windows の場合</summary><div>

Windows からのアクセスの場合、Bonjour と互換がある、もしくは Bonjour がインストールされていないとホスト名の名前解決が出来ずアクセスできません。

以前の Windows 10 では [mDNS](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88DNS) クライアントが標準インストールされていたため Bonjour と互換があったのですが、Fall Creator Update で外されてしまったようです。

しかし、Skype・iTunes・Adobe Photoshop などがインストールされていると、Bonjour もインストールされていることが多いので、まずは `*.local` による接続を試してみて NG だった場合に別途 [Bonjour Print Services](https://support.apple.com/kb/DL999?locale=ja_JP&viewlocale=ja_JP) などをインストールします。

未検証ですが、Bonjour のためにアレコレとインストールするのがイヤな場合、[iTunes のインストーラー](https://support.apple.com/ja_JP/downloads/iTunes-Windows)を [7-Zip](https://sevenzip.osdn.jp/) や [WinRAR](http://www.winrarjapan.com/download) で解凍すると中に Bonjour 単体のインストーラーがあるらしいです。[[出典](https://learn.adafruit.com/bonjour-zeroconf-networking-for-windows-and-linux/overview)]

Bonjour のインストールもイヤな場合は、[`hosts`ファイルに手を加える方法](https://www.google.co.jp/search?q=windows+hosts+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E5%A4%89%E6%9B%B4)もありますが、そこまでするならルーターの設定などで IP アドレスを固定にしてしまい、IP アドレスでアクセスする方が楽だと思います。

---

</div></details>

- IPアドレスによるブラウザ・アクセス

    ```
    http://<IPアドレス>:<ポート番号>/
    ```
    ```text:例
    http://192.168.1.103:8080/
    ```

- Gitea サーバーと同じマシンからセットアップする場合

    ```
    http://localhost:<ポート番号>/
    ```

#### セットアップ画面

インストール・スクリプトからのインストールの場合は、**「SQLite3」をベースに、必要な設定はほとんどできています**。必要な設定は `Site Title`（サイト名）を変更する程度ですが、必要に合わせて適宜設定を変更します。

なお、ページ下部の「Administator Account Settings」で管理者のユーザー登録を同時に行えますが、設定しなくても最初に登録したユーザーが自動的に管理者になります。

![Setup.png](https://qiita-image-store.s3.amazonaws.com/0/78776/f0f08391-8684-1953-3e3d-0605a568829c.png)

ページ下部の「Gitea をインストール」でサーバーの設定が完了します。

### Gitea のユーザー登録

無事、サーバーの設定が完了すると「Sign In」のページに転送されます。セットアップ時に管理者アカウントを設定していない場合は、ユーザーを作成しないといけないので、右上の「登録」からユーザー登録します。（初回ユーザーは管理者として登録されます）

#### サインイン画面（ログイン画面）

![サインイン   KEINOS Personal Git Server.png](https://qiita-image-store.s3.amazonaws.com/0/78776/db1a38e8-cc8a-509e-3508-056f7077f571.png)

#### ユーザー登録画面

![Register   Gitea  Git with a cup of tea.png](https://qiita-image-store.s3.amazonaws.com/0/78776/6361db06-6c29-cb23-2ee2-5bcd90e60d79.png)

#### トップページ画面

<img width="100%" alt="スクリーンショット 2018-08-21 17.41.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/6ad99a83-2de1-de31-9958-2785d7bd7b2e.png">

### ダッシュボード

サインイン（ログイン）すると、ユーザーのダッシュボードが表示されます。

![KEINOS   ダッシュボード   Gitea  Git with a cup of tea.png](https://qiita-image-store.s3.amazonaws.com/0/78776/40a95108-97e1-3eab-4d51-1ad4df1f3158.png)

まずは、自分のアイコンをお気に入りのものに変更してみましょう。**設定できる項目や内容は GitHub とほとんど同じ**なので馴染みやすいと感じると思います。（あと主要な部分は日本語化されているのも良いですね）

### リポジトリの作成

これも GitHub とほとんど同じです。右上の「＋」マークから「新しいリポジトリ」を選択し、必要事項を記入し「リポジトリを作成」します。

<img width="248" alt="スクリーンショット 2018-08-27 22.42.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/674d3232-179c-9837-8464-3be31a50f5a8.png">

![新しいリポジトリ   Gitea  Git with a cup of tea.png](https://qiita-image-store.s3.amazonaws.com/0/78776/a197dbe5-07d2-b4b9-203c-3e4bbb99792f.png)

上記リポジトリ名にスペースが含まれていますが、GitHub 同様スペースは使えないので「-」もしくは「_」を利用してください。

### リポジトリの画面

作成されたリポジトリの画面も GitHub と似ているので使いやすい。

![KEINOS Sample_Repo  Sample Repo   Gitea  Git with a cup of tea.png](https://qiita-image-store.s3.amazonaws.com/0/78776/0e0cef2a-f4c3-b44d-dab6-d273da630e18.png)

### リポジトリのクローン（Gitea サーバからローカルへ Clone）

もぅ、まんま GitHub と同じです。

![Gitea_how-to-clone.png](https://qiita-image-store.s3.amazonaws.com/0/78776/53518a2e-fc82-3e2a-e826-289a51118388.png)

### Gitea 本体のアップデート

~~本記事の [Gitea インストーラー for Mac](https://github.com/KEINOS/gitea_darwin) はアップデートに対応していません。現在は[本家のリリースページ](https://dl.gitea.io/gitea/)から**最新のバイナリをダウンロードして手動で差し替える**必要があります。（要同一バイナリ名）~~

- Issue #3817「[How can I update gitea?](https://github.com/go-gitea/gitea/issues/3817#issuecomment-382619656)」@ 本家 @ GitHub
- Issue #2437「[how to upgrade](https://github.com/go-gitea/gitea/issues/2437#issuecomment-326823714)」@ 本家 @ GitHub

~~[冒頭のインストール・コマンド](https://qiita.com/KEINOS/items/a0742e7f4c2195816b38#%E4%B8%80%E7%99%BA%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)を再度実行すると（バイナリがすでに存在する場合は）アップデートを行うよう[改善する予定はある](https://github.com/KEINOS/gitea_darwin/issues/4)のですが、[本家でも実装を検討している](https://github.com/go-gitea/gitea/issues/518)こともあり、なにぶん、、、ねぇ。やる気が。「いいね」が 10 以上付いたら、本家より先行して対応します。~~

- Issue #4「["update" feature to update existing Gitea](https://github.com/KEINOS/gitea_darwin/issues/4)」@ インストーラー for Mac @ GitHub
- Issue #518「[Auto updates for Gitea](https://github.com/go-gitea/gitea/issues/518)」@ 本家 @ GitHub

#### 2019/01/07 更新

「いいね」を 10 以上いただいちゃったので、**Gitea のアップデートに対応しました**。

同じ階層にバイナリがすでに存在する場合は、**インストール・コマンドを再度実行するとアップデートを行います**。Gitea が終了した状態で実行してください。また、以前のバージョンは `gitea.old` とリネームされているので、不具合がある場合は差し戻してください。

```
bash <(curl -s https://keinos.github.io/gitea_darwin/install.sh)
```

```shell-session:アップデートの実行例
$ pwd
/Users/admin/gitea
$ ls
custom		data		gitea		log
$ 
$ # アップデートの実行
$ bash <(curl -s https://keinos.github.io/gitea_darwin/install.sh)
- Checking existing binary: binary found ... updating
- Current version: 
	Gitea version 1.5.0 built with: bindata, sqlite
- Fetching latest release: OK
- Downloading files: 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   622    0   622    0     0   1046      0 --:--:-- --:--:-- --:--:--  1047
100 23.1M  100 23.1M    0     0  1006k      0  0:00:23  0:00:23 --:--:-- 1750k
100   626    0   626    0     0   2144      0 --:--:-- --:--:-- --:--:--  611k
100   833  100   833    0     0    966      0 --:--:-- --:--:-- --:--:--   966
100   629    0   629    0     0   2713      0 --:--:-- --:--:-- --:--:--  2713
100    99  100    99    0     0    225      0 --:--:-- --:--:-- --:--:-- 99000

- Comparing checksum: gitea-1.6.3-darwin-10.6-amd64.xz: OK
- Decompressing XZ archive: OK
- Removing un-necessary files: OK
- Renaming binary file: OK
- Changing mode of the binary as executable: OK
- Installed path: 
	/Users/admin/gitea
- Installed version: 
	Gitea version 1.6.3 built with: bindata, sqlite
Updating finished.
```

### Gitea のアンインストール

アンインストールはサーバーを停止し、以下のディレクトリを削除します。

- Gitea 本体をインストールしたディレクトリ
    - 本記事の例だと `~/gitea`
- セットアップ時に設定した「リポジトリのルートパス」（残しておいても可）
    - `~/gitea-repsitories`

```shell-session:giteaのアンインストール
$ cd ~
$ rm -rf gitea*
```

### バックアップ

本記事の場合は DB を SQLite3 にしているため、リポジトリのデータ以外は全て `~/gitea` ディレクトリに入っていますが、サーバーのコマンドで ZIP アーカイブも可能です。

サーバーを止め、サーバーのディレクトリで以下の `dump` コマンドを叩くと ZIP にバックアップをアーカイブしてくれます。

```shell-session
$ cd ~/gitea
$ ./gitea dump -c conf/app.ini
2018/08/27 23:06:43 Creating tmp work dir: /var/folders/rl/pyy3j9812xn899qc7qmk9jq00000gn/T/gitea-dump-967896417
2018/08/27 23:06:43 Dumping local repositories.../Users/admin/gitea-repositories
2018/08/27 23:06:43 Dumping database...
2018/08/27 23:06:43 Packing dump files...
2018/08/27 23:06:43 Packing data directory.../Users/admin/gitea/data
2018/08/27 23:06:43 Removing tmp work dir: /var/folders/rl/pyy3j9812xn899qc7qmk9jq00000gn/T/gitea-dump-967896417
2018/08/27 23:06:43 Finish dumping in file gitea-dump-1535378803.zip
$ ls
custom				gitea-dump-1535378803.zip
data				log
gitea
```

## 便利なリファレンス

[Gitea のドキュメント](https://docs.gitea.io/en-us/)は充実しているので、一度目を通しておくと良いと思います。

- [`./gitea web` 以外のサーバーのコマンド](https://docs.gitea.io/en-us/command-line/)
- [バックアップとリストア](https://docs.gitea.io/en-us/backup-and-restore/)
- [Nginx や Apache 環境で使う場合などのリバースプロクシについて](https://docs.gitea.io/en-us/reverse-proxies/)
- [`~/gitea/custom/conf/app.ini`の設定項目](https://docs.gitea.io/en-us/config-cheat-sheet/)

## 所感

### Git サーバーを求めて

[バージョン管理（`VCS`）](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)の必要性は頭では理解しつつも**理解を深める前に触るのがトラウマ**になっていました。

というのも、以前の現場で [CVS](https://ja.wikipedia.org/wiki/Concurrent_Versions_System) や [Subversion](https://ja.wikipedia.org/wiki/Apache_Subversion) が使われていたのですが、古株エンジニアさんの間で構築された暗黙の[プロトコル](https://qiita.com/KEINOS/items/cb7f629268b90ef6493d)があり、助っ人の新参エンジニアさんがコミットするたびに、舌打ちされては怒鳴られていたのを目の当たりにしていたからです。

デスマーチの最中であったため、コミット・ルールをドキュメント化する時間も取れず、教える時間も取れず、「既存のコミットを見て学べ」というスタンスにせざるを得なかったのです。しかし新参の方々は助っ人で呼ばれているため、コミット結果を報告しないと派遣元の営業さんから（半分パフォーマンスも含めて）公然と怒られるという、板挟みに合っているようでした。

私は別件で呼ばれていたので横目で見ていたのですが、私自身も別の自社案件のプロジェクトで CVS を入れたものの開発者が２人であったため**「手間が増えただけ」と感じ、自然と使わなくなってしまいました**。そんな過去があっただけに、「バージョン管理なんて、ガントチャートみたく、マネージャーさんがクライアントに 『やってまっせ』と見せるためのツールなんだな」と感じていました。

しかし、あれから数年が経ち、Qiita や [Qiitadon](https://qiitadon.com/) を通して Git や GitHub の魅力を知り、個人で触ったり [OSS](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2) に触れていくうちに Git Git な味に魅了されてしまいました。コミット増し増し、バグだくです。

いまでこそ Git コマンドを叩いたりすることはありますが、当初は、仕組みがよくわからず、ミスが怖い（どう迷惑がかかるかわからない）ということもあったので、[GitHub の「はじめての Git」](https://help.github.com/articles/set-up-git/)に習い、純正の「[GitHub Desktop](https://desktop.github.com/)」を使って、[Qiita 記事の写経として（他人とコラボを前提としない）自分専用のリポジトリ](https://github.com/KEINOS/flexbox-example)から始めました。

### Git を使うことのメリット

せっかちな性格なので **Git を使うことで作業効率や作業速度が速くなったとは感じません**。むしろ手間が増えたと感じます。読まれもしないとわかっている業務日報を書くツラさがあります。

GitHub でコラボするなら必要と思い、ある意味イヤイヤ使い続けていました。ところが１年くらい使ったあたりでメリットの方が大きいことを実感してきました。

長い目で見たときに**過去の自分をフォローすることができる**ようになったのです。

写経がてら小さなプロジェクトに触れていると、忘れることも多くあります。そんな中、コミット履歴をざっと見れば当時を追体験できる、つまりバグの発生した時期や実装の経緯を思い出すのに役に立つからです。また、「あの時に泣く泣く削除したコード」を掘り起こして復活できたりもします。

Git を使うメリットがコラボレーションであるならば、**Git の最初のコラボレーション相手は過去を忘れた未来の自分なのだ**と思います。

### Git が馴染まない環境とは

個人的な結論から言うと、下記に集約されてしまうと思います。

> 保険や定期検診に頼らないでも大丈夫、先にやるべきことがあるから、と無理をしている人や環境は Git が馴染まない。

Git はブロックチェーンと似た構造を持っています。

そのためか、どちらも**「速度や効率を主眼とした技術ではない」**のと、**過去の情報を担保するための「保険的な技術である」**と感じました。（私がセッカチであるのもありますが）

私自身もそうだったのですが、「病院は体を壊してから行くもの」といった感じの、定期検診やカウンセリングといった「リスクに対する意識」が低い環境や認識の間は、Git を使い始めた時は「時間や手間といったコストのロス感」がとても強く出ます。

おそらく Git （や [VCS](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0) 全般）が馴染まない方は [UnitTest](https://ja.wikipedia.org/wiki/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88) にも馴染めないのかもしれません。**Git を保険だとすると、UnitTest は予防だから**です。つまり、これらは「わかっちゃいるけど」系なんです。

先述のように、プライベートでオープンソースのコラボ（楽しそうなこと）に参加したいがために、嫌々 Git 使って１年後に本当の良さに気づいたというのも、体調を崩し仕事を辞めてから保険のありがたみと普段からのリスクヘッジの意識の低さを実感したのと似ています。

バージョン管理や UnitTest の必要性は感じてはいるものの、どちらにも馴染めない方は、上記のような習慣が体に残っているのかもしれません。お互い気をつけましょう。

### オー、マイ Git!

このような経緯があり、以来、

1. コードをいじる
2. GitHub Desktop でコミットする
3. 区切りがついたら GitHub Desktop で GitHub にプッシュする

のループを繰り返すうちに、**コードをいじる時はコミットメッセージに残せる範囲**になり、あれこれと一気にいじらなくなりました。

しかし、GitHub を使い続けていると、やはり**自分専用の Git サーバーが欲しくなる**と言うもの。

Git サーバーと言えば、[日本人が作っている](https://github.com/takezoe)のに英語のみという、媚びない姿勢の Git 界のサウザー「[GitBucket](https://gitbucket.github.io/)」、ガンダムファンならピックっとくるカッコいい名前の「[Gogs](https://gogs.io/)」や、[新しい Firefox のロゴ](https://jp.techcrunch.com/2018/07/31/2018-07-30-new-firefox-logo/)と間違えそうな「[GitLab](https://jp.techcrunch.com/2018/07/31/2018-07-30-new-firefox-logo/)」など、[色々な Git サーバーがあります](https://qiita.com/kounoike/items/7c42db90c42e280e1cab)。

しかし、大半の Git サーバーは別途 DB サーバーを必要としていたり、わかっている人には簡単とは言えども、機能的にも Git Git で高カロリー過ぎて、ちょっとお試しに、という感じではありませんでした。

### Gitea に決めた理由

個人利用であるため同時アクセスの心配をしなくてもいいことから、SQLite3 を使えるものを検討した結果 Gogs と Gitea が候補に上がったのですが、どちらも**ファイルを設置するだけで動く**という点が大きかったです。

Gogs と Gitea は親戚（Gitea が Gogs から分岐した）らしいので、本家の Gogs を検討していたのですが、何かしっくり来ていなかったところ、Qiitadon のユーザーから「Gitea いいよ」と聞いたので Gitea に決めました。

触ってみて感じたのが、**GitHub に慣れた人に優しい**ということ。逆に言えば、Gitea に慣れれば GitHub にも慣れるということでもあります。そして、**日本語であること**です。

Git 信者を増やすためには、小難しいコマンドから覚えてもらうのではなく、**結果をコミットする習慣が先**だと考えています。

初心者や非ソフトウェア・エンジニアのかたにコミットする習慣を付けてもらうには、GitHub Desktop ＋ Gitea の組み合わせは打って付けではないか、と感じました。惜しむらくは GitHub Desktop が標準で日本語化されていないことです。