2022-12-04から2022-12-06にかけてmstdn.aoirint.comで発生していた障害について

2023-02-10: タイトル・文言の修正 2022-12-04 03:40頃から、mstdn.aoirint.comで障害が発生していました。 2022-12-04 03:40頃 障害発生(WAN側IPアドレスの変更) 2022-12-06 15:00頃 障害を認識、原因を特定、DNSレコードを変更 2022-12-06 15:10頃 TTL経過により解消の見込み サービスの死活監視 サービスの死活監視は、内部ネットワークのSmokePing、および外部ネットワークのBetter Uptimeを使用しています。 以下の画像は、2022-12-04 00:00から06:00における、SmokePingによるNATループバックPingの監視記録です。 これ以降、SmokePingの宛先IPアドレス変更が行われるまで、不通の状態が続きました。 現在のサーバ環境では、原因を特定できていない短時間の接続不良が毎日のように発生しており、 今回の障害ではBetter Uptimeの停止通知が一時的なものでないことに気づかないまま、48時間以上経過することになりました。 今後の対応について、DDNSサービスやCloudflare等を活用したサーバ環境の安定化対策を検討しています。

2022年12月6日 · aoirint

Mastodon on Docker Composeで全文検索エンジンElasticsearchを有効化する

Mastodon on Docker Composeを立てる記事: https://blog.aoirint.com/entry/2020/mastodon_docker/ 上の記事では、諸般の事情(主にスペック不足)によりElasticsearchを無効化した状態でMastodonインスタンスを立てていた。 2021年のElasticsearchのライセンス変更 クラウド事業者によるマネージドサービス提供における、オープンソースコミュニティへのコントリビューションの不足等を背景として、 2021年のバージョン7.11リリース以降、ElasticsearchのライセンスはApache 2.0から独自のElastic License 2.0(およびServer Side Public Licenseのデュアルライセンス)に変更された。 https://www.elastic.co/jp/pricing/faq/licensing この記事では、Elastic License 2.0によってライセンスされる公式のElasticsearchの配布パッケージを使用する。 Elastic License 2.0の条文: https://www.elastic.co/licensing/elastic-license ちなみにElastic License 2.0は、Elasticsearchをマネージドサービスとして提供することを禁止しているが、SaaSアプリケーションのバックエンドとして使用すること(Elasticsearch APIへの直接アクセスを提供しないサービス提供)に影響しないという立場が示されている。 Elasticsearchをバックエンドで使用するSaaSアプリを開発しているけど、どんな影響が生じる? 今回のソースコードのライセンス変更はお客様に一切影響しません。Elastic Licenseに基づいて、デフォルトの配布パッケージを使用できるほか、このパッケージをベースに無料でアプリケーションを開発することもできます。Elastic Licenseはsource-available license(ソース利用許諾)であり、コピーレフトの側面を持たず、デフォルトの機能を無料とします。具体的な例として、よろしければMagentoプロジェクトに関する質問への回答をご参照ください。 https://www.elastic.co/jp/pricing/faq/licensing#elasticsearch%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8Bsaas%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%96%8B%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%91%E3%81%A9%E3%80%81%E3%81%A9%E3%82%93%E3%81%AA%E5%BD%B1%E9%9F%BF%E3%81%8C%E7%94%9F%E3%81%98%E3%82%8B%EF%BC%9F I’m using Elasticsearch to put a search box on my cat-picture SaaS product. This is permitted under ELv2. Meow! I am a Managed Service Provider (MSP) running Elasticsearch and Kibana for my customers. If your customers do not access Elasticsearch and Kibana, this is permitted under ELv2. If your customers do have access to substantial portions of the functionality of either Elasticsearch and Kibana as part of your service, this may not be permitted. ...

2022年11月23日 · aoirint

死活監視サービスBetter Uptimeを導入した

