見出し画像

ラズパイをVPNに繋げて開発用サーバーにしてみた

はじめに

こんにちわ。ぴくむんです。

私は、自身の才能のなさからプレイヤーとして研究に関わるのを諦め、未来の研究者を支援をする活動を通じて、学問の世界に貢献しようとしている情報発信者になります。

活動としては、
・研究者を目指す方に役に立つような情報発信
・研究に関わりのない人が研究に興味を持ってもらうような記事の作成
・博士課程のための口コミサイト開発
をメインでやっております。

きっかけ

というwebサイトを開発しているのだが、
開発しているとどうしても開発用サーバーが欲しくなる。

ローカルだけでいいじゃないかというのもあるけれども、
ローカルで自分のブランチで動作確認した後に、
devブランチにマージして、開発用サーバーにアクセスして、動作確認した後に、
mainブランチに取り組んで、本番運用をしたいなぁ、、、
っとビビリな私は思ってしまう。

しかし、わざわざ開発用サーバーを借りるのもお金かかっていやだし、
開発に関わるのは数えれる程度の人数なので、なんかいい方法ないかと
考えてたところ、目の前にIoTで遊び終わったラズパイを目にした。

あ!
これを開発用サーバーにしてやろう

と思いついたのであった。

ラズパイをPVNで繋ごう

とは言っても、何も考えずラズパイを運用すれば、自分以外の開発メンバーは自分の家に呼ばない限り、間違いなく繋ぐことができないので、VPNというものを使用して、簡易的にネットワークを繋ぐ。

世の中には、便利なサービスがあるもので、

を利用して、ソフトを入れれば簡単に繋げれるようになる。

というわけで、

を参考にしながら、インストールしていく。

一度繋げば、あとは自動で繋がってくれるみたい。

少し引っかかったところを補足しとくと

sudo zerotier-cli join [NETWORKID]

200 join OK

が出ただけでは、不十分である。

sudo zerotier-cli status

をみて、

200 info [Node ID] 1.8.10 ONLINE

のNode IDをちゃんと
Manually Add Member
のとこに追加してあげる必要がある。

あと、つなげる時は、必ず
一番左の
Auth?
をチェックボタンを外して、入れる必要がある。

もし、違うネットワークからアクセスする時は、繋ぎたいメンバーのチェックボックス を入れ直す必要があるので気をつけよう。

他のPCでのセットアップ方法

初回のつなぎ方
1.以下のサイトで対応するOSのアプリをダウンロード

2. 管理者に、Network IDを聞く
3. 管理者に、Node IDを教える
4. 管理者に、ラズパイのipを聞く
5. 作業を終えたら、アプリのバーをクリックして、Network IDのチェックを外す
6. アプリのバーをクリックして、アプリをquitする。
(PCを再起動するまでは、ONLINEであることがVPNサーバーにばれます。)

2回目からは、アプリを起動して、Network IDのチェックをつけてVPNに接続
作業が終われば、チェックを外して、quitして、PCを再起動してください。
(再起動すれば、ONLINEであることはばれません。)

恐らくこれでpingぐらいは通ったと思う。

ラズパイでDocker-composeを動かそう

とりあえずDockerとDocker-composeのインストールに関してはそこらへんでググって出てくるやつをインストールすれば動くと思うが、

ここらへんので動くと思う。

問題は、自分のコンテナを立ち上げるのにめちゃくちゃ苦労した。
DockerFileの構成が問題になった。

最終的な、DockerFileは以下の通りである。

FROM  python:3-buster

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1

ENV PATH $PATH:/root/.local/bin

RUN pip install  --upgrade pip
RUN apt-get update && apt-get -y dist-upgrade

RUN apt-get -y install rustc

#RUN pip install cryptography

COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .

RUN mkdir -p /home/app
RUN pip install --upgrade pip

RUN adduser --system --group app

COPY . .

重要なのは

FROM  python:3-buster
ENV PATH $PATH:/root/.local/bin

でパスを通さないとpipがうまく動かないという現象がおきて、
特に

RUN apt-get -y install rustc

がかなり鬼門だった。
pipでインストールするときにRUSTを使っているものがあるらしく以下のコマンドが必要になった。

自分のmacの環境下では起きないようなエラーばかりだったので、
ラズパイ特有なものなのかも知れないので、
新たにラズパイ専用のDockerFileにして、レポジトリを作り直した。

遠隔でgitのpullを更新できるようにしよう

これで動くようになったけれども、レポジトリにpushした際にラズパイで一々pullするために、キーボード持ってきてなんかするのはめんどくさすぎる。

そんなときに、役に立つのがsoket通信である。
というわけで、簡単なsoket通信のプログラムをpythonで組んでみた。

Server.py(ラズパイで起動するやつ)

import socket
import time
import subprocess
import os


host = 'ラズパイのVPNのIPアドレス'
port = 8765
buff = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))

