0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ホームサーバー完全構築ガイド #2 インフラの構築

Last updated at Posted at 2024-12-06

ホームサーバー完全構築ガイド シリーズ記事:

ホームサーバー完全構築ガイド #0 計画とハードウェア選定
ホームサーバー完全構築ガイド #1 OS導入と基本設定
ホームサーバー完全構築ガイド #3 サービス群の選定
ホームサーバー完全構築ガイド #4 WordPressのデプロイ
ホームサーバー完全構築ガイド #5 情報収集システムの構築
ホームサーバー完全構築ガイド #6 クラウドストレージの構築
ホームサーバー完全構築ガイド #7 DevOpsプラットフォームの構築

はじめに

前回の記事では、ホームサーバーのOS導入や基本的な初期設定(ユーザー管理、SSH設定、ファイアウォール構築など)について解説した。今回は、インフラの中核となるサービス群を導入し、より実用的なホームサーバー基盤を完成させる。具体的には、DockerMySQLRedisNginxddclient(DDNS対応)、およびバックアップ戦略について詳述する。これらを組み合わせることで、サービスの柔軟なデプロイ、データの安全な保管、動的IPへの対応、セキュアなアクセス環境など、安定かつ拡張性の高いインフラを実現できる。

Docker

Dockerとは

Dockerはコンテナ仮想化技術の代表格であり、アプリケーションやその依存関係を一つのイメージとしてパッケージ化し、どの環境でも一貫して実行できる。これにより、ソフトウェアの配布やアップデートが容易になり、インフラ管理の負荷が大幅に低減する。ホームサーバーでは、Webアプリケーション、データベース、各種ツールをコンテナ化し、システム全体の安定性と保守性を高めることが可能である。

インストール手順

1.既存のDocker関連パッケージ削除

sudo apt remove docker docker-engine docker.io containerd runc

2.公式リポジトリの追加

Docker公式リポジトリを利用し、常に最新かつ安定したバージョンを入手する。

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.ユーザーをdockerグループに追加

sudo usermod -aG docker $USER

再ログイン後、docker run hello-worldで動作確認が可能。

運用上のポイント

  • 権限管理dockerグループは実質root権限に準ずるため、参加ユーザーを限定すること。
  • イメージ管理:不要なイメージやコンテナを定期的に削除し、ストレージを圧迫しないようにする。
  • アップデート戦略:Baseイメージやツールイメージは定期的にアップデートし、セキュリティパッチを取り込む。

MySQL

MySQLとは

MySQLは有名なオープンソースRDBMSで、多くのWebアプリケーションやシステムで使用されている。ホームサーバー上でも、ブログ、CMS、ファイル管理ツールなど、さまざまなサービスのデータストアとして役立つ。

インストールと初期設定

sudo apt update
sudo apt install -y mysql-server
sudo mysql_secure_installation

mysql_secure_installationはrootパスワード設定、匿名ユーザー削除、テストDB削除など、基本的なセキュリティ強化を行う。

ユーザー作成例

sudo mysql
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

パフォーマンス・チューニング

  • my.cnf調整/etc/mysql/mysql.conf.d/mysqld.cnfinnodb_buffer_pool_sizeなどを最適化し、メモリ資源を有効活用。
  • インデックス設計:頻繁に参照するカラムに適切なインデックスを張り、クエリ性能を向上。
  • バックアップ戦略との統合mysqldumpxtrabackupを利用し、定期的なデータバックアップを実施。

Redis

Redisとは

Redisはインメモリ型データストアで、キャッシュやセッション管理、キューイングなど高速アクセスが求められる場面に有用。ホームサーバーでは、Webアプリやマイクロサービス間のセッション共有、ジョブキュー管理、リアルタイム分析などに役立つ。

インストール

sudo apt update
sudo apt install -y redis-server

セキュリティ強化

/etc/redis/redis.conf内でrequirepass your_redis_passwordを設定し、パスワード保護を行う。外部からのアクセスを制限するためbind 127.0.0.1 ::1を維持すること。

運用上のポイント

  • 永続化(AOF、RDB):デフォルト設定ではRDBスナップショットが有効だが、AOF(Append Only File)を利用することでデータ永続性を高められる。
  • メモリ制限maxmemory設定でメモリ使用量を制限し、OOM(Out of Memory)エラーを防ぐ。
  • セキュリティ:ローカルアクセスのみ許可、またはSSHトンネル経由で利用する。

