ミニPCでつくる自宅サーバー

ミニPCでつくる自宅サーバー

2025-05-20

ミニPCでつくる自宅サーバー

パソコンのようす

概要

ミニPC(GMKtec NucBox G3 Plus)にProxmox VEを導入し、その上に複数のLXCコンテナと仮想マシンを構築することで、自宅内に小規模な仮想化基盤を作っている。

ハードウェア構成

GMKtec NucBox G3 Plus

  • CPU: Intel N150
  • RAM: 16GB
  • ストレージ: 512GB
  • 追加スロット: M.2 SATA ×1

購入価格は約2万円程度で、小規模な自宅サーバー運用には十分なスペックであろう。

Proxmox VEの導入

ハイパーバイザとしてProxmox VEを採用。Proxmoxは無料で利用でき、ハードウェア上に直接インストールするType-1ハイパーバイザとして、複数の独立したコンテナや仮想マシンを効率的に管理できる。

インストール設定

FQDN:       pvehome.internal
IPアドレス: 192.168.1.10/24
Gateway:    192.168.1.1
DNS:        192.168.1.1

インストール後、https://192.168.1.10:8006/ からWebインターフェースにアクセス可能。

インストール手順は以下の記事を参考にした:

システム設計

管理の容易さを保つため、コンテナとVMを用途別にグループ化し、以下の命名規則を定めた。

LXCコンテナの命名規則

  • 10X番台: ネットワーク基盤(net) - 例: 101, 102, 103
  • 11X番台: Webサービス(web) - 例: 111, 112
  • 12X番台: アプリケーション(app) - 例: 121, 122

