Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

KVM上のUbuntuでMirakurun+EPGStationで録画サーバーを構築する

自宅サーバーで録画サーバーを構築したいと思い構築した.その記録を他の人にも参考になるかもしれないので記事にする.

環境は以下.

ホストOS Ubuntu 18.04.5 LTS
ゲストOS Ubuntu 18.04.5 LTS

用意した機材

録画を行うためには以下の機材が必要になる.

  • B-CASカード
  • テレビチューナー
  • B-CASカードリーダー
  • テレビ線

選ぶ機材にもよるが,私の場合には8000円ほどですべての機材が調達できた.

B-CASカード

自宅の使われていないテレビから拝借した.ない場合でも,B-CASを発行している会社にお布施をすればもらえるらしい.

f:id:Kotaro7750:20201015111820j:plain
B-CASカード

テレビチューナー

今回はUbuntuで構築するため,Ubuntuでの動作報告がされているものを選ぶと良い.

その他にも,同時録画可能数や,BS/CSの録画機能の有無などで判断する.

私は地デジで十分であり,同時録画数にもこだわらないため,安価であり,ubuntuでの動作報告が多いPLEX社のPS-S1UD Ver2を購入した.

仕様
同時録画数 1
録画可能チャンネル 地デジのみ
接続 USB

PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

  • 発売日: 2015/09/10
  • メディア: エレクトロニクス

B-CASカードリーダー

Ubuntuでの動作報告がされており,安価なものを選ぶ.

今回はSCM MicrosystemsのSCR3310/v2.0を使用する.

テレビ線

一人暮らしだったら適当にテレビ線をつなげれば良いが,実家住まいであるため,家族の見るテレビにつながるテレビ線を引っこ抜くわけにはいかない.

そのため,分配器やテレビ線を別途購入した.

仮想マシンの作成

ホストマシン上で仮想マシンを作成し,sshができるようにする.

IPアドレスは固定にしておくのが望ましい.ファイアウォールはローカル以外からのアクセスはすべて遮断するようにする. これは,セキュリティ面もあるが,録画の公開等グレーな行為になりかねないので自宅利用以外はできないようにするためである.

基本的な設定については本記事では述べないが,このままではチューナーとカードリーダーがゲストOSから読み込めないのでUSBパススルーを設定する必要がある.

USBパススルー

USBパススルーとは,本来ならホストOSに繋がっているUSB機器をゲストOSに繋がっているように見せることである.これを行うことで,B-CASカードの読み取りや,チューナーを介した録画をゲストOSで行うことができる.

まずは,ホストOS上で,パススルーしたい機器の情報を調べる.機器を付け外しして,その前後のlsusbの結果を見れば良い.

$ lsusb
Bus 001 Device 003: ID 3275:0080 VidzMedia Pte Ltd
Bus 004 Device 002: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader

IDのところのXXXX:YYYYとなっているところがそれぞれベンダーと製品IDを指すので控えておく.

次にvirshコマンドを使って,パススルーの設定をする.

virsh shutdown {仮想マシン名} #念の為ゲストOSはシャットダウンしておく
virsh edit {仮想マシン名}

すると,エディタが立ち上がるので,devices以下に,下のように追記する.

<hostdev mode='subsystem' type='usb' managed='no'>
  <source>
    <vendor id='0xXXXX'/>
    <product id='0xYYYY'/>
  </source>
</hostdev>

ここで,XXXX,YYYYは先程控えたものに置き換える.

今回のように2つの機器をパススルーする場合には,hostdevノード自体も2つ書く必要がある.

virsh start {仮想マシン名} #正常に開始されることを確認する

ssh {仮想マシンのIPアドレス}
lsusb

ゲストOSにログインし,lsusbした結果,パススルーを行った機器が見えていれば成功である.

以降の操作は基本的にゲストOSで行うこととする.

B-CASカードの読み取り

