Raspberry PiとVPNで作るウェブオンラインストレージサーバ

画像や動画、文章などを簡単に保存するとなると昔ならHDDやポータブルHDDなどに保存していました。最近であれば、ウェブオンラインストレージを使えば簡単に画像や動画、文章を転送して、また共有することができます。代表的なサービスとしてはDropboxやGoogle Drive、OneDriveなどがあります。

今回はRaspberry Piを用いてVPN上で運用するウェブオンラインストレージサーバを構築します。使用するものはownCloudと呼ばれるものです。

#1:サーバのセットアップ

サーバのセットアップを行う。セットアップ済みの場合は、この項目を飛ばしても構いません。

今回使用するイメージはRaspbian Jessie Liteで、Raspbian Jessie With Pixelと同様です。

詳しいことはこちらの記事を参考にしてください。


Raspberry Piで実行するVPN上のWordPress

各種参考項目:

#1:Raspberry Piのセットアップ
#1-1:Raspberry Piに必要なイメージをダウンロード
#1-2:ダウンロードしたイメージをMicro SDに書き込む
#1-3:初期起動の設定

#2:VPNの導入
#2-1:Hamachiへの登録
#2-2:クライアントへダウンロード&インストール
#2-3:Raspberry PiをHamachi VPNに参加させる


#2:サーバに必要な条件を整える

Raspberry PiをウェブサーバとするにはApacheやPHPを導入する必要があります。これがなければ表示することが出来ません。

#2-1:Apache2を導入する

ApacheはHTMLを表示するためのものです。下記のコマンドより導入します。

$ sudo apt-get install apache2

先程ifconfigで調べた自身のIPアドレスをブラウザに入力すると次の表示がされます。

2016-12-24
It works!

#2-2:PHP5の導入

PHP5を導入する必要があります。下記のコマンドより導入します。

$ sudo aptitude install php5 php5-curl

#2-3:MySQLの導入

MySQLを導入します。途中でMySQLに設定するパスワードを聞かれますので、設定して下さい。ここでは例として”raspass”とします。二度聞かれるのでどちらも同じパスワードを入力して下さい。

$ sudo apt-get install mysql-server php5-mysql

#2-4:データベースの作成

実際に運用させるためのデータベースを作成します。今回は”ownCloud”というデータベースを作成します。因みにMySQLにログインするには例として”mysql -uroot -praspass”で入ることができます。詳しく説明すると”mysql -u[User Name] -p[Password]”となっています。今回はowncloudというデータベースを作成します。

$ mysql -uroot -praspass
mysql> CREATE DATABASE owncloud;
mysql> exit

#2-5:phpMyAdminの導入

phpMyAdminを導入します。こちらも途中パスワードを聞かれますので問題なければ先程と同じパスワードを使います。嫌だと思う場合は、phpMyAdminで聞かれるパスワードのみを変え、2度目に同じものを入力して下さい。

$ sudo apt-get install phpmyadmin

#3:ownCloudの導入

今回使うオンラインストレージはownCloudを使用します。最新パッケージはこちらをご覧ください。

#3-1:ownCloudをダウンロードする。

$ wget https://download.owncloud.org/community/owncloud-9.1.3.zip
$ unzip owncloud-9.1.3.zip

#3-2:Apache上に配置する

Apache上でWordPressを再現する必要があるため、移動します。

$ sudo cp -r owncloud /var/www/html/owncloud

#3-3:権限問題の解決

どうしても生じるのが権限問題です。www-dataに権限を移譲し、設定を執り行います。

$ sudo chown -R www-data:www-data /var/www/html/owncloud

#4:ownCloudの設定

いよいよownCloudの設定に移ります。

#4-1:アカウント作成

『http://[Hamachi IP Address]/owncloud/』にアクセスしてみましょう。お好みのユーザ名とパスワードを作成します。

Own1.png
アカウントの作成

データベースに接続します。データベースのユーザ名、データベースのパスワード、先ほど作成したデータベース名を入力します。

Own2.png
データベースへのログイン

#4-2:実行してみた

Own3.png
アップロードしてブラウザ上で表示

以上

Raspberry PiにHamachiをインストールするのが更に簡単になったので紹介

以前紹介した方法は古いヴァージョンでインストールにはlsbやlsb-coreが必要であった。今回紹介するヴァージョンではパッケージ等の導入する必要がない。

