Blog

タグ・月別アーカイブ

DockerCompose on QNAP

ContainerStation

QNAP の ContainerStation をとても便利に使っていたのですが、Deploy のたびに設定 (UIからVolume等) をしたりとか、複数の Container が協調するのがめんどいというか、DockerCompose したいよなあ、と思って VPS を借りてみたりしましてました。

ところが、DockerCompose 対応してる、ということに、最近ようやく気が付きました(最初からあった?)。

DockerCompose == APP

QNAP 用語的には、docker-compose は APP ということみたいです。

Docker 社の作っている app plugin とは別物っぽいです。

APP は二通りの作成方法があるようです。

  • ライブラリ(初期設定なら https://github.com/qnap-dev/container-apps/tree/2.0) をつかう
    templte/*/wizard でメニュー設定と、docker-compose.yml の項目への binding が定義できるようだ。
  • 自分で設定する(作成の所のアプリケーションの作成ボタンから docker-compose.yml を編集して追加できます)
    docker-compose.yml に即値で書いていく。

自分は後者を使いました。設定項目が全て手の中にあるのでバックアップ・履歴管理も楽だし。(docker-compose.qnap.yml で commit しています、詳細な設定・秘密情報は Volume に置く方針です)

注意としては、build エントリがあると失敗するので、消しておきます。なければ image を自動的にダウンロードして実行します。

image の更新

なお、概要タブの Container/APP 一覧から、編集ボタンを押すと既存の APP の yml の編集ができ、適用 すると自動的に更新されます。

tag を :latest にした場合は 適用 を実行したところで、既存の latest を更新してくれないので、image を削除する必要があります。参照されていると削除できないので、面倒です。普通に versioning しましょう。

React

SPA

長いお休みをいただいているので、練習がてら、このサイト(Bugfire.dev)を React で SPA/PWA 化しました。

Page は gh-pages でホストをして、Blog は Markdown にして、index と記事を json でホストして取りに行くようにしました。

Redux/Flux 的なことは Unity や Vue.js で少しかじりましたが、今回は端折りました。
というか色々端折っても三日かかりました、難しい。

TODO

  • Year/Month/Tag で絞り込むUI

  • Android でアイコンが丸くならない、困った。

    "purpose": "maskable" で良いとの記事を見たが動かない。
    十分透過な画像を食わせると良いとは読んだけど、それやると iOS が変になりそう。

  • Markdown (Code highlight)

  • atom.xml

  • sitemap.xml

10/1 追記

PWA は色々おかしい(難しい)ので serviceWorker を止めました。MarkDown も single back-quote が div 要素になったり、普通に hatena blog や qiita にかけば良いのでは?、と頭をよぎってしまうので、あまり時間をかけないようにしたい(自戒)。

自分のためのコードを書くのは楽しいですけどね。

Wake On Lan

PC を定期的に起動・終了したく、試しました。

指定時間で停止

$ sudo crontab -e
MM HH * * * /sbin/shutdown -h now

まあ、普通ですね。歴史的に(?) localtime での時間設定らしいので、気をつける。

起動時にしか localtime をチェックしないので、起動後に localtime を変更する場合は、 cron を再起動しておく。

sudo service cron restart

指定時間で起動

Wake On Lan の magic packet を投げる方法はいくつもあると思いますが、nodejs に慣れているのでそれを選びます。

依存ライブラリのインストール

npm init
npm install --local --save wake_on_lan cron forever
  • wake_on_lan 名前通り
  • cron 時間で指定して実行
  • forever おてがるデーモン化

テスト

ひとまず実行してみる。

const wol = require('wake_on_lan');
wol.wake('xx:xx:xx:xx:xx:xx');

起動する。楽だ。LAN が複数ポートある場合は、一つ目にしか飛ばないのか起動しなかったのでオプションをつける。

wol.wake(mac, { address : '192.168.xx.255' });

動かない場合は sudo tcpdump -nX udp and port 9 等で対象と同じネットワークから見てみる。

結果

最終的には、設定を外出ししてこんな感じに。

ソースファイル

'use strict';

const wol = require('wake_on_lan');
const config = require('./config.js');

function kick() {
    config.hosts.forEach(host => {
        wol.wake(host, config.wol);
    });
};

const CronJob = require('cron').CronJob;
new CronJob(config.schedule, kick, null, true, config.timezone);

設定ファイル

module.exports = {
    timezone : 'Asia/Tokyo',
    schedule : 'MM HH * * *',
    hosts : [
        'xx:xx:xx:xx:xx:xx',
    ],
    wol : {
        address : '192.168.xx.255',
        num_packets : 10,
        interval : 500,
    },
};

デーモン化

  • 起動 ./node_modules/forever/bin/forever start ./wol.js
  • 終了 ./node_modules/forever/bin/forever stop ./wol.js
  • 確認 ./node_modules/forever/bin/forever list

長いパスが嫌な子はパスを通すか wrapper を作るか、global にインストールなぞ。

参照

多少コードは違いますが、ソースはgithubにもあります。
こちらはDockerhubでビルドもしていてコンテナ用になっています。

Disk Checker

ドライブレコーダー用にMicroSDを何枚か買いました。SDカード系って偽物とかありますよね。自分は信頼できる店でしか買わないのでひっかかったこととかないつもりですが...。

チェックするツールもWindows用でいくつか検索で見つけることができますが、色々と面倒なので低機能なものを作ってみました。

  • node.jsで200行未満
  • ディスクが一杯になるまで指定ディレクトリに再現可能な乱数系列の256MBのファイルを作成し続ける
  • ディスクが一杯になったら、作成したファイルを検証する
  • ついでに読み込み・書き込み速度を測る

低レベルで検査しているわけではないので、全エリアはチェックしていません(256MB未満の残り領域、アライメント部分、ディレクトリ情報等)。デバイスファイルを使えばできますが、オペミス怖いしそこまでやらなくてもいいと思いましたのでこのような実装にしました。

https://github.com/Bugfire/diskchecker.git にあります。