Art and Server
Art and Server
Shinya Koyano
Buy on Leanpub

序論

この本を英語で書いた方が良いと思う。しかし、残念ながらわたしには英語を十分に扱える能力がない。

アートとは何でしょうか? わたしにはわかりません。あなたはどういう意味だと思いますか?

”アートは取り扱いが難しい”と言われることが多いんじゃないでしょうか。でも、もし”アートは取り扱いが難しいから扱わない”とするならば、それは”人間は取り扱いが難しいから扱わない”というのと似るように感じます。アートを扱う必要があるのは我々の宿命です。

他者ののサーバーを借りる場合

そのサーバーの管理者が定めたガイドラインに従う必要があります。そのガイドラインは管理者が自由に決められるので借りる側はそれに合わせる必要があります。だから時に折り合いがつかないことがあります。これはやむを得ないことです。

自分のサーバーを持つ

自分が管理者になるので他者の作ったガイドラインとは無縁になります。

わたしはこの方法を実践してみることにしました。この本はその記録です。

実際は一つのサーバーが孤立して存在するのは難しいので、そう単純ではありません。でも、ともかくやってみることにしました。

自己紹介

わたしについて少し話しておいた方が話が伝わりやすいのではないかと思います。

わたしの本名は小谷野慎也です。オンラインネームはmoliと名乗っています。

わたしは基本的にアーティストです。主に絵を描きます。絵を描いているのをストリーミングすることが多いです。音楽も作ります。プログラミングは好きですが、まともなものが作れるほどの能力はありません。

サーバー管理は今回が初めてです。

GNU/LinuxデスクトップのXubuntuなどを使っていた経験は少しあります。

わたしの主な収入源はコミッションとサポーターによるものです。

わたしのソーシャルメディアなどののリンクをここで紹介するべきなのかもしれませんが、NSFWアートが含まれるものが多いので、現段階では差し控えます。Leanpubについてもう少し理解してから考えましょう。

計画

自分でサーバをホストし、既存のサービスの代替となるソフトウェアを実行する。

  • Discord
  • 各種ソーシャルメディア
  • ウェブサイト
  • ストリーミング
  • 送金

別に、わたしはこれらのサービスが嫌いなわけではありません。そのガイドラインと折り合いがつかなかったり、将来サービスが終了したりした場合の保険を用意したいだけです。

構成

デスクトップコンピュータとサーバーコンピュータの2台でシステムを構成します。

デスクトップコンピュータ

絵を描いたり、音楽を作ったり、その他日常的なことをするためには必要です。

サーバー構成要素としては、仮想端末でサーバーコンピュータにSSHで接続するために使います。

サーバーコンピュータ

サーバーとして動作させるための各種ソフトウェアはGNU/Linuxのものが多いので、それが必要です。

基本的に電源を切らずに安全に運用できる必要があるので、低電力・低発熱のものが望ましい。

ディスプレイは机の上のスペースを食うので、ヘッドレスサーバーとして使用したい。

ハードウェア

ルーター

WSR-6000AX8P

各種コンピュータをネットワークに接続するために使用する。他のルーターでもあまり違いはないと思われる。

デスクトップ

iMac, macOS Sequoia 15.1.1

ペンタブレット

Wacom Intuos Pro Medium

**重要な注意点として、これはそのままではiMacには接続できない。**Intuos ProはUSB-Aでコンピュータに接続する必要がある。しかし、iMacはUSB-Cのポートしかないので、変換機が必要になる。(Bluetoothで接続することもできるが、事前にIntuos Proを充電するためにUSB-AでiMacから給電する必要があるので、いずれにしてもまずUSB-AでiMacと接続するしかない)

USB-C ハブ

iMacにさまざまなものを接続するために必要になる。必要なものをリストする。

  • USB-A(一つでは足りなくなるかもしれないので、2-3は必要)
  • HDMI(デュアルディスプレイにするために必要だった)
  • MicroSDカード(Raspberry Pi OSを書き込むために必要)

サーバー

**公式の専用のケースも一緒に購入したが、これは使わない方がいい。**Raspberry Pi Zero 2 Wの基板がケースの溝に硬く挟まってしまうので、一度ケースに入れてしまうと、取り出すのに非常に苦労する。取り外すのは不可能ではないが、ドライバーのようなものをテコにして基盤を持ち上げる必要があり、破損する危険性があると感じた。MicroSDカードを抜き差しするためには、絶対にケースから基盤を取り外す必要があるため、OSを再インストールするときに困ったことになる。

公式のケースを使うのはやめて、裸のまま使うか、適当なプラスチックの箱か何かを用意してそれに入れておけば十分だろう。

ハードウェアのセットアップ

Raspberry Piを購入してもそれだけで動作させることはできない。

