2014/07/17

Redmine の通知メールを Gmail で送信する設定

さくらのVPSのお試し期間が終わったので
さくらのVPSのCentOS6でRedmineを動かす | DevAchieve
動かした Redmine の通知メールを設定しました。

環境

OS
CentOS6.5
Redmine
2.5.1

設定

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "mail_for_redmine@gmail.com"
      password: "gmail_password"

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
参考
メールの設定 — Redmine Guide 日本語訳
参考サイトでは設定にtls: trueが記述されていたけど記述するとメールが送信されなくなりました。

動作は管理者アカウントで[管理 > 設定 > 通知メール]の右下の「テストメールを送信」で確認できます。


注意点

通知メールアドレスに普段使っているアカウントを使用すると
変なところからアクセスしようとしたという判定でメールが送信できませんでした。

Redmine の通知専用の Gmail アカウントを作成するのが良いと思います。

2014/07/16

さくらのVPSのCentOS6でRedmineを動かす

規模が大きくて長期のイベントとかあると
やっぱり課題管理システムとして Redmine とか欲しいなって思います。
開発者じゃなくても使えそうで
自分が使ったことがあるというところで
Redmine を使うことにしました。

参考
[Linux]さくらVPSのCentOSにRedmineをインストール - daybreaksnow's diary
Redmine 2.5をCentOS 6.5にインストールする手順 | Redmine.JP Blog

CentOS の設定

SELinux の無効化

さくらのVPSでは SELinux はデフォルトで無効化されています。
無効化されていない場合は以下のように無効化します。
sudo vim /etc/sysconfig/selinux
-SELINUX=enforcing
+SELINUX=disabled
再起動して設定を反映
sudo reboot
無効化されていることの確認
getenforce
# Disabled

必要なパッケージのインストール

Redmine を使用するにあたって必要なパッケージをインストールします。

EPELリポジトリの登録

Ruby のビルドに必要な libyaml を yum でインストールできるようにするために
EPEL(Extra Packages for Enterprise Linux)リポジトリを追加します。
http://dl.fedoraproject.org/pub/epel/6/x86_64/repoview/epel-release.html
上記のページで Packages の最新のURLをコピー、以下のコマンドのように実行します。
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# パッケージ epel-release-6-8.noarch は既にインストールされています。
さくらのVPSではインストール済みでした。

開発ツール(Cコンパイラ等)のインストール

sudp yum groupinstall "Development Tools"
# No packages in any requested group available to install or update

Ruby と Passenger のビルドに必要なヘッダファイルなどのインストール

sudo yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel

MySQL とヘッダファイルのインストール

sudo yum -y install mysql-server mysql-devel

Apache とヘッダファイルのインストール

sudo yum -y install httpd httpd-devel

ImageMagick とヘッダファイル・日本語フォントのインストール

sudo yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
ImageMagickと日本語フォントはガントチャートをPNG形式の画像にエクスポートする機能、添付ファイルのサムネイル画像を作成するのに使われます。これらのインストールを行わなくてもRedmineの実行は可能です。

Ruby のインストール

ソースコードのダウンロード

Ruby のオフィシャルサイトのダウンロードページから
Ruby2.0 の最新のソースコードをダウンロードしてください。
http://www.ruby-lang.org/ja/downloads/
curl -O http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p481.tar.gz
Redmine 2.5 は 2014 年 2 月にリリースされた Ruby 2.1 には対応していません。
必ず Ruby 2.0 をインストールしてください。

Ruby のビルド

ダウンロードした Ruby の tarball を展開し、Ruby のビルドとインストールを行ってください。
tar zxvf ruby-2.0.0-p481.tar.gz
cd ruby-2.0.0-p481
sudo ./configure --disable-install-doc
sudo make
sudo make install
cd ..
--disable-install-doc を指定すると Ruby のドキュメントのインストールを省略でき、作業時間を短縮できます。
ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-linux]

