Gitea v1.10（コンテナ）をHTTPS接続で使う

# このメモについて

* 手軽に使えるGitサーバとして [Gitea](https://gitea.io/en-us/) （ギッティー）のバージョン 1.10 を使ってみる
* HTTPSの設定例がドキュメントにあるものの、実例があまりないようだったので、試してみた

# 環境

* ホストOS : ubuntu 18.04
 * この上でdocker engineを起動
 * 動作確認も、このubuntu上でfirefox 70.0.1 (64bit) により実施
* docker 19.03.5
* docker-compose 1.24.1
 * [Docker Compose (Github)](https://github.com/docker/compose/releases) でバージョンを確認しておく
 * Docker engineとcompose fileバージョンの互換性については [Compose file version 3 reference](https://docs.docker.com/compose/compose-file/) を参照。
* gitea 1.10
 * [Gitea (Docker Hub)](https://hub.docker.com/r/gitea/gitea/) でバージョンを確認しておく
* mysql 5.7

# 前提条件

* TLSで使う鍵ファイルと証明書は用意しておく

```
$ pwd
/home/hoge/work-gitea
$ ls certs/
gitea.gitea_nw.crt  gitea.gitea_nw.csr  gitea.gitea_nw.key
$
```

# docker-compose.yml

* Giteaはシングルバイナリなので仮想サーバにインストールして設定してもそう手間ではないのだが、せっかくdockerイメージがあるのでコンテナとして起動して使う。
* ポート番号は、他でよく使われそうな3000を避け13000とした。コンテナ側ポートは、app.iniで3000から13000に変えている
 * ポート番号はホストとコンテナで同じ番号にしている。
 * 違う番号にした場合、ROOT_URLの設定を間違うと転送先ページがうまく表示できなかったりしやすい
* DBは特に今回こだわりがないのでmysqlとした。
 * 特に縛り、条件がない場合 [Gitea (github)](https://github.com/go-gitea/gitea) のissuesを見て自分が使う範囲で不具合の少ないものがよいと思う

```
$ pwd
/home/hoge/work-gitea
$ cat docker-compose.yml
version: "3.5"

networks:
  gitea_nw:
    external: false
    name: gitea_nw

volumes:
  gitea_web_volume:
    driver: local
  gitea_db_volume:
    driver: local

services:
  gitea_web:
    image: gitea/gitea:1.10.0
    container_name: gitea_web
    hostname: gitea_web
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=mysql
      - DB_HOST=gitea_db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
    restart: always
    networks:
      - gitea_nw
    volumes:
      - gitea_web_volume:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /home/hoge/work-gitea/certs/gitea.gitea_nw.crt:/usr/share/ca-certificates/gitea.gitea_nw.crt
      - /home/hoge/work-gitea/certs/gitea.gitea_nw.key:/etc/ssl/private/gitea.gitea_nw.key
    ports:
      - "13000:13000"
      - "10022:22"
    depends_on:
      - gitea_db

  gitea_db:
    image: mysql:5.7
    container_name: gitea_db
    hostname: gitea_db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea_nw
    volumes:
      - gitea_db_volume:/var/lib/mysql
 
```

# hosts準備

ホストからgiteaにアクセスするときの名前解決の設定。今回DNSでなくhostsで。

```
$ cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	ubu1804
192.168.137.2	ubu1804.local gitea.gitea_nw
・・略・・
$
```

# volume, app.ini生成

上記のymlを作成後、一度、docker-compose up -dしてvolumeを作っておく。
その中にapp.iniがある。すぐdownして、app.iniの設定値を変更する。

app.iniは、コンテナ内では /data/gitea/conf/app.ini にある。

```
$ sudo docker-compose up -d
$ sudo docker-compose down
```

# app.ini編集

[HTTPS setup to encrypt connections to Gitea](https://docs.gitea.io/en-us/https-setup/) を参考に、serverセクションを以下のように変更する。

* HTTP_PORTの番号を変更
* PROTOCOLをhttps指定する行を追加
* ROOT_URLはhttpsでのURLにした
* CERT_FILE, KEY_FILEの行を追加し、それぞれコンテナ内でのファイルパスを指定。
 * docker-compose.ymlでvolumeマウントの記述箇所にてコンテナ内に配置するファイルの対応（ホスト上でのファイルパスとコンテナ上でのファイルパス）を記載

今回は使っていないが HTTPSについて [Let’s Encrypt](https://letsencrypt.org/) や reverse proxy ([Nginx](https://nginx.org/en/docs/http/configuring_https_servers.html) など) を使う際のヒントも [HTTPS setup to encrypt connections to Gitea](https://docs.gitea.io/en-us/https-setup/) に記載がある。

```
$ sudo cp /var/lib/docker/volumes/work-gitea_gitea_web_volume/_data/gitea/conf/app.ini app.ini.bak 
$
$ sudo vi /var/lib/docker/volumes/work-gitea_gitea_web_volume/_data/gitea/conf/app.ini 
$
$ sudo diff /var/lib/docker/volumes/work-gitea_gitea_web_volume/_data/gitea/conf/app.ini app.ini.bak 
16,20c16,17
< HTTP_PORT        = 13000
< PROTOCOL         = https
< ROOT_URL         = https://gitea.gitea_nw:13000/
< CERT_FILE        = /usr/share/ca-certificates/gitea.gitea_nw.crt
< KEY_FILE         = /etc/ssl/private/gitea.gitea_nw.key
---
> HTTP_PORT        = 3000
> ROOT_URL         = 
$
```

なお、わざわざapp.iniをここで編集せずとも環境変数で最初から反映できるんじゃないの？
ということは当然いわれそうであるが、やってみて反映できなかったのでこのようにvolumeにあるiniを
編集するような手順としている。

ということは、composeの作業ディレクトリを変えて別ディレクトリで起動するとvolume名が別になるので
同じ状態にするには再度app.iniを直す必要がある点に注意する。（↓こんな感じで別volumeが作られる）

```
$ sudo docker volume ls
・・・略・・・
local               work-drone_gitea_db_volume
local               work-drone_gitea_web_volume
local               work-gitea_gitea_db_volume
local               work-gitea_gitea_web_volume
$
```


# 起動

app.iniを上記のように変更後、docker-compose upにより再びコンテナを起動する。
upした後、ログを確認し、エラーやワーニングは出力されたメッセージをヒントに修正する。
たとえば鍵や証明書のファイルパスが間違っていたりすると、ここでエラーが出ているので、直してコンテナを再起動。

docker-compose psでも一応、起動していることやポート番号を確認しておく。

```
$ sudo docker-compose up -d
$ sudo docker-compose logs gitea_web
$ sudo docker-compose ps
```

なお、giteaのコンテナはalpineベースなので、execで中身をみるときは、
sudo docker-compose exec gitea_web ash
などとashを指定する。

```
$ sudo docker-compose exec gitea_web ash
/ # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.3
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
/ # 
```


# 初回接続、ユーザ登録

* ホストから https://gitea.gitea_nw:13000 にアクセスし、右上のsign-inに進むとinstallation画面になる。
* 設定内容を確認し、修正したいところは適宜なおしてから、「Install gitea」ボタン押下。
* 押下後、ログイン画面 https://gitea.gitea_nw:13000/user/login ($ROOT_URL/user/login) に飛ばされるので、右上のほうにある「Register」からユーザ登録する。
* アカウント登録時のパスワードは複雑さが決められている。ので、一定条件を満たさないと登録できない。種別でチェックされるようで、英大文字、英小文字、数字、記号が1文字以上ずつあれば大丈夫そう


# 参考

* [Gitea](https://gitea.io/en-us/)
* [HTTPS setup to encrypt connections to Gitea](https://docs.gitea.io/en-us/https-setup/)
* [Gitea (github)](https://github.com/go-gitea/gitea)
* [Gitea (Docker Hub)](https://hub.docker.com/r/gitea/gitea/)