何が必要なのかわからなかったので、デスクトップ環境を動作させるために必要なパーツを含めて全て用意した。今思えば必要なかった。

自分で必要なパーツを買い揃える自信がなかったので、近所の大型電気量販店に行って店員さんに全ての必要なパーツを選んでもらい購入した。

ヘッドレスサーバー

Raspberry PiはRaspberry Pi Imagerを使ってMicroSDカードにOSを書き込む時にWifi経由でSSH接続するための設定をすることができる。

なので、Raspberry Piをヘッドレスサーバーとして運用するだけなら、必要なパーツは電源だけである。

オペレーティングシステム

OSのドキュメントは全く読んでいない。

Raspberry Pi OS(64-bt)デスクトップ環境付き をインストールした。しかし、実際にはデクストップ環境は自分には必要なかった。それどころかPGPを使用する際に問題になったので(後述)、次回からはデスクトップ環境なしでインストールするべきだろう。

Paspberry Pi OSはdebianベースのOSなので、こちらのドキュメントも参考になりそうだが、全く読んでいない。

自分の場合aptを利用するだけなので、debianに精通している必要があまりない。

サーバーの総合的なセットアップ手順

セットアップには順序が重要である。

まず、ルーターを設置する。そしてインターネットに接続する設定をする。(詳細は忘れた)

次に、iMacをルーターに有線接続する。(有線の方が高速なので)

また、iMacをWifiでもルーターに接続できるようにしておく。(Raspberry Pi Imagerのため)

すると、ルーターのDHCPによってiMacがネットワークに接続できるようになる。

iMacはMicroSDカードの読み書きができないので、USB-CハブをつなぎMicroSDカードを扱えるようにする。

MacにRaspberry Pi Imagerをインストールする。

Raspberry Pi ImagerでMicroSDカードにRaspberry Pi OSを書き込む。(この時推奨の64-bit, デスクトップ環境ありを選択したが、デスクトップなしの方がよいと思う。理由は後述)

  • この時iMacのWifiの設定を自動で取得してくれる。
  • ホスト名を覚えておく(後でアクセスするために必要になる)
  • SSHの設定をする(後でアクセスするために必要になる)

自分はこの時、ディスプレイとBluetoothのキーボード・マウスを揃えて単体でも使えるようにして起動したが、別に必要なかったと思う。(当時、Wifi経由のSSH接続だけで十分かどうか確信が持てなかった)

OSの書き込みが完了したら、Raspberry PiにMicroSDカードを差し込み、電源を繋ぐ、それだけで起動する(電源ボタンなどはない)。

ここまでの設定をしてきたのであれば、MacからsshでRaspberry Piに接続できるはずだ。

systemd

サービスの管理はsystemdが行うので、これを押さえておく必要がある。sshdやnginx、prosodyとかも皆サービスである。

独自のサービスを作成する

/etc/systemd/systemfoo.serviceという名前でUnitファイルを作る。

 1 [Unit]
 2 Description=Foo Service
 3 
 4 [Service]
 5 Type=simple
 6 Restart=always
 7 ExecStart=/home/user1/foo.sh
 8 
 9 [Install]
10 WantedBy=multi-user.target

より短い例。

1 [Unit]
2 Description=Foo Service
3 
4 [Service]
5 ExecStart=/home/moli/Desktop/foo.sh
6 
7 [Install]
8 WantedBy=multi-user.target

Description=は識別子なので独自のものを。

Type=は通常simpleでよい。(デフォルトsimple)

Restart=はプロセスが終了した時に再起動するかどうかを指定する。デフォルトはno。普通はalwaysを選択することになるだろう。

ExecStartは実行される引数付きのコマンド。

WantedBy=はランレベル。multi-user.targetでいいだろう。ターゲットは/usr/lib/systemd/system/multi-user.targetのようになっている。

systemctl daemon-reloadでサービスの設定ファイルを再読み込みする

systemctl

システムの状態を表示
sudo systemctl status 失敗したサービスを表示
sudo systemctl --failed サービスを起動
sudo systemctl start foo.service サービスを停止
sudo systemctl stop foo.service サービスの状態を表示
sudo systemctl status foo.service サービスを自動起動に設定
sudo systemctl enable foo.service サービスの自動起動を無効
sudo systemctl disable foo.service Unitファイルのバックアップファイルを表示
sudo systemctl cat foo.service

journalctl

ログを表示する。

-x
メッセージカタログでログを拡張する -e
ページャの末尾にジャンプする -u unit
指定されたunitに一致するメッセージを表示する -t identifier
識別子でフィルタリングする(systemd-catのメッセージをフィルタするのに使える)

単にjournalctlとすると全てのログが表示されるので、grepなりなんなりで表示を絞り込んでもいい。

systemd-cat

ジャーナルに直接メッセージを送ることができる。

