ミニPCでつくる自宅サーバー
2025-05-20
パソコンのようす
概要
ミニ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を利用することで、ルーターのポート開放なしに外部公開を実現。
セットアップ手順
- 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
- トンネルの作成と認証
cloudflared tunnel login
cloudflared tunnel create net-revproxy
実行後に表示されるUUIDをメモする。
- 設定ファイルの作成
/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
- DNSルーティングとサービス化
cloudflared tunnel route dns net-revproxy example.com
cloudflared service install
systemctl start cloudflared
LXC102: net-vpn
役割: VPNサーバー
技術: Tailscale
外部から自宅ネットワークへ安全にアクセスするためのVPN環境を構築。Tailscaleを使用することで、複雑な設定なしにWireGuardベースのセキュアなネットワークを実現。
セットアップ手順
- Tailscaleのインストール
curl -fsSL https://tailscale.com/install.sh | sh
- 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
- Tailscaleの起動
tailscale up --advertise-routes=192.168.1.0/24 --advertise-exit-node
- 管理画面での設定
Tailscale管理画面から:
- サブネットルート(192.168.1.0/24)を承認
- Exit Nodeとして有効化
- DNSサーバーに
192.168.1.103(LXC103)を設定
LXC103: net-dns
役割: DNSサーバー・広告ブロック
技術: AdGuard Home
ネットワークレベルで広告やトラッカーをブロックし、ローカルDNSサーバーとしても機能する。
セットアップ手順
- AdGuard Homeのインストール
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
- 初期設定
ブラウザでhttp://192.168.1.103:3000にアクセスし、初期セットアップを実行。
LXC111: web-ggme
役割: Webサーバー
技術: Nginx
静的サイト(このWebサイト)をホスティング。ビルドはCI/CD(LXC122)で行い、このコンテナは配信のみに特化。
セットアップ手順
- Nginxのインストールと設定
apt update && apt upgrade -y
apt install -y nginx vim
mkdir -p /var/www/html
rm /etc/nginx/sites-enabled/default
- サイト設定ファイルの作成
/etc/nginx/sites-available/website.conf:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
}
- サイトの有効化
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コンテナで実行。
セットアップ手順
- 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
- 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
- コンテナの管理
更新やメンテナンス時:
docker stop discordbot
docker rm discordbot
# 新しいイメージをpullして再起動
LXC122: app-cicd
役割: CI/CDパイプライン
技術: GitHub Actions Self-hosted Runner
GitHub Actionsのセルフホストランナーを動かし、Webサイトのビルドとデプロイを自動化。
セットアップ手順
- 一般ユーザーの作成
セキュリティのため、root以外のユーザーでランナーを実行:
sudo adduser runner
usermod -aG sudo runner
apt update && apt upgrade -y
apt install -y git curl nodejs npm vim
- SSH鍵認証の設定
LXC122で鍵ペアを生成:
su runner
ssh-keygen -t ed25519 -C "github-actions-runner"
cat ~/.ssh/id_ed25519.pub
公開鍵をLXC111(web-ggme)の~/.ssh/authorized_keysに追加。
- セルフホストランナーのインストール
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
- 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を導入。グラフィカルな作業環境として利用。