Docker 上の Raspberry Pi OS に Gogs をインストールしてみる

経緯

先日作成した Docker Desktop for Windows で動作する Raspberry Pi OS のコンテナを使っていくつか検証してみます。

まずは軽量な Git サーバである gogs をインストールして動作確認するところまでやってみたいと思います。

手順

手順としては以下の記事をなぞったものとなります。

> docker run --name googseberrypi -p 10300:3000 --privileged -it raspios-bullseye-armhf64-lite:2023-05-03 /bin/bash

先日作成したイメージからコンテナを起動。最終的にホスト側から git push して試験したいのでポートも開けておきます。

# apt update -y
# apt upgrade -y
# apt install -y wget sudo zip git

apt のアップデート・アップグレードと必要なパッケージのインストールを実行します。

# mkdir /var/gogs
# cd /var/gogs/

作業用ディレクトリを作成して移動します。

# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv7.zip
# unzip gogs_0.13.0_linux_armv7.zip
# adduser --disabled-login --gecos 'Go Git Service' git
# chown -R git:git /var/gogs/
# sudo -H -u git mkdir /home/git/gogs

https://dl.gogs.io/ から最新の Gogs をダウンロードして展開します。なお、今回作成したイメージでは QEMU との対応からか gogs_0.13.0_linux_armv8.zip では動きませんでした(「(参考・没) armv8 の実行結果」を参照)。

# su git
/var/gogs $ ./gogs/gogs web
yyyy/mm/dd hh:ii:ss [ WARN] Custom config "/var/gogs/gogs/custom/conf/app.ini" not found. Ignore this warning if you're running for the first time
yyyy/mm/dd hh:ii:ss [TRACE] Log mode: Console (Trace)
yyyy/mm/dd hh:ii:ss [ INFO] Gogs 0.13.0
yyyy/mm/dd hh:ii:ss [TRACE] Work directory: /var/gogs/gogs
yyyy/mm/dd hh:ii:ss [TRACE] Custom path: /var/gogs/gogs/custom
yyyy/mm/dd hh:ii:ss [TRACE] Custom config: /var/gogs/gogs/custom/conf/app.ini
yyyy/mm/dd hh:ii:ss [TRACE] Log path: /var/gogs/gogs/log
yyyy/mm/dd hh:ii:ss [TRACE] Build time: 2023-02-25 02:45:33 UTC
yyyy/mm/dd hh:ii:ss [TRACE] Build commit: 8c21874c00b6100d46b662f65baeb40647442f42
yyyy/mm/dd hh:ii:ss [ INFO] Run mode: Development
yyyy/mm/dd hh:ii:ss [ INFO] Available on http://localhost:3000/

いったん先程作成した git ユーザで実行ファイルを叩いて実行します(理由は後述)。

今回は Docker 上なので http://localhost:3000/ ではなく、ポートも冒頭のポートに合わせて http://localhost:10300/ にアクセスします。

Gogs の初期設定画面を開くことができた
Gogs の初期設定画面を開くことができた

Gogs の初期設定画面を開くことができたので、パラメータを調整していきます。変更した部分だけ以下に記載します。

  • データベースの種類: SQLite3
    • 仮に実機で本番運用するとしてもそこまで大規模になるとも想定していないですし、現時点ではただの検証環境なのでお手軽な SQLite で済ませます
  • リポジトリのルートパス: /home/git/gogs/gogs-repositories
    • 上述のコマンドで作成したディレクトリに合わせます
  • 実行ユーザ: git
    • これはこの設定画面上ではデフォルトから変えていないですが、変えていないがゆえに先程実行ファイルを叩く際に root のままで叩くと実行ユーザが異なるためここでエラーになります。かといって root で実行したくはないので、こちらの設定は git のままですが、逆に先程いったんユーザを git に切り替えて実行ファイルを叩く、という手順を踏みました
  • ドメイン: 一応仮想環境の中で ip a で出てきたIPの値に合わせます
  • アプリケーションのURL: こちらもドメインと同様
  • Default Branch: 初期値 master でしたがここは一応 main にしておきます

