壊してもいい練習用のgitサーバーを構築しよう

# はじめに

最近のチームでのソフトウェア開発ではgitの利用が必須だと思っているのですが、仕事してるとまだまだgit使ったことない人がいて説明が面倒だなと思うことがあります。

新人の練習用に壊してもいいgit環境を提供したり、
チームメンバにgit利用経験を積んでもらうためのローカルのgitサーバーを構築したことで、おすすめの手順が見えてきたのでまとめておきます。


## 3行で要約

- 無料、クローズドのgitサーバー（Windows + WSL + docker + gitlab）の構築手順

- LAN内でチーム利用するためのポートフォワードとhostsの設定も記載

- WSLやdockerを利用しているので壊しても再構築が容易なので、学習用にどうぞ。


## 環境

- Windows
 
利用のハードルを下げるためにWindowsで利用する想定


- WSL + Ubuntu

メインのWindows環境を汚さないためにWSL + Ubuntuを利用
systemdを動かすためにWSL2が必須


- docker + gitlab

簡単に構築するためにdockerhubで提供されるgitlab公式コンテナを利用



## WSLでUbuntuを入れる


- 管理者でコマンドプロンプト起動

スタートメニューでコマンドプロンプトを選択して「管理者として起動」を選択します。


- wslにUbuntuをインストール


```
> wsl --update

> wsl --set-default-version 2

> wsl --install -d Ubuntu
インストール中: Ubuntu
Ubuntu はインストールされました。
Ubuntu を起動しています...

```


## Ubuntuにdockerを入れる