今回使うヴァージョンは2.1.0.174-1である。これ単体でインストールすると、Hamachiの導入とHamachiの自動起動まで設定される。

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

ログイン作業を行えばHamachiのグループに参加することが可能となる。最後のhamachi joinはWEB承認を使っている場合不要で、WEB承認を使っている場合はWEB上から承認すると参加できる。

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

これでログインが完了となる。Raspberry Piを再起動して自動起動するか確かめてもらいたい。

以上

Raspberry Piで実行するVPN上のWordPress

Raspberry Piの良いところ、Linuxが扱えることができるマイコンであるという点ですかね。さて、このRaspberry Piを使ってVPN上でWordPressを運用させると言うことは、本人もしくはVPNに参加する人間のみが編集、閲覧することが出来るサイトです。一種のクローズドサイトと呼ばれるものです。自分専用の忘備録であったり、日記であったり、仲間内での共同サイトであったりとVPNという閉鎖的回線を用いることによってプライバシが担保されるものです。簡易的な様子を図示しました。実際にはもっと複雑な処理をしていますが省いています。

vision_1.png
VPNを使えばどこでもWordPressを見ることができる。

因みに今回の設定は外部公開に向きませんのでご留意下さい(ポート開放等の公開行為)。あくまでもVPN上での運用が大前提です。

#1:Raspberry Piのセットアップ

Raspberry Piをセットアップする必要があります。筆者自身もはじめからセットアップを行いました。

#1-1:Raspberry Piに必要なイメージをダウンロード

Raspberry Piに必要なイメージとして、Raspbianを使います。今回筆者が使ったものはRaspbian Jessie LiteというものでRaspbian Jessie With Pixelではありません。Raspbian Jessie LiteはGUIモードがなくCUIモードのみとなっています。しかし、結局のところWordPressというWEB GUIを使用するので何ら問題ありません。また、個人の好みにもよるもので、With Pixelを選択してもLiteを選択しても動作には変わりありませんが、容量を少なく済ませたいのであればLiteをおすすめします。公式サイトよりダウンロードすることができます。

項目
OS Raspbian Jessie Lite
ヴァージョン November 2016
リリース日 2016年11月25日
カーネルバージョン 4.4

#1-2:ダウンロードしたイメージをMicro SDに書き込む

ダウンロードしたファイルを解凍(展開)し、Win32 Disk Imagerで対象のMicro SDに書き込む作業を行って下さい。Win32 Disk ImagerはOSDNよりダウンロードすることができます。詳しい書き込み方法はこちらを参考にして下さい。

#1-3:初期起動の設定

初期起動時、SSHはデフォルトで有効でしたが今回リリースされたヴァージョンではデフォルトでSSHが無効になっているため初期段階からSSHでログインすることができませんでした。有効にするには下記のコマンドを入力し、[5]=>[P5]の順に移動します。

$ sudo raspi-config

最後に自分自身のIPアドレスを確認します。有線LANの場合、eth0を参照し、無線LANの場合、wlan0を参照して下さい。割り当てられたIPアドレスはinet アドレスにて確認することができます。筆者の場合ですと、192.168.11.14に今回割り当てられました。

$ ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス b8:27:eb:05:fc:33
     inetアドレス:192.168.11.14 ブロードキャスト:192.168.11.255 マスク:255.255.255.0

Windowsパソコンで操作する場合はTera TermでSSH接続を行います。Tera Termはこちらでダウンロードすることができます。先程取得したIPアドレスを入力して、ユーザ名とパスワードを入力して下さい。デフォルトのユーザ・パスワードは下記の表のとおりです。

項目
ユーザ名 pi
パスワード raspberry

ログインが完了したら、次にRaspbianのアップデートを行います。

$ sudo apt-get update
$ sudo apt-get upgrade

日本語化とタイムゾーンの変更を行います。下記のコマンドを実行し、必要な処理を行います。[2]よりpiのパスワードを変更して下さい。次に[4]=>[I1]より[en_GB.UTF-8 UTF-8]と[ja_JP.EUC-JP EUC-JP]と[ja_JP.UTF-8 UTF-8]を選択し、デフォルトで使用するロケールを[ja_JP.UTF-8]として下さい。最後に[4]=>[I2]を選択して[Asia]=>[Tokyo]と進んで下さい。

$ sudo raspi-config

次に日本語フォント等を導入します。

$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

