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

<!-- START_SERIES -->

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

[ホームサーバー完全構築ガイド #0 計画とハードウェア選定](https://qiita.com/SolitudeRA/items/0a3f810efb315ba04fd2)
[ホームサーバー完全構築ガイド #1 OS導入と基本設定](https://qiita.com/SolitudeRA/items/aecc62f0bb4270367656)
[ホームサーバー完全構築ガイド #3 サービス群の選定](https://qiita.com/SolitudeRA/items/78ed880f4fa89d466c1f)
[ホームサーバー完全構築ガイド #4 WordPressのデプロイ](https://qiita.com/SolitudeRA/items/ce9e9dadf46e19143656)
[ホームサーバー完全構築ガイド #5 情報収集システムの構築](https://qiita.com/SolitudeRA/items/f41e730e87181076d707)
[ホームサーバー完全構築ガイド #6 クラウドストレージの構築](https://qiita.com/SolitudeRA/items/652c84442abfd818f743)
[ホームサーバー完全構築ガイド #7 DevOpsプラットフォームの構築](https://qiita.com/SolitudeRA/items/8580cffbb7de7148366a)
[ホームサーバー完全構築ガイド #8 スマートホームプラットフォームの構築](https://qiita.com/SolitudeRA/items/9626951e8d8558ef2616)

<!-- END_SERIES -->

# はじめに

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

# Docker

## Dockerとは

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

## インストール手順

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

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

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

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

```bash
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グループに追加**

```bash
sudo usermod -aG docker $USER
```

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

## 運用上のポイント

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

# MySQL

## MySQLとは

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

## インストールと初期設定

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

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

## ユーザー作成例

```bash
sudo mysql
```

```sql
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.cnf`で`innodb_buffer_pool_size`などを最適化し、メモリ資源を有効活用。
- **インデックス設計**：頻繁に参照するカラムに適切なインデックスを張り、クエリ性能を向上。
- **バックアップ戦略との統合**：`mysqldump`や`xtrabackup`を利用し、定期的なデータバックアップを実施。

---

# Redis

## Redisとは

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

## インストール

```bash
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版のインストール

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

```bash
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
```

## 基本設定

```bash
sudo systemctl enable nginx
sudo systemctl start nginx
```

ファイアウォールで`80`、`443`ポートを許可：

```bash
sudo ufw allow 'Nginx Full'
sudo ufw reload
```

## HTTPS対応 (Let's Encrypt)

```bash
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を自動更新し、常に同じドメイン名でサーバーへアクセスできるようにするツール。

## インストールと設定例

```bash
sudo apt update
sudo apt install ddclient
```

`/etc/ddclient.conf`を編集：

```plaintext
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
```

サービス有効化：

```bash
sudo systemctl enable ddclient
sudo systemctl start ddclient
```

## 運用上のポイント

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

---

# バックアップ

## バックアップの重要性

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

## rsyncによるバックアップ例

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

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

## リモートバックアップ

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

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

## 自動化 (cron)

`crontab -e`で定期実行を設定：

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

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

## バックアップ戦略の強化

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

---

# おわりに

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

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