aoirint.com関連サービスにBetter Uptimeを導入し、死活監視情報の提供を開始しました。 登録時に電話番号が必要なのがネックだけれど、URLを入力して、オプションでカスタムドメインを使うためにDNSにCNAMEレコードを追加したくらいで、結構簡単に使い始められた。 プランは以下を参照。URL 10個まで無料で監視させられる(3分間隔)。 https://betterstack.com/better-uptime/pricing カスタムドメインのステータスページ。 https://status.aoirint.com

2022年11月23日 · aoirint

PCIe USB 3.0増設ボード(ELUTENG)を追加した

Amazon.co.jp: ELUTENG USB3.0 増設ボード 4ポート 2ポート インターフェースカード 外部給電不要 独立給電 5Gbps高速伝送 拡張カード 独立コンデンサー 過電流保護 良い安定性 PCIE x16 x8 x4 x1対応 PCIE Express to USB3.0 Win10 8.1 8 7 XP対応 PS3/PS4 Linux Mac非対応 (4ポート) 10月末に1568円で買っていた。 これまで、USB 3.0の増設用途には、2018年6月に1755円で購入した外部電源付きのUSBハブを使っていた。 Amazon.co.jp: エレコム USB3.0 ハブ 4ポート ACアダプタ付 セルフ/バス両対応 ブラック U3H-A408SBK PC裏は電源やUSBケーブル・オーディオケーブル・LANケーブルなどで配線地獄になってしまう。 また、様々な電源を必要とする機器によって、電源コンセントが埋まってしまう。 主に以下のような目的で、タイトルにある改修をすることにした。 ケーブルの数を減らす 電源コンセントを空ける 空いているPCIeポートを活用する 拡張ボード挿してみたい 作業写真 追加前のマザーボード全体 多少ほこりっぽかったり、メモリのメーカーがバラバラだったりするのは見逃してほしい GPU2枚の間のPCIeポートが空いている 設置箇所 拡大 GPUの排熱の影響を受けそうだけれど、しばらくフルパワーで回していないのでよくわからない ここしかポートがないので、よしとする 追加後のマザーボード全体 ケース背面 USBコネクタの穴が空いている方が上になっているのが標準的な向き(フロントパネルとかノートPCでは普通この向き)だと思っているけれど、この向きでしか設置できないので、よしとする

2022年11月21日 · aoirint

CurseForge Modpackを導入したMinecraft Java版 サーバ in Docker

