らくがきちょう

なんとなく

AmazonLinux2 に Nginx で SSL/TLS 終端構成で Gitea をインストールする

Gitea は Go 言語で書かれた Git サーバです。 Gogs から Fork した OSS です。 今回は AmazonLinux2 に Gitea をインストールする手順をメモしておきます。 DB は選択出来ますが、今回は MariaDB を使うことにします。

環境

今回は以下の環境を構築していきます。

  • AmazonLinux2
  • フロントエンド
    • Nginx
    • クライアント通信を Proxy し、バックエンドの Gitea へ転送する
    • SSL/TLS を終端する
  • バックエンド
    • Gitea
    • 3000/TCP を Listen
    • 内蔵 SSH サーバは 22/TCP を Listen
    • DB には MariaDB を使う

Git リポジトリの接続には上述の通り、Gitea 内蔵 SSH サーバを用い、22/TCP を Listen させます。 その為、/etc/ssh/sshd_config を修正し、予め sshd が Listen するポートを (22 では無い) 別のポートへ変更しています。

Nginx

まず、フロントエンドを担当する Nginx をインストールします。

リポジトリの追加

AmazonLinux 標準リポジトリにある Nginx はややバージョンが古い為、Nginx の Mainline リポジトリからインストールします。 /etc/yum.repos.d/nginx.repo を以下の内容で新規作成します。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

リポジトリの定義が出来たら Nginx をインストールします。

yum -y install nginx

Gitea 用設定ファイルの用意

Gitea 用の設定ファイルを用意します。 ポイントは大きく以下の 2 つです。

  1. クライアント通信を Proxy して Gitea へ転送する
  2. SSL/TLS を終端する

/etc/nginx/conf.d/gitea.conf を以下の内容で作成します。 FQDN や証明書/秘密鍵のパスなどは環境に合わせて修正します。

upstream gitea {
  server localhost:3000;
}

server {
    listen       80;
    server_name  git.example.com;
    return       301 https://$host$request_uri;
}

server {
    listen              443 ssl http2;
    server_name         git.example.com;
    ssl_certificate     /etc/letsencrypt/certificates/git.example.com.crt;
    ssl_certificate_key /etc/letsencrypt/certificates/git.example.com.key;
    ssl_protocols       TLSv1.1 TLSv1.2;
    ssl_ciphers         'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://gitea;
        proxy_redirect http:// https://;
    }
}

自動起動&起動の設定

これで Nginx の設定は完了です。 Nginx に自動起動&起動設定を実施しておきます。

systemctl enable nginx
systemctl start nginx

MariaDB

次は MariaDB を構築していきます。

インストール

AmazonLinux 標準リポジトリにあるパッケージをインストールします。

yum -y install mariadb mariadb-server

設定の修正

/etc/my.cnf[mysqld] セクションに文字コードの設定を追加しておきます。

character-set-server=utf8

自動起動&起動の設定

自動起動&起動の設定を実施します。

systemctl enable mariadb
systemctl start mariadb

初期設定

mysql_secure_installation で対話的に初期設定を実施しておきます。 テスト用の DB 等は削除しておく方が無難です。

mysql_secure_installation

Gitea 用データベースの作成

Gitea 用のデータベースを作成します。 まず、MariaDB へ接続します。

mysql -u root -p

以下の SQL を実行してデータベースやユーザを作成しておきます。 データベース名、ユーザ名、パスワードは適宜、修正します。

CREATE DATABASE `gitea` DEFAULT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;
CREATE USER `gitea`@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON `gitea`.* TO `gitea`@`localhost`;
quit

これで MariaDB の設定修正は完了です。

Gitea

最後に Gitea を構築していきます。

項目
パス /opt/gitea 以下へインストール
実行ユーザ root
実行グループ root

git のインストール

Gitea は git コマンドに依存している為、これをインストールしておきます。

yum -y install git

インストール

GitHub からバイナリを取得し、インストールしていきます。

mkdir -p /opt/gitea/bin/
curl -LO https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-amd64
mv gitea-1.8.3-linux-amd64 /opt/gitea/bin/
chmod 755 /opt/gitea/bin/gitea-1.8.3-linux-amd64
ln -s /opt/gitea/bin/gitea-1.8.3-linux-amd64 /opt/gitea/bin/gitea

systemd 用定義ファイルの登録

systemd から Gitea を制御出来るよう、定義ファイルを登録します。 /etc/systemd/system/gitea.service を以下の内容で新規作成します。

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=mysqld.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
RestartSec=2s
Type=simple
User=root
Group=root
WorkingDirectory=/opt/gitea
ExecStart=/opt/gitea/bin/gitea web
Restart=always
Environment=USER=root HOME=/opt/gitea
[Install]
WantedBy=multi-user.target

自動起動&起動の設定

systemd 用の登録ファイルを追加している為、systemctl daemon-reload してから自動起動&起動を行います。

systemctl daemon-reload
systemctl enable gitea
systemctl start gitea

初期設定の実施

