HomeLab / アプリ開発の取り組み

自宅サーバー(HomeLab)を基盤に、仮想化クラスタの運用セルフホスト環境の構築、さらに iOS / Web / 業務効率化システムの開発を進めてきました。


TL;DR

  • HomeLabを「検証→実運用」まで回せる基盤として育て、サービスを段階的に増やしてきました。
  • 自分や身近な人の困りごとを起点に、iOS / Web / 業務効率化を開発しています。

何を目指しているか

自宅サーバーはただ動かすだけではなく、安定して運用ができ、公開までできる使い続けられる基盤にすることを目標にしています。
その基盤の上で、個人開発や、業務効率化システムを、実際にテスト、運用しながら改善することで、作って終わりにせず、運用までできる開発力を身に着けたいと考えています。


1. HomeLabの全体像

1.1 目的

  • 日常利用・開発・検証に使用可能な 安定して運用可能な自宅サーバー基盤を構築する
  • 個人利用アプリに加え、業務効率化のシステムを開発及びデプロイできる仕組みを作る

1.2 動機

初めて自宅サーバーを構築したときは、Ubuntu Desktopを使用したサーバーだったのですが、サービスを増やすのが難しかったり、仮想化していないためにUbuntu自体が止まってしまうと、すべてのサービスが停止してしまう状況でした。
そのため、仮想化基盤を導入することで、サービスごとにVMやLXCを分離し、安定して運用可能な基盤を目標としました。
また、最初は1ノードで始めたのですが、仮想化基盤そのものが停止した際に監視し通知することができないため、2ノード体制にして、相互に監視し、可用性を高めることにしました。
DNSやVPNなどのシステムは各ノードに配置し、片方がメンテナンスなどで停止しても、サービスを継続できるようにしました。

また、自分や、周りの人が困っていることを解決するためにアプリの開発や、システムの開発を行いたいと考えています。
そのために、習慣化アプリや、音楽再生アプリ、業務効率化システムなどを開発しています。

1.3 主要技術

  • 仮想化: Proxmox VE(2ノードクラスタ)
  • コンテナ: Docker / LXC
  • ネットワーク/公開: Cloudflare(DNS/ドメイン管理, Tunnel, Pages), リバースプロキシ, VPN
  • 監視: Uptime Kuma(各ノードで相互監視)
  • メール: mailcow
  • NAS/ストレージ: OpenMediaVault(NAS)
  • 開発: Swift(iOS), Web(PWA), 業務効率システム(文書抽出・構造化)

2. インフラ(Proxmox:2ノードクラスタ)

2.1 基盤構成

  • Proxmox VE を用いて 2ノードでクラスタ構成
  • VM / LXC を用途別に分離し、サービスを段階的に追加

2.2 Proxmox上の VM / LXC(一覧)

  • DNSサーバー(基盤)

    • 目的: 名前解決
    • 備考: 各ノードに配置
  • リバースプロキシサーバー(基盤)

    • 目的: 公開/ルーティング
    • 備考: セルフホストサービスのSSL化用
  • VPNサーバー(基盤)

    • 目的: リモートアクセス
    • 備考: 外部からのアクセスに使用
  • Minecraftサーバー(運用)

    • 目的: マルチサーバー運用
    • 備考: 部活動メンバーが実利用
  • 死活監視(Uptime Kuma)(運用)

    • 目的: 監視/可用性確認
    • 備考: 各ノードに配置・相互監視
  • Windows(運用)

    • 目的: リモートアクセス用PC
  • Docker専用サーバー(基盤)

    • 目的: コンテナ運用の集約
    • 備考: Docker上で各種サービスを運用中
  • メールサーバー(mailcow)(基盤)

    • 目的: メール運用
    • 備考: セルフホストサービスからのメールや、個人用のメールに使用
  • NAS(OpenMediaVault)(基盤)

    • 目的: ストレージ/メディア

2.3 設計で意識したこと

  • 用途分離 : VM / LXCごとにサービスをわけることで、あとからサービスを増やす際に既存のシステムを壊すことなく追加できるようにしました。また、サービスの追加も簡単にできるようにしました。
  • 冗長性 : 監視サービスやDNS、VPNなどの重要なサービスは各ノードに配置し、片方が停止してもサービスを継続できるようにしました。
  • 公開経路の整理 : Cloudflareやリバースプロキシなどを使い分け、用途に応じて安全にアクセスできる形を目指しています。

実際に、片方のノードをメンテナンスのために停止しても、以前はすべてのサービスが1ノードに集まり、サービスが停止してしまう状況でしたが、現在は、重要なサービスは分散されて配置されているので、メンテナンス中も基本的なサービスを継続できるようになりました。

メールサーバーやMinecraftサーバーについては、自宅のポートを自由に開けることが難しいため(セキュリティ的にも自宅IPを晒すのは危険)、OCIにVPN接続し、OCIに来た通信をHAProxyを使用してMinecraftの通信や、SMTPの通信を自宅サーバーに流せるようにしました。ネットワーク上の制約がある中で工夫してサービスを構築するのは楽しいと感じました。


3. Docker上で運用しているサービス

3.1 開発・運用基盤

  • Gitea

    • 目的: Gitサーバー
  • CI/CDサーバー(Gitea用)

    • 目的: ビルド/デプロイの自動化
  • Dockge / Portainer

    • 目的: Docker管理(可視化・運用)
  • DNS同期サービス

    • 目的: DNS設定の同期/管理
  • Cloudflare Tunnel

    • 目的: サービス公開の経路