前回の記事: https://blog.aoirint.com/entry/2021/minecraft_server/ https://hub.docker.com/r/itzg/minecraft-server https://github.com/itzg/docker-minecraft-server 例: https://github.com/aoirint/minecraft-server-pixelmon-cj 2021年12月に確認されたLog4j 脆弱性(Log4jShell)への対応(Minecraft 1.7~1.18を使用する場合) Minecraft公式から、旧バージョンにおける脆弱性対応手順が案内されています。 https://www.minecraft.net/ja-jp/article/important-message–security-vulnerability-java-edition-jp Minecraftサーバー この記事で使用するDockerイメージitzg/minecraft-serverでは、自動的に脆弱性への対応が適用されます。 https://github.com/itzg/docker-minecraft-server#mitigated-log4jshell-vulnerability Minecraftクライアント(CurseForge Appに管理された環境) CurseForge Appでは、Minecraft向けに対応するパッチが適用されているようです(CurseForge Appが管理するMinecraft公式ランチャーのバージョンを脆弱性対応した新しいものに設定している?)。 We already released a patch to the app https://support.overwolf.com/en/support/solutions/articles/9000196615-curseforge-known-issues#Minecraft Mod CurseForge上で脆弱性の影響を受けるModは削除されているようです(独自にlog4jを同梱していたり、特殊な実装をしていたりするものしか影響を受けない気がする)。 to our best knowledge, any vulnerable mod was removed https://support.overwolf.com/en/support/solutions/articles/9000196615-curseforge-known-issues#Minecraft Modpackを導入して新規ワールド生成 CurseForge Appまたはcurseforge.comから、導入するModpackのServer Pack serverpack000_my_mod_pack.zip をダウンロードしてください。 以下では例としてMinecraft 1.12.2の環境ですが、Modpackに対応した本体バージョンに変更してください。 Minecraft公式リリースノート: https://feedback.minecraft.net/hc/en-us/sections/360001186971-Release-Changelogs docker-compose.yml version: "3.9" services: minecraft: image: itzg/minecraft-server:2022.11.0-java8-jdk ports: - "${HOST_MINECRAFT_PORT}:25565" # - "${HOST_DYNMAP_PORT}:8123" environment: EULA: "TRUE" TZ: ${TZ} TYPE: "CURSEFORGE" # https://github.com/itzg/docker-minecraft-server#server-types CF_SERVER_MOD: /modpacks/serverpack000_my_mod_pack.zip VERSION: "1.12.2" # https://feedback.minecraft.net/hc/en-us/sections/360001186971-Release-Changelogs DIFFICULTY: ${DIFFICULTY} SERVER_NAME: ${SERVER_NAME} ENABLE_WHITELIST: ${ENABLE_WHITELIST} WHITELIST: ${WHITELIST} OPS: ${OPS} SPAWN_PROTECTION: ${SPAWN_PROTECTION} VIEW_DISTANCE: ${VIEW_DISTANCE} SEED: ${SEED} MODE: ${MODE} PVP: ${PVP} LEVEL_TYPE: ${LEVEL_TYPE} GENERATOR_SETTINGS: ${GENERATOR_SETTINGS} ONLINE_MODE: ${ONLINE_MODE} tty: true stdin_open: true restart: always volumes: - ./data:/data - ./modpacks:/modpacks .env HOST_MINECRAFT_PORT=0.0.0.0:25565 HOST_DYNMAP_PORT=127.0.0.1:8123 TZ=Asia/Tokyo SERVER_NAME=my-mod-pack-server MOTD= ENABLE_WHITELIST=false WHITELIST= OPS= SPAWN_PROTECTION=0 VIEW_DISTANCE= SEED= DIFFICULTY=hard MODE=survival PVP=true LEVEL_TYPE=normal GENERATOR_SETTINGS= ONLINE_MODE=true HOST_MINECRAFT_PORT: 外部に直接公開(TCP) HOST_DYNMAP_PORT: リバースプロキシでHTTPS化を想定してローカルループバックアドレスにバインド WHITELIST, OPS: カンマ区切りでプロフィール名を記述 サーバ側Modの追加 ModPackへの追加は、初期化以外のタイミングでは反映されないため、./dataディレクトリのmodsフォルダに、通常のMod導入手順と同様に追加します。 ...

2022年10月19日 · aoirint

OpenVPNとnginxをOpenVPNのPort Share機能で共存させる