[docker公式手順](https://docs.docker.jp/engine/installation/linux/docker-ce/ubuntu.html)通りにdocker環境をインストールします。


起動したWSL上のUbuntuで以下を実行する。
apt updateが失敗する場合は、ネットワークかファイアウォールを確認してください。


```shell
$ sudo apt update
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce

$ docker -v
Docker version 24.0.5, build ced0996


```


## gitabのdockerイメージからコンテナ作成


dockerhubの[gitlab-ce](https://hub.docker.com/r/gitlab/gitlab-ce)イメージを利用します。


```shell
$ sudo apt install docker-compose
$ mkdir gitlab
$ cd gitlab
$ vi docker-compose.yml

```


docker-compose.ymlの中身は以下の内容をコピペ。
ポート番号は12080にしてあります。sshは設定してません。

```yml:docker-compose.yml
version: '3'
services:
  gitlab:
    container_name: gitlab_local
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.local:12080'
        nginx['listen_port'] = 80
    ports:
      - '12080:80'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
```

コピペでインデントズレたら直して下さい。



docker-composeでコンテナ作成します。

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

※docker ps でコンテナが起動していることを確認

$ sudo docker ps
CONTAINER ID   IMAGE                     COMMAND             CREATED              STATUS
 PORTS                                                      NAMES
84a1d0cadba6   gitlab/gitlab-ce:latest   "/assets/wrapper"   About a minute ago   Up About a minute (health: starting)   22/tcp, 443/tcp, 0.0.0.0:12080->80/tcp, :::12080->80/tcp   gitlab_local

※health: starting が healthy になるまで数分待機してください。

$ sudo docker ps
CONTAINER ID   IMAGE                     COMMAND             CREATED         STATUS                   PORTS                                                      NAMES
17edcff9fb11   gitlab/gitlab-ce:latest   "/assets/wrapper"   2 minutes ago   Up 2 minutes (healthy)   22/tcp, 443/tcp, 0.0.0.0:12080->80/tcp, :::12080->80/tcp   gitlab_local

※gitlabのrootパスワード確認
　1日経過するとファイルが消えてしまうので、忘れないようにコンテナ作成直後に確認

$ sudo docker exec gitlab_local cat /etc/gitlab/initial_root_password
略
Password: beCqi//W9ucz/WkrxJtuQ9GAGmA4tV7za1s4SJCp2mY=

```


http://127.0.0.1:12080/
にブラウザでアクセスして以下のようなログイン画面が表示されればＯＫ

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/be9d583a-bb1c-bae8-0612-be72d0cfa228.png)


ブラウザでログインできるか確認しましょう。
- ユーザー名 ： root
- パスワード ： (上記で確認したもの) 


次にwslのipアドレスでもアクセス可能か確認します。

### wslのubuntuで以下実行し、IPアドレスを確認

```shell
$ ip a
略
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
略
    inet xxx.xxx.xxx.xxx/20 brd 172.20.47.255 scope global eth0
       valid_lft forever preferred_lft forever

※[wslのIPアドレス]＝xxx.xxx.xxx.xxx

```

 http://[wslのIPアドレス]:12080/
で接続できることを確認



## gitlabの設定

ブラウザで各種設定を行います。

### ユーザーの追加


右下の[Configure GitLab]パネルをクリック

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/851c32cc-43a1-77c2-4922-16ae73b134e8.png)

 [New user]ボタンをクリック

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/809c4a48-a813-4ea6-33fb-c72f1b4b351d.png)

必要事項を入力して、スクロールして画面下の[Create user]ボタンをクリック

例
　Name:hoge
　Username:hoge
　Email:hoge@gitlab.local

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/95b0a8d4-4ef7-aaed-68df-dcf0a2bbc2d6.png)

作成したユーザーにパスワードを設定するために[Edit]ボタンをクリック

  ![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/c778ce01-8805-f3a6-b445-233df338f90e.png)

Password欄が表示されるのでパスワードを設定します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/932f0b4f-a968-b2c0-0861-1cc77caaa9e1.png)


### グループの追加

　左のバーの[Groups]をクリックし、表示された画面の右側の[New group]をクリック

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/ab4e4037-f69c-24b9-57c5-48fbfa7b5ef6.png)

[Create group]パネルをクリック

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/a8d950fc-94c5-b0d7-9e15-ecc04a84e029.png)

必要事項を入力して、スクロールして画面下の[Create group]ボタンをクリック

例
　Group name:new_group
　Group URL:http://127.0.0.1:12080/new_group
　Visibility level:Private

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/4e1cb178-e29c-d041-78e0-a074fe907bce.png)


### プロジェクトの追加

[new_group]の右に表示される[New project]ボタンをクリック

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/dc989e34-21ad-d74d-9598-fe5851c83de5.png)

[Create blank project]をクリック

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/e52d4d44-ae38-2aa9-dc7b-93c8fd45f20f.png)

必要事項を入力して、スクロールして画面下の[Create project]ボタンをクリック

例
　Project name:new_project
　Project URL:http://127.0.0.1:12080/new_group/new_project
　Visibility level:Private

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/2d58988d-8327-369a-6e97-95455688597d.png)


### プロジェクトへユーザー登録

左のバーの[Manage]-[Members]をクリックしてメンバーのリストを表示する
右に表示される[Invite members]をクリックする

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/3d921eca-98fe-8080-4176-b6ea312f66e9.png)


必要事項を入力して、[Invite]ボタンをクリック

例
　Username or email addressでユーザー検索して選択する　
　Select a role で権限選択する


![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/36bc545e-dda9-8b51-fe80-f314706c3afe.png)

ユーザーが追加されていることを確認

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/6c06a7bd-6cf2-11fa-d591-d2a92c1f1bc1.png)


ログオフして、追加したユーザーでログインを確認する



## 外部に公開する場合


以下コマンドでポートフォワードの確認

```
> netsh interface portproxy show v4tov4
```

何も表示されれない場合はポートフォワードが設定されていない。
windowsのipアドレス確認しポートフォワードの設定を行います。


```
> ipconfig
略
   IPv4 アドレス . . . . . . . . . . . .: xxx.xxx.xxx.xxx


※[windowsのIPアドレス]＝xxx.xxx.xxx.xxx

```

http://[windowsのIPアドレス]:12080/
で接続できないことを確認

管理者のコマンドプロンプト起動し、ポートフォワードの設定を行います。
 
```
> netsh interface portproxy add v4tov4 listenaddress=[windowsのIPアドレス] listenport=12080 connectaddress=[wslのIPアドレス] connectport=12080

※[windowsのIPアドレス]と[wslのIPアドレス]は確認した値を入れる

> netsh interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
[windowsのIP]   12080       [wslのIP]       12080

```

http://[windowsのIPアドレス]:12080/
で接続できることを確認



## hostsの設定

名前でアクセスできるようにhostsを設定します。
wslのIPや、127.0.0.1でアクセスする運用でいい人はスキップしてください。


管理者でメモ帳を起動して以下を開く
　C:\Windows\System32\drivers\etc\hosts

最後の行に追加
　外部に公開する場合はWindowsのIPを指定
　外部公開しない場合はローカルIPかWSLのIPを指定
　  127.0.0.1 gitlab.local
  

http://gitlab.local:12080/
でつながることを確認


## 自動起動

### スタートアップによるログイン時のWSL開始

ファイル名を指定して実行で以下を行う
```
%homepath%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
```

エクスプローラーで開いたフォルダにwsl2-startup.wsfを作成し、ファイル内容は以下で保存する。

```xml:wsl2-startup.wsf
<job>
<script language="JScript">
var shell = WScript.CreateObject("WScript.Shell");
shell.Run('wsl -d ubuntu', 0);
shell = null;
</script>
</job>
```

Windowsにログインするタイミングでwslが起動してgitlabが常駐します。

OS起動時にサービス起動する方法も次に記載しますが、安定していないので個人利用なのであれば、本章で記載したログイン時に起動する方式がおすすめです。


### タスクスケジューラによるOS起動時のWSL開始

2024/11/28追記

ログイン時ではなく、OS起動時にバックグラウンドで起動する方法も記載しておきます。
サービスとしてチームに提供する想定はこちらになると思います。

タスクスケジューラを使うことでWindows開始時にWSLを起動します。
基本的には以下のコマンドで登録してOS再起動すればOKです。
WSL起動までにしばらく時間がかかりますので、のんびり待ってください。

たまに起動しないこともあります。
起動しなかった場合の監視や再起動設定を入れたほうが良いかもですが、タスクスケジューラに詳しくないので、サービス起動してなっかったら手動でWSLを起動する運用にしています。


```

>schtasks /create /tn "wsl startup" /tr "\"C:\Program Files\WSL\wsl.exe\"" /sc onstart /RU (アカウント) /RP （パスワード）
>schtasks /query /tn "wsl startup" /v /fo list


```


## gitリポジトリへのアクセス

### ブラウザでログインして、プロジェクトを選ぶ

プロジェクトを開きます。

[Clone]ボタンをクリックします
メニューが表示されるのでClone with HTTP の右の ボタンを押してURLをクリップボードへコピーする

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/bfeae5f9-7bcd-3b2c-5d4e-a4f3cbb7da2e.png)

クリップボードにリポジトリのパスが格納されるのでエディタとかにペーストしておいてください。


### gitクライアントで操作する

gitクライアントは何でもいいのですが、以下がおすすめ

- GUIで使いたい人：[sourcetree](https://www.sourcetreeapp.com/)
- CUIで使いたい人：[git for windows](https://gitforwindows.org/)

Visual StudioやAndroid Studioなど利用中のIDEがgitに対応している場合は、そのままIDEから利用すればよいかと思います。


リポジトリ：http://gitlab.local:12080/new_group/new_project.git
ユーザー名：作成したユーザー名
パスワード：指定したパスワード



## 壊した場合に環境破棄して作り直す

### 方法１．WSLごと削除


管理者権限のコマンドプロンプトで以下コマンドでWSL上のUbuntuを登録解除します。

```
> wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。
```

Ubuntuの再セットアップから再度行ってください。

```
> wsl --install -d Ubuntu
```

こちらよりは次に記載するdockerコンテナのみ削除するほうが簡単でおすすめです。


### 方法２．dockerコンテナを削除する

Ubuntuで以下コマンドでコンテナを停止、削除します。

```shell
$ sudo docker stop gitlab_local
gitlab_local
$ sudo docker rm gitlab_local
gitlab_local
```


docker-composeでupすれば初期化したコンテナが立ち上がります。

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



# おわりに

機密情報をアップするリスクを避けるためにgitを学習しない／させない人たちはローカルgitがあれば安心して挑戦できます！

トライ・アンド・エラーが一番理解が早いと思いますので、どんどん環境壊しましょう。