Archives for : Unix/Linux

自宅ネットワーク環境(2020/02)

 

にやってドン引きされたであろうエントリの2020年度版です。フヒヒ。

自宅ネットワーク

FUJITSU TX100S1

ファイルサーバ 兼 Proxy サーバです(Solaris 11)
サーバ名は「 TERADRIVE 」です。

・NFSファイルサーバ

2TBのDISKをRAID-Z構成にしてNASとして使用しています。
また、DBやWebコンテンツなどもRAID上に格納し、DISK障害から保護しています。
ZFSはファイルシステムレベルでファイル共有の仕組みを持っている素晴らしいファイルシステムです。
ただ、それを乗っけるSolaris自体がもう終わろうとしているのが問題なのですが・・ううっ・・

なおシステムディスクは ZFS mirror によって2重化しています。
RAID1 相当。後からミラー化出来るから良いよね。

・Squid

Proxyフィルタリングを行うことにより、
マルウェアの感染リスクがあるWeb広告をブロックしたり、有害サイトへのアクセスをブロックしています。

ここでいう有害サイトとは、『はちま起稿』、『オレ的ゲーム速報@刃』とかを指します。

このように迷惑なWebサイトにアクセスしようとしてもProxy側で遮断してしまいますので、
Twitterで意識の低い人が短縮URLで有害サイトを貼り付けた場合などに、
誤って開いてしまう事を防ぐことができます。

家の中からのインターネットアクセスをすべてこのSquidからに制限する事で、
例えばウィルスなどに感染した際の外部への勝手なアクセスを阻止できるのです。

が、考えたら家でIT機器使うの俺だけだったという寂しい事実が分かりましたので
セキュリティそこまで考えなくていいかなーとか思ってますし制限してません。

・Wake On LAN
宅内のPCは普段電源OFF状態にありますが、リモートから操作したい時があります。
(録画予約など)
そのような場合はTERADRIVEからWOLパケットを送出する事で、リモート環境から電源投入させる事が出来ます。
なお、電源投入の結果はTwitterより報告されます(後述)

電源投入の予約も出来るシェルスクリプトを作ったので
指定時刻に自動電源投入→録画→エンコード→アップロード→シャットダウン という完全自動運転も可能です。
#環境再構築前はやってたが、今はやってない。考えたら録画しても見ない。(言っちゃった)

・Jenkins
本来はCI/CD(継続的統合&継続的デリバリ)での自動ビルドなどに使われるツールだと思うのですが、
使い勝手が良いのですっごいcronとして使ってます。ってか私開発者じゃないし。

以下の処理を自動化しています。

・SSL証明書更新自動化(月次)
・NAS/DB/WWWコンテンツの自動バックアップ(日次・週次・月次)
・ツクールMVのバックアップとパブリッシュ(オンデマンド実行)
・WindowsのWake On LAN(オンデマンド実行・週次)

ただ、頻繁な処理は各サーバのcronにまかせてます。プロセス監視とかDDNS監視とか。

Raspberry Pi 3 (GameWatch)

主にEnterprise向けOSであり、最新技術に対する柔軟性の低いTERADRIVEを補完するサーバです。
ホスト名は『 GameWatch 』です。緩い役割的にはインターネット関連、って感じです。

・nginx
TERADRIVE に対するインターネットからのアクセスをSSLで暗号化するリバースProxyサーバです。
Let’s Encrypt によるSSL証明書発行を受けています。

何らかの原因でTERADRIVEがWWWサーバとして機能しない時はメンテナンスページを表示します。
また、WebサイトへのアクセスをReverse Proxy経由のアクセスに限定する事によりセキュリティを高めています。

以前はこのサイトもこのリバースプロキシ配下に居ましたが、
今は私が使うだけのサービスを公開しているだけです。

【艦これ】所持艦を表示するやつ作った
https://kswd.twinfami.com/kancolle/

”俺専用” VGM 演奏 DB を公開しました
https://kswd.twinfami.com/vgm/

・宅内DNS

