バナーナナブログ

宮城県仙台市より、日々思ったことを綴っていくウェブログです。

AWS EC2無料枠の中でRedmineを動かす(Nginx+Unicorn+PostgreSQL)

お久しぶりです。
IT会社に勤めている関係で、お客様にRedmine導入を提案することがあります。
最近の構築はdocker使ったりBitnami使ったりすれば簡単に行えます。
ただメンテナンス性やら中身の関係を把握しておくことを考えたら、
自作した方がいいかと思い最新のバージョンの構築経験値を稼ぐことにしました。

基本的には公式を確認、踏襲します。
https://redmine.jp/install/

提案する環境で一番多いのがAWSなので、EC2無料枠のt2.microワンサーバーで作れるか確認しました。
結論から言うと、
t2.microワンサーバーで稼働可能です。

簡単なイメージ構成図。
f:id:smdbanana:20220214120728p:plain

DBはpostgresql、WEBサーバはnginx、RedmineUnicornで、という構成。
ついでにhttpsでアクセスさせるためletsencryptを使います。

以下に手順をつらつら書いていきます。
いずれも2022年2月の情報です。

マシン初期設定

// マシン名設定 (以下では rm というマシン名にする)
# echo 'export NICKNAME=rm' >> /etc/bashrc
# echo 'export PS1="[\u@$NICKNAME \W]\\$ "' >> /etc/bashrc

// タイムゾーンの変更
# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Japan /etc/localtime

// ツール群インストール
$ sudo -s
# yum update -y
# yum groupinstall -y "Development Tools"
# yum install -y openssl-devel readline-devel zlib-devel curl-devel libyaml-devel ImageMagick ImageMagick-devel ghostscript bzip2-devel sqlite-devel libffi-devel git

// letsencrypt (80番ポート空けておく必要あり)
# amazon-linux-extras install -y epel
# yum install -y certbot
# certbot certonly -d 'Redmine用ドメイン' -m 'メールアドレス'
// standaloneを選択 あとは全て従う

// Redmine用ユーザー作成
# useradd redmine

PostgreSQL設定

// PostgreSQLサーバーインストール
# yum -y install postgresql-server postgresql-devel
# postgresql-setup initdb
# cp -p /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
# sed -i -e "s/^host/#host/g" /var/lib/pgsql/data/pg_hba.conf
# echo "host    redminedb       redmineuser     127.0.0.1/32            md5" >> /var/lib/pgsql/data/pg_hba.conf
# systemctl enable postgresql
# systemctl start postgresql
# cd /var/lib/pgsql
# sudo -u postgres createuser -P redmineuser
// パスワード: redminepass
# sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmineuser -T template0 redminedb

Nginx初期設定 (後でRedmine接続設定入れる)

