お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

ローカルで個人メモを管理したいがRedmineでは物足りない。そうだGiteaを使おう。
この記事ではDockerを使用せず、バイナリからセットアップします。
Gitのリポジトリをホスティングできる部分までは確認してます。

外部に公開することは一切考慮していません。ローカルマシンでの個人利用を想定しています。

確認環境

Env Ver
Ubuntu 20.04.4 LTS
WSL2 1.0.3.0
Gitea 1.18.5
MySQL Ver 15.1 Distrib 10.3.37-MariaDB
Git 2.25.1

前提条件

  • WSL2上にUbuntu 20.04.4 LTSをインストール済
  • GitとMySQLは構築済

手順

公式の手順ではユーザーがgitですが、ここではgiteaに変えてます
他にも多少変えてます

Giteaディレクトリの作成とバイナリ配置

# 動作用ユーザーの追加
sudo adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/gitea \
   gitea

# 必要なフォルダを切る
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R gitea:gitea /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo mkdir /etc/gitea
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea

# バイナリのインストール
wget -O gitea https://dl.gitea.com/gitea/1.18.5/gitea-1.18.5-linux-amd64
chmod +x gitea
sudo cp gitea /usr/local/bin/gitea

# mysqlにログイン
mysql -u XXX -pYYY

DBのセットアップ

SET old_passwords=0;
CREATE USER 'gitea' IDENTIFIED BY 'gitea';
CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
GRANT ALL PRIVILEGES ON giteadb.* TO 'gitea';
FLUSH PRIVILEGES;

quit

Giteaの起動とWebインストール

以下のコマンドを叩き表示されたURLを開き、Webインストーラーで適当に設定

gitea web -c /etc/gitea/app.ini

Webインストール後の後処理とデーモンへの登録

# 自分以外書き換え不能に変更
sudo chmod 750 /etc/gitea
sudo chmod 640 /etc/gitea/app.ini

# デーモンの定義を作成
cat <<'EOF' | sudo tee /etc/init.d/gitea
#!/bin/sh
## BEGIN INIT INFO
# Provides:          gitea
# Required-Start:    $syslog $network
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: A self-hosted Git service written in Go.
# Description:       A self-hosted Git service written in Go.
## END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Gitea - Git with a cup of tea"
NAME=gitea
SERVICEVERBOSE=yes
PIDFILE=/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
WORKINGDIR=/var/lib/$NAME
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="web -c /etc/$NAME/app.ini"
USER=gitea
STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/1/KILL/5}"

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

do_start()
{
    GITEA_ENVS="USER=$USER GITEA_WORK_DIR=$WORKINGDIR HOME=/home/$USER"
    GITEA_EXEC="$DAEMON -- $DAEMON_ARGS"
    sh -c "start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \\
        --background --chdir $WORKINGDIR --chuid $USER \\
        --exec /bin/bash -- -c '/usr/bin/env $GITEA_ENVS $GITEA_EXEC'"
}

do_stop()
{
    start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PIDFILE --name $NAME --oknodo
    rm -f $PIDFILE
}

do_status()
{
    if [ -f $PIDFILE ]; then
        if kill -0 $(cat "$PIDFILE"); then
            echo "$NAME is running, PID is $(cat $PIDFILE)"
        else
            echo "$NAME process is dead, but pidfile exists"
        fi
    else
        echo "$NAME is not running"
    fi
}

case "$1" in
    start)
        echo "Starting $DESC" "$NAME"
        do_start
        ;;
    stop)
        echo "Stopping $DESC" "$NAME"
        do_stop
        ;;
    status)
        do_status
        ;;
    restart)
        echo "Restarting $DESC" "$NAME"
        do_stop
        do_start
        ;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
        exit 2
        ;;
esac

exit 0
EOF

# デーモン登録
sudo chmod 755 /etc/init.d/gitea
sudo update-rc.d gitea defaults

# デーモン起動
sudo service gitea start

自動起動する場合はWindowsのスタートアップ時に以下が走るようにしておけばOK

wsl -d Ubuntu -u root -- service gitea start

トラブルシュート

この記事を書くにあたってハマったことのまとめ

gitea 起動時にpermission deniedとエラーが出る

/var/lib/gitea/custom/options/locale: permission denied

以下のコマンドを流せばいける。公式のコマンドではコケる

