Prokumaの雑記

限りなく日記帳に近いブログ

サーバーのホストOSをArch Linuxに変更+Dockerでサーバー構築

自分がConohaから借りているサーバーのホストOSをArch Linuxに変更したので、サーバーの再構築を行うことになりました。この記事では、再構築をどうやってしたのかについて書きたいと思います。

I. ConohaのコントロールパネルからOSを再インストール

これは簡単なので説明は省略します。コントロールパネルで簡単にArchLinuxを入れることができます。サーバーを停止させ、ArchLinuxを選択して再インストールを行いました。

2. DockerとDocker-Composeのインストール

dockerはpacmanで簡単に入手できます。

pacman -S docker

インストールしても自動的に起動しないのでsystemctlで起動しましょう。

systemctl start docker
systemctl enable docker

docker-composeをレポジトリーからダウンロードします。 

curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

docker-composeが使えない場合、PATHに/usr/local/binを追加しましょう。 これでインストールは終わりです、。

3. mailuでメールサーバー構築

mailuは、Webメール、Antispam、基本的なメールサーバーの構成要素(SMTP, POP3, IMAPなど)を合わせて構築できるようにしたものです。 僕はこの記事を参考にして構築しましたが、versionを1.5.1にしても動作しなかったのでversionを1.5にします。1.6が最新版でありますが、設定方法が1.5と大幅に違うため、ここでは1.5を使うことにします。

4. pritunlでOpenVPNサーバー構築

pritunlは、OpenVPNサーバーをWebページで立ち上げて、ユーザーの管理もできるようにするツールです。 構築はこの記事を参考にしました。

3, 4共通事項

あとでReverse Proxyの設定を行うため、Webページと関係がある部分のホストのポート設定を80, 443ではなく8888, 3333など、違うポートに設定し、BIND_ADDRESSを127.0.0.1にします。これは、直接該当ポートを入力してアクセスすることを防止し、Reverse Proxyで80と443ポートが使えるようにするためです。

5. 自作Twitter botのDockerfile作成

自分が作成したTwitter botがありますが、これもDockerfileを作成して環境構築を自動化したいと思いました。Dockerfileは下記に示しています。

FROM python:3.6
COPY .ssh /root/.ssh
RUN pip install tensorflow pillow keras opencv-python python-twitter wget
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y ssh
WORKDIR /root
RUN git clone #省略します
WORKDIR /root/yurucamp_twitter_bot
COPY information.json information.json
CMD python app.py

privateのレポジトリーを使っているため、認証のためにレポジトリーに登録している公開鍵と公開鍵に対応する秘密鍵をコンテナーの中に入れる必要があります。python:3.6のイメージを用いることにして、pipで必要なライブラリをインストールします。あまりよろしくないライブラリの管理の仕方かもしれませんが、面倒いのでpipでインストールします。

そしてdocker-compose.ymlファイルを作成します。

version: '2'
services:
  yurucamp_twitter_bot:
    container_name: yurucamp_twitter_bot
    restart: always
    build: ./
    privileged: true
    tty: true

このdocker-composeファイルを作成することによって、docker-compose up -d --buildだけでTwitter botを立ち上げることができるようになります。

6. Reverse-Proxy構築

実はこれもdocker-composeで構築したかったですが、なぜかリダイレクトが上手くいかなかったのでこれはホストにインストールことにします。nginxも簡単にpacmanでインストールすることができます。

pacman -S nginx

apt, yumの同様に使えるので、みなさん是非Arch Linuxを使うことに躊躇せず使ってみてください!nginxがインストールされたら、/etc/nginx.confを修正し、Reverse Proxyの設定を行います。

worker_processes  2;

events {
    worker_connections  256;
}

http {
    include           mime.types;
    default_type      application/octet-stream;
    sendfile          on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name domain1;
        
        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          http://localhost:設定したポート domain1;
            proxy_pass              http://localhost:設定したポート;
        }
    }

    server {
        listen 80;
        server_name domain2;
        
        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          http://localhost:設定したポート http://domain2;
            proxy_pass              http://localhost:設定したポート;
        }

        #return 301 https://$host$request_uri;
    }

    server {
        listen       443 ssl;
        server_name  domain1;

        ssl_certificate /etc/letsencrypt/live/domain1/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/domain1/privkey.pem; # managed by Certbot

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          https://localhost:設定したポート https://domain;
            proxy_pass              https://localhost:設定したポート;
        }
    }

    server {
        listen       443 ssl;
        server_name  domain2;

        ssl_certificate /etc/letsencrypt/live/domain2/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/domain2/privkey.pem; # managed by Certbot

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-Host $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_redirect          https://localhost:設定したポート https://domain2;
            proxy_pass              https://localhost:設定したポート;
        }
    }
}

7. 感想

初めてdockerを使ってサーバーを構築してみました。残念ながら、Reverse Proxyはホストで設定しましたが、それでも相当環境構築を自動的に行えるようになったので手間を省けることができました。