Redmine
Costs¶
Instance: $42 / year (Reserved Instance)
Domain: $90 / year (Jp Domain)
Instance¶
Region: Tokyo
Type: t3.nano
Image: Debian GNU/Linux 9 (Stretch)
Install¶
Debian Wiki - Redmine通りにオペレーションして特に問題なし
パッケージはRDS代が払えないのでredmine-sqliteにした
CloudFront¶
| Path Pattern | Origin Path | Origin | Cache |
|---|---|---|---|
| /javascripts/* | S3-aretan.jp | /usr/share/redmine/public/javascripts/ | on |
| /stylesheets/* | S3-aretan.jp | /usr/share/redmine/public/stylesheets/ | on |
| /images/* | S3-aretan.jp | /usr/share/redmine/public/images/ | on |
| /themes/* | S3-aretan.jp | /usr/share/redmine/public/themes/ | on |
| /help/* | S3-aretan.jp | /usr/share/redmine/public/help/ | on |
| /plugin_assets/* | S3-aretan.jp | /var/cache/redmine/default/plugin_assets/ | on |
| /attachments/download/* | EC2 | Passenger | on |
| Default (*) | EC2 | Passenger | off |
Security¶
| 対策箇所 | 対策内容 |
|---|---|
| CloudFront | HTTPS Termination Geo Restrictions Set Origin Custom Header |
| S3 | Origin Access Identity |
| EC2 SecurityGroup | SSH IP Whitelist |
| Debian | unattended-upgrades sshguard |
| Redmine | Validate Origin Custom Header |
Apache¶
/etc/apache2/apache2.conf
KeepAliveTimeout 120 Timeout 5
/etc/apache2/sites-enabled/redmine.conf
ServerName aretan.jp RemoteIPHeader X-Forwarded-For
/etc/apache2/mods-enabled/mpm_event.conf
StartServers 2 MinSpareThreads 2 MaxSpareThreads 2 ThreadsPerChild 2 MaxRequestWorkers 2 MaxConnectionsPerChild 0
/etc/apache2/mods-enabled/passenger.conf
PassengerPreStart http://aretan.jp/ PassengerFriendlyErrorPages off PassengerHighPerformance on PassengerMaxPoolSize 1 Header always unset "X-Powered-By" Header always unset "X-Rack-Cache" Header always unset "X-Content-Digest" Header always unset "X-Runtime"
Benchmark¶
Concurrency Level: 100 Time taken for tests: 87.199 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 18883000 bytes HTML transferred: 18094000 bytes Requests per second: 11.47 [#/sec] (mean) Time per request: 8719.943 [ms] (mean) Time per request: 87.199 [ms] (mean, across all concurrent requests) Transfer rate: 211.47 [Kbytes/sec] received
top - 17:09:06 up 4:05, 2 users, load average: 0.87, 0.54, 0.24 Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie %Cpu(s): 97.0 us, 3.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 502452 total, 123908 free, 279100 used, 99444 buff/cache KiB Swap: 0 total, 0 free, 0 used. 206056 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8566 www-data 20 0 468116 177256 10436 S 98.0 35.3 0:57.05 Passenger RubyApp: redmine_default 8551 www-data 20 0 330868 116664 14836 S 0.0 23.2 0:02.82 Passenger AppPreloader: /usr/share/redmine 8518 root 20 0 658644 11496 9572 S 0.0 2.3 0:00.21 Passenger core
プラグイン追加のオペレーション¶
# cd /usr/share/redmine # # put plugin into /usr/share/redmine/plugins/ # bundle install # rake redmine:plugins:migrate RAILS_ENV=production # sudo service apache2 restart
ファイル更新のオペレーション¶
# cd /usr/share/redmine # # edit static file # aws s3 cp stylesheets/application.css s3://aretan.jp/stylesheets/application.css --cache-control max-age=604800 --storage-class REDUCED_REDUNDANCY # aws cloudfront create-invalidation --distribution-id E3RKCYCW0QF7RA --paths /stylesheets/application.css
Embedded Tweets¶
/usr/share/redmine/app/views/layouts/base.html.erb
<%= stylesheet_link_tag 'oembed/jquery.oembed.min.css' %>
<%= javascript_include_tag "oembed/jquery.oembed.min.js" %>
<script type="text/javascript">
$(document).ready(function(){
$("a[href^='https://twitter.com/aretan/status/']").oembed(null,{
embedMethod: 'fill',
});
});
</script>
Crontab DB Backup¶
0 6 * * * aws s3 cp /var/lib/dbconfig-common/sqlite3/redmine/instances/default/redmine_default s3://back.aretan.jp/$(date +\%Y\%m\%d).db
Overview
Report
Wiki