sudo apt-get install -y build-essential git pcscd libpcsclite-dev libccid pcsc-tools #必要ツールのインストール
pcsc_scan

Japanese Chijou Digital B-CAS Cardと出たら成功である.

チューナードライバの導入

PLEX社が公開しているドライバを/lib/firmware以下に配置する.これを行わないと録画ができない.

wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
unzip PX-S1UD_driver_Ver.1.0.1.zip
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware

地上波復号ライブラリの導入

sudo apt-get install -y cmake g++ git
git clone https://github.com/stz2012/libarib25.git
cd libarib25
cmake .
make
sudo make install

余談だが,B-CASカードはなぜ必要なのかというと,テレビ線を伝ってきた信号を復号するための情報を得るためらしい. そんなものデータがあればいいのではと思うかもしれないし,実際にsoftCASなるものがあるみたいだが,録画以上にグレーらしいので使わない.

録画コマンドの導入

参考にさせてもらったサイトでは,satという方の作成した録画コマンドが使われていたが,何故か私の環境では動かなかったので,違うものを使う.

git clone https://github.com/dogeel/recdvb.git
cd recdvb
./autogen.sh
./configure --enable-b25
make
sudo make install

ここまでで,一応の録画はできるようになっているはずなので,テストする.

sudo adduser {録画サーバーのユーザ} video
sudo reboot #ファームウェア等を追加したので念の為再起動
recdvb --b25 --strip --dev 0 20 10 test.m2ts #物理チャンネル20で10秒間録画する

vlcプレイヤーとかで再生してみて,何かの番組が映っていたら成功

録画コマンドが失敗する場合

ネットに転がっている情報だと,このテストは当然成功するものみたいに書いてあったにもかかわらず,このテストが通らなくて数時間試行錯誤したので,エラーと,対処をできるだけ詳しく書いていく. 同様のエラーに苦しんでいる方がいたら参考にしてもらいたい.

フロントエンドが開けない

$ recdvb --b25 --strip --dev 0 20 10 test.m2ts
using B25...
enable B25 strip
using device: /dev/dvb/adapter0pid = 22199
cannot open frontend device

cannot open frontend deviceというエラーは,チューナーをオープンすることができないというものである.

考えられる原因と対処には以下が挙げられる.

ユーザがvideoグループに登録されていない

上の録画コマンドの導入のところにかいてあるが,実行ユーザをvideoグループに登録する.

sudo adduser {録画サーバーのユーザ} video

以下のコマンドの結果に実行ユーザが含まれていれば大丈夫.

cat /etc/group | grep video
チューナーが認識されていない

まずはlsusbの結果にチューナーが含まれているかを確認.もしなければ上の手順をやり直す.

以下のコマンドの結果にadapter0とかがあれば大丈夫.

ls /dev/dbv
チューナーが何か作業を行っている

しばらく待てば解決することもあるらしい.

ロックできない

$ recdvb --b25 --strip --dev 0 20 10 test.m2ts
using B25...
enable B25 strip
pid = 1488
device = /dev/dvb/adapter0/frontend0
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning to 521143 kHz
polling.....
Cannot lock to the signal on the given channel

このエラーは基本的にはファームウェア周りのエラーであるらしい.

ファームウェアが認識されていない

ファームウェアが/lib/firmwareに配置されているかを確認する.

ls /lib/firmware | grep isdbt_rio.inp

配置してあったらdmesgを確認する.

dmesg
[   11.627821] smsmdtv:smscore_init_ir: IR port has not been detected
[   11.627828] smsusb:smsusb_probe: Device initialized with return code 0
[   11.687497] dvbdev: DVB: registering new adapter (Siano Rio Digital Receiver)
[   11.689964] usb 1-4: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
[   11.690041] smsdvb:smsdvb_hotplug: DVB interface registered.
[   11.692556] usbcore: registered new interface driver smsusb

このようなログがあったらファームウェアは恐らく認識されているはず.

録画コマンドを変えてみる

