【初心者向け】ゼロから始める！自宅で ownCloud on Raspberry Pi

#はじめに
「Dropbox の容量足りなくなってきた」
「でも有料プランにしても使いこなせるかどうか・・・」

――なんてこと、思ったことありませんか？

そんな方にオススメしたいのが **ownCloud** です．
ownCloud は専用のサーバに Dropbox ライクなオンラインストレージサービスを構築するオープンソース・ソフトウェアで，これを使えば **無料＆容量無制限** のオンラインストレージサービスを **自宅等に構築** することができます．

今回はこの ownCloud を **Raspberry Pi** の上で構築し，実用に至るまでの手順をゼロから紹介したいと思います．

#何故，Raspberry Pi？
Raspberry Pi はイギリスで開発された ARM 搭載のシングルボードコンピュータです．はっきり言って非力ですが，最大の売りである **安価で低消費電力** は オンラインストレージサービスを構築・運用する上で非常に魅力的だと思います．

実際に維持費がどれくらい掛かるかというと，今回システムの構築に用いる **Raspberry Pi B+** と **外付けポータブル HDD（HD-PE320U2）**は合わせて消費電力が **最大 5.5 W** しかありません．ここで消費電力の平均が 3 W くらいだとして，1 kWh が 22 円だとすると月に掛かる電気代は **約 50 円**．Dropbox の有料プランが月 1,200 円（2014/11/15現在）であることを考えると **格段に安い** といえます．

という訳でこれをモチベーションにぼちぼち手順の方に入りたいと思います．

#用意するもの
* Raspberry Pi B+（以下，ラズパイ）
    * B でも可
* microSD カード
    * 4GB 以上推奨 
* 外付け HDD（USB タイプ）
    * データ保存用
    * ポータブル HDD がおすすめ（低消費電力＆静音性）
* micro USB 電源
    * 外付け HDD がバスパワー方式なら出力が 2.0A くらいのやつ
    * 外付け HDD がセルフパワー方式なら出力が 0.6A 以上（ラズパイ B の場合は 0.7A 以上）
* LAN ケーブル
* Windows PC
    * 今回は作業 PC として Windows を想定
    * もちろん Mac や Linux でも同様の手順でできます
* 初期設定用インターフェイス（なくても可．全操作を SSH ですれば OK）
    * USB キーボード
    * HDMI ケーブル
    * HDMI 対応ディスプレイ

