DollsKit

一日でなれる人形遣い

用意(購入)するもの

Optional でないものは必須です。

本体

その他

参考資料

Raspberry Pi Documentation: https://www.raspberrypi.org/documentation/

Getting Started https://www.raspberrypi.com/documentation/computers/getting-started.html

Headless Setup (GUI なしセットアップ) https://www.raspberrypi.com/documentation/computers/configuration.html#set-up-a-headless-raspberry-pi

ドキュメントが一新され、Raspberry Pi Imager を使ったセットアップ方法となった。 SD card に焼くイメージのセレクタ/ダウンローダとイメージライタが一緒になって いい感じになったセットアップ用ソフト。

最新確認環境

Raspberry Pi OS Lite (32-bit) 2021-05-07 (Buster)

準備

https://www.raspberrypi.com/documentation/computers/getting-started.html

初期設定

$sudo raspi-config

バージョンアップで少しずつパワーアップしている気がする。

ifconfig で wlan の MAC addr を見てルータに DHCP 固定割り当てを設定する。 (そのような機能がある場合) または普通の Linux のやり方で固定アドレスを設定する。 Windows で ipconfig.exe /all を実行した結果を参考にするとよい。

# /etc/dhcpcd.conf
interface <eth0|wlan0>
static ip_address=192.168.XXX.YYY/NN
static routers=192.168.0.1
static domain_name_servers=XXX.YYY.ZZZ.WWW

アップデート

日本のミラーサイト

※これをやらなくても tsukuba.wide.ad.jp につながった。 謎の力で近くのミラーが使われるようになったのかもしれない。

/etc/apt/sources.list に書かれているサーバは遠くて遅いので 以下のうちどれかに差し替える。

http://raspbian.org/RaspbianMirrors

パッケージの更新

パッケージの削除

sudo apt remove --purge <PKGNAME> or sudo apt purge <PKGNAME>

設定ファイルを後から消す

dpkg --purge `dpkg --get-selections | grep deinstall | cut -f1`

Debian-Backports

主にgit や cmake が古い場合。 最新を追いかけるなら公式のリポジトリを sources.list に登録するのが確実だが、 こちらで十分なら設定は一回で済む。

以下を /etc/apt/sources.list に追加。

deb http://ftp.jp.debian.org/debian buster-backports main contrib non-free

その後 sudo apt update。 おそらく鍵エラーが出るので、NO_PUBKEY と言われた鍵(16進)を控えて、

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY>
...

apt show で backports に別バージョンがあるなら -a ですべて表示できると注意が出る。 backports は -t で明示的に指定しなければ使われることはない。

apt show -a <pkg>
apt install -t <version>-backports <pkg>

自動アップデート

  1. sudo apt install unattended-upgrades
  2. sudo dpkg-reconfigure -plow unattended-upgrades
  3. /etc/apt/apt.conf.d/50unattended-upgrades を編集

初期設定は以下のようになっているが、Raspberry Pi では origin が “Raspbian” や “Raspberry Pi Foundation” になっているのでこのままではマッチせず 何もアップデートされない。

"origin=Debian,codename=${distro_codename},label=Debian";
"origin=Debian,codename=${distro_codename},label=Debian-Security";

origin, label, suite 等の情報は /var/lib/apt/lists/ 以下にあるファイルに 書かれているが、いつも apt update apt upgrade だけしているなら 以下のようにすればとりあえず全部アップデートできる。

"o=*";

このあたりを運用に合わせて設定する。

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";

以下で空実行できる。

sudo unattended-upgrade --debug --dry-run

自動補完の Beep 音がうるさい

$ sudo nano /etc/inputrc
# uncomment
set bell-style none

screen

ssh をまともにする

VNC (remote desktop)

https://www.raspberrypi.com/documentation/computers/remote-access.html#virtual-network-computing-vnc

カメラモジュール

I2C

HTTP Server

SSL (Let’s Encrypt)

