こんにちは、てつです!
今回は、新たにブログの構築をやっていこうと思います!
このブログはAWS上のサーバで運用しているのですが、せっかく自宅にサーバー環境を作ったのでこの環境で別のブログを立ち上げてみようと思います!
関連記事

-scaled.png)
#記事のポイント#
構築のロジック(処理の手順)
いきなり環境を作るのではなく、以下の4つのレイヤーで論理的に組み立てていきます。
| レイヤー | 目的 | 具体的な処理内容 |
| 物理層 (Storage) | ストレージ寿命と容量の確保 | OSは内蔵32GB、データは115GBのSDカードへ分離する。 |
| 基盤層 (Docker) | リソースの最適化 | 軽量なMariaDBを採用し、メモリ上限を設けてフリーズを防ぐ。 |
| 防御層 (Network) | 外部攻撃の無効化 | ポート開放を一切行わず、Tailscaleとufwで通信路を制限する。 |
| アプリ層 (WordPress) | 資産の生成 | 最適化された環境下で、ブログ記事の投稿・管理を可能にする。 |
上の表でいう物理層に関しては、以下の記事にて分離が完了しているので今回は基盤層~アプリ層までの構築を行っていきます。

ただ、今回はセキュリティ上の理由で外部からの通信はVNP経由でしか許可しないので、一般ユーザーからは見られない点をご了承ください。
しかし、後述するCloudflare Tunnelを利用すれば自宅のパブリックIPアドレスを公開することなく、安全にWEBサイトをインターネットに公開ができるので参考にしていただければと思います。
セットアップ手順
ストレージの準備と権限設定
まず、事前にマウントしてあるSDカード内にブログ専用のディレクトリを作成し、Dockerが読み書きできるように権限を調整します。
プロジェクト名は、そのブログサイトで書くことに関連する名前にしておくと良いと思います。
Bashにて下記コマンドを順次実行していきます。
# プロジェクト専用のディレクトリを作成します
mkdir -p /mnt/sdcard/<プロジェクト名>
# そのディレクトリに移動します
cd /mnt/sdcard/<プロジェクト名>
# DB用とブログファイル用のフォルダを個別に作成します
mkdir db html
# フォルダの所有権を現在のユーザーに変更し、Dockerがアクセス可能にします
sudo chown -R $USER:$USER /mnt/sdcard/<プロジェクト名>
ネットワークの要塞化 (ufw)
OSレベルでの不要なアクセスを遮断し、安全なトンネルだけを許可します。
Bashにて下記コマンドを順次実行していきます。
# すべての受信を拒否し、送信のみ許可する基本設定にします
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Tailscale(VPN)経由の通信はすべて信頼して許可します
sudo ufw allow in on tailscale0
# WordPressが使用する8000番ポートを許可します
sudo ufw allow 8000/tcp
# 設定を有効化します(SSH接続が切れないよう注意してください)
sudo ufw enable
Tailscale(VPN)については下記の記事で解説しているので、興味のある方は読んでいただけると嬉しいです。
-scaled.png)
Docker Composeファイルの配置
ここからはDocker Composeを用いて、メモリ制限を設けた「省エネ設計図」を作成します。
■ メモリ制限を設ける理由
なぜ、わざわざ面倒なメモリ制限を設定するのでしょうか? 結論からいうと「自宅サーバーという限られたリソースにおけるリスク管理」のためです。
通常、Dockerコンテナは物理メモリを上限なく消費しようとします。
もしデータベース(MariaDB)が重たい処理を始め、メモリを使い果たしてしまうと、土台となるOS(MX Linux)ごとフリーズし、サーバーは完全に沈黙します。 256Mや512Mという「制限(限界)」をあえて設けることは、不測の事態でもサーバー全体の稼働を守るための、いわば「システムの防波堤」です。
下記コマンドを実行し、ディレクトリにdocker-compose.ymlを作り、編集をします。
# プロジェクトのディレクトリにある「指示書」を編集します
code docker-compose.yml
次にコマンドを実行で開いたYAMLを編集します。
services:
db:
# 動作が非常に安定している軽量版データベースを使用します
image: mariadb:10.5
# パソコンが再起動しても、このコンテナは自動で立ち上がる設定です
restart: always
environment:
# データベース全体のマスターパスワードです
MYSQL_ROOT_PASSWORD: <強力なパスワード>
# ブログのデータを保存する「部屋」の名前を決めます
MYSQL_DATABASE: shortcut_db
# 管理用ではない、普段使いのユーザー名を登録します
MYSQL_USER: <ユーザー名>
# そのユーザーがログインするための合言葉です
MYSQL_PASSWORD: <パスワード>
deploy:
resources:
limits:
# データベースが暴走しても256MB以上はメモリを渡さない約束です
memory: 256M
volumes:
# 「本体のストレージ」ではなく「SDカード」にデータを保存させます
- /mnt/sdcard/tech-shortcut-lab/db:/var/lib/mysql
wordpress:
# 常に最新のセキュリティ修正が含まれたWordPress本体を呼び出します
image: wordpress:latest
restart: always
ports:
# パソコン側の8000番の窓口を、コンテナの80番(Web用)に直結します
- "8000:80"
environment:
# 上で作成した「db」というサービスと連携させます
WORDPRESS_DB_HOST: db:3306
# 連携に使うユーザー名は、DB側で決めたものと合わせます
WORDPRESS_DB_USER: <ユーザー名>
# 連携用のパスワードもDB側と揃える必要があります
WORDPRESS_DB_PASSWORD: <パスワード>
# どの「部屋(DB)」を使うかを明示的に教えます
WORDPRESS_DB_NAME: shortcut_db
deploy:
resources:
limits:
# ブログ本体には、少し余裕を持って512MBを割り当てます
memory: 512M
volumes:
# アップロードした画像などを、SDカードに永続的に保存します
- /mnt/sdcard/tech-shortcut-lab/html:/var/www/html
ここまできたら次の起動と検証に移りましょう。
コンテナの起動と検証
コマンドを実行した後、本当の意味で「構築が成功したか」を判断するには、コンテナ内部の「声」を聞く必要があります。
docker compose logs -f を実行すると、サーバーの中で今何が起きているかがリアルタイムで流れてきます。
ここで ready for connections(接続準備完了)という文字が見えれば、心臓が動き始めた証拠です。
# 設計図を元にバックグラウンドで起動を開始します
docker compose up -d
# 正常に起動したかログを確認します
docker compose logs -f
もし構築中に画面が真っ白になったり、エラーが出たりしたときは、以下のキーワードをログの中から探してみてください。
Access denied for user...: パスワードやユーザー名が、DB側とWordPress側で一致していないときに出る「合言葉ミス」です。Error establishing a database connection: ネットワークの設定や、データベース名(DB_NAME)の指定が間違っているときの「部屋の行き違い」です。no configuration file provided: 今いる場所にdocker-compose.ymlが存在しないときの「設計図忘れ」です。
エラーメッセージは、解決への「ショートカット」を教えてくれる親切な案内板です。
Cloudflare Tunnel等の導入について
現在の構成では、Tailscale(VPN)を繋いでいる「自分」しかブログを見ることができません。
これを世界に向けて安全に公開する鍵が Cloudflare Tunnel です。
通常の外部公開はルーターのポートを空ける必要がありますが、これは「玄関に鍵をかけずに看板を出す」ようなリスクを伴います。
Cloudflare Tunnelを使えば、自宅からCloudflareのネットワークへ内側から「トンネル」を掘ることで、自宅の住所(IPアドレス)を一切明かさずに、プロテクトされた状態でサイトを公開することが可能です。
まとめ
今回は、リソースの限られた自宅サーバー環境で、安全かつ安定してWordPressを運用するための構築手法を解説しました。今回のポイントを振り返ります。
- リソースの最適化: Docker Composeでメモリ制限(Limits)を設定し、DBの暴走によるOSフリーズを未然に防ぐ。
- ストレージの延命: 書き込みの多いデータ(DB・画像)を外付けSDカードへ逃がし、内蔵ストレージの寿命を守る。
- 強固なセキュリティ: ufwとTailscaleを組み合わせ、外部からのポート開放を一切行わない「見えないサーバー」を構築。
- ログの活用: エラーが発生した際はログを確認し、メッセージから解決のヒントを見つけ出す。
「自宅サーバーでブログを作る」というとハードルが高く感じるかもしれませんが、一つひとつのレイヤーを論理的に組み立てていけば、低スペックなPCでも立派なサーバーとして生まれ変わります。
現在は自分専用の環境ですが、今後はCloudflare Tunnelを活用して、安全に世界へ公開するステップにも挑戦していく予定です。そちらの構築も完了次第、また記事でシェアしますね!
皆さんも、眠っている古いPCや格安のChromebookを使って、自分だけの「技術実験場」を作ってみてはいかがでしょうか?
最後までお読みいただき、ありがとうございました!

コメント