#1. Raspbian のインストール＆設定
### ■ まずはラズパイに OS を入れて起動
1. [http://www.raspberrypi.org/downloads/](http://www.raspberrypi.org/downloads/) から RASPBIAN - Debian Wheezy（2014/11/15 現在では 2014-09-09 が最新版） をダウンロード．
2. 解凍してでてきた .img ファイルを [Win32DiskImager](http://sourceforge.jp/projects/sfnet_win32diskimager/) 等のソフトで用意した microSD に書き込む（完了したら必ず“ハードウェアの取り外し”を行ってから取り外して下さい）．
3. ラズパイに microSD，LAN ケーブル，外付け HDD，USB キーボード，HDMI ケーブルを装着し，最後に電源ケーブルを差し込む．
4. ラズパイが起動します（再起動するにはコマンドラインから **'$ sudo reboot'** を実行，シャットダウンする場合は **'$ sudo halt'** を実行してから電源ケーブルを抜いて下さい）．

### ■ 次は Raspbian を設定
#### - 初期設定
ラズパイが起動してしばらく待つと初期設定画面が表示されるので次のように設定．

* **SD カードの全ての領域を利用可能にする**
    1. "Expand Filesystem"
    2. "Ok"
* **デフォルトユーザ（ユーザ名 pi）のパスワードを変える**
    1. "Change User Password"
    2. "Ok"
    3. （新しいパスワードを 2 回入力）
    4. "Ok"
* **タイムゾーンを東京に設定する**
    1. "Internationalisation Options"
    2. "Change Timezone"
    3. "Asia"
    4. "Tokyo"
* **キーボードレイアウトを変更する（ここでは日本語 105 キータイプを想定）**
    1. "Internationalisation Options"
    2. "Change Keyboard Layout"
    3. "Generic 105-key (Intel) PC"
    4. "Other"
    5. "Japanese"
    6. "Japanese"
    7. "The default for the keyboard layout"
    8. "No compose key"
    9. "No"
* **高速化のためオーバークロックする**
    1. "Overclock"
    2. "Ok"
    3. "Turbo 1000MHz"
    4. "Ok"
* **グラフィックに使用するメモリを最小にする**
    1. "Advanced Options" を選択
    2. "Memory Split" を選択
    3. "16"に設定

最後に tab キーを押して "Finish"→"Yes" で再起動して設定を反映させてください．
起動したらユーザー名 pi でログインしてください．また，最初に次のコマンドで root のパスワードを設定しておいた方がいいかと思います．

```bash
pi@raspberrypi ~ $ sudo passwd
(設定したいパスワードを 2 回入力)
```

#### - ラズパイの USB 給電能力を 1.2A に設定（バスパワー式の HDD のみ）
バスパワー式の HDD を使用しているとデフォルト（0.6A）では電力不足となる場合があります（実際に私が使用した HD-PE320U2 だと電力不足を知らせるビープ音が鳴っていました）．そこでラズパイの給電能力を config.txt を編集して最大限に引き上げます．

```bash
pi@raspberrypi ~ $ sudo nano /boot/config.txt
```

nano（テキストエディタ）が起動したら次の行を書き足してください．

```
safe_mode_gpio=4
```

設定できたら Ctrl-O → Enter で上書き保存し，Ctrl-X で nano を終了してください．
再起動すれば設定が反映され，バスパワー式 HDD でも正常にドライブできるようになります．

#### - 固定 IP アドレスの設定
サーバの IP アドレスがころころ変わったら大変なので，ネットワーク・インターフェイスの設定を変更してラズパイに静的な IP アドレスを与えます．

```bash
pi@raspberrypi ~ $ sudo nano /etc/network/interfaces
```

次の該当箇所を下のように書き換えます．

```
iface eth0 inet dhcp
↓
iface eth0 inet static
address [設定したい固定 IP アドレス（他の機器と被らないようにする）]
netmask [サブネットマスク]
gateway [デフォルトゲートウェイの IP アドレス]
```

サブネットマスクとデフォルトゲートウェイの IP アドレスは作業 PC のコマンドプロンプトで **$ ipconfig** を実行する等すれば知ることができます．具体的にはこんな感じに設定します（例）．

```
iface eth0 inet static
address 192.168.1.22
netmask 255.255.255.0
gateway 192.168.1.1
```

ファイルを上書き保存すれば Raspbian の設定は終わりです．ラズパイをシャットダウンしてキーボードと HDMI ケーブルは取り外してもらって構いません．以降は作業 PC から SSH でラズパイを操作していきたいと思います．

#### - SSH クライアントの設定
[Tera Term](http://sourceforge.jp/projects/ttssh2/) 等の SSH クライアントを用いてラズパイと作業 PC を接続します．
ラズパイの電源を入れた状態で，ホストには先程設定した **ラズパイの IP アドレス（ex. 192.168.1.xx）**，TCP ポート番号には **22** を設定し，ユーザ名 pi でログインしてください．

#2. 必要パッケージのインストール
ownCloud の構築に必要なパッケージをインストールします．まずは apt のインデックスリストとインストール済みパッケージを最新にします．

```bash
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
```
必要パッケージをインストールします．

```bash
pi@raspberrypi ~ $ sudo apt-get install nginx openssl ssl-cert php5-cli php5-sqlite php5-gd php5-common php5-cgi sqlite3 php-pear php-apc curl libapr1 libtool curl libcurl4-openssl-dev php-xml-parser php5 php5-dev php5-gd php5-fpm memcached php5-memcache php5-curl varnish
```
#3. 無料 DDNS サービスへの登録
自宅でサーバを公開するには外部に公開する IP アドレス（プロバイダから支給）が必要ですが，このアドレスは一般的にころころと変わってしまいます．そこで適当なホスト名を発行し，このホスト名と外向き IP アドレスを動的に結びつける（DDNS）ことでサーバへのアクセスを簡便化したいと思います．

### ■ ieServer.Net に登録
お金を掛けないことがモチベーションなので，ここでは無料（寄付制）の DDNS サービスである [ieServer.Net](http://ieserver.net/) を利用させてもらいます．

登録は超カンタン．「新規ユーザー登録」ページにて規約に同意し（通常接続の方をクリック）， **ユーザ名**，**ドメイン**，**メールアドレス**，**パスワード** を指定して「登録」をクリックするだけです（ホスト名は **ユーザ名.ドメイン** となる）．登録の反映には時間がかかる場合がありますので他の作業をしておくといいかもしれません．

### ■ IP アドレス更新スクリプトを cron に登録
外向き IP アドレスが変更されてないか確認し，変更されていれば自動でホスト名と紐付けし直すスクリプトを一定期間毎に実行します．以下の ieServer.Net 専用スクリプト（ddns-update.pl，[ここ](http://ieserver.net/ddns-update.txt)から引用して少し改変）を /usr/local/ddns/ に保存してください．なお，ソース中の **ユーザ名**，**ドメイン**，**パスワード** は ieServer.Net に登録したものに変える必要があります．

```pl:ddns-update.pl
#!/usr/bin/perl

$CURRENT_IP_FILE = "/var/log/ieserver/current_ip";
$LOG_FILE        = "/var/log/ieserver/ip_update.log";
$REMOTE_ADDR_CHK = "http://ieserver.net/ipcheck.shtml";
$DDNS_UPDATE     = "http://ieserver.net/cgi-bin/dip.cgi";

$ACCOUNT         = "ユーザ名";
$DOMAIN          = "ドメイン";
$PASSWORD        = "パスワード";

if(!open(FILE,"$CURRENT_IP_FILE")) {
    $CURRENT_IP = '0.0.0.0';
    } else {
    $CURRENT_IP = <FILE>;
    close FILE;
}

$NEW_IP = '0.0.0.0';
$NEW_IP = `wget -q -O - $REMOTE_ADDR_CHK`;

if ($NEW_IP ne "0.0.0.0" and $CURRENT_IP ne $NEW_IP) {

    $STATUS = `wget -q -O - '$DDNS_UPDATE?username=$ACCOUNT&domain=$DOMAIN&password=$PASSWORD&updatehost=1'`;
    
    if ($STATUS =~ m/$NEW_IP/) {    
        open (FILE ,">$CURRENT_IP_FILE");
        print FILE $NEW_IP;
        close FILE;
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Updated $CURRENT_IP to $NEW_IP\n";
        close FILE;
    } else {
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Update aborted $CURRENT_IP to $NEW_IP\n";
        close FILE;
    }
}
exit;

```

一応手順を書いておきます．スクリプト保存先のディレクトリを作成し，スクリプトファイルをそこに作成します．ログファイルの保存先ディレクトリもここで作成しておいてください．

```bash
pi@raspberrypi ~ $ sudo mkdir /usr/local/ddns
pi@raspberrypi ~ $ sudo mkdir /var/log/ieserver
pi@raspberrypi ~ $ sudo nano /usr/local/ddns/ddns-update.pl
```

上記スクリプトのコピペがうまくいかない場合，作業 PC で ddns-update.pl を作成しラズパイに転送する手段もあります．[FileZilla](http://sourceforge.jp/projects/filezilla/) 等の FTP クライアントソフトを用いて pi のホームに ddns-update.pl を転送してから **'$ sudo mv ddns-update.pl /usr/local/ddns/'** で上記ディレクトリに移動させる，といった感じです．この際，FTP ソフトの設定は次のようにすればよいです．

* ホスト名：ラズパイのローカル IP アドレス
* ポート：空欄
* プロトコル：SFTP
* ユーザ：pi
* パスワード：[pi のパスワード]

実行できるように ddns-update.pl のパーミッションを変更します．

```bash
pi@raspberrypi ~ $ sudo chmod 755 /usr/local/ddns/ddns-update.pl
```

続いて cron の設定です．cron とは指定した時間に指定したスクリプト等を自動的に実行してくれるデーモンプロセスのことです．こいつを使って ddns-update.pl を 10 分おきに実行させたいと思います．

```
pi@raspberrypi ~ $ sudo crontab -e
```

上記コマンドを実行したら nano が起動するので以下の行をファイルに書き足します．

```
*/10 * * * * /usr/local/ddns/ddns-update.pl
```

これで DDNS の設定は全て完了です．

# 4. サーバの設定

### ■ ownCloud 利用者用にユーザを作成

```bash
pi@raspberrypi ~ $ sudo groupadd www-data
pi@raspberrypi ~ $ sudo usermod -a -G www-data www-data
```

### ■ SSL サーバ証明書（5年）を作成

```bash
pi@raspberrypi ~ $ sudo openssl req $@ -new -x509 -days 1825 -nodes -out /etc/nginx/cert.pem -keyout /etc/nginx/cert.key
pi@raspberrypi ~ $ sudo chmod 600 /etc/nginx/cert.pem
pi@raspberrypi ~ $ sudo chmod 600 /etc/nginx/cert.key
```

SSL サーバ証明書の作成には身元情報の入力が必要ですが，構築しているサーバは完全に自分用なので入力は適当でいいと思います（以下は例）．

* Country Name : JP
* State or Province Name : Tokyo
* Locality Name : .
* Organization Name : .
* Organization Unit Name : .
* Common Name : user.domain.jp（ieServer.Net で登録したホスト名）
* Email Address : .

### ■ Ngnix（Web サーバ） の設定
設定ファイルの編集は次のコマンドで行います．

```
pi@raspberrypi ~ $ sudo nano /etc/nginx/sites-available/default
```

このファイルの中身を全て以下の記述に置き換えてください（**[ieServer.Net で取得したホスト名]** は自分が登録したものに変更してください）．

```nginx:default
upstream php-handler {
        server 127.0.0.1:9000;
        #server unix:/var/run/php5-fpm.sock;
}
 
server {
        listen 80;
        server_name [ieServer.Net で取得したホスト名];
        return 301 https://$server_name$request_uri;  # enforce https
}
 
server {
        listen 443 ssl;
        server_name [ieServer.Net で取得したホスト名];
 
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
 
        # Path to the root of your installation
        root /var/www/owncloud;
 
        client_max_body_size 1000M; # set max upload size
        fastcgi_buffers 64 4K;

        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 360;
 
        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
 
        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;
 
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
 
        location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
                deny all;
        }
 
        location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
 
                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
 
                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
 
                try_files $uri $uri/ index.php;
        }
 
        location ~ \.php(?:$|/) {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param HTTPS on;
                fastcgi_pass php-handler;
        }
 
        # Optional: set long EXPIRES header on static assets
        location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires 30d;
                # Optional: Don't log access to assets
                access_log off;
        }
 
}
```

### ■ ファイルサイズの上限の設定
全部で 3 個のファイルを編集します．

#### - 1 個目

```bash
pi@raspberrypi ~ $ sudo nano /etc/php5/fpm/php.ini
```
以下の 2 つのパラメータ値を変更（ctrl-w で検索可能）してください．

```php
upload_max_filesize = 1000M
post_max_size = 1000M
```

#### - 2 個目

```bash
pi@raspberrypi ~ $ sudo nano /etc/php5/fpm/pool.d/www.conf
```
次の行を下の様に変更してください．

```php
listen = /var/run/php5-fpm.sock 
↓  
listen = 127.0.0.1:9000
```

#### - 3 個目

```bash
pi@raspberrypi ~ $ sudo nano /etc/dphys-swapfile
```
次の行を下の様に変更してください．

```php
CONF_SWAPSIZE=100 
↓  
CONF_SWAPSIZE=512
```

### ■ 最後に PHP と Nginx を再始動して設定を反映

```bash
pi@raspberrypi ~ $ sudo /etc/init.d/php5-fpm restart
pi@raspberrypi ~ $ sudo /etc/init.d/nginx restart
```

# 5. ポート解放
ポートの解放方法はルータによってまちまちなのでここでは割愛します．
外部からの TCP ポート 80 番および 443 番へのアクセスを ラズパイの ローカル IP アドレスにマッピングしてください（ポート番号の変換は不要です）．

# 6. 外付け HDD の設定
### ■ パーティションのフォーマット
まずは外付け HDD のパーティションがどうなっているのか確認します．

```bash
pi@raspberrypi ~ $ sudo fdisk -l
```

例えば私の場合はこんな感じの出力が得られました．

```bash
Disk /dev/mmcblk0: 31.7 GB, 31657558016 bytes
4 heads, 16 sectors/track, 966112 cylinders, total 61831168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: xxxxxxxxxx

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    61831167    30854144   83  Linux

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: yyyyyyyyyy

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   625139711   312568832    7  HPFS/NTFS/exFAT
```

この例では上半分が microSD カード，下半分が外付け HDD の情報となっています．/dev/sda が外付け HDD 自身，/dev/sda1 がその中のパーティションを示します．**もしパーティションがまだない場合** は次のコマンドモードに入りパーティションを作成してください．

```bash
pi@raspberrypi ~ $ sudo fdisk /dev/sda
(n → Enter → Enter → Enter → Enter → w の順にキー入力)
```

既存のもしくは新しく作成したパーティションを ext4 でフォーマットします．

```bash
pi@raspberrypi ~ $ sudo mkfs.ext4 -m 0.001 /dev/sda1
```

### ■ パーティションのマウント

上でフォーマットしたパーティションをマウントします．また，ラズパイ起動時に自動でマウント（パーティションの UUID を使用）する設定もしたいと思います．ちなみにマウント先は /mnt/hdd1 としました．

```bash
pi@raspberrypi ~ $ sudo mkdir /mnt/hdd1
pi@raspberrypi ~ $ sudo mount /dev/sda1 /mnt/hdd1
pi@raspberrypi ~ $ sudo blkid /dev/sda1
(表示される UUID をコピーする)
pi@raspberrypi ~ $ sudo nano /etc/fstab
```

/etc/fstab に以下の文字列を追記します．UUIDには上でコピーしたものをペーストしてください．

```
UUID="～～～～～～" /mnt/hdd1 ext4 defaults 0 0
```

ファイルを保存すれば自動マウントの設定は完了です．

### ■ ownCloud 用データディレクトリの作成
```bash
pi@raspberrypi ~ $ sudo mkdir /mnt/hdd1/data
```
ownCloud から利用できるように所有者とパーミッションを変更します．

```bash
pi@raspberrypi ~ $ sudo chown -R www-data:www-data /mnt/hdd1/data
pi@raspberrypi ~ $ sudo chmod -R 770 /mnt/hdd1/data
```

# 7. ownCloud のインストールと設定
あともう一息です．最後に ownCloud のインストールと設定を行います．

### ■ ownCloud のインストール
ownCloud の最新版をインストールします．

```bash
pi@raspberrypi ~ $ sudo mkdir -p /var/www/owncloud
pi@raspberrypi ~ $ wget https://download.owncloud.org/community/owncloud-latest.tar.bz2
pi@raspberrypi ~ $ tar xvf owncloud-latest.tar.bz2
pi@raspberrypi ~ $ sudo mv owncloud/ /var/www/
pi@raspberrypi ~ $ sudo chown -R www-data:www-data /var/www
pi@raspberrypi ~ $ rm owncloud-latest.tar.bz2
```
# 8. 完成
ラズパイを再起動して Web ブラウザからラズパイのローカル IP アドレスにアクセスしてみると（信用できない証明書のページを挟んで）設定画面がでるかと思います．ここで ownCloud の管理者とデータディレクトリ（/mnt/hdd1/data）を設定すると完成です．お疲れ様でした＼(^o^)／

# 参考文献
* [How to setup ownCloud 7 on Raspberry Pi](http://www.techjawab.com/2014/08/how-to-setup-owncloud-7-on-raspberry-pi.html)
* [Raspberry Pi Model B+のUSBポートに1.2Aの電力を供給する](http://akkiesoft.hatenablog.jp/entry/20140727/1406443999)
* [固定IPアドレスの設定](http://www.hiramine.com/physicalcomputing/raspberrypi/setup_staticip.html)
* [504 Gateway Timeout with Centos/nginx](http://forum.owncloud.org/viewtopic.php?f=3&t=3906)