はじめはsat氏の公開されている録画コマンドを使っていたが,私の場合には何度やってもうまくできなかった.

おかしいと思い,仮想マシンではなく,他の物理マシンで試してみたところ,その環境でも同様のエラーが起きた.

そのため,ファームウェア周りではなく,録画コマンドそのものの相性が悪いのではと思い,録画コマンドを変えたところ,正常に動作した.

なお,これはsat氏のコマンドが悪いと言っているわけではなく,単純に相性が悪かっただけだと思う.

下にいくつかの録画コマンドを紹介するので,複数試してみたらできるものが見つかるかもしれない.

cgi1.plala.or.jp

github.com

Mirakurunの導入

このままでも録画はできるが,チューナーを生でいじっているようなものなので,使い勝手が悪い.そのためチューナーをいい感じに管理してくれるMirakurunというオープンソースのチューナー管理サーバを導入する.

github.com

インストール

下のセットアップマニュアルを参考にして導入する.Dockerを使う方ではないので注意.

github.com

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install pm2 -g
sudo npm install mirakurun -g --production
sudo mirakurun init
sudo mirakurun restart

チューナーの登録

sudo mirakurun config tuners
- name: PX-S1UD-0
  types:
    - GR
  command: recdvb --b25 --dev 0 <channel> - -
  isDisabled: false

録画コマンドを変えたときは,commandのところを変える必要があるかもしれないが基本はこれで大丈夫なはず.

sudo mirakurun restart

チャンネル設定

BS/CSは手書きで設定しなくてはいけないようだが,地デジは自動で取得してくれるらしい.

curl -X PUT "http://localhost:40772/api/config/channels/scan"

成功したらしばらくチャンネルの取得が続く.

ここでサーバーに拒否されたりしたら,設定がおかしい場合がある.以下のコマンドでログを確認して適宜対処する.

sudo mirakurun log server

チャンネルの設定が終わると,ログにその旨が書き込まれるので,再起動

sudo mirakurun restart

EPGStationの導入

番組表からの予約や,視聴を行うためにEPGStationというオープンソース録画管理ソフトを導入する.

github.com

EPGStationのインストール

予めffmpegをインストールしておく必要がある.

sudo apt install ffmpeg

あとは下の公セットアップマニュアルに従えばインストール完了.

github.com

セットアップが終了したら,ブラウザからアクセスできるが,起動してすぐだと番組表が表示されない.しばらくすると表示される.

自作RISC-V32IMインオーダプロセッサ 煌

半年前くらいから自作プロセッサをほそぼそと開発していたが,インオーダパイプラインプロセッサとしては割と高性能だと思うものができたので簡単に紹介していく.

github.com

大まかな特徴

RISC-V32IM準拠

これに関してはそのまま.RISC-V32IMの内,システム系の命令以外を実装している.プロセッサ上でlinuxとか動かすんだったら考える必要があるが,そこまでは考えてないのでやってない.

5段パイプライン

以下のブロック図のような命令フェッチ,デコード,実行,メモリアクセス,レジスタ書き込みの5段ステージ構成となっている.

f:id:Kotaro7750:20200629101815p:plain
ブロック図

それぞれのステージのストールやフラッシュの制御信号を作るのはControllerモジュールが中央集権的に行っている.

強めの分岐予測器

強めと言っても商用プロセッサクラスの強さではなく,個人開発レベルでは強めかなくらいの気持ち.グローバル2レベル適応型分岐予測器とBTBによる分岐先予測を実装している.効果については後述.

グローバル2レベル適応型とは,プログラム全体の分岐履歴と,予測したい命令のプログラムカウンタを合わせたインデックスを持つテーブルに2bit飽和カウンタが並べられているもの. この構成にすることで,どの命令についての予測か・過去の系列がどのようなものだったかという2つを混ぜた予測ができる.

評価

CoreMarkによる評価