while True:
    s.listen(1)
    print('Waiting for connection')
    cl, addr = s.accept()
    print('Established connection')

    while True:
        try:
            msg = cl.recv(buff)
            print('Received msg: %s' % msg)
            try:
                res = subprocess.run(
                    ['git pull'], check=True, shell=True, stdout=subprocess.PIPE)
                print(res.stdout.decode("utf8"))
                cl.send(res.stdout)
                break

            except:
                cl.send(b'fail pull')
                break

            time.sleep(1)
        except socket.error:
            cl.close()
            break

これをラズパイ側で

python Server.py

を実行し、起動させておいて、

ローカル側で
Client.py

import socket
import time


def make_connection(host_, port_):
    while True:
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.connect((host_, port_))
            print('connected')
            return sock
        except socket.error as e:
            print('failed to connect, try reconnect')
            time.sleep(1)


host = 'ラズパイのVPNのIPアドレス'
port = 8765
buff = 1024

s = make_connection(host, port)
s.send(b'git pull')
msg = s.recv(buff)
print('Client received:')
print(msg.decode("utf8"))
s.close()

を実行すれば、ラズパイ側でpullしてくれる。

つまり、なんかレポジトリにpushした際に、

python Client.py

を実行すると、ラズパイとsoket通信して、ラズパイ側でpullしてくれる。

ラズパイが起動したら自動でサーバーが立ち上がるようにしよう

これでいい感じになってきたとおもうけれでも、
ラズパイを立ち上げる度に、ディスプレイみながら、

docker-compose up
python Server.py

をするのがめんどくさいので、以下のシェルスクリプトを書いた。

cd /home/pi/HAKUSHI/Docker-Django
docker-compose up -d
python /home/pi/HAKUSHI/git_comannd_pull/Server.py

一回cdするのは少し尺に触るが、めんどくさかったのでこれでいいや。

あとは、このシェルスクリプトを自動実行するだけだが

このかたのやり方の

autostart を使用する方法

を今回使用した。
他のやり方も少し試したが、うまく動かなかった。
恐らくdocker-composeのパスが切れる前に動いた可能性がある?(適当)

sshを設定する

これをみながらやれば、簡単にできると思う。
ってか、sshつなぐなら、socket通信なくてもいいよね。

電気代のみ開発用サーバーの完成

というわけで、

電源を差すだけで、
1. VPNに自動接続
2. docker-compseが立ち上がる
3. 他のPCからClient.pyを実行すれば、ラズパイ側でpullされる

というラズパイが出来上がった。
小規模のweb開発用サーバーとしては十分だろう。

これで少しは本番環境にマージする不安も減るだろう。
まぁ動いているものを触りたくないからマージしたくないけど

宣伝

自分が開発している

は、この技術を使って開発を進めております。

このHAKUSHI 博士の口コミ αreleaseは、完全に私の個人の人類に貢献したいという思いで進めております。
詳しくは、

を読んでいただければ、自分という存在を理解していただけるかと思います。

自分のHAKUSHIプロジェクトは到底自分一人の力で成し遂げれるものではなく、様々な人の協力の元に成し遂げれるものだと心の底から思っております。

そこで、協力者を募集しております。

webエンジニア(勉強したい人)

現在リアル知人3人の協力のもとサイト開発を行っておりますが、もう2人程度開発ができる方の支援が欲しいと考えております。また、プログラミング初心者の方も2人程度募集して、将来的には8人程度のチームで開発を行いたいと考えております。
開発頻度は月に1 or 2回程度の土or日曜日の午前中にDiscordに来てもらって、最初に雑談して、気軽にコーディングを始めるという流れを考えております。
なるべく仕事感を出さないことを意識したいと思っております。

フロントエンド言語は、HTML, CSS, javascript
バックエンド は、django(python), PostgreSQL
サーバーサイドは、docker-compose, gunicorn, Nginx,AWS EC2
リモートレポジトリは、 git-hub
で開発しております。

参加までの流れとしては、
zoomで軽く話したのちに、Discordに招待。
練習が必要な方は開発練習用のレポジトリに招待し、
経験者の方は本番環境のレポジトリに招待しようと考えております。

始めは、ボランティアベースになりますがタスクをこなした分はきちんと記録しておき、いつか収益化に成功した際にはちゃんと謝礼金を払うつもりではいるので、経験者の方参加していただけると非常に嬉しいです。
また、未経験者の方にとってはタダでサイト開発のノウハウを学ぶチャンスになると思うので参加して、プログラミングに興味のある人にとっては損はないと思います。

もちろん何か他にプライベートでしたいことができたり、時間を裂けなくなったり、開発が楽しくなくなったら、抜けてもらって構いません。
休みの日にコーディングをするので、仕事感を出さないことを第一にやっていきたいと考えているので、そこら辺は柔軟に対応していきたいと思います。

まずは一度お話を、Twitterでお待ちしております。

Twitter

おすすめ記事

日本人なら誰でも適用できるような大切なことに気がついた記事です。

実学 ビジネス編

になります!
もし興味があれば読んでみてください。
最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?