// webサーバはnginx
# amazon-linux-extras install -y nginx1
# cd /etc/nginx/
# cp nginx.conf nginx.conf.org
# vi nginx.conf
# diff nginx.conf.org nginx.conf
81a82,104
>     server {
>         listen       443 ssl http2;
>         listen       [::]:443 ssl http2;
>         server_name  _;
>         root         /usr/share/nginx/html;
>
>         ssl_certificate "/etc/letsencrypt/live/Redmine用ドメイン/fullchain.pem";
>         ssl_certificate_key "/etc/letsencrypt/live/Redmine用ドメイン/privkey.pem";
>         ssl_session_cache shared:SSL:1m;
>         ssl_session_timeout  10m;
>         ssl_prefer_server_ciphers on;
>
>         # Load configuration files for the default server block.
>         include /etc/nginx/default.d/*.conf;
>
>         error_page 404 /404.html;
>             location = /40x.html {
>         }
>
>         error_page 500 502 503 504 /50x.html;
>             location = /50x.html {
>         }
>     }

# cp nginx.conf nginx.conf.org2
// サービスを自動起動オン
# systemctl enable nginx

rbenv設定

// rbenvインストール
# su -l redmine
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
$ source ~/.bashrc
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ rbenv install 2.7.5
$ rbenv global 2.7.5
$ rbenv rehash
$ exit

Redmine設定

// redmine インストール
# svn co http://svn.redmine.org/redmine/branches/4.2-stable /var/lib/redmine
# chown -R redmine:redmine /var/lib/redmine
# su -l redmine
$ cd /var/lib/redmine/
$ tee config/database.yml<<EOF
production:
  adapter: postgresql
  database: redminedb
  host: localhost
  username: redmineuser
  password: "redminepass"
  encoding: utf8
EOF
$ echo -e "# Use unicorn\ngem \"unicorn\"" >> Gemfile.local
$ bundle config set without 'development test'
$ bundle install
$ SECRET_KEY_BASE=`bundle exec rake secret`
$ echo -e "production:\n  secret_key_base: $SECRET_KEY_BASE" > config/secrets.yml
$ RAILS_ENV=production bundle exec rake db:migrate
// unicorn単独起動を手動で確認
$ bundle exec unicorn_rails -l 3000 -E production
// 確認終わったら停止

// サービス化対応
// unicornサンプルを基に最小の設定を記述 https://yhbt.net/unicorn/examples/unicorn.conf.minimal.rb
$ tee config/unicorn.conf.minimal.rb<<EOF
listen "/var/lib/redmine/tmp/sockets/redmine.sock", :backlog => 64
worker_processes 2 # this should be >= nr_cpus
pid "/var/lib/redmine/tmp/pids/redmine.pid"
stderr_path "/var/log/redmine/unicorn.stderr.log"
stdout_path "/var/log/redmine/unicorn.stdout.log"
EOF
$ exit

// redmine用のサービスを設定
# tee /usr/lib/systemd/system/redmine.service<<EOF
[Unit]
Description=Redmine Unicorn Server

[Service]
WorkingDirectory=/var/lib/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine
PIDFile=/var/lib/redmine/tmp/pids/redmine.pid
User=redmine
Group=redmine

ExecStart=/home/redmine/.rbenv/shims/bundle exec "unicorn_rails -c /var/lib/redmine/config/unicorn.conf.minimal.rb -E production --path=/rm"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
EOF

// ログ用のフォルダを作る
# mkdir /var/log/redmine
# chown -R redmine:redmine /var/log/redmine/
// サービスを自動起動オン
# systemctl enable redmine

// サブディレクトリ起動できるよう設定する
# sed -i -e "s/run Rails.application/map ActionController::Base.config.relative_url_root do\n  run Rails.application\nend/g" /var/lib/redmine/config.ru

// nginx設定にredmineソケットの連携を記述
# vi /etc/nginx/nginx.conf
# diff /etc/nginx/nginx.conf.org2 /etc/nginx/nginx.conf
37a38,41
>     upstream redmine {
>         server unix:/var/lib/redmine/tmp/sockets/redmine.sock;
>     }
>
95a100,103
>
>         location /rm/ {
>             proxy_pass http://redmine;
>         }

// サービス再起動
# systemctl restart redmine nginx
// サービス状況確認
# systemctl status redmine nginx

これで https://Redmineドメイン/rm/ にアクセスすればRedmineが起動できるはず。

付録 Redmineの便利プラグイン View Customize を入れる

View Customizeプラグインは便利なので入れておいて損しない。

# su -l redmine
$ git clone https://github.com/onozaty/redmine-view-customize.git /var/lib/redmine/plugins/view_customize
$ cd /var/lib/redmine/
$ bundle install
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
$ exit
# systemctl restart redmine nginx

最後に

各バージョンの確認をしておく。

# cat /etc/image-id
image_name="amzn2-ami-kernel-5.10-hvm"
image_version="2"
image_arch="x86_64"
image_file="amzn2-ami-kernel-5.10-hvm-2.0.20220207.1-x86_64.xfs.gpt"
image_stamp="fc96-3ab8"
image_date="20220207221538"
recipe_name="amzn2 ami"
recipe_id="de496fd4-1f14-4bdc-03f4-c34d-5e31-3263-edbd68d4"
# postgres --version
postgres (PostgreSQL) 9.2.24
# nginx -version
nginx version: nginx/1.20.0
$ ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]

早くイジワルウィルス落ち着いてほしいね。