Gitea が起動したらブラウザで https://git.example.com/install へアクセスし、初期設定を実施します。 初期値と、設定値サンプルを掲載しておきます。 尚、インストーラは一度起動して設定ファイルが作成すると、再実行出来なくなります。 設定ファイルは /opt/gitea/bin/custom/conf/app.ini に作成されましたので、以降は直接このファイルを修正するか、もしくは設定ファイルを削除してインストーラを再実行して初期設定をやり直します。 更に重要なポイントですが、インストール時に指定したパラメータは、すぐには反映されないようなので初期設定が完了したら一度、Gitea を再起動 (systemctl restart gitea) し、設定を再読込しておきます。

項目 初期値 設定例
データベースのタイプ MySQL MySQL
ホスト 127.0.0.1:3306 127.0.0.1:3306
ユーザー名 gitea gitea
パスワード password
データベース名 gitea gitea
サブタイトル Gitea: Git with a cup of tea Gitea: Git with a cup of tea
リポジトリのルートパス /opt/gitea/gitea-repositories /opt/gitea/gitea-repositories
Git LFS ルートパス /opt/gitea/bin/data/lfs /opt/gitea/bin/data/lfs
実行ユーザ名 root root
SSH サーバーのドメイン localhost git.example.com
SSH サーバーのドメインポート 22 22
Gitea の HTTP ポート 3000 3000
Gitea のベース URL http://localhost:3000/ https://git.example.com/
ログの保存先パス /opt/gitea/bin/log /opt/gitea/bin/log
SMTP ホスト
メール送信者
SMTP ユーザー名
SMTP パスワード
登録にはメールによる確認が必要
メール通知を有効にする
ローカルモードを有効にする
Gravatar を無効にする チェック
フェデレーテッド・アバターを有効にする チェック
OpenID を使ったサインインを有効にする チェック
セルフ登録を無効にする チェック
外部サービスを使用した登録のみを許可
OpenID を使ったセルフ登録を有効にする チェック チェック
CAPTCHA を有効にする
ページ閲覧にサインインが必要
デフォルトでメールアドレスを隠す
デフォルトで組織の作成を許可 チェック チェック
デフォルトでタイムトラッキングを有効 チェック チェック
メールを隠すときのドメイン noreply.example.org noreply.example.org
管理者ユーザー名 gitea-admin
パスワード password
パスワード確認 password
メールアドレス gitea-admin@example.com

初期状態では下記のような表示になっていました。

f:id:sig9:20190714171840p:plain:w800

内蔵 SSH サーバを有効化する

少なくても現バージョンの Gitea の Web インストーラには「内蔵 SSH サーバを利用するか?否か?」という選択が無いように見えます。 その為、Web インストーラでの初期設定が完了したら手動で /opt/gitea/bin/custom/conf/app.ini[server] セクションへ下記を追加します。

START_SSH_SERVER = true

追記が完了したら Gitea を再起動し、設定変更を反映します。

systemctl restart gitea

ログイン

これで準備完了です。 ブラウザで https://git.example.com へアクセスすると下記のような画面が表示されるはずです。 初期設定で「ページ閲覧にサインインが必要」と設定している為、ログインせずに画面上部の エクスプローラ をクリックしてもユーザやリポジトリ情報が表示される前にログインを要求されます。

f:id:sig9:20190714121337p:plain:w800

参考

/opt/gitea/bin/custom/conf/app.ini (サンプル)

APP_NAME = Gitea
RUN_USER = root
RUN_MODE = prod

[oauth2]
JWT_SECRET = *******************************************

[security]
INTERNAL_TOKEN = *********************************************************************************************************
INSTALL_LOCK   = true
SECRET_KEY     = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[database]
DB_TYPE  = mysql
HOST     = 127.0.0.1:3306
NAME     = gitea
USER     = gitea
PASSWD   = password
SSL_MODE = disable
PATH     = /opt/gitea/bin/data/gitea.db

[repository]
ROOT = /opt/gitea/gitea-repositories

[server]
SSH_DOMAIN       = git.example.com
DOMAIN           = git.example.com
HTTP_PORT        = 3000
ROOT_URL         = https://example.com/
DISABLE_SSH      = false
SSH_PORT         = 22
LFS_START_SERVER = true
LFS_CONTENT_PATH = /opt/gitea/bin/data/lfs
LFS_JWT_SECRET   = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
OFFLINE_MODE     = false

[mailer]
ENABLED = false

[service]
REGISTER_EMAIL_CONFIRM            = false
ENABLE_NOTIFY_MAIL                = false
DISABLE_REGISTRATION              = true
ALLOW_ONLY_EXTERNAL_REGISTRATION  = false
ENABLE_CAPTCHA                    = false
REQUIRE_SIGNIN_VIEW               = true
DEFAULT_KEEP_EMAIL_PRIVATE        = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = false
DEFAULT_ENABLE_TIMETRACKING       = true
NO_REPLY_ADDRESS                  = noreply.example.org

[picture]
DISABLE_GRAVATAR        = true
ENABLE_FEDERATED_AVATAR = false

[openid]
ENABLE_OPENID_SIGNIN = false
ENABLE_OPENID_SIGNUP = true

[session]
PROVIDER = file

[log]
MODE      = file
LEVEL     = Info
ROOT_PATH = /opt/gitea/bin/log

/etc/my.cnf (初期状態)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d