vimエディタを追加(viが必要な場合のみ、nanoでも対応可能)

$ sudo apt-get install vim

以上を終えたら、下記のコマンドで再起動して下さい。

$ sudo reboot

#2:VPNの導入

VPNとして使うのはHamachiと呼ばれるものでSoftEtherよりも導入が簡単であり5台まで無料というメリットがあります。また、最近ではRaspberry Piへの導入が難なくできるのでおすすめであります。

#2-1:Hamachiへの登録

VPN.net – Hamachi by LogMeInにて登録を行います。

#2-2:クライアントへダウンロード&インストール

指示に従ってダウンロードを行って下さい。筆者の場合、Windowsにインストールしました。追加でiPhoneにもHamachiへ参加させました。

#2-3:Raspberry PiをHamachi VPNに参加させる

HamachiをRaspberry Pi (Raspbian)にインストールするのがとても簡単になりました。以前であればややこしい設定が必要でしたが、最近では自動起動まで勝手にやってくれます。Raspberry Piの操作に戻り、実際にHamachiをRaspberry Piに追加します。また、最新のヴァージョンはこちらで確認できます。選択する場合、『ARM HF version (BETA) *.deb』を選択して下さい。

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

次に参加要求を行います。最後のsudo hamachi joinの部分ですが、自動承認を選択した場合実行して下さい。通常であれば最後のsudo hamachi joinを実行せず、Hamachiの設定画面より『参加要求』から対象であるRaspberry Piを選択し、承認して下さい。

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

これでVPNへの参加を完了することができました。

#3:サイトに必要な条件を整える

Raspberry PiをウェブサーバとするにはApacheやPHPを導入する必要があります。これがなければ表示することが出来ません。

#3-1:Apache2を導入する

ApacheはHTMLを表示するためのものです。下記のコマンドより導入します。

$ sudo apt-get install apache2

先程ifconfigで調べた自身のIPアドレスをブラウザに入力すると次の表示がされます。

2016-12-24
It works!

#3-2:PHP5の導入

PHP5を導入する必要があります。下記のコマンドより導入します。

$ sudo aptitude install php5

#3-3:MySQLの導入

MySQLを導入します。途中でMySQLに設定するパスワードを聞かれますので、設定して下さい。ここでは例として”raspass”とします。二度聞かれるのでどちらも同じパスワードを入力して下さい。

$ sudo apt-get install mysql-server php5-mysql

#3-4:データベースの作成

実際に運用させるためのデータベースを作成します。今回は”wordpress”というデータベースを作成します。因みにMySQLにログインするには例として”mysql -uroot -praspass”で入ることができます。詳しく説明すると”mysql -u[User Name] -p[Password]”となっています。今回はwordpressというデータベースを作成します。

$ mysql -uroot -praspass
mysql> CREATE DATABASE wordpress;
mysql> exit

#3-5:phpMyAdminの導入

phpMyAdminを導入します。こちらも途中パスワードを聞かれますので問題なければ先程と同じパスワードを使います。嫌だと思う場合は、phpMyAdminで聞かれるパスワードのみを変え、2度目に同じものを入力して下さい。

$ sudo apt-get install phpmyadmin

#4:WordPressの導入

いよいよWordPressの導入です。日本語版を使って導入していきたいと思います。

#4-1:WordPress 4.7 日本語版をダウンロード

英語版が良いとお望みでしたら英語版もあるので参照するかと。ここでは日本語版について解説します。また、最新のWordPressについてはこちらから確認することが出来ます。

$ wget https://ja.wordpress.org/wordpress-4.7-ja.zip
$ unzip wordpress-4.7-ja.zip

#4-2:Apache上に配置する

Apache上でWordPressを再現する必要があるため、移動します。

$ sudo cp -r wordpress /var/www/html/wordpress

#4-3:権限問題の解決

どうしても生じるのが権限問題です。このまま実行してもwp-config.phpを手動で変更する必要がありますが、www-dataに権限を移行することによって今後生じる面倒事が無くなります。

$ sudo chown -R www-data:www-data /var/www/html/wordpress

#4-4:WEB上でWordPressの設定を行う

先程のifconfig IPアドレス値をブラウザ上に入力し、設定していきます。今回の場合ですと、私の場合、http://192.168.11.14/wordpressとなっています。環境が違うわけですからhttp://192.168.xxx.xxx/wordpressです。

2016-12-24 (1).png
正常表示

