drag n drop

調べたことを書きます

VPSに、VPNとRedmineを入れる

プライベートでRedmineが使いたくなったので、VPSへデプロイしました。

グローバルには公開したくなかったので、VPNもデプロイして設定しました。

そのやり方について今回は書いていきます。

 

VPSを契約する

今回は、CPU:2core / RAM:1.5GBにしました。
個人でRedmineしか使わないのであれば、1core / 1GBでも足りると思います。

 

OSを入れる

Dockerを使うので、OSは何でもいいのですが、
Firewallとしてufwが使いたかったので、Ubuntu 16.04を選択しました。

初期設定の方法についての説明は省略します。sshが使える状態まで設定します。

こちらもご参考ください。

raspberry piにlinuxをインストールする - drag n drop

 

Firewallを設定する

とりあえずsshで使うポートだけ空けておきます。
 

sudo apt-get install ufw
sudo ufw default deny
sudo ufw allow 22222  # sshのポートを指定
sudo ufw enable
sudo ufw reload

 

Dockerを入れる

docker run hello-worldが動く状態まで設定します。

Get Docker for Ubuntu - Docker Documentation

 

VPNを入れる

pritunlというOSSVPNサーバーソフトを使いました。
このソフトは起動するだけですぐに使えるため便利です。

pritunlは設定データをMongoDBで永続化しているので、
先にMongoDBをデプロイします。

 

MongoDBを入れる

dockerは、デフォルト設定ではNATネットワークが使われますが、
その設定ではufwでポートをふさぐことができないため、
--net hostにして、Hostネットワークで起動させます。
/etc/localtimeを共有すると、ホストOSとコンテナの時計を同期できます。
 

docker pull mongo
docker run -d \
  --name mongo \
  --restart always \
  --net host \
  --volume /etc/localtime:/etc/localtime:ro \
  --volume /opt/docker/volume/mongo:/data/db \
  mongo

 

pritunlを入れる

MongoDBのIPを指定して起動させます。
Hostネットワークなので、127.0.0.1を指定することになります。
Hostネットワークでは、--linkは使えないようです。
pritunl set app.redirect_server false で、ポート80の使用を無効にできます。
 

docker pull fridus/pritunl
docker run -d \
  --name vpn \
  --restart always \
  --net host \
  --env MONGO_URI=mongodb://127.0.0.1:27017/pritunl \
  --volume /etc/localtime:/etc/localtime:ro \
  --privileged \
  fridus/pritunl /bin/bash -c "pritunl set app.redirect_server false; /start.sh"

 

VPNの初期設定をする

pritunlはWebUIから設定を行うため、
初期設定の間だけWebUIにログインするためのポートを開放してから、
管理画面にログインします。
pritunlの管理画面の初期ポートは443ですが、後から変えられます。

 

sudo ufw allow 443
sudo ufw reload

 

管理者アカウントのIDとパスワードの初期値は、どちらもpritunlになっています。
初期ログイン画面で、ポートとアカウント設定を変えておきます。
管理画面の右上のSettingsで、この設定はいつでも変更可能です。

 

まず、左上のUsersから、ユーザー管理画面を開きます。
Add Organizationをクリックして、接続グループを作成します。
このグループ名(組織名)は、ユーザーの作成で必要になります。
Add Userをクリックして、接続ユーザーを作成します。
ここで設定するPINコードは、VPNに接続するためのパスワードとなります。

 

ユーザーの作成が終わったら、ユーザーの横にあるDLアイコンを押して、
ユーザープロファイルのファイルを落としておきます。
このファイルがVPNへの接続で必要になります。

 

スマホから接続する場合は、DLアイコンの隣の鎖アイコンを押して、
短縮リンクを生成してからスマホのブラウザからアクセスして落とすと便利です。

 

ちなみに、作成したユーザーごとのQRコードのアイコンをクリックすると、
2段階認証のためのQRコードが表示されるので、
Googleなどの2段階認証アプリと連携させることもできます。

 

次に、左上のServersから、サーバー管理画面を開きます。
Add Serverをクリックして、VPNサーバーを作成します。
Name, Port, DNS Server を設定すれば、サーバーは作成できます。
Portは、デフォルトとは別のものにしておいたほうがいいと思います。

 

サーバーの作成が終わったら、Attach Organizationをクリックして、
サーバーに先ほど作成したグループを割り当てます。
この設定によって、サーバーが認証できるユーザーを割り当てることができます。

 