3.2 生活系

  • Upsnap(WOL)

    • 目的: Wake-on-LAN 操作
  • Vaultwarden

    • 目的: パスワードマネージャー
  • Wiki(自宅サーバー用)

    • 目的: 構成/運用手順/IPなどの整理
  • Dawarich

    • 目的: Google Mapタイムライン代替
  • FreshRSS

    • 目的: RSSサービス
  • Paperless

    • 目的: レシート等の電子化

3.3 デプロイ/検証

  • 習慣管理アプリ(自作)

    • 目的: 自作アプリの運用環境
  • 開発中サービスのテスト環境

    • 内容: FAX文書→受注書抽出→電子化(父親の会社導入予定)

4. NAS(OpenMediaVault)上のサービス

  • Jellyfin

    • 目的: 動画メディアサーバー
    • 備考: NAS保存の映像/アニメ等を視聴
  • Navidrome

    • 目的: 音楽メディアサーバー
  • Nextcloud

    • 目的: セルフホストクラウド
  • ArchiveBox

    • 目的: Webアーカイブ取得

5. DNS / ドメイン / 公開

  • Cloudflare で DNS とドメイン管理(jitaku.win)を実施
  • 無料ドメインとして MyDNS / DDNS Now を利用
  • OCI(Oracle Cloud)無料枠で外部公開も実施
    • Minecraftサーバー公開、メールサーバー用途など
  • Cloudflare Pagesで静的サイト(このサイト)を公開
  • Cloudflare Tunnelでサービスを公開

6. アプリ開発

6.1 iOS Swift

  • 習慣化アプリ
    • 日々の習慣を継続できるようにするためのアプリ
    • 自分の欲しい機能を実装し、現在も継続利用中
  • Samba上の音楽ファイルを再生するアプリ
    • Sambaサーバー内の音楽をiOSで再生可能にするアプリを開発中

6.2 Web

  • 習慣化アプリ(PWA)
    • Webで利用でき、PWAとしてインストールも可能
    • ただし ネイティブ比で遅さ/不便さがあり、Swiftネイティブへ移行

6.3 開発の動機

  • 習慣化アプリについては、自分が薬を飲むことを忘れてしまうことがあったため、忘れることがないようにする目的で開発を開始しました。シンプルな機能を求めていたので、自分で開発することにしました。最初はPWAアプリを開発していたのですが、ネイティブアプリに比べて動作が遅かったり、使い勝手が悪かったために、Swiftを使用したアプリを開発しました。
  • 音楽再生アプリについては、NASに保存してある音楽をiOSで再生したいために開発を開始した。既存のアプリでは、SMB上の音楽ファイルをうまく再生できなかったために、自分で開発を開始しました。

7. 業務効率化(開発中):FAX注文書の抽出・データ化システム

7.1 背景

  • 父親の会社では、注文書/請求書/請け書などが FAXで届く
  • その中から 注文書(受注書)を抽出し、業務で扱える形に電子化したい

7.2 目的と機能(要点)

  • FAXのPDFから 注文書(受注書)を判別・抽出
  • LLMで項目を構造化(データ化)
  • マスターデータと照会して整合性確認
  • DBへ記録し、管理画面で
    • 記録データの 修正
    • CSVとしてダウンロード
  • 市場の既存システムを調査し、現場で便利になる要件を取り込みながら改善

7.3 このシステムの価値

FAXは注文書だけでなく、請求書なども混ざるため、必要なものを人が見分けて転記する工程が発生します。
このシステムを使うことで、大量のFAXの中から注文書を判別し、必要な項目を構造化、そして、マスターデータと照会すること、手作業を徹底的排除することでFAXを人が読むから、最低限の確認にまでにし、業務を効率化できるようにしています。
また、既存の業務フローに組み込めるようにCSVデータでの出力などの機能も持っており、これからも機能を追加したり改善したりすることで、より便利に使えるシステムにしていく予定です。


8. まとめ

8.1 何が面白かったか

  • 運用が面白い : HomeLabを構築し、それを運用していくのが面白いです。どのようなサービスを追加すれば普段の生活が便利になるかを考えたり、トラブルを解決したりするのが楽しいと感じます。
  • 課題を解決するのが面白い : 自分の課題や、周りの人の課題や不便を、ソフトウェアなどを使用して解決するのが面白いです。課題を解決することができれば、自分も周りの人も嬉しいですし、達成感を感じます。

8.2 今後やりたいこと

  • HomeLabの拡張 : 更にサービスを追加したり、より安定して運用ができるようにHomeLabを整備していきたいです。また、積極的に新しい技術を学んでHomeLabに取り入れていきたいです。
  • アプリやシステムの改善 : 今開発している習慣化アプリや、音楽再生アプリ、業務効率化システムをより使いやすく、便利なものにしていきたいと考えています。新しい技術などをキャッチしてより便利で良いものにできるように改善していきたいです。

9. 参考資料

  • HomeLab構成図
    Architecture
  • Gitea(Gitサーバー)
    gitea
  • Proxmox ダッシュボード
    proxmox-dashboard
  • Proxmox クラスタ
    proxmox
  • Dockerサービス
    docker

検索を開始

キーワードを入力して記事を検索

↑↓
ESC
⌘K ショートカット