WindowsサービスとしてGiteaを設置する

# この記事の概要

Gitベースのソース管理ツールである[Gitea]を、Windowsサービスとして登録、設置する。

[Gitea]:<https://docs.gitea.com/>


# 用意するもの

## Gitea

まずはじめにGiteaです。
公式文書で[さまざまな方法が紹介](https://docs.gitea.com/category/installation)されていますが、この記事ではビルド済みの[gogit-windowsビルド](https://docs.gitea.com/installation/install-from-binary#choosing-the-right-file)というWindowsバイナリを使います。
[ダウンロードエリア](https://dl.gitea.com/gitea/)から最新版をダウンロードしてください。

この記事執筆時点では[gitea-1.22.2-gogit-windows-4.0-amd64.exe](https://dl.gitea.com/gitea/1.22.2/gitea-1.22.2-gogit-windows-4.0-amd64.exe)が対象ファイルです。


## PortableGit

Giteaは単体では動作せず、別途GitのCLI一式が必要です。
[Git for Windows - Releases](https://github.com/git-for-windows/git/releases/)からPortableGit版の最新をダウンロードします。

この記事執筆時点では[PortableGit-2.46.0-64-bit.7z.exe](https://github.com/git-for-windows/git/releases/download/v2.46.0.windows.1/PortableGit-2.46.0-64-bit.7z.exe)です。

自己解凍形式の実行ファイルになっていますが、7-zipなどの解凍ツールで解凍できるはずです。

ちなみに `mingit` では利用できないです。
（たしかコマンドが不足しているとエラーが出たはず、詳細は失念）


## WinSW

[Windows Service Wrapper](https://github.com/winsw/winsw/)は、あらゆるをWindowsサービス化しちゃいます。
[過去記事でも紹介](/k2ok/items/bdafb9bbeeedcd626093)しているので参考にしてください。

Giteaの公式文書には[Gitea単体でサービス登録する方法](https://github.com/winsw/winsw/)も掲載されていますが、ちょっと小細工したいのであえて使います。

alpha版の3.0系を使います。
この記事執筆時点では、[Release](https://github.com/winsw/winsw/releases)を見ると[3.0.0-alpha11](https://github.com/winsw/winsw/releases/tag/v3.0.0-alpha.11)というのが出ているので、[.net Framework 4.61版の実行ファイル](https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.11/WinSW-net461.exe)をダウンロードします。



# 作業内容

今回は（ちょっと諸事情で）手作業での作業内容を説明します。
（普段は[Scoop](https://qiita.com/tags/scoop)のmanifestつくってガリガリ入れてしまうんですが、機会があれば別記事で）


## 各ファイルの展開・配置

前項で入手したファイル群を配置します。
「Gitea」と「WinSW3」には、それぞれ直下にリネームした実行ファイルを配置しましょう。
「PortableGit」フォルダには、PortableGitの実行ファイルを *7-zip等の解凍ツールで開き、展開して* 配置します。

アーカイブには `post-install.bat` というバッチが含まれていて、コマンド実行で自己解凍した場合は自動実行されてしまうようでした。
Giteaからの利用には関係なさそうで、実行したくないので。

Giteaとファイル名は展開イメージは以下のとおりです。

```
D:\app\Git
       ├─\Gitea
       │  └─ gitea.exe
       ├─\WinSW3
       │  └─ WinSW3.exe
       └─\PortableGit
           ├─\bin
           └─\cmd
              ...
```

## Gitea設定ファイルの作成と配置

Giteaの設定は `app.ini` というファイルに保存します。

慣例的に `D:\app\Git\Gitea\custom\conf\app.ini` として配置することになっているようなので従いますが、任意の場所へ配置可能です。（後述）

まずは最低限、初回起動に含めたいパラメータだけ記載します。

```app.ini
[database]
DB_TYPE = sqlite3
PATH = D:/app/Git/Gitea/data/gitea.db
[repository]
ROOT = D:/app/Git/Gitea/repositories
[log]
ROOT_PATH = D:/app/Git/Gitea/log
[server]
PROTOCOL = http
HTTP_PORT = 2401
```


## gitea.exeのコマンドライン起動

上記設定の確認も兼ねて、まずは `gitea.exe` 実行ファイルをコマンドプロンプトから起動しましょう。

```
D:\app\Git\Gitea\gitea.exe web --config D:\app\Git\Gitea\custom\conf\app.ini

```

上記例のとおり、設定ファイルの場所は引数で指定可能です。


## Windowsファイアウォールの許可設定追加

Windows 11などのクライアントOSの場合など、ファイアウォールの受信規則が有効な場合、（許可設定の追加まで）外部から接続できないと思います。

Windowsファイアウオールのブロック時通知を有効にしているならば、起動時に以下のような画面が出て、許可するか確認してくれるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50759/0de508a1-a94d-310c-9b42-953990c1decf.png)

許可できたら、タスクマネージャからプロセス指定killして、あらためてサービス起動する。


## 設定したURLへのアクセス

本記事ではポート2401を指定しているので、当該マシンの2401ポートへブラウザで接続します。
以下のような画面が開けば一安心。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50759/ff7e742b-475c-d2c6-3d85-cf1e5346a21f.png)

個々の設定の説明は、すみませんが省きます。
最初の初期ユーザの登録も、この画面から。

画面最下部に、設定ファイルの保存先が記載されているので「Giteaをインストール」ボタンを押下すれば、設定ファイルが保存され、インストール完了です。


## 保存された設定の確認

あらためて `app.ini` 開くと、作成時からパラメータが多数増えているのが分かると思います。

また、画面上で設定可能なパラメータと、そうでないパラメータもあるはず。
（暗黙的に設定されるものとか）

指定可能なパラメータは[公式文書](https://docs.gitea.com/administration/config-cheat-sheet)も参考に。


## サービス設定ファイルの作成

本記事のポイントといってもいいかもしれない。。

WinSW3によるサービス化のため、以下内容でサービス定義ファイルを作成します。

```Gitea.xml
<service>
  <id>Gitea</id>
  <name>Gitea</name>
  <description>a painless, self-hosted, all-in-one software development service.</description>
  <env name="Path" value="D:\app\PortableGit\bin;%Path%" />
  <workingdirectory>D:\app\Git\WinSW3\work</workingdirectory>
  <executable>D:\app\Git\Gitea\gitea.exe</executable>
  <arguments>web --config D:\app\Git\Gitea\custom\conf\app.ini</arguments>
  <log mode="rotate" />
  <onfailure action="restart" delay="300 sec" />
  <logpath>D:\app\Git\Gitea\log</logpath>
</service>
```

`<env>` 要素に記載のとおり、コマンド検索パスにGitのbinフォルダ追加しています。


## Giteaサービスの登録

```cmd.exe
C:\>winsw3 install Gitea.xml
```

## Giteaサービスの起動

```cmd.exe
C:\>sc start Gitea
```


# その他補足

## データベースの保存先

[Gitea設定ファイルの作成と配置](#gitea%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E9%85%8D%E7%BD%AE) の項の記載例では、データベースはSQLite（ファイルベース）としています。

```app.ini （抜粋）
[database]
DB_TYPE = sqlite3
PATH = D:/app/Git/Gitea/data/gitea.db
```

## リポジトリの保存先

同様に、記載例では以下のフォルダ配下に保存されます。

```app.ini （抜粋）
[repository]
ROOT = D:/app/Git/Gitea/repositories
```

ユーザまたは組織のフォルダが作成され、その下に各プロジェクトのBareリポジトリが作成されます。