[AWS] LigthsailにBitnami版Redmine4.1を構築する

新たにジョインしたプロジェクトでPM業務を担当することになりまして、古来から伝わりしRedmineを準備した際のメモです。……本当は今をときめくClickUpあたりを使いたかったんですが予算の兼ね合いで泣く泣くw Backlogは昔から肌に合わないのとカスタマイズが効かないので候補から外しました。

ゼロからRedmine環境を作るのは骨が折れるため、ボタン2〜3発でRedmineを起動でき、お値段的にも手頃なAWSLightsailを利用して作成してみます。

インスタンスの準備

ダッシュボードへログイン

Lightsailのダッシュボードに入ったら、「インスタンスの作成」ボタンをクリック。

インスタンスを作成

プラットフォームは「Linux/UNIX」を選択、設計図は「アプリ+OS」にある「Redmine」を選択します。

プランは予算に応じたものを選びますが、少なくとも5ドル、できれば10ドル以上のプランがオススメです。Redmineの中身はRoRなのですがメモリもCPUもそれなりに消費するためです。今回は20ドルのプランを選択しました。最後に「インスタンスの作成」ボタンを押せばインスタンスの作成が始まります。

ダッシュボードに自動的に返ってきます。最初はグレーアウトしていますが、この時はまだ裏側で作成処理が走っているためもうしばらく待ちます。

Redmineをブラウザから確認

ここまでで、すでにRedmineが起動し利用可能な状態になっています。何ということでしょう、インスタンスを作成しただけでRedmineの準備も完了してしまいましたw

実際にダッシュボードに表示されている、インスタンスIPアドレスWebブラウザからアクセスするとRedmineのログイン画面が表示されるハズです。

……あれ?ログインIDとパスワードは???

初期パスワードはサーバ内のログに出力されるため、ここからはSSHなどでサーバにログインして操作を行う必要があります。そう、ここで大抵の方が最初につまずきます。もう少しわかりやすいところに説明を載せておいてくれw

Redmineの初期パスワードを入手する

SSHでログイン

Lightsailのダッシュボードのインスタンスハンバーガーメニュー(点が3つ縦に並んだボタン)から「接続」を選ぶか、横ある四角いボタンをクリックします。

このときに以下のようなエラーが出た場合は、まだ裏側でインスタンス作成の処理が流れているので、適当にコーヒーでも飲みながら待機します。

ログインに失敗しました。このインスタンスが起動したばかりの場合は、1~2 分待ってからもう一度試してください。 CLIENT_UNAUTHORIZED [769]

初期パスワード

無事にログインできたら以下のコマンドを実行すると、/var/log/syslog内に出力された初期パスワードが表示されます(XXXXXXXXの部分がパスワードです)

$ cat /var/log/syslog | grep 'Setting Bitnami application password'
Sep 10 11:42:34 ip-1-1-1-1 bitnami[578]: #    Setting Bitnami application password to 'XXXXXXXX'    #

あとは先ほどのブラウザの画面からログインできるか確認します。ここまででもRedmineを使い始めることも可能ですが、もう少し実用的に設定していきます。