次に設定画面に先程設定したデータベース名などを入力していきます。データベースであるMySQLのパスワードは例として”raspass”を使用していますのでご自身が設定したパスワードを入力して下さい。その他の設定はそのままで十分です。

2016-12-24 (3).png
必要事項の入力

正しい値が入力されると以下の画面が出てきます。インストールの実行を行います。

2016-12-24 (5).png
正常にデータベースへ接続完了

 #4-5:サイトの基本情報の入力

サイトタイトルやユーザ名、パスワード、メールアドレスなどご自身のお好きな設定で。ここでは例を挙げているだけです。一応、公開はしませんが『検索エンジンがサイトをインデックスしないようにする』にチェックマークをつけましょう。

2016-12-24 (6).png
サイト基本情報の指定

#4-6:ログインをして動作を確認する

実際にログインを行って動作を確認して下さい。

2016-12-24 (7).png
管理画面
2016-12-24 (8).png
実際のサイト画面

#5:VPN上での改善

VPN上で表示するとレイアウトが崩れて正しく表示されない現象が発生します。これはWordPress上のアドレスがhttp://192.168.xxx.xxxであってVPNのアドレスであるhttp://25.xxx.xxx.xxxに対応していない為です。もし、正しく表示されているとしても、http://192.168.xxx.xxxに転送されているだけかもしれません。

因みに、これをVPN上のアドレスに対応させるだけでは不十分で次はローカルIP上からアクセス出来なくなります。

つまりIPアドレスである、http://192.168.xxx.xxx及びhttp://25.xxx.xxx.xxx (とhttp://raspberry.local)、に対応する必要があります。つまりWordPressのURLであるIPアドレスが2つ以上、つまり能動的(可変的)に動作する必要があります。

IP.png
処理のイメージ

#5-1:wp-config.phpの編集

wp-config.phpを編集し、サイトのURLを優先的に決定させ、能動的(可変的)にURLを変更可能にする設定を行います。ファイルの編集を行って下記の行を追加します。基本的に指定ありませんが(91行以下から制限あり)、データベースの照合順序[define(‘DB_COLLATE’, ”);](44行目)の下に追加するのが順当だと思います。

$ sudo vi /var/www/html/wordpress/wp-config.php
/** 動的URLに対応するめの設定 */
define('WP_SITEURL', 'http://' .$_SERVER['HTTP_HOST']. '/wordpress');
define('WP_HOME', 'http://' .$_SERVER['HTTP_HOST']. '/wordpress');

#5-2:記事本文中の画像等のURLを能動的(可変的)なものにする

wp-config.phpの設定のみでは不十分で、本文中の画像等のURLは変化しません。記事中で対応させるために『Insert PHP』というプラグインを新規追加します。[insert_php]XXXXXXX[/insert_php]で囲まれた範囲はphpが実行されます。つまりHTTP_HOSTが出力されるPHPを挿入すると可変的なURLにもメディアが対応することができます。[insert_php]echo $_SERVER[‘HTTP_HOST’];[/insert_php]をhttp://192.168.xxx.xxxの部分に置換することで対応することができます。IMGのURL部分に置換することで画像の能動的(可変的)な改善が得られます。

現在のアクセスURLは『http://[insert_php]echo $_SERVER['HTTP_HOST'];[/insert_php]』です。

#6:WordPress(PHP)のメディアアップロード容量を増やす

通常であれば、2MBですがこれは少ないのでメディアの許容アップロード値を増加させるべく対応させます。php.iniの変更を行います。

#6-1:php.iniの編集

$ sudo vi /etc/php5/apache2/php.ini
#393行
memory_limit = 128M
#660行
post_max_size = 80M
#820行
upload_max_filesize = 60M

#6-2:.htaccessの編集

次に.htaccessを編集します。以下を追加します。

$ sudo vi /var/www/html/wordpress/.htaccess
php_value memory_limit 128M
php_value post_max_size 80M
php_value upload_max_filesize 60M

#7:あとがき

最後に再起動を済ませると良いかもしれませんね。

$ sudo reboot

#7-0:

さて、ここまでどうでしたか?筆者も実行のみだと1時間くらいで終わりました。しかし、記事にするとなると3倍以上の時間がかかります。意外と大変…。でも、自分の忘備録ともなりますし、まぁ多分将来約に立つのかも。なにかエラー等が出ましたらコメント欄もしくは、お問い合わせページより報告お願いします。(クリスマスになに書いてるんだろ…。)