DIGILENT社製NEXYS VIDEOボード用に合成し,100MHzで動かした結果が下である.

2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 1310801051
Total time (secs): 13
Iterations/Sec   : 230
Iterations       : 3000
Compiler version : GCC9.2.0
Compiler flags   : 
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xcc42
Correct operation validated. See readme.txt for run and reporting rules.

CoreMark/MHzは2.3とインオーダとしては結構いいんじゃないかと思う.ちなみに最近発表されたBOOMのV3は6とか7とかだったような気がするのでアウトオブオーダプロセッサには手も足も出ない感じ.

分岐予測器の性能

本当はベンチマークとして何を使うかも重要なんだろうが,入手してないのでCoreMarkを1イテレーションだけ走らせたものをVivado上で10ms実行してみたときの性能で評価する.

実装 分岐予測精度 制御ストール発生頻度 ミス率 Takenミス率 NotTakenミス率
グローバル2bit飽和カウンタ 59% 7.5% 55% 58% 47%
グローバル2レベル適応型 94% 0.5% 44% 51% 11%

非公式ベンチマークではあるが分岐予測精度は90%を超えた.ただ性能に直結するミス率は飽和カウンタに比べるとそこまで改善されていない.分岐先予測がボトルネックとなってTakenミス率の改善がないからだと考えられる.

tmux上のneovimでtrue colorを使ってundercurlを正しく表示する

neovimのカラースキームには、cui用とgui用があり、ターミナルからは本来なら前者しか使えず、256色しか表現することかできません。しかし、最近のターミナルでは、true colorと言って16進数カラーコードで指定可能な色を表現することができます。

この機能を使えば、ターミナルにいながら、gui用のカラースキームでneovimを使えてとても美しいのですが、ターミナルプレクサのtmux上で使用しようとするとある不具合が起こる可能性が高いのでその解決法を解説していきます。

不具合

gui用のカラースキームの中には、(一部cui用でも使っているものがありますが)下の画像のように特定のハイライトに下線や波線を使っているものがあります。

tmuxを使うときの不具合とはずばり、この下線や波線がうまく表示されないというものです。

f:id:Kotaro7750:20200411173125p:plain
本来なら波線が出る

前提

そもそもtrue color機能を有効化しなければgui用の色は出ないので、ついでにtrue colorの設定も解説していきます。

tmux

tmux.confに以下の設定を追記します。

set-option -g default-terminal "screen-256color"
set-option -ga terminal-overrides ',xterm-256color:Tc'

neovim

vimrcに

set termguicolors

と書くだけです。

確認

:checkhealth このコマンドをneovim内で打つ

以上のコマンドの結果に以下のようにエラーがなければ問題なくtrue colorが使えます。

f:id:Kotaro7750:20200411173128p:plain
checkhealthの結果

また、ターミナル上で以下のコマンドを打って、きちんとしたグラデーションになっていれば問題ありません。