これで、VPNサーバーの初期設定は終わりです。
サーバー管理画面でStart Serverをクリックすると、VPNサーバーが起動されます。

 

ここまで設定が終わったら、
管理画面からログアウトして、ポート開放の設定を変更します。

 

sudo ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22222                      ALLOW IN    Anywhere                  
[ 2] 443                        ALLOW IN    Anywhere    

sudo ufw delete 2         # ルール番号を指定して削除します
sudo ufw allow 60001/udp  # VPNサーバーに設定したポートを指定します
sudo ufw reload

 

これで、VPNに接続するための準備ができました。

 

VPNに接続する

接続には専用のクライアントソフトが必要です。
pritunlの公式サイトから落とせます。
OpenVPN対応であれば、公式クライアントでなくても使えるかもしれません。

Pritunl Client - Open Source OpenVPN Client


Androidからは、OpenVPN Connectというアプリで接続できました。 

OpenVPN Connect - Google Play の Android アプリ


Android標準で付いているVPN接続機能では、
OpenVPNに対応していないのか、接続できませんでした。

 

PC用のクライアントソフトでは、
Import Profileでプロファイルデータを選択して、
右上のメニューからConnectをクリックしてPINコードを入れれば接続できます。

 

Android版のクライアントアプリでは、
右上のメニューからImport -> Import Profile from SD cardで、
プロファイルデータを選択して、UsernameとPasswordを入力して、
Connectをクリックすれば、接続できます。

VPNに接続して以降は、
ポートを開放せずに、VPS上のVPNサーバーの管理画面や、
その他のWebサービスにアクセスできるようになります。

 

Redmineを入れる

Redmineは、MySQLでデータを永続化しているので、
先にMySQLをデプロイしておきます。

 

MySQLを入れる

環境変数でrootのパスワードを設定します。
環境変数で設定したくない場合は、別途調べてみてください。

 

docker pull mysql
docker run -d \
  --name mysql \
  --restart always \
  --net host \
  --env MYSQL_ROOT_PASSWORD=pAs5w0rd \
  --volume /etc/localtime:/etc/localtime:ro \
  --volume /opt/docker/volume/mysql/data:/var/lib/mysql \
  mysql

 

MySQLの初期設定をする

Redmineで使用するためのデータベースとユーザーを作成します。

 

docker exec -it mysql bash
mysql -u root -p

# utf8でデータベースを作ることで、日本語に対応させます
> create database redmine default character set utf8;

# ユーザーを作成します
> create user redmine identified by 'pa55woRd';
> grant all on redmine.* to 'redmine';
> exit

exit

 

Redmineを入れる

pritunlのときと同様に、127.0.0.1でデータベースを指定して起動させます。

 

docker pull redmine
docker run -d \
  --name redmine \
  --restart always \
  --net host \
  --env 'REDMINE_DB_MYSQL=127.0.0.1' \
  --env 'REDMINE_DB_DATABASE=redmine' \
  --env 'REDMINE_DB_USERNAME=redmine' \
  --env 'REDMINE_DB_PASSWORD=pa55woRd' \
  --env 'REDMINE_DB_ENCODING=utf8' \
  --volume /etc/localtime:/etc/localtime:ro \
  --volume /opt/docker/volume/redmine/data:/usr/src/redmine/files \
  redmine

 

これで、ポート3000でRedmineが使える状態になっているはずです。

VPNによるVPSのIPは、ifconfigでtun0-00というinterface名で確認できるはずです。

 

設定方法は以上です。

 

Redmineプラグインを入れる

本題ではありませんが、
Redmineプラグインを使えるようにする方法についても書いておきます。

 

docker exec -it redmine bash

# プラグインをこのフォルダにインストールします
cd plugins
wget http://foo.bar/hoge.tar.gz
tar xf hoge.tar.gz
rm hoge.tar.gz
cd ..

# プラグインをredmineで使える状態にします
RAILS_ENV=production
export RAILS_ENV
bundle update
bundle install
bundle exec rake db:migrate
bundle exec rake tmp:cache:clear
bundle exec rake tmp:sessions:clear
bundle exec rake redmine:plugins:migrate

exit

# redmineを再起動します
docker restart redmine

 

これで、大抵のプラグインは使えるようになるはずです。

 

おわり!