以上

RaspberryPiと携帯回線網(+VPN)の死活監視プログラム

こんにちは、筆者です。RaspberryPiと携帯回線網の組み合わせは最強です。しかし、時々ですが携帯回線がダウンしてしまう場合があります。それの対策として死活監視プログラムの作成が必須となります。L-02Cのファームアップデートだけでは対処できないかも…。

Pythonを使ったPingの確認

Pythonを使ったPingの確認は前回の記事に詳しくかいています。pypingを使う方法です。pypingを使うためにはpipで追加する必要があります。

$sudo pip install pyping

LEDを組み合わせる

GPIO 17,27,22 (Board 11, 13, 15)を使います。LEDと抵抗を準備してください。

Pythonで作ってみる(ベータ版)

ちょっと急いで作ったので使用は自己責任で。多分大丈夫だとは思う。送り先と繰り返し調整は注意して下さい。間違えがあればコメントよろしくお願いします。一応確認はしていますが…。

※追記:pypingは多分pingを送るinterfaceがないとエラーが発生します。つまり、エラーが繰り返してしまうトラブルが発生します。これを解消するためpypingのエラーに対して例外処理を施して再起動を円滑に行えるように対処しました。

$vi ping_monitor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping
import RPi.GPIO as GPIO
import time
import os
import sys
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
################################################
#確認したいアドレス
host_dns     = "8.8.8.8"
host_vpn_A   = "25.18.1.235"
#代替比較アドレス
host_vpn_B   = "25.19.178.224"
################################################
#tが時間,sがtime sleep
def led_n3_f(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(11, True)
      GPIO.output(13, True)
      GPIO.output(15, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, False)
      GPIO.output(15, False)
      time.sleep(s)
      n += 1
def led_n1_f(led_no, t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(led_no, True)
      time.sleep(s)
      GPIO.output(led_no, False)
      time.sleep(s)
      n += 1
def ping_tp(host_name, led_no, t):
   try:
      r_host = pyping.ping(host_name)
      if r_host.ret_code == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def ping_sb(host_name_A, host_name_B, led_no, t):
   try:
      rA_host = pyping.ping(host_name_A)
      rB_host = pyping.ping(host_name_B)
      rAB     = (rA_host.ret_code) * (rB_host.ret_code)
      if rAB == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def led_wait(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(15, False)
      GPIO.output(11, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, True)
      time.sleep(s)
      GPIO.output(13, False)
      GPIO.output(15, True)
      time.sleep(s)
      n += 1
#EX:)解説:ホスト名, GPIOのPIN, 指定時間
#EX:)ping_tp(host_vpn_A, 11, 5)
#待ち時間
led_n3_f(10, 0.7)
led_wait(50, 0.25)

############################################################
while True:
   try:
      cn = 0
      while cn < 30:
         led_n1_f(15, 10, 1.5)
         GPIO.output(15, True)
         time.sleep(50)
         cn += 1
      tt1 = ping_tp(host_dns, 11, 20)
      if tt1 == 0:
         kk1 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
         if kk1 == 0:
            pass
         else:
            led_n1_f(15, 10, 0.5)
            os.system('sudo hamachi login')
            kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk2 == 0:
               pass
            else:
               led_n1_f(15, 20, 0.05)
               os.system('sudo reboot')
               sys.exit()
      else:
         tt2 = ping_tp(host_dns, 11, 20)
         if tt2 == 0:
            kk3 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk3 == 0:
               pass
            else:
               led_n1_f(15, 10, 0.5)
               os.system('sudo hamachi login')
               kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
               if kk2 == 0:
                  pass
               else:
                  led_n1_f(15, 20, 0.05)
                  os.system('sudo reboot')
                  sys.exit()
         else:
            led_n1_f(15, 20, 0.05)
            os.system('sudo reboot')
            sys.exit()
   except:
      led_n3_f(1800, 0.05)
      os.system('sudo reboot')
      sys.exit()

自動起動するようにする

再起動後自動起動することによってまた監視を続行する。

$sudo vi /etc/rc.local

#最後らへんに追加 先程作ったディレクトリを選択してください。ここではusr
python /usr/local/bin/ping_monitor.py &

exit 0

以上

自動起動を止めたい場合はrc.localの追加部分をコメントアウトするか削除してください。