IPアドレスでの管理が面倒だったり、自宅内からFQDNでサイト等にアクセスしたりする為、
dnsmasq によるDNSサーバを設置しています。
/etc/hosts だけ変えて reload すれば良いので、運用がBINDより超絶簡単。

・Twitter bot

サーバに異常(DISK障害、プロセスダウン)があった場合、
GameWatchからTwitterで私のアカウント宛に通報を行っています。
TERADRIVEで異常が発生した場合も、GameWatchを経由して通報されます。

また、@kishiwadapeople のTwitterアカウントを使って、
出演させて頂くイベント等の自動告知を行います。

Tweetpy とatコマンドによるシェルスクリプトで実装しています。

AWS

2020/02 より AWS を使い始めました。
【AWS】サイトを自宅鯖から Lightsail に移行しました

・Lightsail

AWS の格安 VPS「Lightsail」の最小インスタンスを使って、
このブログと艦これ用 Redmine を構築しています。

自宅サーバから Web 系サービスを移行した事で、
AWS を本格的に使っていければと思ったので、
そのうち Jenkins とかと組み合わせて色々な処理させたいですねー。

YAMAHA RTX1200

以前使っていたRTX1100から上位機種へリプレースしました。
インターネットへ安定接続したり、リモートから宅内環境にアクセスするためのVPNルータです。
VPN経由で接続させる事により、SSHやリモートデスクトップのセキュリティを高めています。

iPhoneから艦これ専用PCにアクセスするために存在(いや、それだけではないが)していましたが、
今は公式でAndroidから艦これがプレイできるので専用PCは撤去しました。
業務用なので詳細なパケットフィルタが書けますから、ファイアウォールとしても利用しています。

Windows PC

2019年くらいに買い替え再構築をして主に地デジの録画をしたりします。
MacBookを買ってからはあまり起動しなくなってしまいましたが、たまーにゲームとかもします。
一応 VR もだましだまし動く程度のスペックです。
OSはWindows10です。どうでも良いけどホスト名は『 PlayStation 』です。

MacBook Pro 2017

今の主力です。
ホスト名は『 MSX 』です。
出来ることは何でもコレでやっていますが、何でも出来るのでWindowsの使用頻度がどんどん落ちています。
(あれ・・考えたらTwitterと艦これしかやってないんじゃないか・・・?)

VMware Fusionを導入しており、Windows10の仮想マシンを内蔵しています。
ちなみにそれのホスト名は『 Jaguar 』です。

 

ちなみにこれらの技術はお仕事ではほぼ使わない内容となっており、完全な趣味ITなのであります。
・・・が、最近はちょっとずつお仕事でもこれらの OSS を使ったりします。

時代が私に追いついてきたのかしら?なんちゃって。

技術者たるものお勉強は続けねばなりません。(正当化)

【AWS】サイトを自宅鯖から Amazon Lightsail に移行しました

ことの発端