命名形式: [グループ]-[機能](例: net-dns, web-ggme

仮想マシンの命名規則

  • 20X番台: インフラストラクチャ(infra)
  • 21X番台: デスクトップ環境(desktop)

命名形式: [グループ]-[機能](例: desktop-arch

構築したコンテナ

LXC101: net-revproxy

役割: リバースプロキシ
技術: Cloudflare Tunnel(cloudflared)

外部からのHTTPSリクエストを内部のWebサービスへ転送する。Cloudflare Tunnelを利用することで、ルーターのポート開放なしに外部公開を実現。

セットアップ手順

  1. cloudflaredのインストール
apt update && apt upgrade -y
apt install -y curl wget vim ca-certificates

# Cloudflare GPGキーの追加
mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | \
  tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# リポジトリの追加
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared noble main' | \
  tee /etc/apt/sources.list.d/cloudflared.list

# cloudflaredのインストール
apt update && apt install cloudflared
  1. トンネルの作成と認証
cloudflared tunnel login
cloudflared tunnel create net-revproxy

実行後に表示されるUUIDをメモする。

  1. 設定ファイルの作成

/etc/cloudflared/config.yml:

tunnel: <YOUR_TUNNEL_UUID>
credentials-file: /root/.cloudflared/<YOUR_TUNNEL_UUID>.json

ingress:
  - hostname: example.com
    service: http://192.168.1.111:80
  - service: http_status:404
  1. DNSルーティングとサービス化
cloudflared tunnel route dns net-revproxy example.com
cloudflared service install
systemctl start cloudflared

LXC102: net-vpn

役割: VPNサーバー
技術: Tailscale

外部から自宅ネットワークへ安全にアクセスするためのVPN環境を構築。Tailscaleを使用することで、複雑な設定なしにWireGuardベースのセキュアなネットワークを実現。

セットアップ手順

  1. Tailscaleのインストール
curl -fsSL https://tailscale.com/install.sh | sh
  1. IPフォワーディングの有効化

サブネットルーターとして機能させるため、IPフォワーディングを有効化:

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
  1. Tailscaleの起動
tailscale up --advertise-routes=192.168.1.0/24 --advertise-exit-node
  1. 管理画面での設定

Tailscale管理画面から:

  • サブネットルート(192.168.1.0/24)を承認
  • Exit Nodeとして有効化
  • DNSサーバーに192.168.1.103(LXC103)を設定

LXC103: net-dns

役割: DNSサーバー・広告ブロック
技術: AdGuard Home

ネットワークレベルで広告やトラッカーをブロックし、ローカルDNSサーバーとしても機能する。

セットアップ手順

  1. AdGuard Homeのインストール
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
  1. 初期設定

ブラウザでhttp://192.168.1.103:3000にアクセスし、初期セットアップを実行。

LXC111: web-ggme

役割: Webサーバー
技術: Nginx

静的サイト(このWebサイト)をホスティング。ビルドはCI/CD(LXC122)で行い、このコンテナは配信のみに特化。

セットアップ手順

  1. Nginxのインストールと設定
apt update && apt upgrade -y
apt install -y nginx vim

mkdir -p /var/www/html
rm /etc/nginx/sites-enabled/default
  1. サイト設定ファイルの作成

/etc/nginx/sites-available/website.conf:

server {
  listen 80;
  server_name example.com;

  root /var/www/html;
  index index.html;
}
  1. サイトの有効化
ln -s /etc/nginx/sites-available/website.conf /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

LXC121: app-discord

役割: Discord Botホスティング
技術: Docker

Discord Bot(Rinzechan)をDockerコンテナで実行。

セットアップ手順

  1. Dockerのインストール
apt update && apt upgrade -y
apt install ca-certificates curl wget vim -y

# Docker GPGキーの追加
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# Dockerリポジトリの追加
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. Botのデプロイ

プライベートなGHCR(GitHub Container Registry)からイメージを取得:

export CR_PAT=<YOUR_GITHUB_PAT>
echo $CR_PAT | docker login ghcr.io -u <USERNAME> --password-stdin

docker pull ghcr.io/<USERNAME>/<BOT_IMAGE>:latest

mkdir -p /etc/botconfig
nano /etc/botconfig/.env

docker run -d --restart always \
  --env-file /etc/botconfig/.env \
  --name discordbot \
  ghcr.io/<USERNAME>/<BOT_IMAGE>:latest
  1. コンテナの管理

更新やメンテナンス時:

docker stop discordbot
docker rm discordbot
# 新しいイメージをpullして再起動

LXC122: app-cicd

役割: CI/CDパイプライン
技術: GitHub Actions Self-hosted Runner

GitHub Actionsのセルフホストランナーを動かし、Webサイトのビルドとデプロイを自動化。

セットアップ手順

  1. 一般ユーザーの作成

セキュリティのため、root以外のユーザーでランナーを実行:

sudo adduser runner
usermod -aG sudo runner
apt update && apt upgrade -y
apt install -y git curl nodejs npm vim
  1. SSH鍵認証の設定

LXC122で鍵ペアを生成:

su runner
ssh-keygen -t ed25519 -C "github-actions-runner"
cat ~/.ssh/id_ed25519.pub

公開鍵をLXC111(web-ggme)の~/.ssh/authorized_keysに追加。

  1. セルフホストランナーのインストール

GitHubリポジトリの設定ページから最新のインストールコマンドを取得し実行:

su runner
cd /home/runner
mkdir actions-runner && cd actions-runner

# GitHub提供のスクリプトでインストール
curl -o actions-runner-linux-x64.tar.gz -L <DOWNLOAD_URL>
tar xzf ./actions-runner-linux-x64.tar.gz

./config.sh --url https://github.com/<USERNAME>/<REPO> --token <TOKEN>

# サービスとして登録
sudo ./svc.sh install
sudo ./svc.sh start
  1. GitHub Actionsワークフローの作成

.github/workflows/deploy.yml:

name: Deploy to Server

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: self-hosted
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
          
      - name: Install dependencies
        run: npm install
        
      - name: Build project
        run: npm run build

      - name: Deploy files
        run: |
          rsync -avz --delete ./dist/ [email protected]:/var/www/html/

仮想マシン

VM211: desktop-arch

デスクトップ環境としてArch Linuxを導入。詳細な構築手順は別途ドキュメント化予定。

VM212: desktop-ubuntu

Ubuntu Desktopを導入。グラフィカルな作業環境として利用。