Bundler のインストール

Redmine が使用する Gem を一括インストールするための Bundler というツールをインストールします。
sudo su -
gem install bundler --no-rdoc --no-ri
exit
以下のページの事象が発生して悲しくなります。
参考: とっとこ駆け出しエンジニアぶろぐ: Cent OS 6系でsudo時に環境変数PATHが引き継がれない

MySQL の設定

デフォルトキャラクタセットを utf8 に設定

sudo vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server=utf8

# 任意設定
innodb_file_per_table
query-cache-size=16M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8

MySQL の起動および自動起動の設定

sudo service mysqld start
sudo chkconfig mysqld on

/etc/my.cnf への設定が反映されていることの確認

mysql -u root
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql> exit

MySQL のセキュリティ初期設定

  • root ユーザーのパスワード変更
  • 匿名ユーザー削除
  • リモートからの root ログインの禁止
  • test データベースの削除
  • 設定の反映
mysql_secure_installation
...
Enter current password for root (enter for none): [Enter]
...
Set root password? [Y/n] y
New password: [MySQL Password]
Re-enter new password: [MySQL Password]
...
Remove anonymous users? [Y/n]: y
...
Disallow root login remotely? [Y/n]: y
…
Remove test database and access to it? [Y/n]: y
...
Reload privilege tables now? [Y/n]: y

Redmine 用データベースとユーザーの作成

mysql -uroot -p
mysql> create database redmine default character set utf8;
mysql> grant all on redmine.* to redmine@localhost identified by '********';
# ******** は redmine ユーザのパスワード。 Redmine の設定で使います。
mysql> flush privileges;
mysql> exit;

Redmine のインストール

Redmine のダウンロード

下記のページから Redmine 2.5 の tarball(.tar.gz) をダウンロードしてください。
http://www.redmine.org/projects/redmine/wiki/Download
curl -O http://www.redmine.org/releases/redmine-2.5.1.tar.gz

Redmine の展開と配置

tar xvf redmine-2.5.1.tar.gz
sudo mv redmine-2.5.1 /var/lib/redmine

データベースへの接続設定

sudo vim /var/lib/redmine/config/database.yml
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: ******** # MySQL の redmine ユーザのパスワード
  encoding: utf8

設定ファイル config/configuration.yml の作成

sudo vim /var/lib/redmine/config/configuration.yml
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25
      domain: 'example.com'

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
詳しい設定方法については configuration.ymlの設定項目 — Redmine.JP を参照。
通知メールを Gmail から送信する設定について書きました。↓
Redmine の通知メールを Gmail で送信する設定 | DevAchieve

Gem パッケージのインストール

sudo su -
cd /var/lib/redmine
bundle install --without development test

Redmine の初期設定とデータベースのテーブル作成

bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

Passenger のインストール

Apache 上で Redmine などの Rails アプリケーションの実行に必要な Passenger をインストールします。
gem install passenger --no-rdoc --no-ri

Passenger の Apache 用モジュールのインストール

passenger-install-apache2-module
インストール後に Apache の設定ファイルに記述すべき内容が表示されます。
また、以下のコマンドで確認することができます。
passenger-install-apache2-module --snippet
LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.45/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.45
  PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>
上記は環境によって異なるので上のコマンドの実行結果を使用して下さい。
exit

Apache の設定

Passenger の設定を追加