これで「Gogs をインストール」ボタンをクリックしてインストールを実行します。ただし、このボタンをクリックすると先程の「アプリケーションのURL」に対してリダイレクトがかかりますが、今回はホスト側からアクセスできるIPもポートも設定した値とは異なるのでページが見付からない状態になります。

そのため、手動でもう一度 http://localhost:10300/ にアクセスします。

Gogs のダッシュボード
Gogs のダッシュボード

URLを開き直すとダッシュボード画面が表示され、インストールが完了したことが確認できます。

右上の「登録」から新規ユーザを作成します。

Gogs で新規ユーザ作成
Gogs で新規ユーザ作成

必要項目を入力して登録。

Gogs でサインイン
Gogs でサインイン

今入力したID・パスワードでサインインします。

Gogs サインイン成功
Gogs サインイン成功

サインインできました。試しに「自分のリポジトリ」の右の「+」アイコンで一つ新規のリポジトリを作ってみます。

Gogs で新規リポジトリ作成
Gogs で新規リポジトリ作成

リポジトリ名を入力して作成。

Gogs の空っぽのリポジトリ
Gogs の空っぽのリポジトリ

空っぽのリポジトリができました。

後はホスト側(開発マシン)からリモートリポジトリとしてこのリポジトリを設定して push してみます。

Gogs に push 成功
Gogs に push 成功

push できました。基本的な部分では一通り動作していることが確認できたので、検証成功です。

(参考・没) armv8 の実行結果

# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv8.zip
# unzip gogs_0.13.0_linux_armv8.zip
# chown -R git:git /var/gogs/
# su git
/var/gogs $ ./gogs/gogs web
qemu-aarch64: Could not open '/lib/ld-linux-aarch64.so.1': No such file or directory
/var/gogs $

ダメだった手順

参照した記事では systemctl を使用していた (実機前提と思われる) ため、 Docker コンテナ上で systemctl を使用できないか試しましたが、 /sbin/init 実行でエマージェンシーモードに入っていそうな感じ (ただし SSH で入ると普通に操作できる) でした。

一応別ターミナル画面で最後の sudo systemctl start gogs.service まで叩いてみましたが、暫く待たされた後にジョブキャンセルされてしまったので没となりました。

> docker run --name googseberrypi -p 10300:3000 --privileged -it raspios-bullseye-armhf64-lite:2023-05-03 /sbin/init

systemctl を使うために --privileged オプションで権限を付与しつつ /sbin/init を起動しつつコンテナを建てます。

> docker container exec -it googseberrypi /bin/bash

コンテナに入ります。

# apt update -y
# apt upgrade -y
# apt install -y wget sudo zip git
# mkdir /var/gogs
# cd /var/gogs/
# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv8.zip
# unzip gogs_0.13.0_linux_armv8.zip
# adduser --disabled-login --gecos 'Go Git Service' git
# chown -R git:git /var/gogs/
# sudo -H -u git mkdir /home/git/gogs

ここまでは成功した手順と同じです。

# vi gogs/scripts/systemd/gogs.service


[Unit]
Description=Gogs
After=syslog.target
After=network.target
#After=mariadb.service mysql.service mysqld.service postgresql.service memcached.service redis.service
# ↑の行をコメントアウトする

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gogs
#ExecStart=/home/git/gogs/gogs web
ExecStart=/var/gogs/gogs web
# ExecStart のパスを gogs を展開したパスに変更する

## 略


# sudo systemctl enable /var/gogs/gogs/scripts/systemd/gogs.service
# sudo systemctl start gogs.service

# ↑ここでジョブキャンセルされて実行できない

systemctl で操作するため設定ファイル gogs/scripts/systemd/gogs.service を編集し、サービスを登録・起動の流れです。

ただし、最後の起動のところで起動失敗してしまい、没となりました (後で気付いたのですが環境的に gogs_0.13.0_linux_armv7.zip ならば行けたかもしれません)。

参考

Gogs

Rasppberry Pi に Gpgs をインストール

compose.yml

Docker

zip, unzip

Raspberry Pi で起動時にスクリプトを実行

systemctl

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。