-t identifier
識別子を指定する。指定しないと実行ファイル名になる
1 systemd-cat -t FOO echo hello

OpenSSH

導入

サーバーにアクセスするにはこれを使う。

Raspberry Piは初期設定でパスワード認証によってsshで接続できるようになっている。

ローカルネットワークでsshで接続するには次のようにする。

1 ssh user@host.local

sshにはいくつか認証方式がある。

  • パスワード認証
  • キーによる認証

キー認証の方がより安全な方式のようなので、まず、パスワード認証でログインできることを確認したら、キー認証に切り替えて、パスワード認証によるログインを無効化する。

具体的には以下のような手順になる

  1. クライアントの方でssh-keygenを使って公開鍵と秘密鍵のペアを生成する
  2. サーバーに公開鍵を登録する。手動でやるか、ssh-copy-idを使う
  3. sshdの設定ファイルを編集しパスワード認証を無効化する
  4. ssh-agentやscpなどの便利なコマンドを使う

全体を把握するためにWikibooksを読むのもいいかもしれない。

設定したのが少し前のことなので、大まかにしか書いてない、後で書き直す。

ssh

ssh

sshクライアント。

パスワード認証にせよ鍵認証にせよこれを使うことになる。

1 ssh user@host

あとは道なりに進んでゆけば良い。

ssh-keygen

鍵を生成する。

1 ssh-keygen

特にオプションなどは必要ないと思う。パスフレーズを尋ねられるので設定する。

公開鍵を登録する

サーバーの~/.sshがsshの設定ファイルを入れるディレクトリなのでここに鍵を入れる。鍵はテキストファイルなので端末からコピーアンドペーストすればよい。

ssh-copy-idを使うこともできる。

sshd

設定はファイルは/etc/ssh/sshd_configである。

パスワード認証を無効化するには設定ファイルにPasswordAuthentication noと記述する。

サービスとして実行されれいるので、設定ファイルの内容を反映するためにはsudo systemctl restart sshd.service として再起動する。

ssh-agent

クライアントの方で使うと以後の鍵の入力を省略できるようになる。 ssh-addで秘密鍵を登録する。

1 ssh-agent bash
2 ssh-add ~/.ssh/key

複数のクライアントから同じサーバーに接続する必要がある場合は便利かもしれないが、自分の場合はあまり使っていない。

sftp & scp

クライアントからサーバーにファイルを転送するのにこれらが必要だ。sftpでもscpもどちらでもよさそうだが十分試してないので、後で調査する。

DDNS

自分の場合固定IPではなかったのでDDNSに登録する必要があった。

選択肢はいくつかあったが自分はNO-IPのProプランを使うことにした。

  • ルーターがNO-IPに対応していたこと(必須ではない)
  • 独自のドメインを設定することができること(IndieWebに対応するために必要)

しかし、月に約15ドルもかかるので、かなり厳しい。もっとどうにかならないだろうか。

独自ドメイン

上記のサイトを参考にしつつ選んでみた。

この記事とは直接関係しないが、価格が手頃だったのでレジストリ.xyzから直接購入することにした。

しかし、自分がちゃんと設定方法を理解していないだけかもしれないが、DDNSを設定するとサブドメインを使うことができないようなので、後々NO-IPから別のドメインを設定せざるを得なくなったりと、使いにくい感がある。固定IPならば問題はなさそうなのだけど。

結果としては、特に難しいこともないのだが、初めてドメインを購入するとなるとWHOISについて悩むことになるだろう。

WHOIS

WHOISはドメインの所有者に連絡を取るための公開データベースを検索するための仕組みだ。

ここにはドメインを取得する時に記入した個人の住所、電話番号、メールアドレスが含まれる。

WHOISは公開されており誰でも検索できるので、普通にやると住所や電話番号が全世界に公開されてしまうようになっている。個人の場合には安全のために望ましくないと考えるのが常識だろう。

しかし、WHOISはその時代遅れな仕様が改められない。

対策として、レジストラがドメインの所有者にWHOIISに登録することでドメイン所有者の個人情報を隠すWHOISプライバシーなどと呼ばれる仕組みが、どのレジストラにも備わっているようだ。

ただし、WHOISプライバシーを有効にした場合、もしレジストらとドメイン所有者が紛争になった場合、ドメイン所有者に勝ち目がなくなるといった問題もあるようだ。わたしは法律に詳しくないのでなんとも言えない。

わたしは住所を公開するわけにもいかなかったので、WHOISプライバシーを有効に設定している。

考察

DDNSにせよ、ドメインにせよ、ISPにせよ、自分と異なったポリシーを持っている他者であるわけだ。これらを利用しなければならない時点で、完全に独立したサーバーとは言えない。

