·267 words·2 mins
HTTPS 対応サイトを運用していると、「証明書が増えてきた」「更新テストをしたい」「自動更新の設定が合っているか不安」といった場面が定期的にやってくる。
この記事では、Certbot の日常運用でよく使う操作を一か所にまとめた。セットアップ手順ではなく、運用フェーズで実際に使うコマンドと設定に絞っている。
1. 証明書の確認・削除 # まず現状把握から。取得済みの証明書は一覧で確認できる。
sudo certbot certificates 有効期限・ドメイン・証明書名が表示されるので、不要なものがあれば削除する。
# 対話形式で選択 sudo certbot delete # 証明書名を直接指定 sudo certbot delete --cert-name example.com 削除すると /etc/letsencrypt/live/・archive/・renewal/ 配下のファイルが一括で消え、自動更新の対象からも外れる。
2. dry-run で事前テスト # 証明書の取得・更新に失敗し続けると Let’s Encrypt のレート制限に引っかかる。本番実行の前に dry-run でテストしておくのが鉄則だ。
dry-run ではステージング環境が使われるため、レート制限の心配なく何度でも試せる。
新規取得のテスト # sudo certbot certonly --dry-run --webroot \ -w /var/www/acme-challenge \ -d example.com 既存証明書の更新テスト(推奨) # 既存の .conf 設定(authenticator = webroot など)を読み込んで実行される。
·194 words·1 min
前回の記事では git commit をトリガーに Ansible でローカルの Hugo を自動更新する仕組みを構築した。今回はその続きで、git push のタイミングで本番サーバへの同期も自動化した話を紹介する。
やりたいこと # これまでは本番反映を手動で実行していたが、git push に統合し、push するだけで本番まで反映されるようにしたかった。
git に post-push フックはない # git には post-commit のように「push 後」に処理を実行する post-push フックが存在しない。
代わりに pre-push フックを使う。これは push が実行される直前に呼ばれるフックで、処理が失敗(exit 1)すると push 自体を中止できる。
本番同期に失敗したまま GitHub へ push されるのを防げるため、むしろ都合がいい。
実装 # .githooks/pre-push に本番同期の処理を記述し、実行権限を付与してコミットする。
·304 words·2 mins
このブログは Hugo で構築している。記事作成時は Ansible でローカルの Hugo を更新してプレビューし、確認後に本番へアップロードするフローで運用している。
これまではコミット後に ansible-playbook コマンドを手動で実行していたが、コミットしたら自動で Hugo が更新されプレビューに集中できる環境を作りたかった。
この記事では、git の post-commit hook と Ansible を組み合わせた自動デプロイの仕組みを紹介する。
構成の概要 # このブログは以下の構成で運用している。
役割 内容 記事管理 git リポジトリの files/*.md ローカルデプロイ Ansible Playbook (ansible_connection=local) プレビュー ローカルの Hugo サーバ 自動化の対象は「コミット → Ansible 実行」の部分だ。
なぜ git hook を選んだか # git hook にした理由は以下の通りだ。
·223 words·2 mins
このブログの記事作成フローは、以前の記事で紹介したように git commit・git push をトリガーにプレビューや本番反映が自動で流れる仕組みになっている。
ただ、毎回 Claude Code を開いて「プレビューして」「本番に反映して」と伝えるのは手間だ。記事を書くことだけに集中したい。 そこで Claude Code のカスタムスラッシュコマンドを使って、これらの操作をワンコマンド化した。
カスタムスラッシュコマンドとは # Claude Code には、独自のスラッシュコマンドを作れる仕組みがある。所定の場所に Markdown ファイルを置くだけで、そのファイル名がそのままコマンド名になる。
ファイル名 = コマンド名 というシンプルなルールだ。
たとえば preview.md というファイルを置けば /preview というコマンドが使えるようになり、そのファイルの中身がプロンプトとして Claude に渡される。コマンドを入力するだけで、ファイルに書いた指示を Claude が実行してくれる。
配置場所とスコープ # コマンドファイルの置き場所によって有効範囲が変わる。
配置場所 スコープ <プロジェクトルート>/.claude/commands/ そのプロジェクトのみ ~/.claude/commands/ 全プロジェクトで有効 プロジェクト固有の操作はプロジェクト側に置く。こうすると他のプロジェクトで Claude を使っても同名のコマンドが干渉しない。git で管理できるので、チームで共有するときもそのまま使える。
·6 words·1 min
暇つぶしゲーム # このサイトに暇つぶし用のゲームページを置いた。
2048 やブロック崩しなど、ちょっとした隙間時間に遊べるゲームを集めている。
暇つぶしゲームはこちら
·447 words·3 mins
はじめに # Alibaba が開発した AI コーディングエージェント Qwen Code は、OpenAI 互換 API を持つ任意のエンドポイントを向け先として指定できる。今回は さくらのAI Engine(api.ai.sakura.ad.jp)を API バックエンドとして設定し、KVM 上の Ubuntu 26.04 VM で動作させた。
通信制御に Squid 明示プロキシ(FQDN ホワイトリスト方式) を導入した。プロキシのアクセスログを確認したところ、さくらの API 以外にも Alibaba Cloud の外部サービスへのアクセスが発生していることが判明した。
環境構成 # iptables(ファイアウォール) # 外向き通信は デフォルト DROP とし、Squid 実行ユーザのプロセスのみ 443/80 への通信を許可する構成にした。
·266 words·2 mins
はじめに # KVM 環境で Ubuntu 26.04 の VM を何度も作成する機会があり、毎回インストーラーを手動操作するのが手間だったため、完全ノータッチで VM を立ち上げる構成を整えた。
autoinstall は Ubuntu のインストーラー(Subiquity)が提供する機能で、設定ファイルを seed ISO として渡すだけで、対話操作なしにインストールが自動で完了する。
autoinstall の仕組み # Ubuntu 20.04 以降のサーバーインストーラー(Subiquity)は autoinstall という設定ファイル形式をサポートしている。#cloud-config ヘッダーを持つ YAML ファイルに、ロケール・ネットワーク・ストレージ・ユーザーなどを記述しておくと、インストーラーが対話なしに処理を進める。
この設定ファイル(user-data)をインストーラーに渡す方法はいくつかあるが、今回は NoCloud データソースを使った seed ISO 方式を採用した。
seed ISO の中身は user-data と meta-data の 2 ファイルだけで、ボリュームラベルを cidata にするルールがある。
·95 words·1 min
sudo apt update を実行すると、次のような警告が表示されることがあります。
W: Failed to fetch https://ppa.launchpadcontent.net/gns3/ppa/ubuntu/dists/... connection timed out 警告の原因 # 追加済みの PPA(Personal Package Archive)リポジトリへの接続がタイムアウトしたことを示しています。
W: プレフィックスは Warning(警告) であり、エラー(E:)ではありません。パッケージのインストールや更新など、通常の apt 操作への影響は軽微です。ただし、apt update のたびに表示されるため、放置すると煩わしくなります。
タイムアウトが発生する主な原因は次の2つです。
Launchpad サーバー側の一時的な障害・メンテナンス PPA を追加したままにしており、サーバーへの疎通が取れなくなっている 対処法 # 一時的な問題の場合 # 時間をおいてから再度 sudo apt update を実行してください。サーバー側の問題であれば自然に解消されます。
·371 words·2 mins
メールサーバー構築(Postfix / Dovecot / Roundcube / SpamAssassin)で発生したトラブルと解決策
1. Roundcube: Internal Error(INBOX が存在しない) # 症状
ログインは成功するが画面に “Internal Error” が表示される。ブラウザの開発者ツールで確認したレスポンス:
"exec": "this.display_message(\"サーバーエラー: STATUS: Internal error occurred.\", \"error\", 0);" 原因
IMAP の STATUS コマンドが失敗。メール未受信のため Maildir の INBOX ディレクトリが存在しなかった。エラーログには何も出力されないため原因特定にブラウザの開発者ツールが必要だった。
解決策
Dovecot に INBOX 自動作成設定を追加した。初回ログイン時に INBOX ディレクトリが自動生成される。
# dovecot 10-mail.conf namespace inbox { inbox = yes mailbox INBOX { auto = subscribe } } 2. Postfix: 外部送信タイムアウト(OCI Free Tier) # 症状
·572 words·3 mins
Ubuntu 24.04 / Postfix / Dovecot / Roundcube / SpamAssassin による受信専用メールサーバー
1. 要件 # 機能要件 # 項目 内容 メールドメイン blackratel.com 受信 外部メールサーバーから SMTP port 25 で受信 メール閲覧 IMAP port 143(localhost のみ)/ Roundcube WebUI スパムフィルタ SpamAssassin(content_filter 方式) 送信 対象外(受信専用) 認証 Dovecot 認証(IMAP・Roundcube ログイン) メールボックス形式 Maildir ユーザー管理 バーチャルユーザー(OS ユーザーと分離) 非機能要件 # 項目 内容 OS Ubuntu 24.04 LTS TLS 証明書 Postfix(port 25 STARTTLS)と Apache(HTTPS)のみ使用。Dovecot は localhost のみのため SSL 不要 パスワード保存 ARGON2ID ハッシュ ホスティング OCI Free Tier(アウトバウンド port 25 はブロックのため送信不可) スコープ外 # メール送信(OCI Free Tier のためアウトバウンド port 25 が利用不可) SPF / DKIM / DMARC 設定(送信しないため不要) 2. 環境・構成情報 # ミドルウェア # ソフトウェア 役割 Postfix MTA(外部からの受信) Dovecot MDA + MRA(メール保存・IMAP 提供) SpamAssassin スパムフィルタ(content_filter 方式) Roundcube WebUI(ブラウザでのメール閲覧) Apache2 Roundcube のリバースプロキシ ポート構成 # ポート プロトコル 用途 接続元 25 SMTP 外部メールサーバーからの受信 外部(OCI Security List + UFW で開放) 143 IMAP Roundcube → Dovecot(メール取得) localhost のみ 443 HTTPS Roundcube WebUI 外部 port 110 / 465 / 587 / 993 / 995 は無効化。
·19 words·1 min
スロット要素を組み合わせたブロック崩しゲーム(slot brick breaker)を作りました。 リラックスモードだと、アイテムがたくさん落ちるので爽快でサクサク遊べます。 物足りない人は、ハードモードを挑戦してください。
ブロックを崩しながら、アイテムやスロットでパワーアップしよう——シンプルだけど何度でも遊びたくなる一本です。
遊び方 # 画面下のパドルを左右に動かしてボールを跳ね返す すべてのブロックを崩せばステージクリア 特徴 # スロットでパワーアップ ボールが通過するとスロットを回せます。マルチボール・貫通弾・巨大ボールなど、運次第で強力な効果が手に入ります。
シンプルな操作 パドルをスライドするだけ。直感的に遊べます。
Google Play からダウンロード
·21 words·1 min
宝石のソートパズルゲーム(gem sort puzzle)を作りました。よかったら遊んでみてください。
バラバラになった宝石を、同じ色ごとに水晶ボックスへ——じっくり考えながら解いていくパズルです。
ステージとステージの間に広告が入らないので、集中して遊び続けられます。
遊び方 # 水晶ボックスをタップして一番上の宝石を選び、移動先の試験管をタップ 同じ色の上か、空の水晶ボックスにしか置けない すべての水晶ボックスを同じ色にすればステージクリア! 特徴 # シンプルな操作 タップで動かすだけ。すぐに始められます。
自然に上がる難易度 ステージが進むにつれて水晶ボックスの数や宝石の格納数が増えていきます。急に難しくなるのではなく、じわじわと難しくなります。
カスタマイズ クリア時のエフェクトを変更できます。遊びながらポイントを貯めて、自分好みに整えてください。
Google Play からダウンロード
·16 words·1 min
麻雀の点数計算アプリを作りました。よかったら使ってみてください。
「この手、何点?」——対局中にそんな疑問が浮かんだ時、すぐに答えが出るアプリがほしくて作りました。役・点数を表示してくれるのはもちろん、ずんだもんが音声で読み上げてくれるのが一番の特徴です。
使い方 # 鳴きがある場合はまず、暗カン・明カン・ポン・チーの数を入力します。続いて牌画像をタップして手牌を入力。
親・子、自風・場風、リーチ・一発の有無を選択します。
ツモ・海底などのあがり方と、ドラ(ドラ・裏ドラ・赤ドラすべての合計)の枚数を設定。最後にあがり牌を選択します。
すると、成立した役と点数が一覧で表示されます。そして——ずんだもんが役名と得点を読み上げてくれます。対局中、画面を見ずに耳で確認できるのは地味に便利です。
符計算の詳細内訳(底符・面子符・雀頭符・待ち符など)も表示できるので、「なぜこの点数になるのか」を確認しながら覚えることもできます。
音声はON/OFFを切り替えられます。喰いタンのあり・なし設定にも対応しています。
無料で使えます。気が向いたらぜひ。
Google Play からダウンロード
音声合成: VOICEVOX:ずんだもん
·20 words·1 min
宝石カードを使った占いアプリを作りました。よかったら使ってみてください。
朝のちょっとした時間に、大切な決断の前に、恋のことで迷った時に——そんな場面で、そっと背中を押してくれるアプリを目指しました。
できること # 3種類の占いが使えます。
朝の1分占い 朝、今日の指針をカードに聞いてみる。それだけでなんとなく気持ちが整う気がします。
恋愛診断 恋のことで迷った時に。答えを出すというより、自分の気持ちを整理するヒントになればと思っています。
3枚カードリーディング 過去・現在・未来の流れを3枚のカードで読みます。少し込み入ったことを考えたい時に。
カードの選び方 # 指で画面上に円を描くようになぞると、自然と1枚が選ばれます。論理的に選ぶのではなく、その瞬間の直感に任せる仕組みです。
34種類の宝石カードがあり、それぞれに固有のメッセージがあります。
シンプルに使えることを意識して作ったので、完全無料・課金なしです。
気が向いたら使ってみてください。
Google Play からダウンロード
·193 words·1 min
はじめに # ブログを始めるにあたって、まず悩んだのがプラットフォームの選定だ。
WordPress をはじめとする CMS は機能が豊富な反面、DB・PHP・プラグイン管理など 運用コストが高い。今回は「書くことに集中できる、軽量で安全な構成」を目指した。
その結果として選んだのが Hugo だ。
なぜ Hugo を選んだのか # 1. セキュリティ # Hugo は静的サイトジェネレーター(SSG)であり、ビルド時にすべてのページを HTML ファイルとして生成する。つまり:
SQL インジェクション不可 php等の言語の脆弱性と無縁 さらに Hugo は 単一の Go バイナリとして配布されており、 npm のようなサプライチェーンリスクもない。 依存パッケージがゼロというのは、セキュリティ観点では大きな強みだ。