成人向け同人(R-18)のファイル管理方法を考える

何らかの事情でGitHub等のバージョン管理に触れたことのある方で、プライベートな同人活動でもそういったものを用いた開発を行いたいという方はいらっしゃると思います。
一般向けであれば普通にGitHub等のプライベートリポジトリを使えば良さそうですが、問題は一般向けでない方。
つまり**R-18**とか**成人向け**とか呼ばれるもので、どうすればこれらを管理していけるかについて考えていきたいと思います。

# 注意事項

- 筆者は今回の記事を作成する以前に色々と環境を操作したことがあるため、失念している作業があるかもしれません。
  同様に処理したはずなのに異なる挙動が発生した場合は、そのメッセージ内容をGoogleで検索する等して対処してください。
- 今回の記事は結果として**Docker**、**docker-compose**を使用してローカルに環境を構築するという形になりましたが、Androidエミュレータや仮想環境で**HAXM**を使用している場合、WindowsでのDockerに必要なWSLおよびHyper-Vと競合する場合があるので、代わりに[VMware](https://www.vmware.com/jp.html)や[Oracle VM VirtualBox](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html)等の仮想環境や実環境による構築を試みてください。
- docker-composeとか余裕で理解していて完成したファイルのみ知りたい方は、[ここ](https://github.com/full-deviation/docker-compose-example)に記載しているので読み飛ばしてください。
  余裕で理解している人にサンプルが必要かと言われれば疑問が残りますが。
- この記事で紹介しているDocker Desktopの法人利用に関して[有料化](https://www.docker.com/blog/updating-product-subscriptions/)が予定されています。
  有料化対象となる従業員250人以上 or 年間売上1000万ドルを超えるところは早々ないとは思いますが、法人でこの記事を参考にしようと考えている方は回避策を考えておいてください。
- GitHubみたいなものを利用出来たらいいなという記事ですが、GitリポジトリやDropboxによるバックアップが使えるだけで有用だとは思うので、全部が分からなくても部分的に活用してみても良いと思います。

# 対象者

- プロジェクトを管理するソフトウェアまたはサービスが欲しい方
- 主な成果物がプログラムやスクリプトを用いたゲーム系で、特にR-15やR-18等の年齢制限がつく内容
- Gitを使ったことがある、またはこの記事を読んだ上で別途勉強するつもりの方(Gitそのものの使い方についてはこの記事では書きません)
- Windows10を使用している方(をメインに話を進めます)

# 有名どころのGitサービス

まずは、有名どころがR-18を許容しているかどうかの確認を行いましょう。
これで「あった！」となればそこで終了です。

## GitHub

https://github.com/
GitHub, Inc.によって運営されているGitHubは、[GitHub 利用規定 - 2.コンテンツの制限](https://docs.github.com/ja/free-pro-team@latest/github/site-policy/github-acceptable-use-policies#2-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E5%88%B6%E9%99%90)に以下の記載があります。

> 性的・わいせつな内容を含むもの、

性的と書かれた時点で100%ダメですね。

## GitLab(サービス)

https://about.gitlab.com/
GitLab Inc.によって運営されているGitLabは、[Termsの2. RESTRICTIONS AND RESPONSIBILITIES](https://about.gitlab.com/terms/)に以下の記載があります。

> (1) is harmful, fraudulent, deceptive, threatening, abusive, harassing, tortious, defamatory, **vulgar**, **obscene**

翻訳すると

> （1）有害、詐欺的、欺瞞的、脅迫的、虐待的、嫌がらせ、不法、中傷的、**下品**、**猥褻**

下品や猥褻に恐らく引っ掛かりますね。
性的なコンテンツでなくても暴力的な方面のR-18もダメそうですね、これはGitHubもそうですが。

## BitBucket

https://bitbucket.org/
アトラシアンによって運営されているBitBucketは、[Acceptable Use PolicyのInappropriate content](https://www.atlassian.com/ja/legal/acceptable-use-policy)に以下の記載があります。

> Is deceptive, fraudulent, illegal, obscene, defamatory, libelous, threatening, harmful to minors, **pornographic** (including child pornography, which we will remove and report to law enforcement, including the National Center for Missing and Exploited Children), indecent, harassing, hateful

翻訳すると

> 欺瞞的、詐欺的、違法、わいせつ、中傷的、軽蔑的、脅迫的、未成年者に有害、**ポルノ**（児童ポルノを含み、削除して、全米行方不明・搾取児童センターを含む法執行機関に報告します）、下品、嫌がらせ嫌い

検索してもなかなか出てこなくて、もしかして大丈夫なのか！？と思いましたが残念ながらアウトでした。

## Backlog

https://backlog.com/ja/
ヌーラボによって運営されているBacklogは、オプションでプロジェクト用のGitやSVNのリポジトリが作成できます。
Backlog単独での規約は見当たらず、ヌーラボ利用規約自体にはアプリケーションの種類に関する記述が見つかりませんでしたが、[ヌーラボAPI利用規約 の第10条（禁止事項）](https://nulab.com/ja/terms/api/)に以下の記載があります。

> (10)次のいずれかの内容を含むアプリケーションを制作すること
>   ⑩青少年も含む不特定多数の利用者による閲覧に適さない内容

これが成人向けそのものをNGとしているか、それともAPIを使用してワークスペースそのものを成人向けサービスとして公開するものかは問い合わせないと分からないですが、こんな内容で問い合わせるのはちょっと…なのでやめておきます。

他のサービスについて私は知らないので、興味があったら調べてみてください。

# 自分で構築する

見つけられないなら、自分で構築するしかないですね。
とはいってもこの記事を検索で辿ってきた方の中には、環境構築の経験がない人もいらっしゃると思うので、出来るだけ簡単にできる方法を考えましょう。
ただし、冒頭にもあるようにローカルのみに保存するのではなく、外部にもデータ保存を行う方法で考えます。

## 何を使いたいか

有名どころの欄に書かれているサービスには、Gitリポジトリ管理の他に

- wiki機能
- バグや新規機能の追加をTODOとして管理するIssues機能

等が付いていて、サービスをそのまま再現するものがあれば、基本的にはそれで済むと思います。

個人的には一定量以上のプログラムやスクリプトの構築と、プログラム以外に設定やシナリオが一定量以上あるものであれば、別物として設定wikiなんかも欲しいかなと思いますが、今回はとりあえずバージョン管理だけでも作れるようにしていきましょう。

## 用意するもの

インストールの容易さでいけば、恐らくDockerで組んでいただいた方が楽だと思うので、その手順で進めます。
Dockerを使用しないまたは使用できない場合や、使いなれたLinux環境が物理または仮想で用意されている場合は、使おうとしているソフトウェアの名前だけメモって、各々のインストールガイドを検索すると良いです。

### Windows Subsystem for Linux 2(WSL2)

これから使用していこうとしているDockerをインストールするために、Windows Subsystem for Linux 2(WSL2)が必要になります。
[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)を参考に、Windows Powershellを`管理者として実行`し、以下のコマンドを打ち込んでいきましょう。
管理者として実行は、Windows PowerShellのアイコンが見えた時点で右クリックしてメニューから選択する等して行います。

```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

次に、[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)をインストールし、再びWindows PowerShellを管理者として実行し、以下のコマンドを打ち込みます。

```powershell
wsl --set-default-version 2
```

### Docker Desktop

https://www.docker.com/
Qiitaによく来ている方はよく知っていると思いますが、簡単に言うと仮想化をもう少しコンパクトにしたものです。
成人向け同人と言えば一般的にはやはりWindowsだと思うので、最近Windows10 Homeでも使用可能になった[Docker Desktop](https://www.docker.com/products/docker-desktop)を使用しましょう。

Docker Desktopのインストール自体は難しくないと思うので、いい感じにインストールしてください。
Windows10なのにインストールできないという方は、更新プログラムの確認が必要です。
それ以前のOSの場合は…新しいOS買うか、[Docker Toolbox](https://github.com/docker/toolbox/releases)等による構築を試みてください。

### Git

https://git-scm.com/
Gitで管理するという話で進めているので、Gitをインストールしてください。
ただし、今回はGitサーバを用意することを主軸とした話であり、Gitについて細かく説明は行いませんので、「Git 使い方」等で検索してください。
コマンドラインでも行えますが、[TortoiseGit](https://tortoisegit.org/)や[Visual Studio Code](https://code.visualstudio.com/)等で表示した方が何をコミットやプッシュしていないかを見ることができますし、デフォルトでGitをサポートしている開発環境もあるので、そういった場合はそれを使用した方が良いです。

例えばVisual Studio Codeで表示した場合、変更したのにコミットしていないものはオレンジ色になります。
![VSCode 表示例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/fc53651c-d897-67f2-c78d-1b859fa5d22a.png)
私はインストールしていませんが、TortoiseGitであればエクスプローラ上にステータスを表すアイコンが表示されるのと、フォルダやファイルを右クリックで何を行うか選択できるはずなのでやりやすくなるはずです。

## 構築

ここからが本番です。
Dockerは色々なソフトウェアを利用できますが、自分で構成を考えていかなくてはなりません。
Dockerのデータファイルを格納する起点のフォルダを決めておきましょう。
今回、私はDockerで使用するフォルダとして`C:\Docker`というフォルダを作成し、そこにDocker絡みのデータを格納することにしましたが、この辺は自由に決めてください。

### 記事で紹介する構成をまとめたGitHubリポジトリ

https://github.com/full-deviation/docker-compose-example
ファイルの配置や内容等について分からないことがあった時用に、実際に使用したファイルとそのフォルダ構成を格納したGitHubリポジトリを提示しておきます。
後で出てくるGit for Windowsのインストールが完了していれば、コマンドプロンプトで以下のコマンドを実行すれば内容は取得できるはずです。

```
git clone https://github.com/full-deviation/docker-compose-example.git Docker
```

このリポジトリはPukiWikiのサンプルも別フォルダに用意してありますので、docker-composeの例として参考にしてみてください。

### Gitサーバ

Dockerでイメージが配布されているもので、私が把握しているのは以下のものです。

- [GitLab](https://hub.docker.com/r/gitlab/gitlab-ce/)(ソフトウェア)
- [GitBucket](https://hub.docker.com/r/gitbucket/gitbucket/)
- [Gitea](https://hub.docker.com/r/gitea/gitea)

私が組んだことがあるのはGitBucketなのでGitBucketを用いて解説を行っていきますが、GitLab(ソフトウェア)やGiteaで行いたいという場合は「使いたいソフト名 docker-compose」で検索するとヒットするはずなので、そちらを参考にしてみてください。
特にGitLabは有名なサービスとしても提供されているのもあって、恐らく安定度は高いと思われますが必要スペックが高いとも聞いているので動かす環境次第でしょうか。

GitBucketは単品で構成することが可能で、その場合は[H2 Database Engine](http://www.h2database.com/)という軽量なデータベースを使用して起動しますが、いくつか調べて回ったところ組み合わせとして安全性が低く、他のRDBMSを連携した方が良いと公式発表があったそうなので、今回はGitBucket+[PostgreSQL](https://www.postgresql.org/)にします。

#### フォルダを決める

先ずはGitBucketの構成とデータを格納するフォルダを決めます。
今回、私は`C:\Docker\gitbucket`にしました。

#### wait-for-it.shをダウンロード

https://github.com/vishnubob/wait-for-it
GitBucketをPostgreSQLと組み合わせる場合、**PostgreSQLが準備完了してからGitBucketを実行**する必要があり、これを組み込まないと起動に失敗してしまいます。(H2の場合は問題なし)
先に必要なものを起動してから起動というやり方(depends_on)があるにはあるのですが、起動したからといって準備完了しているとは限らないため、これを待機するための機構が必要です。

そこで登場するのが、wait-for-it.shです。
まず、GitBucketのフォルダに`data`というフォルダを作成します。(私の場合は`C:\Docker\gitbucket\data`)
そして、[ここ](https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh)を右クリックしてダウンロードしたものを`data`フォルダに格納してください。

#### docker-compose.ymlを書く

次にGitBucketフォルダ内(`C:\Docker\gitbucket`)にdocker-compose.ymlを作成しテキストエディタで書きます。
文字コードは**UTF-8(BOMなし)**の改行コードはUnix系で使用する**LF**で行います。

```yaml:docker-compose.yml
version: "3.8"  # docker-composeファイル形式v3.8
services:  # サービスの一覧
  # 【サービス名】gitbucket
  gitbucket:
    # 【イメージ】DockerHub上のリポジトリを指定
    image: gitbucket/gitbucket:latest                    # gitbucketの最新版を使用
    # 【ポート番号】(書式: - ホスト上のポート番号:Docker上のポート番号)
    ports:
      - 8080:8080                                        # HTTP
      - 29418:29418                                      # SSH
    # 【ボリューム】(書式: - ホスト上のパス:Docker上のパス)
    volumes:
      - ./data:/gitbucket                                # Docker上の"/gitbucket"を"./data"に保存する
    # 【再起動】
    restart: unless-stopped                              # 手動で停止されない限りは自動起動
    # 【依存先】(書式: - サービス名)
    depends_on:
      - db                                               # サービス名"db"に依存する
    # 【環境変数】
    environment:
      - GITBUCKET_DB_URL=jdbc:postgresql://db/gitbucket  # DB接続先
      - GITBUCKET_DB_USER=gitbucket                      # DBユーザ
      - GITBUCKET_DB_PASSWORD=gitbucket                  # DBパスワード
    # 【コマンド】wait-for-it.shでホスト名"db"のポート番号5432が接続可能になるのを待ち、成功したら"java -jar /opt/gitbucket.war"を実行
    command: ["/gitbucket/wait-for-it.sh", "db:5432", "--", "java", "-jar", "/opt/gitbucket.war"]

  # 【サービス名】db
  db:
    # 【イメージ】
    image: postgres:11-alpine          # PostgreSQL11のApline Linux版を使用
    # 【ボリューム】
    volumes:
      - ./db:/var/lib/postgresql/data  # Docker上の"/var/lib/postgresql/data"を"./db"に保存する
    # 【再起動】
    restart: unless-stopped            # 手動で停止されない限りは自動起動
    # 【環境変数】
    environment:
      - POSTGRES_DB=gitbucket          # DB名
      - POSTGRES_USER=gitbucket        # DBユーザ
      - POSTGRES_PASSWORD=gitbucket    # DBパスワード
```

一応コメントで大まかな説明が書かれていますが、ちょっと解説します。

```yaml:ports
    # 【ポート番号】(書式: - ホスト上のポート番号:Docker上のポート番号)
    ports:
      - 8080:8080                                        # HTTP
      - 29418:29418                                      # SSH
```

`8080:8080`および`29418:29418`のコロンより左側の数字が、PCから作成されたコンテナにアクセスするためのポート番号になります。
`8080:8080`はWebブラウザで閲覧するためのHTTP用で、実際にブラウザで入力する際には`http://localhost:8080/`と入力することになり、左側の数字を変更することでブラウザで入力時のポート番号が変更されます。
`29418:29418`の方はというとSSHと呼ばれるプロトコルで、GitではHTTPまたはSSHのどちらかを用いてバージョン管理が行えるので、そちらを使用する場合はこのポート番号を使用します。

```yaml:volumes
    # 【ボリューム】(書式: - ホスト上のパス:Docker上のパス)
    volumes:
      - ./data:/gitbucket                                # Docker上の"/gitbucket"を"./data"に保存する
(中略)
    # 【ボリューム】
    volumes:
      - ./db:/var/lib/postgresql/data  # Docker上の"/var/lib/postgresql/data"を"./db"に保存する
```

`./data:/gitbucket`のコロンより左側が実際にデータが保存される場所で、右側はコンテナ内のパスを表しています。
`./data`と書いた場合、`./`が現在のフォルダ(C:\Docker\gitbucket)から相対的という指定で、`data`がその下のフォルダ名となるので、コンテナ上で`/gitbucket`というフォルダを`C:\Docker\gitbucket\data`というフォルダに保存しますよという意味になります。

また、下の方にある`- ./db:/var/lib/postgresql/data`はデータベースのデータ格納場所を`C:\Docker\gitbucket\db`というフォルダに保存しますよという意味になります。
この辺に関しては他のdocker-composeでも同じようなものなので、追加で他にも使えそうなものがあれば使いたいという方は覚えておくと良いです。

#### docker-compose up -d

docker-compose.ymlを置いたフォルダをエクスプローラで表示し、パス欄に`cmd`と入力しEnterキーを押すと、目的のフォルダでコマンドプロンプトを開くことができます。

![エクスプローラ上でcmd](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/a8a6ba06-82c6-a9a1-8e70-814669352f4a.png)

または、コマンドプロンプト上でのフォルダ移動を理解している方は、コマンドプロンプトを起動して`cd`コマンドによりdocker-compose.ymlのあるフォルダに何とかたどり着いてください。

そしてコマンドです。

```
docker-compose up -d
```

すると、以下のメッセージが表示されると思います。

```
Pulling gitbucket (gitbucket/gitbucket:latest)...
(中略)
Creating gitbucket_db_1 ... done
Creating gitbucket_gitbucket_1 ... done
```

最後の**done**が成功した証です。
そして、タスクトレイにあるDockerのアイコンを右クリックしてDashboardを選択すると、以下のような表示になるはずです。

![Docker Dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/96625010-8a4a-7529-280b-c8109c2d8f53.png)

`restart: unless-stopped`設定で、■を押せば停止して▶を押すまでの間は再起動しても停止したままになりますので、アクセスできなくなった！という時にはチェックしてみてください。

#### ブラウザによるアクセス

##### 管理者の設定

http://localhost:8080/

でアクセスすると初期画面が表示されます。
![20201101 GitBucket初期画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/a17b42c1-928e-e5b1-419b-395debf9cc24.png)
ここで右上にある`Sign in`を選択し、管理者ユーザーとして入ってみましょう。
IDおよびパスワードは`root`です。

サインインに成功したら、まずはパスワードの変更を行います。
右上の`[r]`と表示されている場所をクリックし`Account Settings`を選択すると、`Password (input to change password):`という項目が見えるはずなので、万が一誰かにアクセスされた時でも大丈夫なように安全なパスワードを入力し、下にある`Save`をクリックします。**※間違ってDelete account**を押さないように気を付けてください。**

![Gitbucket root Profile](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/2df0b61f-b2b6-ee1f-66b6-8791e15bf434.png)

画面上部に水色で`Account information has been updated.`と表示されれば成功、失敗した場合は指摘された箇所を修正してください。

##### 通常ユーザー設定

次に、先ほど`Account Settings`を設定したのと同じ右上から`System Administration`を選択し、システム設定を開きます。

アカウントを追加する場合は、(初期表示にはなっていますが)左の`User management`を選択し右上の`New user`を選択します。
![User managementとNew user](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/d22525bf-1840-bb5b-3b7e-2911f3abd7c3.png)

例えば、こんな感じで書いて下部の`Create user`を押します。
![GitBucket create user](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/2064c9e2-d015-407c-3d12-36d6c572cda8.png)

一般的には管理者と利用ユーザーは分けてやった方が良いですが、どうせ一人しかアクセスしないしという場合は分けなくても良いかもしれません。私は分けます。

外部からポートフォワードすることで複数利用者での活用も行えますが、この辺は多分ここで書かれているような内容を勉強している段階では**危険**だと思うので説明しません。
どうしてもという場合は「ポート開放」や「DDNS」というキーワードで検索してください。
ルーターのメーカーによって異なると思うので、メーカー名も検索条件に入れると良いでしょう。
内部側のポートは、ここに書かれている内容だとポート番号8080なので上手くつなげてください。

##### システム設定

ここから先は、人によって異なると思うので変更しそうな設定だけ。
設定を変更したら最後に画面下にある`Apply Changes`を押すのを忘れないように。
更新に成功すると上部に`System settings has been updated.`と表示されます。

###### Repository operation

リポジトリを一般ユーザーが作ったり削除したりできるようにするか、管理者のみに制限するかを選択します。
信用できない利用者が発生しそうなサーバやリポジトリが想定される場合、適宜`Admin Only`に変更してください。
逆に`Admin Only`に変更した操作は、その必要が発生する度に管理者が呼び出されることになるので、`New user`で`Administrator`を設定したユーザーを増やして複数名体制にする等の措置も考える必要があります。

###### Anonymous access

匿名で閲覧できるようにするかを選択します。
何かの間違いで閲覧されてしまうことを防止するために`Deny`とした方が良いですね。

###### File upload

ファイルアップロードのサイズ等を規定します。
動画や音楽等のことを考えると結構大きな値が良さそうですが、とんでもないものをアップロードされる可能性も考慮して適宜変更してください。

#### リポジトリを作成

一般ユーザーを作った場合は作成した一般ユーザーでサインインし直し、管理者のみの場合はそのままで、とりあえず最初のリポジトリを作成します。
サインイン後の右上にある[+]から`New repository`を選択しましょう。
![to New repository](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/3c3b5bbb-1001-6c9e-4cbe-0d2b53cfd4e0.png)

`Repository name`を記入して、下部の`Create repository`を押せばリポジトリの作成は完了です。
![Create repository](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/66fe9be6-ba2e-4c9e-2941-1097994e4a48.png)

最初のやり方については、リポジトリの作成後に表示されるページに書かれているように行えばpushできるはずです。
![Create repository直後のページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/e60c43cf-5149-7e57-4af2-96112f739e76.png)
この辺はGitHubでも似たような文面が表示されるので、経験者なら見たことがあるはず？

## データのバックアップ

PCの故障、火事、自然災害等、家にあるからといってデータが安全であることが保障されないので、データのバックアップをクラウド上に保存できたら良いですよね。
ということで調べてみましょう。

外部バックアップが必要ない方は読み飛ばしてください。

### Dropbox

https://www.dropbox.com/
Dropbox, Inc.が提供するクラウドストレージサービスです。
一応、規約を確認してみると[利用規定](https://www.dropbox.com/ja/acceptable_use)に以下の記載があります。

> 違法なポルノや猥褻なコンテンツ、またはテロのプロパガンダを含む過度な暴力やテロ活動を公開、共有すること。

この違法なポルノとは児童ポルノ等の所持していると罪に問われるものや、同意を得ていない類のことで、性的な表現を含む活動をしている方々にも利用可能なように他サービスよりもポルノ関係には寛容だそうです。（今のところは）

ということで登録を行います。
登録が終わると[Dropbox デスクトップアプリ](https://www.dropbox.com/ja/downloading)のインストールを催促されるので、これを入れておきます。
この時に選択したフォルダが後の工程で使用されるので、場所はよく考えておいてください。
今回、私はDropboxのフォルダを `E:\Shared\Dropbox` という新規フォルダで確保したという仮定で話を進めます。

#### 通知のカスタマイズ

Dropbox デスクトップアプリの通知は、デフォルト状態だとファイルの追加や編集の度に出てくるので、今回のようにソフトウェアによってファイルがいくつも変更されるケースにおいては、そのあたりの通知を無効化しておいた方が無難です。

タスクトレイのDropboxを左クリックして出てくるウィンドウで、右上アイコンを左クリックすると出てくる`基本設定`の`通知`の項で、以下の項目からチェックを外しておくと良いでしょう。

- 新しいファイルが同期されたとき
- ファイルが編集されたとき

![Dropbox 通知のカスタマイズ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675079/d4d61a6e-dc6a-a63d-88d4-14c53470fd04.png)

#### バックアップスクリプトの作成

試しにmklinkによるシンボリックリンクのみでバックアップを実現できないか試してみましたが、どうやら[Dropbox でのシンボリック リンク](https://help.dropbox.com/ja-jp/installs-integrations/sync-uploads/symlinks)に示されている通り、シンボリックリンクを張ってのバックアップはダメそう？
という訳でバックアップスクリプトを作ります。

- ZIPにまとめておけば復旧の時も楽かも？
- この動作のためだけに新しい追加ソフトウェアを整備したくないので、出来るだけデフォルトで入っているものを利用する

ということで、PowerShellを使用したスクリプトを作りましょう。
場所はdocker-compose.ymlと同じGitBucketフォルダ内(今回の場合はC:\Docker\GitBucket)で、名前も分かりやすくbackup.ps1とします。

```powershell:backup.ps1
#########################
# Backup to zip archive #
#########################
$SrcPath = ".\*"
$DstPath = "E:\Shared\Dropbox\Docker\gitbucket-backup.zip"

Compress-Archive -Path $SrcPath -DestinationPath $DstPath -Force
```

説明ですが

```powershell
$DstPath = "E:\Shared\Dropbox\Docker\gitbucket-backup.zip"
```

この `$DstPath` の右辺がDropbox保存先になります。
私の場合は、先ほど記載した `E:\Shared\Dropbox` フォルダ内にDocker関連ファイルを保存するためのDockerフォルダを作っていますが、この辺はインストール時のフォルダ設定とお好みで書き換えてください。

##### テスト実行

できたら実際に実行してみてzipが作成されることと、Dropboxに保管されていることを確認しましょう。
以下のようなエラーが表示される場合、PowerShellの実行ポリシーを設定する必要があります。

```powershell
.\backup.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Docker\gitbucket\backup.ps1 を読み込
むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照
してください。
発生場所 行:1 文字:1
+ .\backup.ps1
+ ~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

Windows Powershellを`管理者として実行`し、以下のコマンドを打ち込んでいきましょう。

```powershell
Set-ExecutionPolicy RemoteSigned
```

`RemoteSigned`は、外部から入手したスクリプトは署名付きであること、ローカルで生成したスクリプトは署名を必要としないという指定です。
セキュリティに厳密にとなるともう少し指定の仕方がありますが、今回の対象はあくまで個人製作と想定しているのでここでは詳しく説明しません。

#### 自動バックアップの設定

バックアップ用のストレージを用意したものの実行を忘れていて、いざ必要になった時には欲しいデータが既に手遅れになっていたなんてことはありませんか？私はあります。
用意自体はしていても実行が手動だと人は忘れてしまうものなので、自動でバックアップを行うようにしておいた方が良いです。

という訳でバッチファイルを作ります。
ファイルは`backup.bat`としてDockerフォルダ(今回の場合はC:\Docker)に置きました。

```bat:backup.bat
cd %~dp0
cd gitbucket
powershell -File backup.ps1
```

これも作成したら実行し、問題がなければタスク スケジューラに登録します。

スタートボタンを押下後、「task」と入力するとタスク スケジューラが出てくるので、これを選択します。

先ずは他社が作成した既存のタスクと混ざらないように、独自のフォルダを作成しておきましょう。
左側ツリービューに表示されている`タスク スケジューラ ライブラリ`を右クリックし、`新しいフォルダー(N)...`を選択します。
私は`Self`というフォルダーにしました。

次に中央上のリストビューにて右クリックし、`新しいタスクの作成(C)...`を選択します。
操作内容は、例えば私の環境であれば以下の通り。

- 「全般」タブ
  - 名前 : Docker backup
- 「トリガー」タブで新規ボタンを押下
  - タスクの開始 : スケジュールに従う
  - 設定 : 毎週
  - 開始 : 2021/06/25 12:05:00 火曜日
- 「操作」タブで新規ボタンを押下
  - 操作 : プログラムの開始
  - プログラム/スクリプト : C:\Docker\backup.bat

「全般」タブはよく分からないうちは名前と説明だけ変更する感じにしましょう。
`ユーザーがログオンしているかどうかにかかわらず実行する`を指定したいところだとは思いますが、これを指定した場合に特にデスクトップがあることを想定したアプリケーションの不具合等を説明するのが面倒なので、今回は指定しません。

「トリガー」で指定した開始の時刻部分は実行される時間になるので、**確実にログインしている時間**を指定します。
お好みで頻度を毎月や毎週の曜日を変更してみても良いですし、タスクの開始をスケジュールに従うから変更するのもありですが、あまり頻度が上がると負荷にも繋がるのでその辺は適宜調整してください。

「操作」のプログラム/スクリプトはbackup.batを配置した場所を指定してください。

OKを押して無事作成ができたのであれば、作成されたタスクを右クリックで`実行する(R)`を選択し、正しく実行されることを確認しましょう。

### Google Driveは？

https://www.google.co.jp/drive/apps.html
最初、使い慣れたGoogle Driveを使おうと考えていましたが、[不正使用に関するプログラム ポリシーと違反措置](https://support.google.com/docs/answer/148505?visit_id=637397217414504473-3239853945&rd=1)に以下の記載があったので、残念ながらGoogle Driveは使えません。

> 露骨な性的表現
> ヌード、性行為の描写、ポルノなどの露骨な性的表現を含むコンテンツは配信しないでください。これには、商業ポルノサイトにユーザーを誘導することも含まれます。教育、記録、科学、芸術を目的としたヌードは許可されます。

配信…共有しなければ大丈夫なのでしょうか？
大丈夫だと思う方はそちらで試してみても良いかもしれませんが、今回はできるだけセーフな手段での構築を目指すということで除外しておきます。

## はじめよう

以上でサーバの準備は完了、後はGitを運用していきます。
GitBucketは元はGitHubクローンを目指していたそうなので、基本的にGitHubの機能を踏襲してあり、GitBucketで探したいものが見つからなかった場合は、代わりにGitHubで検索すると大体似たような項目があるはずです。

# その他

## Dockerホスティングサービス

今回、ローカルでDockerを動かす方法で解決を行いましたが、世の中にはDockerをホスティングするサービスがあったりします。
一番有名なのは、大企業でも使われている[Amazon Elastic Beanstalk](https://aws.amazon.com/jp/elasticbeanstalk/)ですが、これは大掛かりで同人ユースには厳しい。
さくらインターネットのDockerホスティングサービスArukasがサービス終了してしまったようです。
[Arukasの代わりにさくらのクラウド](https://cloud-news.sakura.ad.jp/2020/01/15/arukas-io-sacloud-migration/)にはデフォルトでDockerがインストールされているようなので、コマンドを調べて導入すればいけるかもしれません。

今回の記事の対象外なので規約の確認は行っていないため、サービスを利用する場合は規約を確認して下さい。
昔は二次元のR-18といえばさくらでOKだった記憶がありますが、今も利用可能かは知りません。

## チーム開発

チームで開発し各々に更新を行わせるのであれば、セキュリティについて勉強した上で「ポート開放」や「DDNS」で検索したものを参考にしてみてください。
最近はルータの設定でVPNを使用したネットワークの構築も行えるそうなので、そちらの線でやってみるのもありなのかなと思います。

でなければ後はファイルを受け取って集中管理するしかないですね。
よほどの人数でなければそれでも十分ですし、管理手段があるとないとではかなり違ってくるので、使用者が1人に限定される状況でも導入はした方が良いかと思われます。

## 設定wiki

個人的にはゲームであれば設定wikiを別に建てておきたいところですが、どのソフトウェアを使用するかは人によると思いますし、これもまたサービスによって成人向けが可能か否か、非公開で使用出来るか等異なるため、利用規約と機能等をよく確認してください。

### PukiWiki

https://pukiwiki.osdn.jp/
[PukiWiki](https://pukiwiki.osdn.jp/)はシンプルでデータベースも使わないので、Dockerに含める場合でもデータベースを共用することを考えなくても良いというのが良いですね。
歴史も長く色々なプラグインも開発されていたり文献も多かったりして、今でも現役で更新されています。
私個人としては、とりあえずPCを買ったらまず[XAMPP](https://www.apachefriends.org/jp/)とPukiWikiを導入する習慣があったほどで、過去に書いた設定を再利用する上ではこれでいいかなという気もしないでもないです。

### GROWI

https://growi.org/ja/
最近流行りのMarkdownで書けるwikiとして出てきた[Crowi](https://site.crowi.wiki/)のフォークとして生まれたGrowiは、なかなか強そうな感じ。
作られたのも最近だけあってモダンな見た目をしていますね。
データベースは[MongoDB](https://www.mongodb.com/)を使用していて、今回の記事で使用しているPostgreSQLとは別にデータベースを建てることになりますが、docker-compose上でPostgreSQLに複数のデータベースを持たせるのは初心者には厳しいような気もするので被ってない方が気楽かもしれませんね。

GROWIは公式が[docker-compose](https://github.com/weseek/growi-docker-compose)のリポジトリを用意していますので、そちらを参考にしてみてください。