sudo vim /etc/httpd/conf.d/passenger.conf
# Passengerの基本設定
    # passenger-install-apache2-module --snippet を実行して表示される設定を使用
    LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.45/buildout/apache2/mod_passenger.so
    
      PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.45
      PassengerDefaultRuby /usr/local/bin/ruby
    

    # Passengerが追加するHTTPヘッダを削除するための設定(任意)
    Header always unset "X-Powered-By"
    Header always unset "X-Rack-Cache"
    Header always unset "X-Content-Digest"
    Header always unset "X-Runtime"

    # Passenger のチューニング
    # Phusion Passenger users guide
    # http://www.modrails.com/documentation/Users%20guide%20Apache.html
    PassengerMaxPoolSize 20
    PassengerMaxInstancesPerApp 4
    PassengerPoolIdleTime 3600
    PassengerHighPerformance on
    PassengerStatThrottleRate 10
    PassengerSpawnMethod smart
    RailsAppSpawnerIdleTime 86400
    PassengerMaxPreloaderIdleTime 0

    # シンボリックリンクを有効にする
    PassengerResolveSymlinksInDocumentRoot on
参考: [Redmine Rails] Passenger がシンボリックリンクを解決してくれない | Javable.Jp
Apache の再起動
sudo service httpd restart

Apache 上の Passenger で Redmine を実行するための設定

sudo chown -R apache:apache /var/lib/redmine

Redmine を VirtualHost で動かすための設定

sudo vim /etc/httpd/conf/httpd.conf
-#NameVirtualHost *:80
+NameVirtualHost *:80
sudo mkdir -p /var/www/vhosts/redmine.wada811.at/
sudo ln -s /var/lib/redmine/public/ /var/www/vhosts/redmine.wada811.at
sudo vim /etc/httpd/conf.d/redmine.wada811.at.conf
<VirtualHost *:80>
  ServerName redmine.wada811.at
  DocumentRoot /var/www/vhosts/redmine.wada811.at
  <Directory "/var/www/vhosts/redmine.wada811.at">
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
  ErrorLog /var/log/httpd/redmine.wada811.at-error_log
  CustomLog /var/log/httpd/redmine.wada811.at-access_log combined
</VirtualHost>
sudo /etc/init.d/httpd graceful
sudo service httpd restart
ドメインを取っていないので Hosts ファイルに追加
sudo sh -c "echo 'IP.ADD.RE.SS  redmine.wada811.at' >> /etc/hosts"

参考
Apache のバーチャルホストで Redmine を動作させる 〜 CentOS6 | EasyRamble

Redmine が動きました!

というわけでここまでです。
あとは Redmine のユーザ作成などの初期設定です。
Redmineを使い始めるための初期設定 — Redmine.JP
2014/07/15

CentOS6.5でやっておくと良さそうな設定

前提条件

cat /etc/redhat-release
CentOS release 6.5 (Final)
arch
x86_64
参考: CentOSのバージョン確認コマンドとアーキテクチャ確認コマンド | mawatari.jp

Kernel Panic 時の自動再起動設定

sudo vi /etc/sysctl.conf
# When kernel panic's, reboot after 10 second delay
-kernel.panic = 0
+kernel.panic = 10
設定の反映
sudo sysctl -p
設定の確認
cat /proc/sys/kernel/panic

日本語化

sudo vim /etc/sysconfig/i18n
-LANG="C"
+LANG="ja_JP.UTF-8"
sudo reboot

IPv6の無効化

適当に IPv6 を無効にすると SELinux でエラーになるらしい。
モジュールは読みこむようにして設定で無効化するとエラーにならないとか。
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
参考
How do I disable IPv6? - FAQ/CentOS6 - CentOS Wiki
CentOS6でIPv6を無効化する - shinayoshiの日記
確認
sudo vi /etc/sysctl.conf
# 以下の記述があれば無効化されているはず
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
sudo /sbin/sysctl -p
# なんかエラーが出るのでコメントアウトする(要出典)
ifconfig
# inet6 の記述がなければ IPv6 が無効化されている
netstat -an -A inet6
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State 
lsmod | grep ipv6
ipv6                  318183  0 
確認方法もいっぱいある。

不正アクセス監視 denyhosts の導入

logwatch の設定


参考

さくらVPS/Cent OS 6.4 ipv6の停止/日本語化/denyhosts導入[Railsサーバへの道] - 酒と泪とRubyとRailsと
CentOS6でIPv6を無効化する - shinayoshiの日記

