「インストール - Redmine」の版間の差分
(ページの作成:「== 概要 == <br><br> == Rubyのインストール == Rubyのビルドに必要なライブラリをインストールする。<br> sudo zypper install gcc gcc-c++ autoconf bison gperf libopenssl-devel libopenssl-1_1-devel libyaml-devel zlib-devel \ readline-devel libedit-devel gmp-devel libffi-devel rust cargo ruby2.5-devel <br> [https://github.com/ruby/ruby RubyのGithub]にアクセスして、ソースコードをダウンロードする…」) |
|||
(同じ利用者による、間の17版が非表示) | |||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
Redmineとは、課題管理や情報共有の機能を備えるプロジェクト運営を支援するためのオープンソースソフトウェアである。<br> | |||
誰でも自由にRedmineをダウンロードし、インストールして利用することができる。<br> | |||
<br> | |||
Webアプリケーションとして動作するシステムであるため、Redmineが稼働している環境があり、Webブラウザがあれば、他にソフトウェアをインストールすることなく使用できる。<br> | |||
また、情報が1ヶ所に集約されていますので、どこからでもアクセスでき、複数のメンバでも使用することもできる。<br> | |||
<br> | |||
Redmineは、ソフトウェア開発プロジェクトとの親和性が高く、SubversionやGit等のバージョン管理システムと連携できる。<br> | |||
Redmine自体の開発プロジェクトもRedmineで管理されており、他のソフトウェアでも利用されている。<br> | |||
<br> | |||
Redmineが役立つ場面はソフトウェア開発だけではなく、様々な種類の事業プロジェクト、イベント開催、組織の日常的なタスク管理、顧客の問い合わせ対応の管理、社内業務フローの運用等、広範囲に活用できる。<br> | |||
<br> | |||
現代の業務環境では、タスクの管理やチーム内のコミュニケーションを効率的に行うことが求められるため、<br> | |||
特にリモートワークの普及や複数のチームとの協業が当たり前となる中において、適切なツールの導入は業務の質を大きく向上させる要因となる。<br> | |||
<br> | |||
Redmineはそのような状況に最適なツールである。<br> | |||
<br><br> | |||
== Redmineの主な機能 == | |||
* チケット | |||
*: Redmineの中核機能は、チケットを使用した課題や問題の追跡管理機能である。 | |||
*: やるべき作業をチケットとして登録する。 | |||
*: 課題、タスク、バグ等のしなければならない物事をチケットに登録して、作業を進めたらチケットを更新する。 | |||
*: チケットには担当者や期日を設定できるため、誰がどのタスクをいつまでにしなければならないのか、ひと目でわかるようになる。 | |||
<br> | |||
* ガントチャート | |||
*: プロジェクトを管理するために、課題を細かい作業単位に分け、全体の作業の流れと進捗を視覚的につかめるように並べた図をガントチャートと呼ぶ。 | |||
*: Redmineはガントチャート機能を備えている。 | |||
*: チケットを登録する時に開始日と期日を入力すると、チケットが自動的にガントチャートに反映され、作業の順番、予定、進捗がひと目で確認できるようになる。 | |||
<br> | |||
* Wiki | |||
*: プロジェクトや組織に関する文書やメモ等、用途を問わず作成できる。 | |||
*: 複数のページを作成して、ページを相互にリンクすることも簡単にできる。 | |||
*: また、編集履歴が残るため、比較や復元も容易にできる。 | |||
<br> | |||
* バージョン管理システムの連携 | |||
*: SubversionやGit等のバージョン管理システムと連携できる。 | |||
*: コミットの履歴やリポジトリ内のファイルに内容等がRedmineの画面で参照できる。 | |||
*: ソフトウェア開発やシステム開発のプロジェクトを運営するときに便利な機能である。 | |||
<br><br> | <br><br> | ||
== Rubyのインストール == | == Rubyのインストール == | ||
Rubyのインストールについては、[[インストール - Ruby]]のページを参照すること。<br> | |||
sudo | <br><br> | ||
== Redmineのインストール == | |||
一般的に、最新のRedmineをインストールする。<br> | |||
Redmineは、6ヶ月ごとに新しいバージョンがリリースされており、実用的でかつ安定している。<br> | |||
リポジトリのtrunkからチェックアウトした開発版は、Ruby on Railsに精通し、かつ最新の開発に追従する必要がない限りは非推奨である。<br> | |||
<br> | |||
また、trunkは正常に動作しないこともあるため、注意が必要である。<br> | |||
<br> | |||
==== Redmineのインストール ==== | |||
[http://redmine.jp/download/ Redmineの公式Webサイト]にアクセスして、Redmineをダウンロードする。<br> | |||
ダウンロードしたファイルを展開して、任意のディレクトリに配置する。<br> | |||
<br> | |||
==== 空のデータベースとユーザの作成 ==== | |||
* MySQLの場合 | |||
CREATE DATABASE redmine CHARACTER SET utf8mb4; | |||
CREATE USER 'redmine'@'localhost' IDENTIFIED BY '<パスワード>'; | |||
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost'; | |||
※ MySQL 5.5.2以前の場合、utf8mb4ではなくutf8を指定すること。 | |||
<br> | |||
* PostgreSQLの場合 | |||
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '<パスワード>' NOINHERIT VALID UNTIL 'infinity'; | |||
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine; | |||
<br> | |||
==== データベースの接続の設定 ==== | |||
Redmineのインストールディレクトリにあるconfig/database.example.ymlファイルをコピーして、config/database.ymlファイルを作成する。<br> | |||
次に、config/database.ymlファイルを編集して、"production"環境用のデータベースの設定を行う。<br> | |||
<br> | |||
* MySQLの場合 | |||
production: | |||
adapter: mysql2 | |||
database: <上記で作成したデータベース名 例. redmine> | |||
host: <上記で指定したホスト名 例. localhost> | |||
port: <ポート番号 例. 3306> | |||
username: <上記で作成したユーザ名 例. redmine> | |||
password: "<MySQLにおけるredmineユーザのパスワード>" | |||
encoding: utf8mb4 | |||
pool: 5 | |||
schema_search_path: public | |||
socket: <MySQLのソケットファイルのフルパス> | |||
<br> | |||
* PostgreSQLの場合 | |||
production: | |||
adapter: postgresql | |||
database: <上記で作成したデータベース名 例. redmine> | |||
host: <上記で指定したホスト名 例. localhost> | |||
username: <上記で作成したユーザ名 例. redmine> | |||
password: "<PostgreSQLにおけるredmineユーザのパスワード>" | |||
encoding: utf8 | |||
schema_search_path: <データベーススキーマ (デフォルト: public)> | |||
socket: <PostgreSQLのソケットファイルのフルパス> | |||
<br> | |||
==== Redmineに依存するソフトウェアのインストール ==== | |||
<u>MySQL等を使用する場合、mysql2をインストールするために、~/.profileファイル等へMySQLへの環境変数<code>PATH</code>を追記する必要がある。</u><br> | |||
vi ~/.profile | |||
<br> | |||
# ~/.profileファイル | |||
export PATH="/<MySQLのインストールディレクトリ>/bin" | |||
<br> | |||
Redmineは、RubyGemの依存関係を管理するために、Bundlerを使用している。<br> | |||
そのため、まず、Bundlerをインストールする。<br> | |||
gem install bundler | |||
または | |||
sudo gem install bundler | |||
<br> | |||
Redmineのインストールディレクトリに移動して、Redmineの実行に必要な全てのgemをインストールする。<br> | |||
bundle config set --local without 'development test' | |||
bundle install | |||
または | |||
sudo bundle config set --local without 'development test' | |||
sudo bundle install | |||
<br> | |||
==== データベースアダプタ ==== | |||
Redmineは、データベースの設定ファイルであるconfig/database.ymlファイルを読み取り、必要なデータベースアダプタを自動的にインストールする。<br> | |||
(例. mysql2のみを使用するように設定した場合は、mysql2 gemのみがインストールされる)<br> | |||
もし、config/database.ymlファイルを編集してデータベースアダプタの追加や削除を行った後は、必ず、<code>bundle install --without development test ...略</code>を実行する。<br> | |||
<br> | |||
==== 独自の依存関係の設定 (Gemfile.local) ==== | |||
もし、Redmine本体が使用しないgem(例. puma、fcgi)もロードする場合は、Gemfile.localファイルをRedmineのインストールディレクトリに作成する。<br> | |||
これは、<code>bundle install</code>コマンド実行時にインストールされる。<br> | |||
# Gemfile.localファイル | |||
gem 'puma' | |||
<br> | |||
==== セッションストア秘密鍵の生成 ==== | |||
Railsはセッションハイジャックを防ぐため、セッション情報を格納するcookieをエンコードしている。<br> | |||
この処理で使用されるランダムなキーを生成する。<br> | |||
bundle exec rake generate_secret_token | |||
<br> | |||
また、秘密鍵は、config/secrets.ymlファイルに格納することもできる。<br> | |||
<br> | |||
==== データベースのテーブル等の作成 ==== | |||
データベースに、Redmineに必要なテーブルを作成する。<br> | |||
<br> | |||
<u>Redmineのインストールディレクトリに移動して</u>、以下に示すコマンドを実行する。<br> | |||
これにより、マイグレーションが1つずつ実行およびテーブルが作成されて、更に権限のデータ一式と管理者アカウント(admin)が作成される。<br> | |||
RAILS_ENV=production bundle exec rake db:migrate | |||
<br> | |||
==== デフォルトデータ ==== | |||
デフォルトデータをデータベースに追加する。<br> | |||
RAILS_ENV=production bundle exec rake redmine:load_default_data | |||
<br> | |||
各言語のデフォルトデータにおいて、言語の選択が求められる。<br> | |||
なお、上記のコマンドにおいて、<code>REDMINE_LANG</code>オプションを指定する場合、言語の選択を求められることなく自動的に処理が進められる。<br> | |||
RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_data | |||
<br> | |||
==== ディレクトリおよびファイルのパーミッション ==== | |||
Redmineを実行するOSのユーザーは、以下に示すディレクトリの書き込み権限が必要である。<br> | |||
* files (添付ファイルの保存ディレクトリ) | |||
* log (Redmineのログファイル @production.log@) | |||
* tmp (これらのディレクトリが無ければ作成すること) | |||
* tmp/pdf (これらのディレクトリが無ければ作成すること) | |||
* public/plugin_assets (プラグインが使用する画像やCSS) | |||
<br> | |||
例. redmineユーザとしてソフトウェアを実行する場合 | |||
mkdir -p tmp tmp/pdf public/plugin_assets | |||
chown -R redmine:redmine files log tmp public/plugin_assets | |||
chmod -R 755 files log tmp public/plugin_assets | |||
※注意 | |||
これらのディレクトリが既に存在する場合(バックアップからリストアした場合等)、ファイルに実行権限が不可されていないことを確認する。 | |||
find files log tmp public/plugin_assets -type f -exec chmod -x {} + | |||
<br> | |||
==== Redmineの起動 ==== | |||
WEBrickを使用してRedmineを起動する。<br> | |||
bundle exec rails server -e production | |||
<br> | |||
WEBrickが正常に起動した後、Webブラウザから http://localhost:3000/ にアクセスする。<br> | |||
<br> | |||
デフォルトのシステム管理者アカウントは、以下の通りである。<br> | |||
* ログインID | |||
*: admin | |||
* パスワード | |||
*: admin | |||
<br> | |||
<u>※注意</u><br> | |||
<u>WEBrickは開発時に使用すものであり、通常の運用には適していないため、動作確認以外には使用しないこと。</u><br> | |||
<u>本番運用においては、Passenger(mod_rails)、FCGI、Rackサーバ(Unicorn, Thin, Puma,hellip等)の使用を推奨する。</u><br> | |||
<br><br> | |||
== NginXとの連携 == | |||
==== NginXのインストール ==== | |||
NginXのビルドに必要なライブラリをインストールする。<br> | |||
sudo zypper install libxslt-devel pcre2-devel gd-devel | |||
libcurl-devel # Passengerを使用する場合 | |||
kernel-source kernel-devel # AIOを使用する場合 | |||
<br> | <br> | ||
[https:// | 必要ならば、[https://www.openssl.org/source/ OpenSSLの公式Webサイト]にアクセスして、OpenSSL(1.X.Y)のソースコードをダウンロードする。<br> | ||
ダウンロードしたファイルを解凍する。<br> | ダウンロードしたファイルを解凍する。<br> | ||
tar xf | tar xf openssl-<バージョン> | ||
<br> | |||
* Digest認証モジュールを使用する場合 | |||
*: NginXのソースコードと一緒に配布されていないため、別途インストールする必要がある。<br> | |||
*: [https://github.com/atomx/nginx-http-auth-digest Digest認証モジュールのGithub]にアクセスして、ソースコードをダウンロードする。<br> | |||
*: ダウンロードしたファイルを解凍する。<br> | |||
*: <code>tar xf nginx-http-auth-digest-<バージョン>.tar.gz</code> | |||
*: <br> | |||
*: または、<code>git clone</code>コマンドを実行して、ソースコードをダウンロードする。<br> | |||
*: <code>git clone https://github.com/atomx/nginx-http-auth-digest.git</code> | |||
<br> | |||
[https://nginx.org/en/download.html NginXの公式Webサイト]にアクセスして、NginXのソースコードをダウンロードする。<br> | |||
ダウンロードしたファイルを解凍する。<br> | |||
tar xf nginx-<バージョン>.tar.xz | |||
<br> | |||
NginXおよびNginX向けPassangerをビルドおよびインストールする。<br> | |||
passenger-install-nginx-module | |||
<br> | |||
手順が表示されるので、[Enter]キーを押下して次へ進む。<br> | |||
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。<br> | |||
<br> | |||
NginXのソースコードがあるディレクトリを入力して、[Enter]キーを押下する。<br> | |||
次に、NginXのインストールディレクトリを入力して、[Enter]キーを押下する。<br> | |||
<br> | |||
最後に、<code>configure</code>スクリプトのオプションを、以下に示すように指定する。<br> | |||
改行文字(<code>\</code>)が使用できないことに注意する。<br> | |||
--sbin-path=/<NginXのインストールディレクトリ>/sbin/nginx --conf-path=/<NginXのインストールディレクトリ>/etc/nginx.conf --pid-path=/<NginXのインストールディレクトリ>/nginx.pid --modules-path=/<NginXのインストールディレクトリ>/modules/ --error-log-path=/<NginXのインストールディレクトリ>/log/error.log --http-log-path=/<NginXのインストールディレクトリ>/log/access.log --lock-path=/<NginXのインストールディレクトリ>/nginx.lock --http-client-body-temp-path=/<NginXのインストールディレクトリ>/tmp --http-proxy-temp-path=/<NginXのインストールディレクトリ>/proxy --http-fastcgi-temp-path=/<NginXのインストールディレクトリ>/fastcgi --http-uwsgi-temp-path=/<NginXのインストールディレクトリ>/uwsgi --http-scgi-temp-path=/<NginXのインストールディレクトリ>/scgi --with-perl_modules_path=/<NginXのインストールディレクトリ>/Perl --with-threads --with-file-aio --with-pcre --with-pcre-jit --with-http_v2_module --with-http_ssl_module --with-http_addition_module --with-http_realip_module --with-http_flv_module --with-http_random_index_module --with-http_degradation_module --with-http_slice_module --with-http_dav_module --with-http_mp4_module --with-http_xslt_module --with-http_xslt_module=dynamic --with-http_image_filter_module --with-http_image_filter_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_secure_link_module --with-http_stub_status_module --with-http_sub_module --with-http_perl_module --with-http_perl_module=dynamic --with-mail --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-compat --user=<任意のユーザ名 例. nginx> --group=<任意のグループ名 例. nginx> --add-module=<Digest認証モジュールのソースコードがあるディレクトリ> | |||
<br> | |||
Passengerのビルドが開始する。<br> | |||
ビルドに成功した時、<u>Passengerを組み込まれた</u>nginx.confの設定が表示される。<br> | |||
<syntaxhighlight lang="nginx"> | |||
http { | |||
# ...略 | |||
passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17; | |||
passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0; | |||
# ...略 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== NginXの設定 ==== | |||
NginXの設定ファイル(nginx.conf)において、<code>http</code>ディレクティブに、上記の設定が記述されているか確認する。<br> | |||
vi nginx.conf | |||
<br> | |||
<syntaxhighlight lang="nginx"> | |||
# nginx.confファイル | |||
http { | |||
# ...略 | |||
passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17; | |||
passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0; | |||
# ...略 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 仮想ホストの構築 ==== | |||
NginXの設定ファイル(nginx.conf)において、<code>http</code>ディレクティブに、以下に示す設定を記述する。<br> | |||
vi nginx.conf | |||
<br> | |||
<syntaxhighlight lang="nginx"> | |||
# nginx.confファイル | |||
http { | |||
# ...略 | |||
include /<NginXのインストールディレクトリ>/etc/conf.d/*.conf; | |||
include /<NginXのインストールディレクトリ>/etc/vhosts.d/*.conf; | |||
# ...略 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
次に、NginXの仮想ホストファイルを作成する。<br> | |||
vi /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.conf | |||
<br> | |||
<syntaxhighlight lang="nginx"> | |||
# /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.confファイル | |||
# Ruby Application server Unicorn | |||
upstream redmine { | |||
server unix:/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock; | |||
} | |||
server { | |||
listen 80; | |||
server_name redmine; | |||
root /<Redmineのインストールディレクトリ>/public; | |||
passenger_enabled on; | |||
client_max_body_size 10m; # Max attachemnt size | |||
# for redmine + unicorn | |||
location / { | |||
alias /<Redmineのインストールディレクトリ>/public; | |||
try_files $uri/index.html $uri.html $uri @redmine; | |||
} | |||
location @redmine { | |||
proxy_redirect off; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
proxy_set_header Host $http_host; | |||
proxy_connect_timeout 60; | |||
proxy_read_timeout 60; | |||
proxy_send_timeout 600; | |||
proxy_pass http://redmine; | |||
} | |||
# redirect server error pages to the static page /50x.html | |||
error_page 500 502 503 504 /50x.html; | |||
location = /50x.html { | |||
root html; | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== httpsの使用 ==== | |||
自己証明書を作成する。<br> | |||
* 秘密鍵の作成(パスフレーズなし) | |||
*: ファイル名: server.key | |||
*: <code>openssl genrsa -out server.key 2048</code> | |||
*: <br> | |||
* 証明書署名要求(CSR: Certificate Signing Request)の作成 | |||
*: ファイル名: server.csr | |||
*: <code>openssl req -utf8 -new -key server.key -out server.csr</code> | |||
*: 以下に示す項目を入力する。 | |||
*: <br> | |||
*: Country Name (2 letter code) [XX]: <--- 国(ジャップならばJP) | |||
*: State or Province Name (full name) []: <--- 県 | |||
*: Locality Name (eg, city) [Default City]: <--- 市 | |||
*: Organization Name (eg, company) [Default Company Ltd]: <--- 会社・組織 | |||
*: Organizational Unit Name (eg, section) []: <--- 部門(未入力可) | |||
*: Common Name (eg, your name or your server's hostname) []:alfa.torutk.com <--- サーバドメイン名(未入力可) | |||
*: Email Address []: <--- 管理者メール(未入力可) | |||
*: | |||
*: Please enter the following 'extra' attributes to be sent with your certificate request | |||
*: A challenge password []: <-- (未入力可) | |||
*: An optional company name []: <-- (未入力可) | |||
*: <br> | |||
* ubject Alternative Name(SAN)情報の作成 | |||
*: ファイル名: san.txt | |||
*: まず、最近のWebブラウザでは、Subject Alternative Name(SAN)を含めないとアクセスができないため、SAN情報をテキストファイルに記述する。 | |||
*: また、ワイルドカードを使用して、複数のホスト名に対応させることもできる。 | |||
*: <code>vi san.txt</code> | |||
*: <br> | |||
*: <code># san.txtファイル</code> | |||
*: <code>subjectAltName = DNS:*.torutk.com</code> | |||
*: <br> | |||
* 自己署名証明書の作成 | |||
*: ファイル名: server.crt | |||
*: <code>openssl x509 -in server.csr -out server.crt -extfile san.txt -req -signkey server.key -days 3650</code> | |||
<br> | |||
上記で作成した秘密鍵と自己署名証明書を、任意の場所に配置する。<br> | |||
* server.key | |||
* server.crt | |||
<br> | |||
Nginx設定ファイルの作成または編集する。<br> | |||
vi nginx.conf | |||
<br> | |||
<syntaxhighlight lang="nginx"> | |||
# nginx.confファイル | |||
upstream unicorn { | |||
server unix:/<Redmineのインストールディレクトリ>/tmp/unicorn.sock; | |||
} | |||
server { | |||
listen 80 default_server; | |||
listen [::]:80 default_server; | |||
server_name _; | |||
return 301 https://$host$request_uri; | |||
} | |||
server { | |||
listen 443 ssl http2 default_server; | |||
listen [::]:443 ssl http2 default_server; | |||
server_name _; | |||
root /<Redmineのインストールディレクトリ>/public; | |||
ssl_certificate "<自己署名証明書ファイルのパス 例. /etc/pki/nginx/server.crt">; | |||
ssl_certificate_key "<秘密鍵ファイルのパス 例. /etc/pki/nginx/private/server.key">; | |||
ssl_session_cache shared:SSL:1m; | |||
ssl_session_timeout 10m; | |||
ssl_ciphers PROFILE=SYSTEM; | |||
ssl_prefer_server_ciphers on; | |||
include <Nginxの設定ファイル群があるディレクトリ 例. /etc/nginx/conf.d/*.conf>; | |||
client_max_body_size 10m; | |||
location / { | |||
try_files $uri/index.html $uri.html $uri @redmine; | |||
} | |||
location @redmine { | |||
proxy_redirect off; | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
proxy_set_header Host $http_host; | |||
proxy_connect_timeout 60; | |||
proxy_read_timeout 60; | |||
proxy_send_timeout 600; | |||
proxy_pass http://redmine; | |||
} | |||
error_page 404 /404.html; | |||
location = /40x.html { | |||
} | |||
error_page 500 502 503 504 /50x.html; | |||
location = /50x.html { | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== Apache2との連携 == | |||
==== Phusion Passengerとは ==== | |||
Railsシステムを実行するためのApacheモジュールである。<br> | |||
<br> | |||
==== メリット ==== | |||
Redmine等のRuby on RailsシステムをPhusion Passenger([http://www.modrails.com/ mod_rails for Apache])を使用して、Apache上で稼働させる。<br> | |||
これにより、運用の簡素化、複数インスタンスを並列稼働させることによるレスポンスの改善が期待できる。<br> | |||
<br> | |||
特徴<br> | |||
* Apache2を起動するだけでRailsシステムが使用できる。<br>Apache2のモジュールとして実装されており、別途デーモンを起動する必要が無い。<br>Railsシステム用の起動スクリプトは不要である。 | |||
* TCPポートを消費しない。 | |||
* Railsシステムのデプロイが簡素化される。(PHPのように、ファイルのアップロードのみで出来る) | |||
* サーバのメモリが節約できる。<br>Railsインスタンスは必要なタイミングで生成する。<br>また、一定時間アクセスがなければ、インスタンスを終了させる。 | |||
<br> | |||
==== 手順 ==== | |||
インストール手順は、次の通りである。<br> | |||
* ビルドに必要なライブラリをインストールする。 | |||
* Ruby向けにPassengerをインストールする。 | |||
* Apache2向けのPassangerモジュールをビルドする。 | |||
* httpd.confを変更する。 | |||
* 仮想ホストとして構築する場合は、仮想ホストファイルを作成する。 | |||
<br> | |||
==== ビルドに必要なライブラリのインストール ==== | |||
sudo zypper install libcurl-devel | |||
<br> | |||
==== Ruby向けPassengerのインストール ==== | |||
gem install passenger | |||
<br> | |||
==== Apache2向けPassangerモジュールのビルド ==== | |||
Apache2をソースコードからビルドおよびインストールしている場合、環境変数APXS2および環境変数PATHを手動で設定する必要がある。<br> | |||
これにより、Apache2のヘッダファイル、APRを探索してインストールすることができる。<br> | |||
<br> | |||
# ~/.profileファイル | |||
export APXS2=/<Apache2のインストールディレクトリ>/bin/apxs | |||
export PATH=/<Apache2のインストールディレクトリ>/bin:$PATH | |||
<br> | |||
Apache2向けのPassangerモジュールをビルドする。<br> | |||
passenger-install-apache2-module | |||
<br> | |||
手順が表示されるので、[Enter]キーを押下して次へ進む。<br> | |||
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。<br> | |||
Passengerのビルドが開始する。<br> | |||
<br> | |||
ビルドに成功した時、Passengerを組み込むためのhttpd.confの設定が表示される。<br> | |||
# 出力例 | |||
LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so | |||
<IfModule mod_passenger.c> | |||
PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン> | |||
PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby | |||
</IfModule> | |||
<br> | |||
==== Apache2の設定 (httpd.confファイルの変更) ==== | |||
Apache2の設定ファイル(httpd.conf)において、上記セクションに記述したPassengerを組み込むための設定を追記する。<br> | |||
<syntaxhighlight lang="apache"> | |||
# httpd.confファイル (設定例) | |||
# ...略 | |||
LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so | |||
<IfModule mod_passenger.c> | |||
PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン> | |||
PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby | |||
</IfModule> | |||
</syntaxhighlight> | |||
<br> | |||
==== 仮想ホストとして構築する場合 ==== | |||
<syntaxhighlight lang="apache"> | |||
# vhost-redmine.confファイル (設定例) | |||
<VirtualHost *:80> | |||
ServerName redmine | |||
# DocumentRoot: The directory out of which you will serve your | |||
# documents. By default, all requests are taken from this directory, but | |||
# symbolic links and aliases may be used to point to other locations. | |||
DocumentRoot /<Redmineのインストールディレクトリ>/public | |||
# if not specified, the global error log is used | |||
ErrorLog /<Redmineのインストールディレクトリ>/log/redmine-error_log | |||
CustomLog /<Redmineのインストールディレクトリ>/log/redmine-access_log combined | |||
# don't loose time with IP address lookups | |||
HostnameLookups Off | |||
# needed for named virtual hosts | |||
UseCanonicalName Off | |||
# configures the footer on server-generated documents | |||
ServerSignature On | |||
# Redmineの画像ファイルおよびCSSファイル等へのアクセスを許可する設定 | |||
# Apache 2.4のデフォルトではサーバ上の全ファイルへのアクセスが禁止されている | |||
<Directory "/<Redmineのインストールディレクトリ>/public"> | |||
# Possible values for the Options directive are "None", "All", | |||
# or any combination of: | |||
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews | |||
# Note that "MultiViews" must be named *explicitly* --- "Options All" | |||
# doesn't give it to you. | |||
# | |||
# The Options directive is both complicated and important. Please see | |||
# http://httpd.apache.org/docs/2.4/mod/core.html#options | |||
# for more information. | |||
Options Indexes FollowSymLinks | |||
# AllowOverride controls what directives may be placed in .htaccess files. | |||
# It can be "All", "None", or any combination of the keywords: | |||
# Options FileInfo AuthConfig Limit | |||
AllowOverride None | |||
# Controls who can get stuff from this server. | |||
Require all granted | |||
</Directory> | |||
</VirtualHost> | |||
</syntaxhighlight> | |||
<br><br> | |||
== Unicornの設定 == | |||
==== Unicornとは ==== | |||
Unicornは、Ruby on RailsアプリケーションのためのUnicorn Webサーバ(Rackサーバ)である。<br> | |||
HTTPサーバであり、高速かつスケーラブルなWebアプリケーションを提供することを目的としており、Redmineを効率的かつスムーズに実行するために使用される。<br> | |||
<br> | |||
Unicornは、Unicorn WebサーバとRedmineを統合することにより、Redmineをよりスムーズかつ安定した方法で実行することができる。<br> | |||
これにより、Redmineを使用するユーザは、より優れたパフォーマンスと高い可用性を得ることができる。<br> | |||
<br> | <br> | ||
==== Unicornのインストール ==== | |||
./ | UnicornはRubyモジュール(gem)として提供されているため、bundlerでインストールする。<br> | ||
Redmineをインストールしたディレクトリに移動して、Gemfile.localファイルを作成する。<br> | |||
cd <Redmineのインストールディレクトリ> | |||
vi Gemfile.local | |||
<br> | |||
# /<Redmineのインストールディレクトリ>/Gemfile.local | |||
gem "unicorn" | |||
<br> | |||
Unicornをインストールする。<br> | |||
bundle update | |||
<br> | |||
==== 単独起動 ==== | |||
Unicornは、マスタープロセス1つにワーカープロセスが複数という構成で実行する。<br> | |||
<br> | |||
Unicornを起動して、Redmineの動作を確認する。<br> | |||
bundle exec unicorn_rails -l 3000 -E production | |||
<br> | |||
Webブラウザから http://localhost:3000 にアクセスして、動作を確認する。<br> | |||
<br> | |||
各オプションを、以下に示す。<br> | |||
* --listen -l <[アドレス:]ポート> | |||
*: ソケットのエンドポイントを指定 | |||
* --config-file -c <ファイル> | |||
*: 設定ファイルを指定 | |||
* -D | |||
*: デーモンプロセス起動指定 | |||
* -E <RAILS_ENV> | |||
*: production等を指定 | |||
<br> | |||
Unicornの終了手順を、以下に示す。<br> | |||
* フォアグラウンドプロセスとして起動した場合 | |||
*: [Ctrl] + [C]キーを同時押下して停止する。 | |||
* デーモンプロセスとして起動した場合 | |||
*: シグナルINT(強制終了)またはQUIT(グレースフル停止)をマスタープロセスに送信する。 | |||
*: シグナルINTは、ワーカープロセスを終了させて自らも終了する。 | |||
<br> | |||
==== 設定ファイル(unicorn.rb)の作成 ==== | |||
Redmineのインストールディレクトリに移動して、configディレクトリにunicorn.rbファイルを作成する。<br> | |||
cd /<Redmineのインストールディレクトリ>/config | |||
vi unicorn.rb | |||
<br> | |||
<syntaxhighlight lang="ruby"> | |||
# /<Redmineのインストールディレクトリ>/config/unicorn.rb | |||
# -*- coding: utf-8 -*- | |||
# 応答性を良好に保つには、コア数以上のワーカーを指定する | |||
# ただし、仮想環境では、CPU使用率とメモリ使用量を見ながらワーカー数を許容範囲まで増やす | |||
worker_processes 2 | |||
# リクエスト待ち受け口 | |||
# TCPとUNIXドメインとが指定可能 | |||
# 複数のプロトコルを列挙することで複数のプロトコルおよびポートを扱うことができる | |||
## UNIXドメインソケットを使用する場合 | |||
listen "/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock", :backlog => 32 | |||
## TCPソケットを使用する場合 | |||
#listen 8080, :tcp_nopush => true | |||
timeout 30 | |||
pid "/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid" | |||
stderr_path '/<Redmineのインストールディレクトリ>/log/unicorn.stderr.log' | |||
stdout_path '/<Redmineのインストールディレクトリ>/log/unicorn.stdout.log' | |||
# マスタープロセス起動時にアプリケーションをロードする(true時) | |||
# ワーカープロセス側でロードをしないのでメモリ消費、応答性良好になる | |||
# ただし、ソケットはfork後に開きなおす必要あり | |||
# HUPシグナルでアプリケーションはロードされない | |||
preload_app true | |||
# unicornと同一ホスト上のクライアントとのコネクション限定で、維持されているかをアプリケーションを呼ぶ前にチェックする | |||
check_client_connection false | |||
before_fork do |server, worker| | |||
# Railsでpreload_appをtrueにしているときは強く推奨 | |||
defined?(ActiveRecord::Base) and | |||
ActiveRecord::Base.connection.disconnect! | |||
# new master phase out the old master | |||
old_pid = "#{server.config[:pid]}.oldbin" | |||
if old_pid != server.pid | |||
begin | |||
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU | |||
Process.kill(sig, File.read(old_pid).to_i) | |||
rescue Errno::ENOENT, Errno::ESRCH | |||
end | |||
end | |||
end | |||
after_fork do |server, worker| | |||
# Railsでpreload_appをtrueにしているときは必須 | |||
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection | |||
end | |||
</syntaxhighlight> | |||
<br> | |||
* listen | |||
** backlog | |||
**: ワーカーが作業中であっても、コネクションのリクエストを受理して待機しておくことができる個数である。 | |||
**: デフォルトは、1024である。 | |||
**: 例えば、1件平均30[mS]で捌く処理に対して1000個バックログによる待ちがある時、新たにリクエストした処理は結果が返るまで30[S]待たされることになる。 | |||
**: その場合、コネクションを受け付けずにエラーにした方がよいということがある。 | |||
**: <br> | |||
** tcp_nopush | |||
**: TCP_CORK(Linux)を制御する。 | |||
**: デフォルトは、<code>false</code>である。 | |||
**: <code>true</code>にする場合、TCPフレームの断片が小出しに送られることを抑止するため、リモートにあるNginXのタスクを早めに起こさずに済ませる。 | |||
*: <br> | |||
* timeout | |||
*: ワーカーがこの時間[秒]以上処理に費やす時はプロセスを落とす。 | |||
*: デフォルトは、60秒である。 | |||
*: 大抵の処理は60秒以内に完了するが、それ以上に時間の掛かる処理がある場合は処理時間に応じて値を増やす。 | |||
*: <br> | |||
*: 例えば、サイズの大きい添付ファイルのアップロードおよびダウンロードが該当する。 | |||
*: 添付ファイルのサイズ上限のファイルを実際にアップロードおよびダウンロードすることにより、それに掛かる時間を計測して、許容できる処理時間を設定する。 | |||
*: <br> | |||
*: ここで、Unicornのタイムアウト値とNginXのタイムアウト値が不整合だと動作が不安定となるため、両者のタイムアウト値を整合させるようにする。 | |||
*: (例. Unicornのタイムアウト値 + αをNginXのタイムアウト値にする。この時、αは1〜2秒程度等) | |||
*: <br> | |||
* pid | |||
*: Unicornを起動した時、そのプロセスIDを記録しておくファイルを指定する。 | |||
*: <br> | |||
* stderr_path および stdout_path | |||
*: Redmineのインストールディレクトリ下のlogディレクトリにログファイルを生成する。 | |||
*: <br> | |||
* preload_app | |||
*: <code>true</code>に設定する場合、マスタープロセス起動時にアプリケーションをロードして、ワーカープロセスをフォークするとアプリケーションが実行可能となる。 | |||
*: 複数のワーカープロセスでコードを共有するため、メモリ使用効率が良くなる。 | |||
*: <u>デメリットは、ワーカープロセスを再起動してもアプリケーションはロードされないことである。</u> | |||
*: <br> | |||
* before_fork | |||
*: ワーカープロセスをフォークする前に、マスタープロセスによって呼ばれる。 | |||
*: USR2シグナルで新旧マスタープロセスが共存する場合、旧マスタープロセスにQUITシグナルを送信して終了させる。 | |||
*: <br> | |||
* after_fork | |||
*: ワーカープロセスがフォークされた後に呼び出される。 | |||
<br> | |||
Unicornの設定ファイルを使用して、Unicornを起動する。<br> | |||
cd /<Redmineのインストールディレクトリ> | |||
bundle exec unicorn_rails -c config/unicorn.rb -E production | |||
<br> | |||
==== Unicornのサービスユニットファイルの作成 ==== | |||
* [Unit]セクション | |||
** Afterキー | |||
**: Redmine(Unicorn)は、起動時にデータベースに接続できない場合は、エラーとなる。 | |||
**: そのため、mysql.serviceまたはmariadb.serviceを実行した後に、redmine-unicorn.serviceが起動するように順序を指定する。 | |||
*: <br> | |||
* [Service]セクション | |||
** Userキー および Groupキー | |||
**: 起動プロセスの実行ユーザおよびグループを指定する。 | |||
**: Systemdサービスで<code>ExecStart</code>により実行したプロセスの実行ユーザおよびグループをroot以外にする場合は指定する。 | |||
**: <br> | |||
** WorkingDirectory | |||
**: Redmineのインストールディレクトリを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。 | |||
**: <br> | |||
** PIDFile | |||
**: UnicornのプロセスIDファイルを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。 | |||
**: <br> | |||
** PermissionsStartOnly | |||
**: <code>true</code>を指定する場合、<code>User</code>キーおよび<code>Gourp</code>を指定していたとしても、<code>ExecStartPre</code>キーの値は、root権限で実行される。 | |||
<br> | |||
sudo vi /etc/systemd/system/redmine-unicorn.service | |||
<br> | |||
<syntaxhighlight lang="ini"> | |||
# /etc/systemd/system/redmine-unicorn.serviceファイル | |||
[Unit] | |||
Description=Redmine Unicorn Server | |||
# MySQLおよびMariaDBを通常インストールした場合 | |||
After=mysqld.service | |||
[Service] | |||
User=<ユーザ名> | |||
Group=<グループ名> | |||
WorkingDirectory=<Redmineのインストールディレクトリ> | |||
Environment=RAILS_ENV=production | |||
SyslogIdentifier=redmine-unicorn | |||
PIDFile=/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid | |||
# MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合 | |||
ExecStartPre=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server start | |||
# Rubyを通常インストールした場合 | |||
ExecStart=/<Rubyのインストールディレクトリ>/bin//bundle exec "/<Rubyのインストールディレクトリ>/unicorn_rails -c config/unicorn.rb -E production -D" | |||
# Rubyを任意のインストールディレクトリにインストールした場合 | |||
ExecStart=/bin/bash -c "PATH=/<Rubyのインストールディレクトリ>/bin:$PATH /<Rubyのインストールディレクトリ>/bin/bundle exec /<Rubyのインストールディレクトリ>/bin/unicorn_rails -c config/unicorn.rb -E production -D" | |||
ExecStop=/usr/bin/kill -QUIT $MAINPID | |||
# MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合 | |||
ExecStopPost=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server stop | |||
ExecReload=/bin/kill -USR2 $MAINPID | |||
[Install] | |||
WantedBy=multi-user.target | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ: | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:Web]] |
2024年12月26日 (木) 08:59時点における最新版
概要
Redmineとは、課題管理や情報共有の機能を備えるプロジェクト運営を支援するためのオープンソースソフトウェアである。
誰でも自由にRedmineをダウンロードし、インストールして利用することができる。
Webアプリケーションとして動作するシステムであるため、Redmineが稼働している環境があり、Webブラウザがあれば、他にソフトウェアをインストールすることなく使用できる。
また、情報が1ヶ所に集約されていますので、どこからでもアクセスでき、複数のメンバでも使用することもできる。
Redmineは、ソフトウェア開発プロジェクトとの親和性が高く、SubversionやGit等のバージョン管理システムと連携できる。
Redmine自体の開発プロジェクトもRedmineで管理されており、他のソフトウェアでも利用されている。
Redmineが役立つ場面はソフトウェア開発だけではなく、様々な種類の事業プロジェクト、イベント開催、組織の日常的なタスク管理、顧客の問い合わせ対応の管理、社内業務フローの運用等、広範囲に活用できる。
現代の業務環境では、タスクの管理やチーム内のコミュニケーションを効率的に行うことが求められるため、
特にリモートワークの普及や複数のチームとの協業が当たり前となる中において、適切なツールの導入は業務の質を大きく向上させる要因となる。
Redmineはそのような状況に最適なツールである。
Redmineの主な機能
- チケット
- Redmineの中核機能は、チケットを使用した課題や問題の追跡管理機能である。
- やるべき作業をチケットとして登録する。
- 課題、タスク、バグ等のしなければならない物事をチケットに登録して、作業を進めたらチケットを更新する。
- チケットには担当者や期日を設定できるため、誰がどのタスクをいつまでにしなければならないのか、ひと目でわかるようになる。
- ガントチャート
- プロジェクトを管理するために、課題を細かい作業単位に分け、全体の作業の流れと進捗を視覚的につかめるように並べた図をガントチャートと呼ぶ。
- Redmineはガントチャート機能を備えている。
- チケットを登録する時に開始日と期日を入力すると、チケットが自動的にガントチャートに反映され、作業の順番、予定、進捗がひと目で確認できるようになる。
- Wiki
- プロジェクトや組織に関する文書やメモ等、用途を問わず作成できる。
- 複数のページを作成して、ページを相互にリンクすることも簡単にできる。
- また、編集履歴が残るため、比較や復元も容易にできる。
- バージョン管理システムの連携
- SubversionやGit等のバージョン管理システムと連携できる。
- コミットの履歴やリポジトリ内のファイルに内容等がRedmineの画面で参照できる。
- ソフトウェア開発やシステム開発のプロジェクトを運営するときに便利な機能である。
Rubyのインストール
Rubyのインストールについては、インストール - Rubyのページを参照すること。
Redmineのインストール
一般的に、最新のRedmineをインストールする。
Redmineは、6ヶ月ごとに新しいバージョンがリリースされており、実用的でかつ安定している。
リポジトリのtrunkからチェックアウトした開発版は、Ruby on Railsに精通し、かつ最新の開発に追従する必要がない限りは非推奨である。
また、trunkは正常に動作しないこともあるため、注意が必要である。
Redmineのインストール
Redmineの公式Webサイトにアクセスして、Redmineをダウンロードする。
ダウンロードしたファイルを展開して、任意のディレクトリに配置する。
空のデータベースとユーザの作成
- MySQLの場合
CREATE DATABASE redmine CHARACTER SET utf8mb4; CREATE USER 'redmine'@'localhost' IDENTIFIED BY '<パスワード>'; GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost'; ※ MySQL 5.5.2以前の場合、utf8mb4ではなくutf8を指定すること。
- PostgreSQLの場合
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '<パスワード>' NOINHERIT VALID UNTIL 'infinity'; CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
データベースの接続の設定
Redmineのインストールディレクトリにあるconfig/database.example.ymlファイルをコピーして、config/database.ymlファイルを作成する。
次に、config/database.ymlファイルを編集して、"production"環境用のデータベースの設定を行う。
- MySQLの場合
production: adapter: mysql2 database: <上記で作成したデータベース名 例. redmine> host: <上記で指定したホスト名 例. localhost> port: <ポート番号 例. 3306> username: <上記で作成したユーザ名 例. redmine> password: "<MySQLにおけるredmineユーザのパスワード>" encoding: utf8mb4 pool: 5 schema_search_path: public socket: <MySQLのソケットファイルのフルパス>
- PostgreSQLの場合
production: adapter: postgresql database: <上記で作成したデータベース名 例. redmine> host: <上記で指定したホスト名 例. localhost> username: <上記で作成したユーザ名 例. redmine> password: "<PostgreSQLにおけるredmineユーザのパスワード>" encoding: utf8 schema_search_path: <データベーススキーマ (デフォルト: public)> socket: <PostgreSQLのソケットファイルのフルパス>
Redmineに依存するソフトウェアのインストール
MySQL等を使用する場合、mysql2をインストールするために、~/.profileファイル等へMySQLへの環境変数PATH
を追記する必要がある。
vi ~/.profile
# ~/.profileファイル export PATH="/<MySQLのインストールディレクトリ>/bin"
Redmineは、RubyGemの依存関係を管理するために、Bundlerを使用している。
そのため、まず、Bundlerをインストールする。
gem install bundler または sudo gem install bundler
Redmineのインストールディレクトリに移動して、Redmineの実行に必要な全てのgemをインストールする。
bundle config set --local without 'development test' bundle install または sudo bundle config set --local without 'development test' sudo bundle install
データベースアダプタ
Redmineは、データベースの設定ファイルであるconfig/database.ymlファイルを読み取り、必要なデータベースアダプタを自動的にインストールする。
(例. mysql2のみを使用するように設定した場合は、mysql2 gemのみがインストールされる)
もし、config/database.ymlファイルを編集してデータベースアダプタの追加や削除を行った後は、必ず、bundle install --without development test ...略
を実行する。
独自の依存関係の設定 (Gemfile.local)
もし、Redmine本体が使用しないgem(例. puma、fcgi)もロードする場合は、Gemfile.localファイルをRedmineのインストールディレクトリに作成する。
これは、bundle install
コマンド実行時にインストールされる。
# Gemfile.localファイル gem 'puma'
セッションストア秘密鍵の生成
Railsはセッションハイジャックを防ぐため、セッション情報を格納するcookieをエンコードしている。
この処理で使用されるランダムなキーを生成する。
bundle exec rake generate_secret_token
また、秘密鍵は、config/secrets.ymlファイルに格納することもできる。
データベースのテーブル等の作成
データベースに、Redmineに必要なテーブルを作成する。
Redmineのインストールディレクトリに移動して、以下に示すコマンドを実行する。
これにより、マイグレーションが1つずつ実行およびテーブルが作成されて、更に権限のデータ一式と管理者アカウント(admin)が作成される。
RAILS_ENV=production bundle exec rake db:migrate
デフォルトデータ
デフォルトデータをデータベースに追加する。
RAILS_ENV=production bundle exec rake redmine:load_default_data
各言語のデフォルトデータにおいて、言語の選択が求められる。
なお、上記のコマンドにおいて、REDMINE_LANG
オプションを指定する場合、言語の選択を求められることなく自動的に処理が進められる。
RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_data
ディレクトリおよびファイルのパーミッション
Redmineを実行するOSのユーザーは、以下に示すディレクトリの書き込み権限が必要である。
- files (添付ファイルの保存ディレクトリ)
- log (Redmineのログファイル @production.log@)
- tmp (これらのディレクトリが無ければ作成すること)
- tmp/pdf (これらのディレクトリが無ければ作成すること)
- public/plugin_assets (プラグインが使用する画像やCSS)
例. redmineユーザとしてソフトウェアを実行する場合 mkdir -p tmp tmp/pdf public/plugin_assets chown -R redmine:redmine files log tmp public/plugin_assets chmod -R 755 files log tmp public/plugin_assets ※注意 これらのディレクトリが既に存在する場合(バックアップからリストアした場合等)、ファイルに実行権限が不可されていないことを確認する。 find files log tmp public/plugin_assets -type f -exec chmod -x {} +
Redmineの起動
WEBrickを使用してRedmineを起動する。
bundle exec rails server -e production
WEBrickが正常に起動した後、Webブラウザから http://localhost:3000/ にアクセスする。
デフォルトのシステム管理者アカウントは、以下の通りである。
- ログインID
- admin
- パスワード
- admin
※注意
WEBrickは開発時に使用すものであり、通常の運用には適していないため、動作確認以外には使用しないこと。
本番運用においては、Passenger(mod_rails)、FCGI、Rackサーバ(Unicorn, Thin, Puma,hellip等)の使用を推奨する。
NginXとの連携
NginXのインストール
NginXのビルドに必要なライブラリをインストールする。
sudo zypper install libxslt-devel pcre2-devel gd-devel libcurl-devel # Passengerを使用する場合 kernel-source kernel-devel # AIOを使用する場合
必要ならば、OpenSSLの公式Webサイトにアクセスして、OpenSSL(1.X.Y)のソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf openssl-<バージョン>
- Digest認証モジュールを使用する場合
- NginXのソースコードと一緒に配布されていないため、別途インストールする必要がある。
- Digest認証モジュールのGithubにアクセスして、ソースコードをダウンロードする。
- ダウンロードしたファイルを解凍する。
tar xf nginx-http-auth-digest-<バージョン>.tar.gz
- または、
git clone
コマンドを実行して、ソースコードをダウンロードする。 git clone https://github.com/atomx/nginx-http-auth-digest.git
- NginXのソースコードと一緒に配布されていないため、別途インストールする必要がある。
NginXの公式Webサイトにアクセスして、NginXのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf nginx-<バージョン>.tar.xz
NginXおよびNginX向けPassangerをビルドおよびインストールする。
passenger-install-nginx-module
手順が表示されるので、[Enter]キーを押下して次へ進む。
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。
NginXのソースコードがあるディレクトリを入力して、[Enter]キーを押下する。
次に、NginXのインストールディレクトリを入力して、[Enter]キーを押下する。
最後に、configure
スクリプトのオプションを、以下に示すように指定する。
改行文字(\
)が使用できないことに注意する。
--sbin-path=/<NginXのインストールディレクトリ>/sbin/nginx --conf-path=/<NginXのインストールディレクトリ>/etc/nginx.conf --pid-path=/<NginXのインストールディレクトリ>/nginx.pid --modules-path=/<NginXのインストールディレクトリ>/modules/ --error-log-path=/<NginXのインストールディレクトリ>/log/error.log --http-log-path=/<NginXのインストールディレクトリ>/log/access.log --lock-path=/<NginXのインストールディレクトリ>/nginx.lock --http-client-body-temp-path=/<NginXのインストールディレクトリ>/tmp --http-proxy-temp-path=/<NginXのインストールディレクトリ>/proxy --http-fastcgi-temp-path=/<NginXのインストールディレクトリ>/fastcgi --http-uwsgi-temp-path=/<NginXのインストールディレクトリ>/uwsgi --http-scgi-temp-path=/<NginXのインストールディレクトリ>/scgi --with-perl_modules_path=/<NginXのインストールディレクトリ>/Perl --with-threads --with-file-aio --with-pcre --with-pcre-jit --with-http_v2_module --with-http_ssl_module --with-http_addition_module --with-http_realip_module --with-http_flv_module --with-http_random_index_module --with-http_degradation_module --with-http_slice_module --with-http_dav_module --with-http_mp4_module --with-http_xslt_module --with-http_xslt_module=dynamic --with-http_image_filter_module --with-http_image_filter_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_secure_link_module --with-http_stub_status_module --with-http_sub_module --with-http_perl_module --with-http_perl_module=dynamic --with-mail --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-compat --user=<任意のユーザ名 例. nginx> --group=<任意のグループ名 例. nginx> --add-module=<Digest認証モジュールのソースコードがあるディレクトリ>
Passengerのビルドが開始する。
ビルドに成功した時、Passengerを組み込まれたnginx.confの設定が表示される。
http {
# ...略
passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17;
passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0;
# ...略
}
NginXの設定
NginXの設定ファイル(nginx.conf)において、http
ディレクティブに、上記の設定が記述されているか確認する。
vi nginx.conf
# nginx.confファイル
http {
# ...略
passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17;
passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0;
# ...略
}
仮想ホストの構築
NginXの設定ファイル(nginx.conf)において、http
ディレクティブに、以下に示す設定を記述する。
vi nginx.conf
# nginx.confファイル
http {
# ...略
include /<NginXのインストールディレクトリ>/etc/conf.d/*.conf;
include /<NginXのインストールディレクトリ>/etc/vhosts.d/*.conf;
# ...略
}
次に、NginXの仮想ホストファイルを作成する。
vi /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.conf
# /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.confファイル
# Ruby Application server Unicorn
upstream redmine {
server unix:/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock;
}
server {
listen 80;
server_name redmine;
root /<Redmineのインストールディレクトリ>/public;
passenger_enabled on;
client_max_body_size 10m; # Max attachemnt size
# for redmine + unicorn
location / {
alias /<Redmineのインストールディレクトリ>/public;
try_files $uri/index.html $uri.html $uri @redmine;
}
location @redmine {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 600;
proxy_pass http://redmine;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
httpsの使用
自己証明書を作成する。
- 秘密鍵の作成(パスフレーズなし)
- ファイル名: server.key
openssl genrsa -out server.key 2048
- 証明書署名要求(CSR: Certificate Signing Request)の作成
- ファイル名: server.csr
openssl req -utf8 -new -key server.key -out server.csr
- 以下に示す項目を入力する。
- Country Name (2 letter code) [XX]: <--- 国(ジャップならばJP)
- State or Province Name (full name) []: <--- 県
- Locality Name (eg, city) [Default City]: <--- 市
- Organization Name (eg, company) [Default Company Ltd]: <--- 会社・組織
- Organizational Unit Name (eg, section) []: <--- 部門(未入力可)
- Common Name (eg, your name or your server's hostname) []:alfa.torutk.com <--- サーバドメイン名(未入力可)
- Email Address []: <--- 管理者メール(未入力可)
- Please enter the following 'extra' attributes to be sent with your certificate request
- A challenge password []: <-- (未入力可)
- An optional company name []: <-- (未入力可)
- ubject Alternative Name(SAN)情報の作成
- ファイル名: san.txt
- まず、最近のWebブラウザでは、Subject Alternative Name(SAN)を含めないとアクセスができないため、SAN情報をテキストファイルに記述する。
- また、ワイルドカードを使用して、複数のホスト名に対応させることもできる。
vi san.txt
# san.txtファイル
subjectAltName = DNS:*.torutk.com
- 自己署名証明書の作成
- ファイル名: server.crt
openssl x509 -in server.csr -out server.crt -extfile san.txt -req -signkey server.key -days 3650
上記で作成した秘密鍵と自己署名証明書を、任意の場所に配置する。
- server.key
- server.crt
Nginx設定ファイルの作成または編集する。
vi nginx.conf
# nginx.confファイル
upstream unicorn {
server unix:/<Redmineのインストールディレクトリ>/tmp/unicorn.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
root /<Redmineのインストールディレクトリ>/public;
ssl_certificate "<自己署名証明書ファイルのパス 例. /etc/pki/nginx/server.crt">;
ssl_certificate_key "<秘密鍵ファイルのパス 例. /etc/pki/nginx/private/server.key">;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
include <Nginxの設定ファイル群があるディレクトリ 例. /etc/nginx/conf.d/*.conf>;
client_max_body_size 10m;
location / {
try_files $uri/index.html $uri.html $uri @redmine;
}
location @redmine {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 600;
proxy_pass http://redmine;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Apache2との連携
Phusion Passengerとは
Railsシステムを実行するためのApacheモジュールである。
メリット
Redmine等のRuby on RailsシステムをPhusion Passenger(mod_rails for Apache)を使用して、Apache上で稼働させる。
これにより、運用の簡素化、複数インスタンスを並列稼働させることによるレスポンスの改善が期待できる。
特徴
- Apache2を起動するだけでRailsシステムが使用できる。
Apache2のモジュールとして実装されており、別途デーモンを起動する必要が無い。
Railsシステム用の起動スクリプトは不要である。 - TCPポートを消費しない。
- Railsシステムのデプロイが簡素化される。(PHPのように、ファイルのアップロードのみで出来る)
- サーバのメモリが節約できる。
Railsインスタンスは必要なタイミングで生成する。
また、一定時間アクセスがなければ、インスタンスを終了させる。
手順
インストール手順は、次の通りである。
- ビルドに必要なライブラリをインストールする。
- Ruby向けにPassengerをインストールする。
- Apache2向けのPassangerモジュールをビルドする。
- httpd.confを変更する。
- 仮想ホストとして構築する場合は、仮想ホストファイルを作成する。
ビルドに必要なライブラリのインストール
sudo zypper install libcurl-devel
Ruby向けPassengerのインストール
gem install passenger
Apache2向けPassangerモジュールのビルド
Apache2をソースコードからビルドおよびインストールしている場合、環境変数APXS2および環境変数PATHを手動で設定する必要がある。
これにより、Apache2のヘッダファイル、APRを探索してインストールすることができる。
# ~/.profileファイル export APXS2=/<Apache2のインストールディレクトリ>/bin/apxs export PATH=/<Apache2のインストールディレクトリ>/bin:$PATH
Apache2向けのPassangerモジュールをビルドする。
passenger-install-apache2-module
手順が表示されるので、[Enter]キーを押下して次へ進む。
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。
Passengerのビルドが開始する。
ビルドに成功した時、Passengerを組み込むためのhttpd.confの設定が表示される。
# 出力例 LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so <IfModule mod_passenger.c> PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン> PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby </IfModule>
Apache2の設定 (httpd.confファイルの変更)
Apache2の設定ファイル(httpd.conf)において、上記セクションに記述したPassengerを組み込むための設定を追記する。
# httpd.confファイル (設定例)
# ...略
LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>
PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby
</IfModule>
仮想ホストとして構築する場合
# vhost-redmine.confファイル (設定例)
<VirtualHost *:80>
ServerName redmine
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
DocumentRoot /<Redmineのインストールディレクトリ>/public
# if not specified, the global error log is used
ErrorLog /<Redmineのインストールディレクトリ>/log/redmine-error_log
CustomLog /<Redmineのインストールディレクトリ>/log/redmine-access_log combined
# don't loose time with IP address lookups
HostnameLookups Off
# needed for named virtual hosts
UseCanonicalName Off
# configures the footer on server-generated documents
ServerSignature On
# Redmineの画像ファイルおよびCSSファイル等へのアクセスを許可する設定
# Apache 2.4のデフォルトではサーバ上の全ファイルへのアクセスが禁止されている
<Directory "/<Redmineのインストールディレクトリ>/public">
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
Options Indexes FollowSymLinks
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
AllowOverride None
# Controls who can get stuff from this server.
Require all granted
</Directory>
</VirtualHost>
Unicornの設定
Unicornとは
Unicornは、Ruby on RailsアプリケーションのためのUnicorn Webサーバ(Rackサーバ)である。
HTTPサーバであり、高速かつスケーラブルなWebアプリケーションを提供することを目的としており、Redmineを効率的かつスムーズに実行するために使用される。
Unicornは、Unicorn WebサーバとRedmineを統合することにより、Redmineをよりスムーズかつ安定した方法で実行することができる。
これにより、Redmineを使用するユーザは、より優れたパフォーマンスと高い可用性を得ることができる。
Unicornのインストール
UnicornはRubyモジュール(gem)として提供されているため、bundlerでインストールする。
Redmineをインストールしたディレクトリに移動して、Gemfile.localファイルを作成する。
cd <Redmineのインストールディレクトリ> vi Gemfile.local
# /<Redmineのインストールディレクトリ>/Gemfile.local gem "unicorn"
Unicornをインストールする。
bundle update
単独起動
Unicornは、マスタープロセス1つにワーカープロセスが複数という構成で実行する。
Unicornを起動して、Redmineの動作を確認する。
bundle exec unicorn_rails -l 3000 -E production
Webブラウザから http://localhost:3000 にアクセスして、動作を確認する。
各オプションを、以下に示す。
- --listen -l <[アドレス:]ポート>
- ソケットのエンドポイントを指定
- --config-file -c <ファイル>
- 設定ファイルを指定
- -D
- デーモンプロセス起動指定
- -E <RAILS_ENV>
- production等を指定
Unicornの終了手順を、以下に示す。
- フォアグラウンドプロセスとして起動した場合
- [Ctrl] + [C]キーを同時押下して停止する。
- デーモンプロセスとして起動した場合
- シグナルINT(強制終了)またはQUIT(グレースフル停止)をマスタープロセスに送信する。
- シグナルINTは、ワーカープロセスを終了させて自らも終了する。
設定ファイル(unicorn.rb)の作成
Redmineのインストールディレクトリに移動して、configディレクトリにunicorn.rbファイルを作成する。
cd /<Redmineのインストールディレクトリ>/config vi unicorn.rb
# /<Redmineのインストールディレクトリ>/config/unicorn.rb
# -*- coding: utf-8 -*-
# 応答性を良好に保つには、コア数以上のワーカーを指定する
# ただし、仮想環境では、CPU使用率とメモリ使用量を見ながらワーカー数を許容範囲まで増やす
worker_processes 2
# リクエスト待ち受け口
# TCPとUNIXドメインとが指定可能
# 複数のプロトコルを列挙することで複数のプロトコルおよびポートを扱うことができる
## UNIXドメインソケットを使用する場合
listen "/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock", :backlog => 32
## TCPソケットを使用する場合
#listen 8080, :tcp_nopush => true
timeout 30
pid "/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid"
stderr_path '/<Redmineのインストールディレクトリ>/log/unicorn.stderr.log'
stdout_path '/<Redmineのインストールディレクトリ>/log/unicorn.stdout.log'
# マスタープロセス起動時にアプリケーションをロードする(true時)
# ワーカープロセス側でロードをしないのでメモリ消費、応答性良好になる
# ただし、ソケットはfork後に開きなおす必要あり
# HUPシグナルでアプリケーションはロードされない
preload_app true
# unicornと同一ホスト上のクライアントとのコネクション限定で、維持されているかをアプリケーションを呼ぶ前にチェックする
check_client_connection false
before_fork do |server, worker|
# Railsでpreload_appをtrueにしているときは強く推奨
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
# new master phase out the old master
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
after_fork do |server, worker|
# Railsでpreload_appをtrueにしているときは必須
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
- listen
- backlog
- ワーカーが作業中であっても、コネクションのリクエストを受理して待機しておくことができる個数である。
- デフォルトは、1024である。
- 例えば、1件平均30[mS]で捌く処理に対して1000個バックログによる待ちがある時、新たにリクエストした処理は結果が返るまで30[S]待たされることになる。
- その場合、コネクションを受け付けずにエラーにした方がよいということがある。
- tcp_nopush
- TCP_CORK(Linux)を制御する。
- デフォルトは、
false
である。 true
にする場合、TCPフレームの断片が小出しに送られることを抑止するため、リモートにあるNginXのタスクを早めに起こさずに済ませる。
- backlog
- timeout
- ワーカーがこの時間[秒]以上処理に費やす時はプロセスを落とす。
- デフォルトは、60秒である。
- 大抵の処理は60秒以内に完了するが、それ以上に時間の掛かる処理がある場合は処理時間に応じて値を増やす。
- 例えば、サイズの大きい添付ファイルのアップロードおよびダウンロードが該当する。
- 添付ファイルのサイズ上限のファイルを実際にアップロードおよびダウンロードすることにより、それに掛かる時間を計測して、許容できる処理時間を設定する。
- ここで、Unicornのタイムアウト値とNginXのタイムアウト値が不整合だと動作が不安定となるため、両者のタイムアウト値を整合させるようにする。
- (例. Unicornのタイムアウト値 + αをNginXのタイムアウト値にする。この時、αは1〜2秒程度等)
- pid
- Unicornを起動した時、そのプロセスIDを記録しておくファイルを指定する。
- stderr_path および stdout_path
- Redmineのインストールディレクトリ下のlogディレクトリにログファイルを生成する。
- preload_app
true
に設定する場合、マスタープロセス起動時にアプリケーションをロードして、ワーカープロセスをフォークするとアプリケーションが実行可能となる。- 複数のワーカープロセスでコードを共有するため、メモリ使用効率が良くなる。
- デメリットは、ワーカープロセスを再起動してもアプリケーションはロードされないことである。
- before_fork
- ワーカープロセスをフォークする前に、マスタープロセスによって呼ばれる。
- USR2シグナルで新旧マスタープロセスが共存する場合、旧マスタープロセスにQUITシグナルを送信して終了させる。
- after_fork
- ワーカープロセスがフォークされた後に呼び出される。
Unicornの設定ファイルを使用して、Unicornを起動する。
cd /<Redmineのインストールディレクトリ> bundle exec unicorn_rails -c config/unicorn.rb -E production
Unicornのサービスユニットファイルの作成
- [Unit]セクション
- Afterキー
- Redmine(Unicorn)は、起動時にデータベースに接続できない場合は、エラーとなる。
- そのため、mysql.serviceまたはmariadb.serviceを実行した後に、redmine-unicorn.serviceが起動するように順序を指定する。
- Afterキー
- [Service]セクション
- Userキー および Groupキー
- 起動プロセスの実行ユーザおよびグループを指定する。
- Systemdサービスで
ExecStart
により実行したプロセスの実行ユーザおよびグループをroot以外にする場合は指定する。
- WorkingDirectory
- Redmineのインストールディレクトリを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。
- PIDFile
- UnicornのプロセスIDファイルを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。
- PermissionsStartOnly
true
を指定する場合、User
キーおよびGourp
を指定していたとしても、ExecStartPre
キーの値は、root権限で実行される。
- Userキー および Groupキー
sudo vi /etc/systemd/system/redmine-unicorn.service
# /etc/systemd/system/redmine-unicorn.serviceファイル
[Unit]
Description=Redmine Unicorn Server
# MySQLおよびMariaDBを通常インストールした場合
After=mysqld.service
[Service]
User=<ユーザ名>
Group=<グループ名>
WorkingDirectory=<Redmineのインストールディレクトリ>
Environment=RAILS_ENV=production
SyslogIdentifier=redmine-unicorn
PIDFile=/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid
# MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合
ExecStartPre=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server start
# Rubyを通常インストールした場合
ExecStart=/<Rubyのインストールディレクトリ>/bin//bundle exec "/<Rubyのインストールディレクトリ>/unicorn_rails -c config/unicorn.rb -E production -D"
# Rubyを任意のインストールディレクトリにインストールした場合
ExecStart=/bin/bash -c "PATH=/<Rubyのインストールディレクトリ>/bin:$PATH /<Rubyのインストールディレクトリ>/bin/bundle exec /<Rubyのインストールディレクトリ>/bin/unicorn_rails -c config/unicorn.rb -E production -D"
ExecStop=/usr/bin/kill -QUIT $MAINPID
# MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合
ExecStopPost=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server stop
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target