Raspberry Pi 上に構築していた艦これ攻略用 Redmine ( https://yotei.twinfami.com/ ) の環境を
ふとしたことから触ってしまい、Ruby on Rails がまともに動かなくなりました。

Ruby
ほんと Ruby クソだな。

Raspberry Pi に CentOS7 を入れ直して新規構築してみましたが、
これまた全然動かず。ほんと Ruby クソだな。

ググって出てくる Qiita は情報中途半端に古いし、公式ドキュメント見てもダメだし。
5日間以上トラブルシューティングに突っ込んでも全然解決できず、
なんか良いのないかなーって調べていたら AWS の VPS を知りました。

Amazon Lightsail への移行

Amazon Lightsail
https://aws.amazon.com/jp/lightsail/

月額 3.5 ドルからの低価格な VPS。
EC2 で nano インスタンス立ち上げても結構掛かるので随分お得ですね。

しかも見ると、Redmine や WordPress のアプリケーションが構築済みで、
デプロイするだけで使えちゃうんですって。
気になる outbound 転送料も1TB までコミコミ。

もうこれでいいじゃん!
ちょっと触るだけで壊れたりする環境に費やす労力を、
お金に換算したら余裕でペイできるよ。

「初心者向け EC2」って感じで、
この画面で環境が自動構築されちゃいます。めっちゃ簡単。

OS選んで

アプリ選んで

インスタンスのサイズ選んで

名前つけてキーペア設定して作成

・・・

yotei
https://yotei.twinfami.com/

AWS 契約してから30分くらいで復旧完了しました。
この5日間はなんだったのか?

Redmine のデータ移行は簡単で良いですね。3.3.4→4.0 への移行でしたが、
以下のサイトを参考に、DB リストアと file 移行して Migration するだけでイケちゃいました。
#「DB のインポート」から参考に。

サル以下でもできた!Redmineの移行(Windows Bitnami Redmine → AWS Bitnami redmine)
https://qiita.com/miyasita1958/items/6a68a3fb16232f17cdbd

 

root@ip-172-26-8-231:/opt/bitnami/apps/redmine/htdocs# ruby bin/rake db:migrate RAILS_ENV=production
== 20161001122012 AddTrackerIdIndexToWorkflows: migrating =====================
-- add_index(:workflows, :tracker_id)
-> 0.0332s
== 20161001122012 AddTrackerIdIndexToWorkflows: migrated (0.0335s) ============
(中略)
== 20180923082945 ChangeSqliteBooleansTo0And1: migrating ======================
== 20180923082945 ChangeSqliteBooleansTo0And1: migrated (0.0000s) =============

== 20180923091603 ChangeSqliteBooleansDefault: migrating ======================
== 20180923091603 ChangeSqliteBooleansDefault: migrated (0.0000s) =============

ってことは単純に Ruby のせいだね。ほんと Ruby クソだな。
もともと DB に MySQL 使っていたのも奏功しました。(bitnami は MariaDB)

Open Solaris11 から Anazon Lightsail へ

・・・じゃあ基盤が老朽化しているこのサイト
( https://www.twinfami.com ) も一緒に乗っけちゃえ〜って事で、
VirtualHost を有効にして bitnami から WordPress をダウンロードしインストール。
プラグイン「All-in-One WP Migration」を使って一気に移行してしまいました。

構築の上で、こちらを随分と参考にしました。ありがとうございます。
Bitnamiで1インスタンスに複数のパッケージをインストールする

普通は1インスタンス1アプリで考えるんですが、お金掛かるしね?

一方で、検索系(艦これ とか VGM とか)は違う DB を使っている事から、
サブドメインを分けて自宅サーバに継続させることにしました。

https://kswd.twinfami.com/vgm/
https://kswd.twinfami.com/kancolle/

SSL 証明書の自動更新とかバックアップ設計とかはまだ対応していませんが、
そのうち考える予定です。スナップショット 20 GB 取ったら月額1ドル掛かるしなぁ・・(いいじゃん)

常時 swap 使ってる状態なので、とっても遅い・・ってことになったら、
インスタンスのサイズアップを検討しますが、まあウチなんて弱小サイトだし大丈夫でしょう。

なお Ruby クソクソいってますが、私が Redmine 使いたいだけの消費者だからであって、
PG の方にとっては素晴らしい言語だと思います。
仮に私が PG だったら Ruby 最高といっていることでしょう。知らんけど。

Raspberry Pi3にBCASを制御させる

WindowsでPT2を使った録画サーバを構築してるのですが、
本日大変調子が悪くなったことからOSを再インストールしました。
そこでPT2環境も再セットアップした時に少し構成変更したのでメモ。

前提

再インストール前は「BonCasLink(Server)」と「BonCasProxy」を使ってBCASカードを管理していました。
前者がBCASカードの接続を共有するソフトウェア、後者が共有されたBCASをLAN内で共有するソフトウェアです。

ふつーであればスマートカードリーダーをPCに挿しておけば済む話なのでこれらは不要です。
が、リモートデスクトップで接続するとスマートカードリーダーが切断されるという宿命みたいな仕様があり、
このため別ユーザでBCASをLAN公開して、そこにローカルホスト接続するとかいう、
Linuxみたいな回避策を取らざるを得ませんでした。


こんな感じかしら。知らんけど。

一度構築しちゃったのでこの構成でも良かったのですが、
再インストールに際して環境再現が非常に面倒くさかったので、BCASサーバを別立てしようと思いつきました。
探してみるとPerlでBCAS共有を実現している人が。世の中には凄い人がいるんですね・・。

Raspberry Pi3でのセットアップ

$ uname -a
Linux GameWatch 4.4.9-v7+ #884 SMP Fri May 6 17:28:59 BST 2016 armv7l GNU/Linux

OSはRaspbian。リーダーはSCR3310-NTTComです。

ほとんど以下のサイトの手順で実施しました。(ありがとうございます)
http://blog.techlab-xe.net/archives/4136

リーダーは最初から繋いでてもOKです。特にドライバもありません。
さっそくGitHubからダウンロードして、改行コードを処理します。

$ git clone https://github.com/walkure/bcs-perl

$ cd bcs-perl/
$ mv bcs-perl.pl bcs-perl.bak; tr -d \\r < bcs-perl.bak > bcs-perl.pl

この状態でbcs-perl.plにlistをつけて実行。

$ ./bcs-perl.pl list

Can’t locate Chipcard/PCSC.pm in @INC (you may need to install the Chipcard::PCSC module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl .) at ./bcs-perl.pl line 12.

BEGIN failed–compilation aborted at ./bcs-perl.pl line 12.

怒られた。
”PCSCモジュールが無い”っぽいので入れてみます。

$ sudo apt-get install pcsc-tools

※以下を参考にして入れました。他にも入れなきゃいけないかも?
http://www.utilities-online.info/articles/GettingStarted-With-SmartCard-In-Linux/#.WYaYR63ANmA

List of PC/SC card reader
NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader [Vendor Interface] 00 00
>>EOL

今度は成功。わあい。
ここで表示される文字列を控え、bcs-perl.plの変数$selected_readerに設定します。

my $selected_reader = ‘NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader [Vendor Interface] 00 00’;

設定後にbcs-perl.plを実行してみて、以下のようなログがでればOKです。

$ ./bcs-perl.pl
>>Reader:NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader [Vendor Interface] 00 00
>>Card Status:[Card Present][Powered][Ready for PTS]
>>Card Ver:2
>>Card Manufacture ID:M
>>Card ID: 0000 3202 4408 6635 0845
>>Begin Listening(0.0.0.0:6900)…..

BonCasLinkの宛先をRaspberry Piに向けてやればめでたくBCAS共有ができます。
多分以下のような構成になるんじゃないかと思います。

rcスクリプト例

起動確認が終わったらrcスクリプトを書いてデーモン化しておきます。
起動チェック類が多少ぬるいです・・っていうかそもそも動作保証しません。

#!/bin/sh
PID_FILE="/usr/local/bin/bcs-perl/bcs-perl.pid"

if [ -f ${PID_FILE} ] ; then
   FILE_PID=`cat ${PID_FILE}`
   ps -p ${FILE_PID} > /dev/null
   NOT_RUNNING=$?
else
   NOT_RUNNING=1
fi

case "$1" in 
        start )
           if [ ${NOT_RUNNING} -eq 1 ] ; then
                  /usr/local/bin/bcs-perl/bcs-perl.pl > /dev/null 2>&1 &
                  echo $! > ${PID_FILE}
           else
              echo "bcs-perl was running. (PID=${FILE_PID})"
           fi
        ;;
        stop )
           if [ ${NOT_RUNNING} -eq 0 ] ; then
               kill ${FILE_PID}
               rm ${PID_FILE}
           else
              echo "bcs-perl is not running." 
           fi
           
        ;;
        status ) 
           if [ ${NOT_RUNNING} -eq 1 ] ; then
              echo "bcs-perl is not running." 
           else
              echo "bcs-perl was running. (PID=${FILE_PID})"
           fi
          :  
        ;;
        * ) echo "$0 {start|stop|status} " ;;
esac

#すげえニッチなエントリになった。。