さくらのVPS初期設定[SSH接続設定/ユーザ追加/公開鍵認証/iptables]

2014年も半年が過ぎ、今年の目標のイテレーションを回そうと思ったら
思いのほか何もやっていない感があったので
何かやらねば、と思い、タスク管理がしたかったので Redmine を動かすために
去る7月1日にさくらのVPSを借りてみました。

さくらのVPSを借りる

HDD プランのメモリ 1G のやつを借りました。
月額約1000円、年間1万円ちょっとで自由に使えるサーバがあるなんて最高な気分です。
どうせなので2週間無料お試しで借りました。
スペックは 料金・サービス仕様 | VPS(仮想専用サーバ)は「さくらのVPS」
OS は CentOS6 x86_64 の標準 OS です。
アカウント登録とクレカ登録などを済ませてちょっとしたら「お申込受付完了のお知らせ」、
その10分後くらいに「[さくらのVPS] 仮登録完了のお知らせ」のメールが届きました。

たしか仮登録完了のお知らせが来るまで何もできないです。

用語定義

USER
サーバの作業ユーザ名
IP.ADD.RE.SS
サーバの IP アドレス
PORT
変更した SSH のポート番号
%
Mac でのコマンド
$
サーバのコマンド
#
コメント

VPS を起動する

さくらインターネットVPSコントロールパネルで仮想サーバ操作の起動ボタンを押します。
Updating RPMS on system: で結構待たされるのでエラーかと思いますが、ひたすら待ちます。
参考: さくらのVPSの初回起動時に応答が無くなるように見えるけど、気長に待つ | ただのにっき。

ここから先は さくらのVPSで最初にやっておくこと - 飲んだり寝たり を参考にした。

VPS に接続する

Mac の Terminal からいつものように SSH 接続。IP アドレスとパスワードは仮登録のメールにある。
ssh root@IP.ADD.RE.SS

root パスワードの変更

passwd
# パスワード入力
セキュリティ対策。

SSH のポートを変更する

# 設定ファイルのバックアップ
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
vi /etc/ssh/sshd_config
-Port 22
+Port PORT
セキュリティ対策:サーバの 22 番ポートを調べて脆弱性がないか確認するポートスキャンという手法対策。
10022 に変える記述が多いけど 10022 に変えるのがデファクトスタンダードになったら
10022 にもポートスキャンしてくるんじゃないかなーと思ったり。
49513 〜 65535 が自由に使えるダイナミックポート/プライベートポートと呼ばれるポートらしいので
僕はその間のポートにしました。
参考: ポート番号は何番を使えばいいのか教えて下さい - ポート開放ナビ
SSH 接続設定の再読み込み
/etc/rc.d/init.d/sshd reload
Command + T で Terminal のタブを増やして動作確認(元のタブは万が一のために閉じない)
ssh -p PORT root@IP.ADD.RE.SS
# 変更したパスワードを入力

作業用ユーザの追加と設定

作業用ユーザの追加

useradd USER
passwd USER
# パスワード入力
USER: ユーザ名
以降、root ユーザでは接続せず、作業用ユーザで接続する。
必要のある場合のみ sudo su - で root になる。

root ユーザでのログイン禁止

sudo vi /etc/ssh/sshd_config
#PermitRootLogin yes 
PermitRootLogin no

sudo の設定

sudo が使える wheel グループに追加する
usermod -G wheel USER
参考
「wheelグループ」とは:ITpro
[Linux] なぜ sudo する権限のあるグループが「 wheel 」という名前なのか « Codaholic
wheel が sudo を使えるようにする
visudo
## Allows people in group wheel to run all commands
-# %wheel  ALL=(ALL)       ALL
+%wheel  ALL=(ALL)       ALL

SSH 接続方式を公開鍵認証方式に変更

Mac でキーペア(秘密鍵, 公開鍵)の生成