gitea web -c /etc/gitea/app.ini

サービス起動時にFailed to get home directoryとエラーが出る

2023/03/03 13:17:38 ...s/setting/setting.go:656:loadFromConf() [F] Failed to get home directory: cannot get home directory

/etc/init.d/giteado_start()の部分を以下の内容にすればいける

do_start()
{
    GITEA_ENVS="USER=$USER GITEA_WORK_DIR=$WORKINGDIR HOME=/home/$USER"
    GITEA_EXEC="$DAEMON -- $DAEMON_ARGS"
    sh -c "start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \\
        --background --chdir $WORKINGDIR --chuid $USER \\
        --exec /bin/bash -- -c '/usr/bin/env $GITEA_ENVS $GITEA_EXEC'"
}

git pushでエラーが出る

RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

nginxからgiteaにリバースプロキシしてる場合はconfのserverセクションに以下を追加

client_max_body_size 0;

参考

投稿日:
OS::Linux::コマンド

高機能ダウンローダー
単純な疎通確認やバッチでファイルを落としたりするときに重宝する

wget [options...] <url>

Options

  • -O <path>
    • 出力先のフルパス
  • -P <path>
    • 出力先フォルダ
    • ファイル名は元のファイル名になる
  • --referer
    • リファラ

参考

  • https://linux.die.net/man/1/wget

keychainというパスフレーズを記憶させるツールを使って記憶させます
shellの初回起動時にパスフレーズを入力させられ、以降多分再起動するまで記憶しておいてくれる気がします

確認環境

Env Ver
keychain 2.8.5
Ubuntu 20.04.5 LTS

手順

  1. keychainのインストール
    1. sudo apt install keychain
  2. keychainの設定
    1. .zshrcとかに次の行を追加
    2. keychain -q --nogui --agents gpg --quick <GPGのkeyid>
      1. GPGのkeyidはgpg --list-secret-keys --keyid-format=longで取得可能

トラブルシュート

ssh と gpg 両方記憶させたい

こんな感じで書くと行ける。shell起動時にSSHのPW -> GPGのPWの順で入力ダイアログが出てくる

keychain -q --nogui --agents ssh,gpg --quick $HOME/.ssh/id_ed25519 <GPGのkeyid>

GPG のキーが見つからないエラーが出る

  • Warning: can't find DEADBEEF; skipping

上記が出た場合
~/.gnupg/gpg.confに対して以下の記述をすることで改善する可能性がある(この対策は不完全かもしれない

keyid-format LONG

公式のドキュメントには書かれていない気がするがDockerだけあればセットアップ可能。WSL2でのセットアップが面倒なVargantは不要

本記事ではWSL2内のUbuntuの中でDockerとDocker Composeを使った構築法について記述する。Windows向けのDocker Desktopは使用しない

前提

  • WSL2のUbuntuにVSCodeで接続して作業
  • 起動してログイン、トゥート、設定と言った最低限の画面操作が可能な程度まで

確認環境

Env ver
Mastodon v3.5.3
Docker 20.10.21, build baeda1f
Docker Compose v2.12.2
Ubuntu 20.04.5 LTS
WSL2 1.0.3.0
DevContainer v0.266.1
VSCode 1.73.0

手順

  1. git clone https://github.com/mastodon/mastodon.git
    1. 最新版などバージョン指定が必要な場合は追加でtagをチェックアウトする
  2. VSCodeでClone先を開く
  3. Reopen Containerする
  4. セットアップが走るので暫く待つ
  5. foreman startを流す
  6. http://localhost:3000/ へアクセス

操作方法

ユーザーを作ったりしたい場合、Using the admin CLIが参考になる

一例としてユーザー作成は次の書式で行ける

./bin/tootctl accounts create foo --emaill foo@example.com --confirmed

トラブルシュート

DB接続エラーが出る

ActiveRecord::ConnectionNotEstablished at /
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql//.s.PGSQL.5432"?

上記のエラーが出る場合、ビルドしたDockerイメージが壊れてるので以下のコマンドで全て消して作り直すとうまく行く

docker rm -f `docker ps -a -q`
docker rmi `docker images -q`
docker system prune

他のMastodonインスタンスが動かない

複数のMastodonインスタンスのDocker環境を同居させると多分コンフリクトする