TCP 443番ポートは、一般にHTTPSの通信に使われ、ファイアウォールやプロキシによる制限の強いネットワークでも通過できることが多い。 一方、WebサーバをホストしたいIPアドレスと、443番ポートでVPNをホストしたいIPアドレスが同一の場合、443番ポートの取り合い(ポート番号の重複)が起きてしまう。 OpenVPNには、OpenVPNが待ち受けるポートへの通信が、 VPNのパケットか、VPN以外のパケット(例えばnginxへのHTTPS通信)かを自動で判別して、 VPN以外のパケットを中継してくれるPort Share機能がある。 つまり、OpenVPNが443番(0.0.0.0:443)で待ち受け、 nginxは他の適当なポート(例えば127.0.0.1:4443)で待ち受けるようにして、 Port Share機能の転送先をnginxに設定すれば、443番で待ち受けるOpenVPNと、本来443番で待ち受けたいnginxとが共存できる。 UbuntuサーバへのOpenVPNの導入は、以下のDigitalOceanの記事が有用なので、参照されたい。 OpenVPNで使用するサーバー証明書・クライアント証明書を発行するCAサーバをセットアップする記事: https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-ubuntu-20-04 OpenVPNをセットアップする記事: https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04-ja OpenVPNのインストールにあたっての重要な点として、 ステップ7 — OpenVPNの設定の(オプション)DNSの変更をプッシュして、VPNを介してすべてのトラフィックをリダイレクトするを実行した上で、 ステップ9 — ファイアウォールの設定を手順通り実行することがある。 NAT下にあるなどの理由でufwの設定をしていなかったサーバーでも、新たにufwの設定をすることで、トラブルなくOpenVPNのインストールができる。 このステップを行わないと、VPN外へのパケットの転送が動作せず、VPN接続中のクライアントがインターネットに接続できない状況に陥る。 また、(オプション)ポートとプロトコルの調整で、待ち受けポートを443番、プロトコルをTCPにしておく。 OpenVPNの起動の際には、nginxとポート番号を取り合って起動に失敗しないように、nginxをあらかじめ停止し、ポート番号を書き換えておく。 nginx 設定ファイル /etc/nginx/sites-enabled/などにあるnginxの設定ファイルを書き換え、 4443番で待ち受けるようにする。 server { listen 4443 http2 ssl; } 大量にサイトをホストしている場合、コマンドやVSCodeなどでまとめて書き換えるとよい。 /etc/openvpn/server/server.conf OpenVPNのサーバー設定ファイルにport-shareを追記する。 port 443 port-share 127.0.0.1 4443 proto tcp OpenVPNからnginxへのパケット転送の許可(ufw) ufw allow from 10.8.0.0/24 to any port 4443 nginx, OpenVPNの再起動 nginxおよびOpenVPNを再起動し、443番ポート宛てのHTTPS通信(nginx宛て)、443番ポート宛てのVPN接続(OpenVPN宛て)が正常に動作することを確認する。

2022年10月19日 · aoirint

Adobe Acrobat ReaderのUIが正しく描画されない・印刷しようとするとクラッシュする(Windows 10 21H2)

特定のWindows 10 21H2環境で、Adobe Acrobat ReaderのUIが正しく描画されなかったり、PDFを印刷したりするとクラッシュする症状に悩まされていた。 https://twitter.com/aoirint/status/1579530951029579776 症状 一部のテキスト(太字?)が右上に傾いて表示される 一部のテキスト(ボタンのラベル?)が表示されない 一部のテキストが135度左回転して表示される ボタンのサイズが本来より大きくなる 印刷UIを開くとクラッシュする メニューから印刷を選んで印刷UIを開くとクラッシュする。 クラッシュレポート送信ダイアログも表示されない。 ほとんどのテキストが太字・下線付きで表示される 高DPI設定を変更すると、表示されなかった一部のテキストを表示できることがあるが、太字・下線付きで表示される。 高DPI設定(Acrobat.exeのプロパティ>互換性>高DPI設定の変更) おかしい表示 正しい表示(解決後のスクリーンショット) 自分の環境での原因・解決 原因は、Windowsのデフォルトフォントを変更していたことだった。 Windowsのデフォルトフォントは、(おそらくこういった不具合を防ぐため)通常の設定UIでは変更することができない。 レジストリを書き換えることで、フォント名に対応するフォントを変更することができる。 このとき、標準的にWindowsのUIフォントとして使われるSegoe UIフォントで描画する、という指定がされているUI上のテキストを、別のフォントを使って描画するように設定することで、デフォルトフォント(システムフォント)を変更する方法がある。 デフォルトフォントの変更方法を指南する記事: https://techcult.com/change-default-system-font-in-windows-10/ Acrobat Readerを正常に動作させるには、Segoe UIとして描画されるフォントが、正しくSegoe UIフォントである必要があるらしい。 クラッシュの原因についてSegoe UIフォントの正常性との関係を指摘するコメント: https://community.adobe.com/t5/acrobat-reader-discussions/acrobat-reader-quit-unexpectedly/m-p/11139813#M66281 上のデフォルトフォントの変更方法についての記事を参照し、復元用regファイルを作成・実行、Windowsを再起動することで、Acrobat Readerを正常に動作させることができるようになった。 recover.reg (TechCultより) Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts] "Segoe UI (TrueType)"="segoeui.ttf" "Segoe UI Black (TrueType)"="seguibl.ttf" "Segoe UI Black Italic (TrueType)"="seguibli.ttf" "Segoe UI Bold (TrueType)"="segoeuib.ttf" "Segoe UI Bold Italic (TrueType)"="segoeuiz.ttf" "Segoe UI Emoji (TrueType)"="seguiemj.ttf" "Segoe UI Historic (TrueType)"="seguihis.ttf" "Segoe UI Italic (TrueType)"="segoeuii.ttf" "Segoe UI Light (TrueType)"="segoeuil.ttf" "Segoe UI Light Italic (TrueType)"="seguili.ttf" "Segoe UI Semibold (TrueType)"="seguisb.ttf" "Segoe UI Semibold Italic (TrueType)"="seguisbi.ttf" "Segoe UI Semilight (TrueType)"="segoeuisl.ttf" "Segoe UI Semilight Italic (TrueType)"="seguisli.ttf" "Segoe UI Symbol (TrueType)"="seguisym.ttf" "Segoe MDL2 Assets (TrueType)"="segmdl2.ttf" "Segoe Print (TrueType)"="segoepr.ttf" "Segoe Print Bold (TrueType)"="segoeprb.ttf" "Segoe Script (TrueType)"="segoesc.ttf" "Segoe Script Bold (TrueType)"="segoescb.ttf" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes] "Segoe UI"=-