ssh-keygen -t rsa
ssh-add ~/.ssh/id_rsa

公開鍵をサーバーに転送

scp -P PORT ~/.ssh/id_rsa.pub USER@IP.ADD.RE.SS:~/

公開鍵を登録する

ssh -p PORT USER@IP.ADD.RE.SS
mkdir ~/.ssh
chmod 700 ~/.ssh
mv id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

パスワード認証の無効化

sudo vi /etc/ssh/sshd_config
-PasswordAuthentication yes 
+PasswordAuthentication no
sudo service sshd restart
# 問題がなければ [OK] と表示される

接続の確認

ssh -p PORT USER@IP.ADD.RE.SS
# ログイン出来る(パスワードが聞かれない)
ssh -p PORT root@IP.ADD.RE.SS
ログイン出来ない

SSH 接続の簡略化

vi ~/.ssh/config
HOST ALIAS
    HostName IP.ADD.RE.SS
    Port PORT
    User USER
    identityfile ~/.ssh/id_rsa
ssh ALIAS
エイリアスで SSH 接続できるので便利です。
参考: .ssh/configで設定すると接続が楽になる方法 - Qiita

iptables (Firewall)の設定

参考
俺史上最強のiptablesをさらす - Qiita
さくらVPS/Cent OS 6.4 iptableの設定[Railsサーバへの道][セキュリティ] - 酒と泪とRubyとRailsと
iptablesでパケットフィルタリングするための設定 - 飲んだり寝たり
sudo mkdir /root/bin/
sudo vim /root/bin/iptables.sh
wada811/iptables.sh
sudo sh /root/bin/iptables.sh
sudo iptables -L
sudo chkconfig iptables on
# OS起動時にiptablesを起動するようにする
chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
# 3:on になっていれば OK

設定完了

とりあえず必須な初期設定はこれで完了だと思います。
必ずコレはやっておけみたいなのとか、間違ってるとか、もっとこうした方が良いとかあればコメント下さい。
2014/07/06

[ShellScript]adb-screencap で Android 端末の画面をキャプチャしてPCに持ってくるコマンド

adbでスクリーンショットを撮るやつ - teshi04 / adb-screencap.sh
↑を実行するのに ./adb-screencap.sh とかするよりパスの通っているところに置いて
コマンドっぽく adb-screencap ってしたかったので書き換えてみた。
ついでに複数端末接続時に端末を指定してキャプチャできるようにしてみた。

man の書き方とか contribution の書き方とかライセンスとかどうすればいいのかわからないので
誰か良い感じにして下さい。
全然エラー制御していなくて、端末が認識されていないのに実行したり、
複数端末が認識されているのに端末を指定せずに実行した時はコマンドの分だけエラーが出ます。

入門UNIXシェルプログラミングを途中まで読んでいたので
制御文の書き方レベルしか知らなくて
初めてのシェルプログラミングだったので空文字チェックで地味に詰まりました。

if [ -z $SERIAL ] だと $SERIAL が null の場合
if [ -z ] と評価されて unary operator expected というエラーが出ます。
if [ -z "$SERIAL" ] のようにクォートで囲って
if [ -z "" ] と評価されるようにすれば
-z (Zero length) の引数にちゃんと空文字が渡されてエラーになりません。

あ、あとコメントの TODO にある通り、オプション引数の有無でコマンドを分けていて微妙なので
誰か良い方法を知っていたら教えて下さい。よろしくお願いします。
GitHub→ wada811/ADB-Tools

参考
シェルスクリプトを公開するとき, コマンド前にバックスラッシュをつけるべき - Life is very short
Bash - 今更ながら抑えておきたいシェルスクリプト用チートシート - Qiita
シェルスクリプトの条件評価ではまりやすいところ - ritchiekotzen's blog
シェルスクリプトで空文字列かどうか調べる。 - masa.edw the ハバネロブリーダー

タグ(RSS)