インターネットを利用する以上、完全に独立しているというのは無理だということが明らかになったと思う。

他者と協調しつつ、自分の権利を確保してゆくというふうに立ち回るほかない、そう思われる。

nginx

HTTPサーバーとリバースプロキシ。

aptでインストールすれば特に問題はないようだ。

同様の用途としてCaddyを使うようになってしまったので、今後使うかどうかはわからない。

ただし、使うつもりがあるなら、Certbotを設定するより前に入れておいた方がいい。Certbotはnginxの設定ファイルを書き換えてTSLが有効になるようにするからだ。

TLS

TLS

Wikipediaのページを読んでも、全く意味がわからない。

二者間の通信のセキュリティを担保するために第三者の認証局を入れるという方式のようだ。

とにかく、これを入れないとWebサーバーやXMPPサーバーが使えないので、なんとかして設定する必要がある。

認証局を選ぶ

無料で証明書を発行してくれる認証局。大抵の場合はここが使われるようだ。

証明書には有効期限(13ヶ月くらい)があるので、証明書の取得と更新を自動で行うプログラムを入れるのが一般的なようだ。

Certbot

Let’s Encryptがおすすめしているクライアントプログラムがこれなので、これを使う。

使い方は忘れたが、Webページの指示通りにやっていけば問題なかった。

XMPP

Discordの代替として見たときに、グループチャットとファイル共有は可能だが、画面共有はできない。(音声通話は可能なようだが、設定していない)

画面共有がしたいならJitsi Meetなどを使うという手もあるが、ストリーミングで代用できる部分も多いので、今は検討しないことにした。

サーバー

設定の仕方は忘れたが、ドキュメント通りにやっていけばできるはずだ。

チャット、ファイル共有、グループチャットなどには、それぞれポート開放とCertbotによる証明書の発行が必要になる。

クライアント

vCardというプロフィールを設定するためのモジュールが上手く動作しなかったので他のクライアントで設定する必要があった。それ以外はあまり問題なく使えている。

Caddy

ウェブサーバーとリバースプロキシ。

いくつか特徴がある。

  • 証明書を自動で取得してくれる
  • 一つの実行ファイルで完結しているので、好きな場所に配置できる
  • 設定ファイルをカレントディレクトリから読み込むのでディレクトリによって動作を変えられる
  • ドキュメントがわかりやすい

デメリットとしては。

  • サービスにしたければ手動で登録する必要がある
  • nginxのような大量のアクセスに対してどの程度の性能があるのかよくわからない

今のところ大量のアクセスを処理しなければならない状況にはないので、自分にはCaddyが適していると思う。

今のCaddyfileはこんな感じ。あまり綺麗ではないので後で整理したい。

 1 moli-green.xyz {
 2     root * /home/moli/Public/www
 3     file_server
 4 }
 5 
 6 moli-stream.zapto.org {
 7     reverse_proxy :8080
 8 }
 9 
10 :80 {
11     root * /home/moli/Public/onion
12     file_server browse
13 }

Owncast

ストリーミングするならPeerTubeなどの選択肢もあったが、インストールが難しそうだったので、別のソフトウェアを探していたところ、これを見つけた。

非常に簡単にインストールできる。

インストールスクリプトを実行するだけである。単体の実行ファイルとしてインストールされる。Caddyを内蔵しているのでHttpサーバーの設定なども必要ない。ホームディレクトリにインストールするならばルート権限も必要ない。

しかし、わたしのサーバーコンピュータはRaspberry Pi Zero 2 Wなので性能が足りなかった。(しばらく動かしているとダウンしてしまう)もう少し、性能の高いマシンであれば全く問題ないと思うので、サーバーマシンを買い替えたら導入したい。

Painter

ワコム タブレットの設定

わたしの場合、CLIP STUDIO PAINTのペンによるパンの操作に慣れていたので少し設定を変更した。

  1. Wacom Centerを開く。
  2. ペンの設定 -> アプリケーション -> Corel Painter 2023を追加
  3. 下サイドスイッチを”パン/ズーム…”に変更
ペンをタブレットから浮かせて下サイドスイッチを押した状態
パン ペンをタブレットにつけてしたサイドスイッチを押した状態
ズーム

という動作になる。

CLIP STUDIO PAINTとは少し動作が異なるが、個人的にはなんとか慣れることができそうに思う。

ショートカット

CLIP STUDIO PAINTと違うところ、または、個人的に要注目の部分だけ取り上げる

1-0キー
ブラシの透明度を10-100%の範囲で10%刻みに変更する(例えば3なら30%の透明度)

CLIP STUDIO PAINT

名前が長いので以下CSPと略す。

複数ページ管理機能を使うためにはEXを購入する必要がある。

わたしはこのCSPを使い慣れているので、ペイントソフトに関してはCSPが基準になっている。