追記 これ後日気がついたのですが、SSHでログインしたホームディレクトリにbitnami_application_passwordというファイルがありまして、この中に入っていましたw catするだけで確認できるようです。失礼しました(;´∀`)

$ cat ~/bitnami_application_password
Fw6cEjiSa6tZ

独自ドメインを割り当てる

固定IPアドレスを付与

LightsailにもAWS本体で言うElastic IPのように、インスタンスに固定IPを紐付ける機能があります。

ダッシュボードの上部のメニューにある「ネットワーキング」から「静的IPの作成」ボタンをクリック。

IPアドレスを付与したいインスタンスを選んだ後に、IPアドレスを管理するための名前を決めます。名前とインスタンス名は似たものを設定しておかないと後々わからなくなりますのでご注意を。最後に「作成」ボタンをクリックすれば完了です。

実際に割り当てられたIPアドレスをどこかにメモしておきます。

なおこの固定IPはインスタンスと紐付けている間は無料ですが、インスタンスを削除したあとに固定IPをそのままにしておくと料金が発生します。インスタンスを削除したら忘れずに固定IPを野に放つか、新しいインスタンスに紐づけておく必要があります。

独自ドメインを設定

詳細は割愛しますが、先ほどの固定IPをLightsailのDNS機能か、Route53などで紐付けます。

LightsailにはDNSを(無料で!)設定することもできます。もちろんドメイン自体はどこかで契約し1年毎に対価を払う必要はありますが、ネームサーバ分については料金は発生しません。

もしくはAWS本体のRoute53で設定する方向もあります。こちらは問答無用で料金が発生しますが、よほど大規模なアクセスが無ければコーヒー一杯分にもなりませんので不安になる必要はありません。

SSHでログインする

ここから先の設定はコマンドラインで行う必要があるのですが、ダッシュボードからだと色々使い勝手が悪いのでローカル端末のTerminalから接続できるようSSHの設定を行います。

公開鍵の登録

ログインするローカルの端末でRSA鍵を事前に作成しておき、公開鍵の方をクリップボードにコピーしておきす。あとはRedmineサーバへダッシュボードからログインし~/.ssh/authorized_keysへ追記し保存します。

$ vi  ~/.ssh/authorized_keys
(公開鍵を貼り付ける)

ローカルの端末からログインできるか確認します。ユーザー名はbitnamiです。

$ ssh bitnami@redmine.example.com

sshdの設定を変更

ピンポンダッシュを防ぐためにSSHのポート番号をデフォルトの22番から他の番号へ変更しておきます。未定義の49152〜65535番が安全ではあります。

$ sudo vi /etc/ssh/sshd_config
Port 60022

LightsailにはデフォルトでFirewalldもiptablesもいないのですが、ダッシュボードからポートの開放を行う必要があります。インスタンスの管理画面に入り、「ネットワーキング」をクリック。ファイアーウォールの項目にある「ルールを追加」をクリック。

sshd_configに記入したポート番号を入力し「作成」ボタンをクリックします。 

おもむろにsshdを再起動して設定を反映します。この時に今接続しているTerminalは切断しないよう気をつけてください。もし設定を間違えていた場合、二度と接続できなくなる可能性があります。

$ sudo service sshd restart

新しいTerminalを開き、先ほど設定したポート番号でログインできるか確認します。

$ ssh bitnami@redmine.example.com -p 60022 

なお、ポート番号を変更するとこれ以降はダッシュボードからはログイン出来なくなるのでご注意を。……まぁ一度ローカルから接続する設定を終えるとこっちはほとんど使わないのですけどね。

エラーが発生し、インスタンスに接続できないか、インスタンスとの接続を維持できませんでした。このインスタンスが起動したばかりの場合は、1~2 分待ってからもう一度試してください。 UPSTREAM_NOT_FOUND [519]

SSLに対応する (Let's Encrypt)

特に会社などでRedmineを利用する場合、機密情報てんこ盛りなためSSLでの暗号化は必須です。……うへぇ…めんどくさそうだなぁ…と思っていたのも昔、bitnamiにはLet's Encryptを簡単に導入できるツールが最初から含まれています。

なんと以下のコマンドを実行するだけです。拍子抜けするレベルで簡単です。

$ sudo /opt/bitnami/bncert-tool

このあと色々と英語で聞かれるので、それぞれ回答していきます。

質問項目

バージョンアップしていくかい?

最初に以下の文言が出た場合、インストールされているツールが古くなっています。ここではYを入力(もしくはそのままEnter)すると裏側で自動的にアップデートしてくれます。

An updated version is available. Would you like to download it? You would need to run it manually later. [Y/n]: 

アップデートが終わっても特に何か表示されるわけでは無いですが、数分ほど待ってから再度同じコマンドを実行します。

対象ドメイン

SSL証明書を取得したいドメイン(FQDN)を入力します。

Please provide a valid space-separated list of domains for which you wish to 
configure your web server.

Domain list []: redmine.example.com

www付きドメインも対象にするかい?

先ほど入力したドメインの先頭にwww.を付けた物も含めるか聞いてきますが、今回は不要だったのでnを入力してEnter。

The following domains were not included: www.redmine.example.com. Do you want to add them? [Y/n]: n

HTTPでアクセスされたらHTTPSへリダイレクトするかい?

Webブラウザで暗号化されていないHTTPでアクセスされたら、自動的にHTTPSへリダイレクトする設定を有効にするか聞かれるので、もちろんYを選択します。

Enable/disable redirections

Please select the redirections you wish to enable or disable on your Bitnami 
installation.

Enable HTTP to HTTPS redirection [Y/n]: Y

本当にこの設定で良いのかい?

ここまでの入力内容によって、どのような変更が行われるか一覧で表示されます。特にドメインを間違えるとやり直す羽目になるのでよく確認してください。問題なければYで次の画面へ。

Changes to perform

The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: 
redmine.example.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: redmine.example.com
5. Enable HTTP to HTTPS redirection (example: redirect 
http://redmine.example.com to https://redmine.example.com)
6. Start web server once all changes have been performed

Do you agree to these changes? [Y/n]: 

SSL証明書の期限切れ連絡メールを設定&規約に同意

最後にLet's Encryptへ登録するメールアドレスを入力し、利用規約に同意します。

Create a free HTTPS certificate with Let's Encrypt

Please provide a valid e-mail address for which to associate your Let's Encrypt 
certificate.

Domain list: redmine.example.com
Server name: redmine.example.com
E-mail address []: katsubemakito@gmail.com

The Let's Encrypt Subscriber Agreement can be found at:
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf

Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: Y

これだけでSSL対応完了

これで数十秒待つだけで、SSL対応がすべて完了します。

SSL キタ━━━━(゚∀゚)━━━━!! ちょっと感動しますねw

SSL証明書は更新されるの?

ユーザー「bitnami」のcronに更新用のタスクが登録されていました。デフォルトだと毎日0:00(UTC)に実行されるようですね。あとは放置しておくだけで良いのです。

$ crontab -l
0 0 * * * sudo /opt/bitnami/letsencrypt/lego --path /opt/bitnami/letsencrypt --email="katsubemakito@gmail.com" --http --http-timeout 30 --http.webroot /opt/bitnami/apps/letsencrypt --domains=redmine.example.com renew && sudo /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf -k graceful # bncert-autorenew

メール通知に対応する

AWS SESでSMTPを準備

AWS本体のSESを利用するとSMTPサーバが簡単に用意できます。

詳しい準備の方法は以下の記事を参照ください。この中でSMTP用のIAMを新たに作成し、最終的に表示されるユーザー名とパスワードをメモしてください。 blog.katsubemakito.net

Redmineの設定ファイルに反映

Redmineサーバにログインし、設定ファイルのあるディレクトリまで移動、念の為これから編集する設定ファイルのバックアップを取っておきます。

$ cd /opt/bitnami/apps/redmine/htdocs/config/
$ cp configuration.yml configuration.yml.back

viなどで設定ファイルを開き、以下のように設定を記述します。YAML形式なのでインデントは半角スペースで文字数を必ず合わせる必要がある点に注意してください。またコロンの位置やコロンの後に半角スペースを入れるなど割と厳格です。

$ vi configuration.yml
default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "email-smtp.ap-northeast-1.amazonaws.com"
      port: 587
      domain: "redmine.example.com"
      authentication: :login
      user_name: "XXXXXXXXXXXXXX"
      password: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

ご覧の通りですが、可変部分の意味は次の通りです。

address
SESで利用するリージョンのSMTPサーバのドメイン(FQDN)。ここでは東京リージョンのSMTPサーバを指定しています。
domain
今回作成したRedmineサーバのドメイン(FQDN)。SESでドメインの認証をしておく必要があります。
user_name, password
SESの準備中に作成したSMTP用のIAMのユーザー名とパスワードをそれぞれ指定します。

Fromアドレスの設定

忘れそうになるのですが(実際忘れてましたw)、Redmineにログインし「管理」→「設定」→「メール通知」とたどり「送信元メールアドレス」を入力します。

重要なのはメールアドレスのドメインをSESで認証した物にしておくことです。返信を受け取る必要が無ければ@より前のユーザー名は存在しない物でもかまいません。その場合はよくあるnoreply@〜.comなどにしておくのがわかりやすそうです。

ここまででメール通知の設定は完了です。実際に適当なユーザーを登録しメール通知の実験をしてみましょう。

バックアップ

Lightsailのスナップショットの料金

Lightsailにも自動的にスナップショットを取ってくれる機能がありますが、1Gあたり0.05USDかかりますので、個人や予算の少ないプロジェクトで使うには若干高価です。

最大で7日分のスナップショットが保存されますので、1ドル105.85円で計算した際の月額プランごとの料金は以下になります。例えば月20ドルのプランだと、ディスクが80Gあるため1週間分のスナップショットを1ヶ月保管すると2,964円でしょうか。サーバより高いw

料金(USD) SSD (GB) 1日 2日 3日 4日 5日 6日 7日
3.5 20 ¥106 ¥212 ¥318 ¥423 ¥529 ¥635 ¥741
5 40 ¥212 ¥423 ¥635 ¥847 ¥1,059 ¥1,270 ¥1,482
10 60 ¥318 ¥635 ¥953 ¥1,270 ¥1,588 ¥1,905 ¥2,223
20 80 ¥423 ¥847 ¥1,270 ¥1,694 ¥2,117 ¥2,540 ¥2,964
40 160 ¥847 ¥1,694 ¥2,540 ¥3,387 ¥4,234 ¥5,081 ¥5,928
80 320 ¥1,694 ¥3,387 ¥5,081 ¥6,774 ¥8,468 ¥10,162 ¥11,855
160 640 ¥3,387 ¥6,774 ¥10,162 ¥13,549 ¥16,936 ¥20,323 ¥23,710

そのかわり、難しいことを考えずに手軽にバックアップの設定が取れますし、復旧もスナップショットから新しいインスタンスを作成するだけなので大変楽です。お金持ちの方は迷わずこちらの方法を取るのが良いかと思います。

今回は貧乏なプロジェクトのためS3に必要なファイルを送信する作戦で行きます。

AWS側の準備

S3にバックアップ用のバケットを新規に作成、専用のIAMを用意します。

S3にバケット作成

普通にS3にバケットを作るのですが、バックアップ時にそれほどスピードを気にしなくても良い条件下であれば最も価格の安いリージョンを選択するのがオススメです。今回はオレゴンにしました。

これ以外に気をつけるポイントとしては以下くらいでしょうか?

  • 公開しない
  • 専用のバケットとして用意する
  • 暗号化は原則ON

金額が気になる場合は、必要に応じて以下のような「ライフサイクル」を追加してください。

  • n日以上経過したら削除する
  • n日以上経過したらGlacierなどへ移行する

S3送信用のIAM作成

S3だけを操作できるIAMを作成します。ユーザー作成後に次のようなJSONを登録します。Resourceで指定しているarnは作成したバケット名に変更してください。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket"
         ],
         "Resource":"arn:aws:s3:::backup.redmine.example.com"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject"
         ],
         "Resource":"arn:aws:s3:::backup.redmine.example.com/*"
      }
   ]
}

AWS CLIの設定

ここからLightsailに戻ります。SSHでログインしたら先ほど作成したIAMのアクセスキーとシークレットを登録します。

$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

試しにawsコマンドからファイルをアップロードしてみます。マネジメントコンソールなどからファイルが確認できれば成功です。

$ date > date.txt
$ aws s3 put date.txt s3://backup.redmine.example.com
upload: ./date.txt to s3://backup.redmine.example.com/date.txt

ファイルの一覧も取得できるか確認します。

$ aws s3 ls s3://backup.redmine.example.com
2020-09-14 13:42:58         32 date.txt

大丈夫そうですね。

MySQLにバックアップ用のアカウント作成

MySQLをrootで触るのは怖いので、権限の弱いバックアップ専用のMySQLユーザーを作成しておきます。まずはMySQLへログインします。このときのパスワードはブラウザでRedmineへログインした際のパスワードと同じです。

$ mysql -u root -p

無事にログインできたら以下の3つのSQLを実行。backuperという名前のユーザーを作成し、mysqldumpに必要な権限をGRANTで付与しました。

CREATE USER backuper@localhost IDENTIFIED BY '(パスワードを指定)';
GRANT SELECT,SHOW VIEW,EVENT,TRIGGER,LOCK TABLES,RELOAD ON *.* TO backuper@localhost;
FLUSH PRIVILEGES;

特にエラーが出なければMySQLのクライアントは終了させます。

バックアップ用のシェルスクリプト

今回バックアップ対象のMySQLの全データと、Redmine上のローカルのファイルを圧縮ファイルにまとめてS3へアップするシェルスクリプトを用意しました。これを適当な場所に保存し、実行権を755などに設定します。スクリプト中のパスワードやS3のバケット名などは適宜変更してください。

なおRedmineでバックアップすべきなのは次の2箇所です。filesにはアップロードされたファイルが保管されます。

  • /opt/bitnami/apps/redmine/htdocs/config
  • /opt/bitnami/apps/redmine/htdocs/files

スクリプトの準備ができたら、念の為この段階で実行して正常にS3へ送信されるか確認しておきます。

$ ./backup_redmine.sh 
Redmine Backuper

*** start ***
20/09/15 09:27:52
----------------------------
mysqldump: [Warning] Using a password on the command line interface can be insecure.
upload: ../../../var/tmp/backup/redmine/mysql_20200915.sql.gz to s3://backup.redmine.example.com/202009/mysql_20200915.sql.gz
upload: ../../../var/tmp/backup/redmine/files_20200915.tar.gz to s3://backup.redmine.example.com/202009/files_20200915.tar.gz
----------------------------
*** end ***
20/09/15 09:27:55

ちなみに以下のような警告が出ますが、これはmysqldumpを実行する際にパスワードを直接渡しているためです。詳細は割愛しますが気持ち悪い場合は~/.my.cnfなどにアカウント情報を記録するなどして回避することもできます。

mysqldump: [Warning] Using a password on the command line interface can be insecure.

cronでタイマー実行する

シェルスクリプトが無事に実行できたらcronで指定の時間になったら自動的に実行するよう設定します。念の為crontab -lで無事に登録できたか確認すると良いでしょう。

$ crontab -e
# AM 04:20 (JST)
20 19 * * * /home/bitnami/cron/backup_redmine.sh >> /tmp/backup.log 2>&1

気をつけるのは、SSL証明書を更新するジョブがすでに登録されている場合は触らないことと、このサーバは時間がUTCになっているためcronで指定する時間もUTCで考える必要がある点でしょうか。(しゃらくさい場合は日本時間に設定を変えても良いかもしれませんね)

おまけ

Bitnamiのバナーを削除する

画面の右下に付いて回るBitnamiのバナー(ロゴ)画像が邪魔に感じたら以下のコマンドで削除できます。

$ sudo /opt/bitnami/apps/redmine/bnconfig.disabled --disable_banner 0

公式ドキュメントの通りに実行すると、コマンドが見つからないと怒られるのでよくよく見るとコマンド名が変わったみたいですね。

時間がずれるのを直したい

特に設定をしていない場合、デフォルトのタイムゾーンUTCに設定されているため日本標準時と9時間のずれが生じます。さすがに不便なので最初にデフォルトのタイムゾーンの設定をしてやります。

まずはRedmineディレクトリへ移動し、対応しているタイムゾーンの一覧を表示します。UTC+09:00にある日本の都市名を確認します。

$ cd /opt/bitnami/apps/redmine/htdocs
$ bundle exec rake time:zones:all 
(中略)
* UTC +09:00 *
Osaka
Sapporo
Seoul
Tokyo
Yakutsk

以下の設定ファイルをviなどで開きます。

$ vi config/application.rb 

このファイルの最初の方にある次の行の:localの箇所を

config.active_record.default_timezone = :local

以下のように適当な都市名に変更します。引用符で囲うのをお忘れなく。

config.active_record.default_timezone = 'Tokyo'

すでに作成済み(設定済み)のユーザーはデフォルトの値を変えても変化がありませんので、管理者がメニューの「管理」から1つずつ変更するか、もしくは各ユーザーにそれぞれ「個人設定」からタイムゾーンの設定を行ってもらう必要があります。

リマインダーメールを送信する

チケットの期日がn日前になったらアラートメールを送る機能がRedmineには最初から入っています。有効にするには単にcronに登録するだけです。

次のようにcronへ登録すると、7日以内に期限が切れるチケットの一覧をユーザー毎にメール送信してくれます。

$ crontab -e
0 30 * * * sudo /opt/bitnami/ruby/bin/rake -f /opt/bitnami/apps/redmine/htdocs/Rakefile redmine:send_reminders days=7 RAILS_ENV="production"

WikiなどでHTMLタグを使いたい

あまりやりたく無いのですが、Markdownを利用している場合、以下のファイルを開いて一番下の方まで移動します。

$ vi /opt/bitnami/apps/redmine/htdocs/lib/redmine/wiki_formatting/markdown/formatter.rb

:filter_html => trueとなっている箇所をfalseに変更して保存します。

def formatter
  @@formatter ||= Redcarpet::Markdown.new(
    Redmine::WikiFormatting::Markdown::HTML.new(
      :filter_html => false,
      :hard_wrap => true
    ),
    :autolink => true,
    :fenced_code_blocks => true,

Apacheを再起動させて反映します。

$ sudo /etc/init.d/bitnami restart apache

これでHTMLタグが使い放題になりますが、逆にエスケープされなくなりますのでエスケープされることを前提で運用している箇所で不具合が発生しないか確認を。一般公開されているRedmineの場合はセキュリティ上の懸念があるのでやめておいた方が良さそうです。

検索エンジンにインデックスさせたくない

これもあまりやりたく無いのですが、テンプレートを直接いじります。

$ vi /opt/bitnami/apps/redmine/htdocs/app/views/layouts/base.html.erb

テンプレートを開いたらheadタグに以下のmetaタグを貼り付けて保存。

<meta name="robots" content="noindex,nofollow">

最後にApacheを再起動させれば反映されます。

$ sudo /etc/init.d/bitnami restart apache

これでRedmine上の全てのページで先ほどのmetaタグが出力されます。行儀の悪いロボットにはもちろん無視されますが、Googleなどの一般的に利用されている検索エンジンはちゃんと解釈してくれます。

REFERERでサーバのURLを外部に漏らしたくない

チケットやWikiに書かれたリンクをクリックしたり画像を埋め込むことでREFERERを通じて先方のサーバ管理者にバレてしまうことがあります。実際このブログには様々な会社のRedmineからリンクをいただいているのを確認してますw

社内用など外部にRedmineサーバのURLを漏らしたくない場合、これも先ほどと同様にテンプレートを開いて、metaタグを埋め込めば大抵の場合は防ぐことができます。

$ vi /opt/bitnami/apps/redmine/htdocs/app/views/layouts/base.html.erb
<meta name="referrer" content="no-referrer">

最後にApacheを再起動して反映します。

$ sudo /etc/init.d/bitnami restart apache

以前書いた「view customize」プラグインで行う手もあります。 blog.katsubemakito.net

ガントチャートPNG出力が文字化けする

追記 チケットのタイトルを日本語で登録すると、ガントチャートPNG出力した際にその部分が文字化けします。PDFで出力すれば大丈夫なんですけどね。これはデフォルトで英字フォントが設定されているからのようなので、日本語フォントに置き換えるだけで解決します。

日本語でのPNG出力に対応したい場合は、以下の設定ファイルを開き、

$ vi /opt/bitnami/apps/redmine/htdocs/config/configuration.yml

以下の箇所に日本語フォントのパスを指定します。以前rmagick_font_path でしたが4.1から変更になったみたいですね。

minimagick_font_path: /usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf

最後にApacheを再起動して反映すれば完了です。

$ sudo /etc/init.d/bitnami restart apache

もし日本語フォントが無い場合は?

aptでインストールできます。たくさん出てきますのでお好きな物をどうぞ。

$ apt-cache search font japanese | grep '^fonts-'
fonts-droid-fallback - handheld device font with extensive style and language support (fallback)
fonts-aoyagi-kouzan-t - Brush-style Japanese font
fonts-aoyagi-soseki - Brush-style Japanese font, Aoyagi-Soseki
fonts-arphic-ukai - "AR PL UKai" Chinese Unicode TrueType font collection Kaiti style
fonts-arphic-uming - "AR PL UMing" Chinese Unicode TrueType font collection Mingti style
fonts-dejima-mincho - antique-looking Japanese TrueType Mincho font
fonts-hanazono - Japanese TrueType mincho font by KAGE system and FontForge
fonts-horai-umefont - Japanese TrueType font, Ume-font
fonts-ipaexfont - Japanese OpenType font, all IPAex Fonts
fonts-ipaexfont-gothic - Japanese OpenType font, IPAex Gothic Font
(中略)

$ sudo apt-get install fonts-takao

logrotateの設定を確認する

追記

Redmineが実行する度に出力するログを見るとなんかデカい、そしてローテーションされてない。

$ ls -lh /opt/bitnami/apps/redmine/htdocs/log/
total 34M
-rwxrwxrwx 1 daemon daemon 34M Oct 22 15:04 production.log

logrotate自体はインストールされており、Redmine用の設定ファイルも存在しているのですが、どうやらエラーが発生し正常に動作していないようです。エラーメッセージを読むにパーミションがゆるくて怒られている模様。

$ sudo logrotate -d /etc/logrotate.d/bitnami.conf
(中略)
rotating pattern: /opt/bitnami/apps/redmine/htdocs/log/*.log  weekly (150 rotations)
empty log files are rotated, old logs are removed
considering log /opt/bitnami/apps/redmine/htdocs/log/production.log
error: skipping "/opt/bitnami/apps/redmine/htdocs/log/production.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

そこですでに用意されていたlogrotateのRedmine用の設定ファイルを開き、logrotateを実行するユーザーを指定します。9行目を追加しました。

$ sudo vi /opt/bitnami/config/logrotate/logrotate.d/redmine.conf 
/opt/bitnami/apps/redmine/htdocs/log/*.log {
  weekly
  rotate 150
  dateext
  compress
  copytruncate
  missingok
  su daemon daemon 
}

これでもう一度sudo logrotate -d /etc/logrotate.d/bitnami.confを実行し先ほどのエラーが出力されなければ、次回のlogrotateから反映されます。

もしくは以下のコマンドを実行することで、手動ですぐに実行することもできます。

$ sudo logrotate -f /opt/bitnami/config/logrotate/logrotate.d/redmine.conf

されてますね。

$ ls -lah /opt/bitnami/apps/redmine/htdocs/log/
total 2.7M
drwxrwxr-x  2 bitnami daemon 4.0K Oct 22 15:27 .
drwxrwxr-x 18 bitnami daemon 4.0K Jun  9 17:17 ..
-rwxrwxrwx  1 daemon  daemon    0 Oct 22 15:27 production.log
-rwxrwxrwx  1 daemon  daemon 2.7M Oct 22 15:04 production.log-20201022.gz

Redmineがメモリから落ちないようにする

追記

WebサーバがRedmineを起動した際に、実行可能な状態のデータをしばらくの間キャッシュしてくれるため頻繁に利用されている間は高速に動いてくれるのですが、例えば朝一番にログインしたときなどしばらくアクセスが無い状態が続くとレスポンスが返ってくるのが遅くなります。

そこでお手軽な方法としてcronで一定時間置きにリクエストを投げるように設定します。

$ crontab -e
# Every 5min
*/5 * * * * curl -s 'http://localhost/login?back_url=http%3A%2F%2Flocalhost%2F' > /dev/null

あとはしばらく待ってログに実行結果が出力されていれば成功です。 以下はOS側のログ。

$ tail -f /var/log/syslog
Oct 22 14:55:01 ip-111-11-1-111 CRON[8015]: (bitnami) CMD (curl -s 'http://localhost/login?back_url=http)

こちらはRedmineが吐き出すログ。

$ tail -50 /opt/bitnami/apps/redmine/htdocs/log/production.log 
Started GET "/login?back_url=http%3A%2F%2Flocalhost%2F" for 127.0.0.1 at 2020-10-22 14:40:54 +0000
Processing by AccountController#login as */*
  Parameters: {"back_url"=>"http://localhost/"}
  Current user: anonymous
  Rendering account/login.html.erb within layouts/base
(中略)

まとめ

以上で使い始めるのに最低限の設定を終えることができました。 こうやって書き出すと何だかんだで面倒ですねw 案件によってはBASIC認証をかけたいとか既存のデータを移行したいとか色々出てきそうですが、また気が向いたら追記します。

以前はRubyの環境から整える必要があり、普段Rubyに慣れ親しんでいない身としては中々にハードルが高かったのですが、そこをショートカットできるだけでも助かりますね。

参考ページ