2022年10月15日 · aoirint

ARK: Survival Evolved Dedicated Server

以下のDockerイメージを使う。 https://hub.docker.com/r/hermsi/ark-server/ docker-compose.yml イメージのタグは適宜最新のものに更新する。 version: '3.8' services: ark: image: hermsi/ark-server:tools-1.6.61a restart: always volumes: - ./ark-server:/app - ./ark-server-backups:/home/steam/ARK-Backups environment: - SESSION_NAME=${SESSION_NAME} - SERVER_MAP=${SERVER_MAP} - SERVER_PASSWORD=${SERVER_PASSWORD} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - MAX_PLAYERS=${MAX_PLAYERS} - UPDATE_ON_START=${UPDATE_ON_START} - BACKUP_ON_STOP=${BACKUP_ON_STOP} - PRE_UPDATE_BACKUP=${PRE_UPDATE_BACKUP} - WARN_ON_STOP=${WARN_ON_STOP} ports: # Port for connections from ARK game client - "0.0.0.0:7777:7777/udp" # Raw UDP socket port (always Game client port +1) - "0.0.0.0:7778:7778/udp" # RCON management port - "127.0.0.1:27020:27020/tcp" # Steam's server-list port - "0.0.0.0:27015:27015/udp" .env SESSION_NAME=my-ark-session-name SERVER_MAP=TheIsland SERVER_PASSWORD=myserverpasword ADMIN_PASSWORD=myadminpassword MAX_PLAYERS=10 UPDATE_ON_START=false BACKUP_ON_STOP=false PRE_UPDATE_BACKUP=true WARN_ON_STOP=true ポート公開 詳細は調査中。 ...

2022年7月30日 · aoirint

Python, asyncioを使った同期・非同期処理の実装例

