├── .github
└── workflows
│ └── ci.yml
├── LICENSE.md
├── README.md
├── ansible.cfg
├── group_vars
└── redmine-servers
├── hosts
├── roles
├── apache
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ │ └── redmine.conf
├── pg
│ └── tasks
│ │ └── main.yml
├── redmine
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ │ ├── Gemfile.local
│ │ ├── configuration.yml
│ │ └── database.yml
├── ruby
│ └── tasks
│ │ └── main.yml
└── system
│ └── tasks
│ └── main.yml
└── site.yml
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | schedule:
6 | - cron: '0 1 * * 1' # 毎週月曜日の午前1時(UTC)に実行
7 |
8 | jobs:
9 | ci:
10 | runs-on: ubuntu-24.04
11 |
12 | steps:
13 | - name: Checkout repository
14 | uses: actions/checkout@v4
15 |
16 | - name: Setup
17 | run: |
18 | sudo apt update
19 | sudo apt install --yes software-properties-common
20 | sudo add-apt-repository --yes --update ppa:ansible/ansible
21 | sudo apt install --yes ansible git python3-psycopg2
22 |
23 | - name: Execute ansible playbook
24 | # Test without -K option to make it non-interactive
25 | run: ansible-playbook -i hosts site.yml
26 |
27 | - name: Health check
28 | run: curl --silent http://localhost/redmine/login | grep -q 'ログイン'
29 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 [Far End Technologies Corporation](http://www.farend.co.jp/)
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # redmine-ubuntu-ansible
2 |
3 |
4 | 最小構成でインストールしたUbuntu ServerにRedmineを自動インストールするためのAnsibleプレイブックです。
5 |
6 | `ansible-playbook` を実行するだけで、あとはしばらく放置すればインストールが完了します。
7 |
8 |
9 | ## 概要
10 |
11 | Ansibleを使ってRedmineを自動インストールするためのプレイブックです。以下のwebサイトで紹介されている手順におおむね準拠しています。
12 |
13 | [Redmine 6.0 をUbuntu 24.04 LTSにインストールする手順](https://blog.redmine.jp/articles/6_0/install/ubuntu24/)
14 |
15 | ## システム構成
16 |
17 | * Ansible 2.17.5
18 | * Redmine 6.0
19 | * Ubuntu Server 24.04 LTS
20 | * PostgreSQL 16.4
21 | * Apache (Railsの実行にはPassengerを使用)
22 | * Ruby 3.3.6
23 |
24 | ## Redmineのインストール手順
25 |
26 | インストール直後の Ubuntu Server にログインし以下の操作を行ってください。
27 |
28 |
29 | ### Ansibleと必要パッケージのインストール
30 |
31 | [Installing Ansible on specific operating systems — Ansible Community Documentation](https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html#installing-ansible-on-ubuntu) を参考にして Ansible をインストールします。
32 |
33 | ```bash
34 | sudo apt update
35 | sudo apt install software-properties-common
36 | sudo add-apt-repository --yes --update ppa:ansible/ansible
37 | sudo apt install ansible
38 | ```
39 |
40 | git や [PostgreSQL の操作](https://docs.ansible.com/ansible/latest/collections/community/postgresql/postgresql_db_module.html) で必要なパッケージをインストールします。
41 |
42 | ```bash
43 | sudo apt update
44 | sudo apt install git python3-psycopg2
45 | ```
46 |
47 | ### playbookのダウンロード
48 |
49 | ```
50 | git clone https://github.com/farend/redmine-ubuntu-ansible.git
51 | ```
52 |
53 | ### PostgreSQLに設定するパスワードの変更 (推奨)
54 |
55 | ファイル `group_vars/redmine-servers` をエディタで開き、 `db_passwd_redmine` を適当な内容に変更してください。これはPostgreSQLのRedmine用ユーザー redmine に設定されるパスワードです。
56 |
57 | ### playbook実行
58 |
59 | 下記コマンドを実行してください。Redmineの自動インストールが開始されます。
60 |
61 | > [!NOTE]
62 | >
63 | > "BECOME password"にsudoを実行するためのパスワードを入力してください。
64 |
65 | ```
66 | cd redmine-ubuntu-ansible
67 | ansible-playbook -K -i hosts site.yml
68 | ```
69 |
70 | 10〜20分ほどでインストールが完了します。webブラウザで `http://サーバIPアドレス/redmine` にアクセスしてください。Redmineの画面が表示されるはずです。
71 |
72 |
73 | ## ライセンス
74 |
75 | MIT License
76 |
77 |
78 | ## 作者
79 |
80 | [ファーエンドテクノロジー株式会社](http://www.farend.co.jp/)
81 |
--------------------------------------------------------------------------------
/ansible.cfg:
--------------------------------------------------------------------------------
1 | [ssh_connection]
2 | pipelining = true
3 |
--------------------------------------------------------------------------------
/group_vars/redmine-servers:
--------------------------------------------------------------------------------
1 | # ----------------------------------------------------------------------
2 | # データベースの redmine ユーザーのパスワード (変更推奨)
3 | db_passwd_redmine: Must_be_changed!
4 | # ----------------------------------------------------------------------
5 |
6 | # Redmineにアクセスするときのサブディレクトリ名
7 | redmine_relative_url_root: /redmine
8 |
9 | # Redmineのチェックアウト元URL
10 | redmine_svn_url: https://svn.redmine.org/redmine/branches/6.0-stable
11 |
12 | # Redmineのデプロイ先ディレクトリ
13 | redmine_dir: /var/lib/redmine
14 |
15 | # Redmineのデプロイ先ディレクトリのオーナー:グループ
16 | redmine_dir_owner: www-data
17 | redmine_dir_group: www-data
18 |
19 | # Redmineで使用する日本語フォントファイル
20 | redmine_font_path: /usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf
21 |
22 | # Redmine DB で使用する設定
23 | redmine_db_name: redmine
24 | redmine_db_user: redmine
25 | redmine_db_locale: ja_JP.UTF-8
26 |
27 | # ダウンロードするRubyのソースコード
28 | ruby_url_dir: https://cache.ruby-lang.org/pub/ruby/3.3
29 | ruby_archive_version: ruby-3.3.6
30 | ruby_archive_ext: tar.gz
31 | ruby_archive_name: "{{ ruby_archive_version }}.{{ ruby_archive_ext }}"
32 |
33 | ruby_file_name: /usr/local/bin/ruby
34 | work_dir: /tmp/redmine-setup
35 |
--------------------------------------------------------------------------------
/hosts:
--------------------------------------------------------------------------------
1 | [redmine-servers]
2 | localhost ansible_connection=local
3 |
--------------------------------------------------------------------------------
/roles/apache/tasks/main.yml:
--------------------------------------------------------------------------------
1 | - name: Redmineディレクトリ以下のオーナーを変更
2 | become: yes
3 | file:
4 | path: "{{ redmine_dir }}"
5 | owner: "{{ redmine_dir_owner }}"
6 | group: "{{ redmine_dir_group }}"
7 | recurse: yes
8 |
9 | - name: PassengerのApache用設定ファイルが存在するか確認
10 | command:
11 | test -f /etc/apache2/conf-available/redmine.conf
12 | register:
13 | result
14 | failed_when: result.rc not in [0, 1]
15 | changed_when: false
16 |
17 | - name: PassengerのApache用モジュールのインストール
18 | become: yes
19 | command:
20 | passenger-install-apache2-module --auto --languages ruby
21 | environment:
22 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
23 | when: result.rc == 1
24 |
25 | - name: PassengerのApache用モジュールの設定を取得
26 | command:
27 | passenger-install-apache2-module --snippet
28 | environment:
29 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
30 | register:
31 | passenger_snippet_vars
32 | changed_when: false
33 |
34 | - name: redmine.confの作成
35 | become: yes
36 | template:
37 | src=redmine.conf
38 | dest=/etc/apache2/conf-available/redmine.conf
39 |
40 | - name: Redmine用のApacheの設定を有効にする
41 | become: yes
42 | command:
43 | a2enconf redmine
44 |
45 | - name: Apacheの再起動
46 | become: yes
47 | service:
48 | name=apache2
49 | state=restarted
50 | enabled=yes
51 |
--------------------------------------------------------------------------------
/roles/apache/templates/redmine.conf:
--------------------------------------------------------------------------------
1 |
2 | Allow from all
3 | Options -MultiViews
4 | Require all granted
5 |
6 |
7 | Alias {{ redmine_relative_url_root }} {{ redmine_dir }}/public
8 |
9 | PassengerBaseURI {{ redmine_relative_url_root }}
10 | PassengerAppRoot {{ redmine_dir }}
11 |
12 |
13 | {{ passenger_snippet_vars.stdout }}
14 |
15 | PassengerMaxPoolSize 20
16 | PassengerMaxInstancesPerApp 4
17 | PassengerPoolIdleTime 864000
18 | PassengerStatThrottleRate 10
19 |
--------------------------------------------------------------------------------
/roles/pg/tasks/main.yml:
--------------------------------------------------------------------------------
1 | - name: start postgresql server
2 | become: yes
3 | service:
4 | name=postgresql
5 | state=started
6 |
7 | - name: postgresユーザになるためACLがインストールされているか確認
8 | stat:
9 | path: /usr/local/bin/acl
10 | register:
11 | result
12 |
13 | - name: ACLインストール
14 | become: yes
15 | apt:
16 | name: "acl"
17 | when: not result.stat.exists
18 |
19 | - name: PostgreSQL ユーザー作成
20 | become: yes
21 | become_user: postgres
22 | postgresql_user:
23 | name: "{{ redmine_db_user }}"
24 | password: "{{ db_passwd_redmine }}"
25 |
26 | - name: PostgreSQL データベース作成
27 | become: yes
28 | become_user: postgres
29 | postgresql_db:
30 | name: "{{ redmine_db_name }}"
31 | owner: "{{ redmine_db_user }}"
32 | encoding: "UTF-8"
33 | lc_collate: "{{ redmine_db_locale }}"
34 | lc_ctype: "{{ redmine_db_locale }}"
35 | template: "template0"
36 |
--------------------------------------------------------------------------------
/roles/redmine/tasks/main.yml:
--------------------------------------------------------------------------------
1 | - name: mkdir /var/lib/redmine
2 | become: yes
3 | command:
4 | mkdir -p {{ redmine_dir }}
5 |
6 | - name: chown www-data /var/lib/redmine
7 | become: yes
8 | command:
9 | chown {{ redmine_dir_owner }} {{ redmine_dir }}
10 |
11 | - name: Redmineのソースコードをチェックアウト
12 | become: yes
13 | become_user: "{{ redmine_dir_owner }}"
14 | command:
15 | svn co {{ redmine_svn_url }} {{ redmine_dir }}
16 |
17 | - name: database.ymlの作成
18 | become: yes
19 | become_user: "{{ redmine_dir_owner }}"
20 | template:
21 | src=database.yml
22 | dest={{ redmine_dir }}/config/database.yml
23 | force=no
24 | register:
25 | result_database_yml
26 |
27 | - name: configuration.ymlの作成
28 | become: yes
29 | become_user: "{{ redmine_dir_owner }}"
30 | template:
31 | src=configuration.yml
32 | dest={{ redmine_dir }}/config/configuration.yml
33 | force=no
34 |
35 | - name: Gemfile.lockが存在するか確認
36 | command:
37 | test -f {{ redmine_dir }}/Gemfile.lock
38 | register:
39 | result_test_gemfile
40 | failed_when: result_test_gemfile.rc not in [0, 1]
41 | changed_when: false
42 |
43 | - name: gemsパッケージのインストール 1/3
44 | become: yes
45 | become_user: "{{ redmine_dir_owner }}"
46 | template:
47 | src=Gemfile.local
48 | dest={{ redmine_dir }}/Gemfile.local
49 | force=no
50 | when:
51 | result_test_gemfile.rc == 1
52 |
53 | - name: gemsパッケージのインストール 2/3
54 | become: yes
55 | command:
56 | bundle config set --local without 'development test'
57 | chdir={{ redmine_dir }}
58 | environment:
59 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
60 | when:
61 | result_test_gemfile.rc == 1
62 |
63 | - name: gemsパッケージのインストール 3/3
64 | become: yes
65 | command:
66 | bundle install
67 | chdir={{ redmine_dir }}
68 | environment:
69 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
70 | when:
71 | result_test_gemfile.rc == 1
72 |
73 | - name: gemsパッケージのアップデート
74 | become: yes
75 | command:
76 | bundle update
77 | chdir={{ redmine_dir }}
78 | environment:
79 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
80 | when:
81 | result_test_gemfile.rc == 0
82 |
83 | - name: secret tokenの作成
84 | become: yes
85 | become_user: "{{ redmine_dir_owner }}"
86 | command:
87 | bundle exec rake generate_secret_token
88 | chdir={{ redmine_dir }}
89 | environment:
90 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
91 | RAILS_ENV: production
92 |
93 | - name: データベースのマイグレーション
94 | become: yes
95 | become_user: "{{ redmine_dir_owner }}"
96 | command:
97 | bundle exec rake db:migrate
98 | chdir={{ redmine_dir }}
99 | environment:
100 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
101 | RAILS_ENV: production
102 |
103 | - name: デフォルトデータ(日本語)をロード
104 | become: yes
105 | command:
106 | bundle exec rake redmine:load_default_data
107 | chdir={{ redmine_dir }}
108 | environment:
109 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
110 | RAILS_ENV: production
111 | REDMINE_LANG: ja
112 | when:
113 | result_database_yml is changed
114 |
115 | - name: farend_basicテーマのダウンロードと展開
116 | become: yes
117 | shell: |
118 | wget -O {{ work_dir }}/farend_basic.tar.gz https://github.com/farend/redmine_theme_farend_basic/archive/refs/tags/1.5.tar.gz
119 | mkdir -p {{ redmine_dir }}/themes/farend_basic
120 | tar xzf {{ work_dir }}/farend_basic.tar.gz -C {{ redmine_dir }}/themes/farend_basic --strip-components=1
121 | when:
122 | result_database_yml is changed
123 |
124 | - name: テーマをfarend_basicに切り替え
125 | become: yes
126 | command:
127 | bundle exec rails r 'Setting["ui_theme"]="farend_basic"'
128 | chdir={{ redmine_dir }}
129 | environment:
130 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
131 | RAILS_ENV: production
132 | when:
133 | result_database_yml is changed
134 |
135 | - name: デフォルトの言語を日本語に変更
136 | become: yes
137 | command:
138 | bundle exec rails r 'Setting["default_language"]="ja"'
139 | chdir={{ redmine_dir }}
140 | environment:
141 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
142 | RAILS_ENV: production
143 | when:
144 | result_database_yml is changed
145 |
146 | - name: ユーザー名の表示形式を「姓 名」に変更
147 | become: yes
148 | command:
149 | bundle exec rails r 'Setting["user_format"]=:lastname_firstname'
150 | chdir={{ redmine_dir }}
151 | environment:
152 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
153 | RAILS_ENV: production
154 | when:
155 | result_database_yml is changed
156 |
157 | - name: 添付ファイルとリポジトリのエンコーディングを設定
158 | become: yes
159 | command:
160 | bundle exec rails r 'Setting["repositories_encodings"]="UTF-8,CP932,EUC-JP"'
161 | chdir={{ redmine_dir }}
162 | environment:
163 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
164 | RAILS_ENV: production
165 | when:
166 | result_database_yml is changed
167 |
168 | - name: 添付ファイルのサムネイルを表示
169 | become: yes
170 | command:
171 | bundle exec rails r 'Setting["thumbnails_enabled"]="1"'
172 | chdir={{ redmine_dir }}
173 | environment:
174 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
175 | RAILS_ENV: production
176 | when:
177 | result_database_yml is changed
178 |
179 | - name: CSS や JavaScript、画像などを public/assets ディレクトリ配置
180 | become: yes
181 | command:
182 | bundle exec rake assets:clobber assets:precompile
183 | chdir={{ redmine_dir }}
184 | environment:
185 | PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
186 | RAILS_ENV: production
187 | RAILS_RELATIVE_URL_ROOT: "{{ redmine_relative_url_root }}"
188 |
--------------------------------------------------------------------------------
/roles/redmine/templates/Gemfile.local:
--------------------------------------------------------------------------------
1 | gem 'passenger', group: :production
2 |
--------------------------------------------------------------------------------
/roles/redmine/templates/configuration.yml:
--------------------------------------------------------------------------------
1 | production:
2 | email_delivery:
3 | delivery_method: :smtp
4 | smtp_settings:
5 | address: "localhost"
6 | port: 25
7 | domain: "{{ ansible_fqdn }}"
8 |
9 | rmagick_font_path: {{ redmine_font_path }}
10 |
--------------------------------------------------------------------------------
/roles/redmine/templates/database.yml:
--------------------------------------------------------------------------------
1 | production:
2 | adapter: postgresql
3 | database: "{{ redmine_db_name }}"
4 | host: localhost
5 | username: "{{ redmine_db_user }}"
6 | password: "{{ db_passwd_redmine }}"
7 | encoding: utf8
8 | pool: 5
9 |
--------------------------------------------------------------------------------
/roles/ruby/tasks/main.yml:
--------------------------------------------------------------------------------
1 | - name: Rubyがインストールされているか確認
2 | command:
3 | test -f {{ ruby_file_name }}
4 | register:
5 | ruby_test_vars
6 | failed_when: ruby_test_vars.rc not in [0, 1]
7 | changed_when: false
8 |
9 | - name: Rubyがダウンロード済みか確認
10 | command:
11 | test -f {{ work_dir }}/{{ ruby_archive_version }}
12 | register:
13 | ruby_src_test_vars
14 | failed_when: ruby_test_vars.rc not in [0, 1]
15 | changed_when: false
16 |
17 | - name: Rubyのソースコードのダウンロード
18 | get_url:
19 | url={{ ruby_url_dir }}/{{ ruby_archive_name }}
20 | dest={{ work_dir }}
21 | when: ruby_test_vars.rc == 1 and ruby_src_test_vars.rc == 1
22 |
23 | - name: Rubyのソースコードを展開
24 | unarchive:
25 | src={{ work_dir }}/{{ ruby_archive_name }}
26 | dest={{ work_dir }}
27 | copy=no
28 | when: ruby_test_vars.rc == 1 and ruby_src_test_vars.rc == 1
29 |
30 | - name: Rubyのビルド1 (configure)
31 | command:
32 | ./configure --disable-install-doc
33 | chdir={{ work_dir }}/{{ ruby_archive_version }}
34 | when: ruby_test_vars.rc == 1
35 |
36 | - name: Rubyのビルド2 (make)
37 | command:
38 | make
39 | chdir={{ work_dir }}/{{ ruby_archive_version }}
40 | when: ruby_test_vars.rc == 1
41 |
42 | - name: Rubyのインストール
43 | become: yes
44 | command:
45 | make install
46 | chdir={{ work_dir }}/{{ ruby_archive_version }}
47 | when: ruby_test_vars.rc == 1
48 |
--------------------------------------------------------------------------------
/roles/system/tasks/main.yml:
--------------------------------------------------------------------------------
1 | # PostgreSQLでlc_collateとlc_ctypeに ja_JP.UTF-8 を指定するために必要
2 | # 海外業者のサーバなども考慮して念のために実行するもので、ロケール設定は変更しない
3 | - name: apt update
4 | become: yes
5 | apt:
6 | update_cache=yes
7 | cache_valid_time=86400
8 | - name: Generate ja_JP.UTF-8 locale 1/3
9 | become: yes
10 | apt:
11 | name='language-pack-ja'
12 | - name: Generate ja_JP.UTF-8 locale 2/3
13 | become: yes
14 | command: locale-gen ja_JP.UTF-8
15 | - name: Generate ja_JP.UTF-8 locale 3/3
16 | shell: localectl list-locales | grep ja_JP.UTF-8
17 |
18 | # Redmine を動かすために必要なパッケージのインストール
19 | - name: RubyとPassengerのビルドに必要な開発ツールやヘッダファイルのインストール
20 | become: yes
21 | apt:
22 | name='build-essential,zlib1g-dev,libssl-dev,libreadline-dev,libyaml-dev,libcurl4-openssl-dev,libffi-dev'
23 |
24 | - name: PostgreSQLとヘッダファイルのインストール
25 | become: yes
26 | apt:
27 | name='postgresql,libpq-dev'
28 |
29 | - name: Apacheとヘッダファイルのインストール
30 | become: yes
31 | apt:
32 | name='apache2,apache2-dev'
33 |
34 | - name: ImageMagickとヘッダファイル・日本語フォントのインストール
35 | become: yes
36 | apt:
37 | name='imagemagick,fonts-takao-pgothic'
38 |
39 | - name: そのほかのツールのインストール
40 | become: yes
41 | apt:
42 | name='subversion,git'
43 |
44 | - name: 作業ディレクトリ作成
45 | file: path={{ work_dir }} state=directory mode=0755
46 |
--------------------------------------------------------------------------------
/site.yml:
--------------------------------------------------------------------------------
1 | - hosts: redmine-servers
2 |
3 | roles:
4 | - system
5 | - pg
6 | - ruby
7 | - redmine
8 | - apache
9 |
10 | post_tasks:
11 | - name: 完了
12 | debug:
13 | msg='インストールが完了しました。 http://{{ ansible_default_ipv4.address }}{{ redmine_relative_url_root }}/ にアクセスしてください。'
14 |
--------------------------------------------------------------------------------