awk 'BEGIN{
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
    for (colnum = 0; colnum<77; colnum++) {
        r = 255-(colnum*255/76);
        g = (colnum*510/76);
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'

f:id:Kotaro7750:20200411173135p:plain
美しいグラデーションが表示されればok

原因

上で述べた現象の原因は、aptで入れられるtmuxのバージョンでは下線や波線に対応していないためです。そのため、ソースから直接ビルドして新しいtmuxを入れる必要があります。 aptでは、これを書いている現在tmux 2.6がインストールされますが、これらの機能は3.0以降で使うことができます。

対処

以下のコマンドで最新版のtmuxをインストールできます。

sudo apt update

sudo apt install libevent-dev libncurses-dev bison

git clone https://github.com/tmux/tmux.git

cd tmux

./autogen.sh

./configure

make

sudo make install

ただし、このままだと今まで使っていたtmuxが残ってしまい、PATHの設定によっては昔のtmuxのほうが参照されてしまうので、昔のtmuxをアンインストールします。

sudo apt remove tmux

tmux -V
tmux next-3.2

tmuxの設定

また、正しく下線や波線を使うにはtmux.confに以下のような設定を追記する必要があります。

set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm'
set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m'

おまけ

新しくしたtmuxでは一部設定方法が昔と異なっているケースがあります。

例えば下の設定は下のように変更する必要があります。

bind \ split-window -h #これはだめ

bind \\ split-window -h #こうする

ubuntuで英字キーボードを使用したときの日本語入力設定(おまけ vimでの自動IMEオフ)

ubuntuで英字キーボードを使用したときの日本語入力設定

私は普段Ubuntuに英字キーボードを繋いでいるのですが、そうなるとめんどくさいのが日本語入力の設定です。この記事では私がたどり着いた答えを解説していこうと思います。 また、この記事のやり方を真似ることで、vimで日本語入力をオンにしたままノーマルモードに入った際に自動でオフにしてくれる設定も可能になります。

前提

デフォルトのインプットメソッドがfcitxでないとできません。設定->地域と言語->インストールされている言語の管理 からキーボード入力に使うIMシステムをfcitxにしてください。

設定方法

レイアウトを英字にする

$ sudo dpkg-reconfigure keyboard-configuration

画像のように選択していく。普通のキーボードだったら画像の通りで大丈夫ですが、HHKBなどを使っている場合は、キーボードモデルのところで使っているものを選択してください。

f:id:Kotaro7750:20200331105412p:plain
キーボードのモデル
f:id:Kotaro7750:20200331105144p:plain f:id:Kotaro7750:20200331105156p:plain
f:id:Kotaro7750:20200331105202p:plainf:id:Kotaro7750:20200331105208p:plainf:id:Kotaro7750:20200331105218p:plain
ここらへんは割とどうでもいい

そのようにしたら、/etc/default/keyboardが以下のようになっていればok

$ cat /etc/default/keyboard

BACKSPACE="guess"
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

次に/usr/share/ibus/component/mozc.xmlの部分をdefaultではなく、enにします。

fcitxの設定

まずはfcitx-mozcをインストールします。

$ sudo apt install fcitx-mozc

そうしたら、アプリケーション一覧から下の画像のように、fcitxの設定を起動します。 f:id:Kotaro7750:20200331105224p:plain

入力メソッドをmozc、英字キーボードのみにし、2つともレイアウトは英字にしてください。

次に画像のように、「入力メソッドのオンオフ」を好きなバインドにしてみてください。ここではこれをバインドAと呼びます。(画像の例ではSuper+Space)

f:id:Kotaro7750:20200331105707p:plain
入力メソッドのオンオフを設定する

mozcの設定

先程mozcもインストールしたはずですので、アプリケーション一覧からmozcの設定を起動してください。もしない場合は、aptなどで簡単に入ると思います。

下の画像のように、キー設定->キー設定の選択をカスタムにして、編集を選択してください。

f:id:Kotaro7750:20200331105236p:plain
カスタムにする

すると、以下の画像のような画面が出てくるので、直接入力モードのIMEを有効化に好きなバインドにしてください。先程のバインドとは異なることに注意してください。ここではこれをバインドBと呼びます。(画像の例ではShift Space)

f:id:Kotaro7750:20200331105231p:plain
バインドBを設定する

以上で設定は終わりです。このようにすると、バインドAで日本語入力と半角入力をトグルすることができます。なお、バインドBはログインした最初のときに日本語入力がオフになっている場合があるのでそのときに使います。

つまり流れとしては、

  1. ログインする
  2. 日本語入力をバインドBでオンにする
  3. 以降はバインドAでトグルする

となります。

注意点

バインドは、システム全体のバインドと被っていると動きません。

おまけ macみたいにIMEをオンオフする

トグルではなく、macのように、これを押したら必ず日本語入力、半角入力になるとしたい場合は、下の画像のように、fcitxの設定の入力メソッドをオンに、オフにというところを設定してやるとそのようになります。

f:id:Kotaro7750:20200331105240p:plain
mac式の設定

私は、トグルに慣れてしまったので設定していません。

おまけ vimでの設定

日本人Vimmerなら、日本語入力のままノーマルモードに入ってしまってイライラしたことがあると思います。

以下のように設定することで、日本語入力のままノーマルモードに入ったときに、自動で半角モードに切り替えることができます。

使用しているメソッドの確認

fcitxをインストールすると、fcitx-remoteというコマンドラインツールが自動的に入るのですが、これはコマンド経由でIMEを切り替えられるというものです。つまり、インサートモードを抜けるときにこのコマンドを適切に発火してやれば所望の動作が実現できます。

$ cat ~/.config/fcitx/profile | sed 's/,/\n/g' | grep True

# True False
# True False
#WidePunc=True
# True False
EnabledIMList=mozc:True
fcitx-keyboard-us:True
# True False
#PreeditStringInClientWindow=True

mozc,fcitx-keyboard-usという2つを使っていることがわかりました。つまり、以下のコマンドでコマンドラインで半角入力にすることができます。

# 半角
fcitx-remote -s fctix-keyboard-us
# 日本語
fcitx-remote -s mozc

vimscriptでの設定

fcitx-remoteコマンド単体だと、現在のIMEの状態(日本語入力だと1のinactive)を返すので、インサートモードを抜けたときに日本語入力だった場合のみ半角入力に戻しています。

if has('unix')
  autocmd InsertLeave * :call OffIME()
endif

function! OffIME() abort
  " fcitx-remote returns 1 if current method is mozc
  let l:fcitx_status = system('fcitx-remote')
  if fcitx_status == 1
    call system('fcitx-remote -s fcitx-keyboard-us')
  endif
endfunction

自動デプロイ付きWEBアプリをheroku無料版で構築する【フロント編】

f:id:Kotaro7750:20200330114829p:plain
構成

学生が小規模なWEBアプリを作ろうと思った時、ネックになるのはどのサーバーを使おうかという点だと思います。私はケチなので一円たりとも払いたくはありません。そのため、今回は制限内でなら完全無料でDBも作れるherokuでWEBアプリを作成する方法を解説していきます。

長くなりそうなので、今回はフロント部分を解説していきます。

この方法で作ったリポジトリはこれです。

github.com

使うフレームワーク

今回はVueを使います。とはいっても、記事の内容に具体的なWEBアプリのコードは出てこないので、reactでも生JSでも問題ありません。ただ、パッケージ管理ツールとしてnpmを、サーバープログラムとしてnodeを使うということは予め記しておきます。

手順

なんかサービスを作る

いきなり抽象的ですが、今回の記事は特定のサービスに限らず使えるのでこのような表記にしています。とりあえず動けば何でもいいので、ここではvue createコマンドを利用して、とりあえず動くものを作ります。

# vue以外を使ってる人は雛形を作ってくれるコマンドがあればそれを使ってみてください。
# ここではe-portfolio-frontという名前の雛形を作ります。
$ vue create e-portfolio-front

# 終わると、以下のような中身を持つディレクトリができます
$ ls e-portfolio
README.md  babel.config.js  node_modules  package.json  public  src

上記の手順で作った雛形アプリを拡張していけば、所望の機能を持ったアプリを作れます。

server.jsを作成する

前項でできたディレクトリにserver.jsというファイルを作成します。これはherokuがエントリーポイントとして使うファイルです。またこのエントリーポイント内で実際にサーバとして動かすためにExpressというモジュールが必要なのでこれもインストールします。

npm install express --save
// server.js
var express = require('express');
var path = require('path');
var serveStatic = require('serve-static');
app = express();
app.use(serveStatic(__dirname + "/dist"));
var port = process.env.PORT || 5000;
app.listen(port);
console.log('server started '+ port);

また、package.jsonのrunスクリプトに以下を追記します。

"start": "node server.js",

以上の変更により、npm start(またはnode server.js)により、server.jsをエントリーポイントとして環境変数PORTをポート番号としてサーバーが起動するようになります。

herokuでアプリケーションを作成する

以下の画像のようなherokuダッシュボードから新しいアプリを作ります。今回はapiとfrontという2つの独立したアプリケーションを作る構成にします。

f:id:Kotaro7750:20200330114848p:plain
herokuアプリの作成

そうしたら、herokuコマンドをインストールします。よくあるheroku記事などではこのコマンドを使って直接デプロイしていることが多いのですが、いちいちこんなコマンドを打つのは面倒くさいのでデプロイには使用しません。ただ、他の方法でデプロイするためのトークンが必要なのでこのコマンド経由で取得します。

# herokuコマンドインストール
$ sudo snap install --classic heroku
$ heroku login
# nodeの環境変数をセットする
$ heroku config:set NODE_ENV=production --app <herokuのアプリ名>

$ heorku auth:token

 ›   Warning: token will expire 03/05/2021
 ›   Use heroku authorizations:create to generate a long-term token
{{ここにトークン文字列が出てくるので保管}}

Github Actionsの設定をする

herokuコマンドの代わりにここではGithub Actionsを使って、masterへのpushがあるたびにデプロイすることにします。

Github Actionsについては、この記事を参照してみてください。

kotaro7750.hatenablog.com

今回のリポジトリには、apiとfront両方のコードを配置しておきたいので、以下のようなディレクトリ構成であるとします。

|- .git
|
|- e-portfolio-front
|   |-server.js
|   |-src
|   |-...
|
|- e-portfoli-api

ここでe-portfolio-frontなどと同一階層に.github/workflowsというディレクトリを作成します。このディレクトリには、GitHub Actionsの設定ファイルを配置します。frontのデプロイ用に以下のようなスクリプトを書きます。

# front.yml
name: ePortfolio-front build-and-deploy

on: 
  push:
    paths:
      - '.github/workflows/front.yml'
      - 'e-portfolio-front/**'

jobs:
  build-deploy:
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@v2

    - name: remote add Heroku
      env:
        HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
        HEROKU_APP_NAME: "herokuのアプリ名"
      run: git remote add heroku-front https://heroku:$HEROKU_API_TOKEN@git.heroku.com/$HEROKU_APP_NAME.git
    
    - name: Deploy to Heroku
      if: github.ref == 'refs/heads/master' && job.status == 'success'
      run: |
        git push heroku-front `git subtree split --prefix front master`:master --force

GitHub Actionsの記述方法はさておき、ここでは2つのことを行っています。1つはheroku-frontという名前のリモートブランチを登録すること、2つめはそのリモートブランチにpushしているということです。

また、pushにsubtreeを使っていますが、これは、同じgitリポジトリに2つのherokuアプリケーション用のディレクトリを配置しており、そのうちの一つのみをpushしなければいけないためです。

Githubにherokuのトークンを登録する

先程herokuコマンドで作成したトークンをHEROKU_API_TOKENという名前で以下のようにGitHubリポジトリのSecretに登録します。

f:id:Kotaro7750:20200330114858p:plain
githubのsecret

開発のサイクル

以上の手順で自動デプロイができるようにはなっていますが、あらためて開発のサイクルを確認しておきます。

  1. コードを変更する
  2. commitしてpushする
  3. 勝手にデプロイされている

確認もなにもないレベルの簡単さだと思います。

環境変数の取扱

GitHubにコードを上げるのでAPIのURLなどは環境変数を用います。

ローカル開発環境

.env.developという名前のファイルに記述します。もちろんこのファイルをgitの追跡対象にしてはいけません。

heroku環境

以下の画像のように、herokuのアプリケーションのsettingsから環境変数を設定できるのでそこに登録します。

f:id:Kotaro7750:20200330114853p:plain
環境変数の設定