Python 3.9.13 (pyenv) Ubuntu 20.04 (WSL2) https://github.com/aoirint/python_asyncio_examples なんかこう書くとうまく動くということしかわからん、という実装例です。 https://twitter.com/aoirint/status/1544891079786627074 基本実装 同期関数から非同期関数を同期的に呼び出す asyncio.run Details import asyncio import time def main(): async def func(): await asyncio.sleep(3) print('func exited') # 1 asyncio.run(func()) time.sleep(1) print('main exited') # 2 main() print('exited') # 3 同期関数から非同期関数を非同期的に呼び出す threading.Thread + asyncio.run Details import asyncio from concurrent.futures import ThreadPoolExecutor import threading import time def main(): async def func(): await asyncio.sleep(3) print('func exited') # 3 thread = threading.Thread(target=lambda: asyncio.run(func())) thread.start() time.sleep(1) print('main exited') # 1 main() print('exited') # 2 非同期関数から同期関数を同期的に呼び出す ふつうに呼び出す Details import asyncio import time async def main(): def func(): time.sleep(3) print('func exited') # 1 func() await asyncio.sleep(1) print('main exited') # 2 asyncio.run(main()) print('exited') # 3 非同期関数から同期関数を非同期的に呼び出す asyncio.new_event_loop + ThreadPoolExecutor + EventLoop.run_in_executor Details import asyncio from concurrent.futures import ThreadPoolExecutor import time async def main(): def func(): time.sleep(3) print('func exited') # 3 loop = asyncio.new_event_loop() executor = ThreadPoolExecutor() loop.run_in_executor(executor, func) await asyncio.sleep(1) print('main exited') # 1 asyncio.run(main()) print('exited') # 2 非同期関数から非同期関数を同期的に呼び出す awaitキーワード Details import asyncio async def main(): async def func(): await asyncio.sleep(3) print('func exited') # 1 await func() await asyncio.sleep(1) print('main exited') # 2 asyncio.run(main()) print('exited') # 3 非同期関数から非同期関数を非同期的に呼び出す threading.Thread + asyncio.run Details import asyncio import threading async def main(): async def func(): await asyncio.sleep(3) print('func exited') # 3 thread = threading.Thread(target=lambda: asyncio.run(func())) thread.start() await asyncio.sleep(1) print('main exited') # 1 asyncio.run(main()) print('exited') # 2 非同期関数から同期間数を非同期的に3つずつ呼び出す asyncio.new_event_loop + ThreadPoolExecutor + EventLoop.run_in_executor Details import asyncio from concurrent.futures import ThreadPoolExecutor import time async def main(): def func(): time.sleep(3) print('func exited') # 3 loop = asyncio.new_event_loop() executor = ThreadPoolExecutor(max_workers=3) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) loop.run_in_executor(executor, func) await asyncio.sleep(1) print('main exited') # 1 asyncio.run(main()) print('exited') # 2 よく見るエラー RuntimeError: Event loop is closed TBW ...

2022年7月7日 · aoirint

nginx, リバースプロキシからのReferrer-Policyヘッダを置換する

add_header Referrer-Policy no-referrer; # add_header Referrer-Policy same-origin; proxy_hide_header Referrer-Policy; # remove Referrer-Policy from original response https://takuya-1st.hatenablog.jp/entry/2018/11/01/040000 https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referrer-Policy https://stackoverflow.com/a/55692346 Mastodon Mastodonでリファラを送らないようにしたかった。 HTMLタグのmetaタグを使う方法をよく使うのだけれど、 ブログとかによくあるheadタグへの任意HTML追加機能のようなものは Mastodon v3.5.3にはなさそうだった。 https://github.com/mastodon/mastodon/issues/9183 同一オリジンでもリファラを送らないようにする(no-referrer)とMastodonの一部の設定が更新できなくなくなるようなので、 MastodonではReferrer-Policy: same-originに設定した。 単純にadd_headerするだけだと、Mastodonが返すReferrer-Policyとnginxが追加するReferrer-Policyで2つのヘッダになってしまった。 referrer-policy: origin referrer-policy: no-referrer そこで、 proxy_hide_header Referrer-Policy; でMastodonから返ってきたReferrer-Policyを削除するようにした。 あとは、 add_header Referrer-Policy same-origin; するだけ。 https://mstdn.aoirint.com/@aoirint/108569086590516035

2022年7月1日 · aoirint