sudo certbot

Certbot doesn't know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run "certbot certonly" to do so. You'll need to manually configure your web server to use the resulting certificate.

sudo certbot certonly

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): (メール)

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): (ドメイン名)
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (ドメイン名)

Select the webroot for (ドメイン名):
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for yappy.mydns.jp: (Enter 'c' to cancel):/var/www/html/
(lighttpd のデフォルトドキュメントルートの場合)
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/(ドメイン名)/fullchain.pem. Your cert will
   expire on 2019-01-01. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

/etc/cron.d/certbot に cronjob が登録されている。 12 時間ごとに自動で renew してくれるらしい?

ssl.pemfile = "/etc/letsencrypt/live/yappy.mydns.jp/fullchain.pem"
ssl.privkey = "/etc/letsencrypt/live/yappy.mydns.jp/privkey.pem"

セキュリティや設定の確認は Qualys SSL LABS で診断してもらうのがおすすめらしい。 ドメインを入れるだけで色々とチェックしてくれる。

MySQL (MariaDB)

セキュリティ初期設定

以下 10.11.4-MariaDB の情報。

sudo mariadb-secure-installation (mysql_secure_installation)

推奨やデフォルトが変わってトラブルを起こしている気がする。。

# root ログイン確認
sudo mysql

sudo mysql [-u USER] [-p]

-u は省略すると '現在のログインユーザ'@'localhost' が使われる。 パスワードを入力したい場合は -p を指定するが、管理が大変なのであまり使いたくないことも 多いかもしれない。

WordPress - MariaDB

Prerequirements

apt に wordpress というのがあるが、apache に依存があり、インストールすると そちらも同時にインストールされてしまう(一敗)。 それとちょっと古い。

以下から最新版をダウンロードする。

https://ja.wordpress.org/support/article/how-to-install-wordpress/

  1. zip をダウンロードして展開する。そのまま web から見えるどこかに配置する。
  2. index.php にアクセスしてみる。
  3. 動かない→シンプルな PHP ファイルで動作を再確認。
  4. 画面が出たがデータベースライブラリがないと言われる→php-mysql(nd) をインストール してサーバを再起動。
  5. 画面が出た→データベース名とユーザ/パスワードを入力。
    データベース名: wordpress とかにする。
    ユーザー名: サーバの動作ユーザ (www-data) と同じにすると unix_socket 認証が効く。
    パスワード: unix_socket 認証ならば空で OK。
    データベースのホスト名: localhost で。
    テーブル接頭辞: データベースの root がないけど wp を複数動かしたい人向け。 デフォルトで。
  6. wp-config.php を作ろうとするが、パーミッションエラーとなった場合は 表示された内容を自前でコピペして作成する。 wp-config.php は最終的には 400 (r–/—/—) 推奨

これでとりあえずボタンを押すとデータベース接続エラーになるので、 必要なユーザや権限をエラーが出なくなるまで作っていく。

MariaDB ユーザの作成

まずログインエラーを直せるか確認しつつ行う。

-- パスワードなしで誰でも入れる。危険。
CREATE USER 'www-data'@'localhost';
-- パスワードを指定して作成。コマンドログに残るし色々と何とも言えないところがある。
CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'password';
-- unix_socket による認証。www-data ユーザならパスワードなしでログインできる。
CREATE USER 'www-data'@'localhost' IDENTIFIED VIA unix_socket;
# sudo は実は root で実行する、ではなく switch user して実行する、なので
# www-data ユーザとして実行できる
# 'www-data'@'localhost' としてログイン確認
sudo -u www-data mysql

ここまで確認できたら WordPress からユーザ名: www-data, パスワード: 空で データベースログインまで通ることを確認する。

文字コードデフォルト設定

SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE "col%";

/etc/mysql/my.cnf がルート設定ファイルだが、ディレクトリの中身を全部 インクルードしているだけなので、/conf.d/mysql.cnf を編集する。

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin

[client]
default-character-set=utf8mb4
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

+----------------------------------+--------------------+
| Variable_name                    | Value              |
+----------------------------------+--------------------+
| collation_connection             | utf8mb4_general_ci |
| collation_database               | utf8mb4_general_ci |
| collation_server                 | utf8mb4_general_ci |
| column_compression_threshold     | 100                |
| column_compression_zlib_level    | 6                  |
| column_compression_zlib_strategy | DEFAULT_STRATEGY   |
| column_compression_zlib_wrap     | OFF                |
+----------------------------------+--------------------+

character_set_system は utf8(mb3) のままで OK。

なぜか collation-server のデフォルト設定が効かない気がする。 とはいえデフォルト設定に頼るのは移行時の事故の元なので、 CREATE DATABASE 時に明示的に設定するようにする。

-- データベース設定情報の取得
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
*************************** 5. row ***************************
              CATALOG_NAME: def
               SCHEMA_NAME: wordpress
DEFAULT_CHARACTER_SET_NAME: utf8mb4
    DEFAULT_COLLATION_NAME: utf8mb4_bin
                  SQL_PATH: NULL
            SCHEMA_COMMENT:

スロークエリ

WordPress 運用ではそこまで要らないかもしれないけど、一応。

[mariadb]
slow_query_log
long_query_time=1.0
# default=/var/lib/mysql/{host}-slow.log
slow_query_log_file=slow.log

WordPress - 本体

パーミッションと自動更新

データベースだけでなく、WordPress のインストール先自体を書き換えることがある。 とりあえず読み取りさえできれば動きはするが、FTP の設定を求められたりする。

本体の自動更新をするには PHP プログラム (= web サーバ = www-data ユーザ) から 自分自身を書き換えられるようにする必要がある。

理想

しかし、更新作業が面倒とか、忘れているとかでセキュリティパッチの適用なしで インターネット上に放置されるのはあまりにも危険。

現実的には

こんなところかもしれない。 自分自身を任意のプログラムに置き換えられる可能性は頭にちらつくが、 セキュリティアップデートなしで放置するよりはマシな気がする。 (S)FTP or SSH を設定するというのも、もっと権限の高い権限へのログイン情報を WordPress に持たせる感があって何とも言えない。

chown -R www-data:www-data .
find . -type f | xargs chmod 644
find . -type d | xargs chmod 755
chmod 400 wp-config.php

自動更新設定

初期設定ではなかなか激しいことになっている。。(ver 6.4.3)

このサイトは WordPress の新しいバージョンごとに自動的に最新の状態に保たれます。
メンテナンスリリースとセキュリティリリースのみの自動更新に切り替えます。

プラグインを入れたりしていると、普通に破壊されると思われる。 そういうまともな使い方を始めるまでは常時最新アップデート設定で、 というメッセージなのかもしれないけど。。

下のリンクをクリックするとマイナー/セキュリティリリースのみの自動更新になる。

このサイトは WordPress のメンテナンスリリースとセキュリティリリースのみで自動的に最新の状態に保たれます。

ただ、固定したバージョンも永久に使い続けられる訳ではないので、 データベースも含めたバックアップ/リストア手順と共に、 メジャーバージョンアップの手順確立と習慣化も考えるべきだと思われる。 また、PHP や MySQL (MariaDB) も数年でサポートが切れる。

一応 10 年前までのリリースにもセキュリティパッチは出ているようだけど、 10 年分の全部のリリースブランチにパッチを当ててリリース作業を行う担当者の 悲痛な叫び声が聞こえる。。

https://ja.wordpress.org/download/releases/

積極的に保守されている6.4系統の最新版以外の以下のバージョンは、安全に使用することはできません。

サイトヘルス

