├── .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 | --------------------------------------------------------------------------------