Nginx

Nginxとは

Nginxは軽量・高性能なHTTPサーバー、リバースプロキシ、ロードバランサとして利用される。コンテンツ配信効率、リバースプロキシ機能、SSL終端などが強力であり、ホームサーバーで複数サービスに一元的にアクセス可能なエンドポイントを提供する上で有用。

最新LTS版のインストール

公式リポジトリを使用する:

sudo apt update
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl -fsSL https://nginx.org/keys/nginx_signing.key | \
sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | \
sudo tee /etc/apt/sources.list.d/nginx.list

sudo apt update
sudo apt install -y nginx

基本設定

sudo systemctl enable nginx
sudo systemctl start nginx

ファイアウォールで80443ポートを許可:

sudo ufw allow 'Nginx Full'
sudo ufw reload

HTTPS対応 (Let's Encrypt)

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

これによりSSL/TLS証明書が自動取得・更新され、HTTPS接続が可能になる。

パフォーマンス・チューニング

  • gzip圧縮:テキストデータを圧縮して帯域を節約
  • HTTP/2有効化listen 443 ssl http2;でHTTP/2を有効にし、クライアントとの通信を高速化
  • キャッシュ戦略:静的ファイルに対してロングキャッシュヘッダを設定し、応答速度を向上

ddclient(DDNS対応)

ddclientとは

ddclientは、動的IPアドレス環境でDDNSプロバイダ(例:Cloudflare、DynDNSなど)に現在のグローバルIPを自動更新し、常に同じドメイン名でサーバーへアクセスできるようにするツール。

インストールと設定例

sudo apt update
sudo apt install ddclient

/etc/ddclient.confを編集:

daemon=300
syslog=yes
pid=/var/run/ddclient.pid
ssl=yes
use=web, web=dynamicdns.park-your-domain.com/getip

protocol=cloudflare
zone=yourdomain.com
login=your_email@example.com
password=your_api_token
subdomain.yourdomain.com

サービス有効化:

sudo systemctl enable ddclient
sudo systemctl start ddclient

運用上のポイント

  • 更新頻度daemon値を適切に設定し、無用な過剰更新を避ける。
  • ログ監視/var/log/syslogでddclientの動作を確認し、問題発生時に早期検知。

バックアップ

バックアップの重要性

ハードウェア障害、人為的ミス、マルウェア攻撃など、データ消失のリスクは常に存在する。定期的なバックアップは、サービス継続性を確保し、復旧時間を短縮するために不可欠である。

rsyncによるバックアップ例

rsync -av --delete /source/directory/ /backup/directory/

これにより、差分同期を行い、ソースとバックアップ先を正確に反映させる。

リモートバックアップ

SSH鍵認証を用い、外部ストレージや別サーバーへ安全にバックアップを転送:

rsync -av -e "ssh -i /path/to/private_key" /source/directory/ user@remote_server:/backup/directory/

自動化 (cron)

crontab -eで定期実行を設定:

0 3 * * * rsync -av --delete /source/directory/ /backup/directory/

毎日午前3時にバックアップが実行される。

バックアップ戦略の強化

  • インクリメンタルバックアップ:BorgBackupやResticなどを利用し、効率的な増分バックアップを実施。
  • バージョン管理:過去世代のバックアップを保持し、誤操作やランサムウェア対策に役立てる。
  • オフサイト保管:物理的にも異なる場所にバックアップを保管し、自然災害などローカル環境への依存を減らす。

おわりに

本記事では、ホームサーバー環境を構築する上で基盤的な役割を果たすサービス群(Docker、MySQL、Redis、Nginx、ddclient、バックアップ運用)を詳細に解説した。これらを組み合わせることで、セキュリティ、パフォーマンス、スケーラビリティに優れたホームサーバー基盤を確立できる。

次回の記事では、これらの基盤上に実際のサービス(WordPress、Nextcloud、Gogsなど)をデプロイし、実運用環境として活用する方法について解説する予定である。これらのツールと設定を、持続的なメンテナンスおよび定期的なセキュリティアップデートと併せて行うことで、長期的かつ安定したサーバー運用が可能となる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?