警告 オプションのモジュール curl がインストールされていないか、無効化されています。
警告 オプションのモジュール dom がインストールされていないか、無効化されています。
警告 オプションのモジュール imagick がインストールされていないか、無効化されています。
警告 オプションのモジュール zip がインストールされていないか、無効化されています。
エラー 必須モジュール gd がインストールされていないか、無効化されています。
警告 オプションのモジュール intl がインストールされていないか、無効化されています。
apt install php-gd
apt install php-curl php-dom php-imagick php-zip php-intl
service lighttpd restart
REST API で予期しない結果が発生しました

パーマリンク設定のところが %postname% を含むもの (デフォルトもそう) になっていると REST API が 404 になるらしい。

サイトのパーマリンク構造を選択してください。%postname% タグを含めるとリンクが理解しやすくなり、投稿が検索エンジンで上位に表示されるのに役立つ可能性があります。

バグのような気もするし、そのうち直るのかもしれない…。

pCloud

買い切りのクラウドストレージ。 生涯 (会社が潰れるまで) 使い続けられるらしい。

rclone

https://rclone.org/

クラウドストレージ全般に対応したコマンドラインツール。 Go 製。 暗号化した状態で保存もできるらしい。

インストール

https://rclone.org/downloads/
https://rclone.org/install/

sudo -v ; curl https://rclone.org/install.sh | sudo bash

例によってシェルスクリプトの実行がどうかと思う場合はマニュアル操作で行う。 CPU に合わせて AMD64 (PC) or ARM64 (RasPi) を選択。 Debian/Raspbian なら *.deb パッケージを選ぶと管理が楽。 sudo apt install ./xxx.deb のように ./ で始まるパスを書けば apt からインストールできる。

remote の追加

rclone config
  1. New remote
  2. Enter name for new remote. リモート設定に名前を付ける。 設定完了後にコマンドライン上で毎回指定することになる。
  3. Pcloud
  4. Leave blank normally. と言われたら空のままで。
  5. Say Y if the machine running rclone has a web browser you can use. 多分ウェブブラウザの使えるマシン上で認証して、設定をコピーするのが楽。 GUI 環境のある PC でここに Y と答える。
  6. WSL だとブラウザが開けず http://127.0.0.1:53682/... へアクセスしろと 言われるので、ブラウザで開く。
  7. ブラウザから pcloud にログインしたことがあれば認証通るはず。
  8. ここまで行う、または GUI 環境がない場合は ~/.config/rclone/rclone.conf の 内容を認証できているマシンからコピーしてくる。

OAuth とかの認証のため、ウェブブラウザがないとしんどい。 GUI のある PC にも rclone をインストールし、ウェブブラウザから認証して アクセストークンを入手する。 設定ファイル ~/.config/rclone/rclone.conf にアクセストークンが書かれているので、 CUI 環境での設定ファイルにコピーするのが多分楽。

rclone 使い方

リモートのパスは <remote>:<path/to/file_or_dir> のように、 設定でつけた名前をコロンの前に指定する。 パスは / で始めないことを推奨。 ルートを指定したい場合は空文字列で OK。 ごく一部のサービス相手では最初を / で始めるか始めないかで、 ルートからのパスかホームディレクトリからのパスかを使い分けられる。

# ls (--max-depth 1 をつけないと再帰的に全エントリを列挙する)
rclone ls remote:
# ls -l っぽいもの (同上)
rclone lsl remote:
# ディレクトリのみ列挙する (-R で再帰的に列挙)
rclone lsd remote:
# ファイルのみ列挙する (同上)
rclone lsf remote:
# JSON フォーマットで出力する (同上)
rclone lsjson remote:

Linux CLI client のビルド

スマホも含めて各 OS のクライアントがダウンロード可能だが、 Linux - CLI のコマンドライン版を求めると github へ案内され CMake, C++, boost を使った高難度ステージへ案内される。

https://github.com/pcloudcom/console-client

ビルドの難度がやたら高い上に、何だか不安定な気がする以上に rclone がよく出来すぎているため、rclone があれば不要と思われる。

必要なもの