世界を動かす技術を、日本語で。

DigitalOceanからHetznerへの移行:ゼロダウンタイムで$1,432から$233へ

2026年4月18日原文(isayeter.com)

概要

  • DigitalOceanからHetzner専用サーバーへの 大規模本番移行 事例
  • MySQL 248GB/30DB、34サイト、GitLab EE、Neo4j、モバイルアプリの 無停止移行
  • インフラコストの高騰と 年間$14,388のコスト削減
  • CentOS7→AlmaLinux9.7 へのOSアップグレードも同時実施
  • 詳細な ゼロダウンタイム移行戦略 と各種トラブル対応

DigitalOceanからHetznerへの移行背景

  • トルコ国内のインフラコスト高騰、為替変動によるドル建て請求負担の増加
  • DigitalOceanで月額 $1,432 支払い、性能に対してコスト効率が悪化
  • Hetzner AX162-R( 256GB DDR5 RAM/1.92TB NVMe/48コアCPU)で 月額$233、年間 $14,388 のコストダウン
  • DigitalOcean製品自体の品質には満足、だが長期利用で 価格差を痛感

移行対象システム概要

  • 30個のMySQLデータベース (合計248GB)
  • 34のNginx仮想ホスト (複数ドメイン対応)
  • GitLab EE (バックアップ42GB)
  • Neo4j Graph DB (30GB)
  • Supervisorによる バッチワーカー管理
  • Gearmanジョブキュー
  • 数十万ユーザー対応のモバイルアプリ
  • 旧サーバー: CentOS 7 (EOL、セキュリティ更新なし)
  • 新サーバー: AlmaLinux 9.7 (RHEL9互換、CentOS後継)

ゼロダウンタイム移行戦略(6フェーズ)

  • Phase 1: 新サーバーに 全スタック構築 (Nginx, PHP, MySQL8, Neo4j, GitLab EE, Supervisor, Gearman)
    • SSL証明書は /etc/letsencrypt/をrsync でコピー、移行後 certbot renew --force-renewal で一括更新
  • Phase 2: Webファイル(/var/www/html, 65GB, 150万ファイル)をrsync で同期
    • 切替直前に 増分同期 を実施
  • Phase 3: MySQLマスター・スレーブレプリケーション
    • mydumperで 並列ダンプ、binlog位置を記録し リアルタイム同期
  • Phase 4: DNS TTL短縮 (A/AAAAレコードのみ3600→300秒、MX/TXTは変更せず)
    • 1時間待機でTTL反映、5分以内で切替可能に
  • Phase 5: 旧サーバーのNginxを リバースプロキシ化
    • Pythonスクリプトで 全34サイト設定をproxyへ自動変換
    • DNS伝播中も 旧IPアクセスは新サーバーへ転送、ユーザー影響ゼロ
  • Phase 6: DNS切替&旧サーバー停止準備
    • Pythonスクリプトで 全Aレコードを新IPへ一括切替
    • 旧サーバーは1週間 コールドスタンバイ 後に完全停止

MySQL移行詳細

  • mydumper/myloader による 高速並列ダンプ&リストア
    • 48コア活用で 従来mysqldumpの数日→数時間 に短縮
    • コマンド例:
      • mydumper --threads 32 --compress --trx-consistency-only --skip-definer --chunk-filesize 256 -v 3 --outputdir /root/mydumper_backup/
      • myloader --threads 32 --overwrite-tables --ignore-errors 1062 --skip-definer -v 3 --directory /root/mydumper_backup/
  • MySQL 5.7→8.0アップグレード
    • mysqlcheck --check-upgradeで 互換性確認
    • mysql.userテーブルのカラム不一致 問題発生(45列→51列)、sysスキーマもテーブル化でエラー
      • sysデータベース削除後、mysqld --upgrade=FORCEで解決
  • レプリケーションエラー(重複キー)
    • ダンプ2回実行間のデータ差分で発生、slave_exec_mode = 'IDEMPOTENT'で 重複エラー自動スキップ
  • SUPER権限問題
    • read_only=1でも SUPER権限ユーザーは書き込み可能、全アプリユーザーからSUPERをrevokeし正常化

切替前検証・DNS・プロキシ

  • /etc/hosts編集 でローカルから新サーバー動作を事前検証
  • DigitalOcean DNS API でTTL短縮、A/AAAAのみ変更
  • Nginxリバースプロキシ自動生成スクリプト で全サイト一括対応
    • proxy_ssl_verify offで 自己管理環境下のSSL検証省略

本番切替手順

  • 新サーバー: STOP SLAVE, SET GLOBAL read_only=0, RESET SLAVE ALL, supervisorctl start all
  • 旧サーバー: nginx設定テスト&リロード(プロキシ稼働)、supervisorctl stop all
  • ローカル: DNS切替スクリプト実行(10秒以内に全Aレコード更新)
  • 5分待機、旧サーバーのcrontabをコメントアウト
  • GitLabのwebhook IP修正 もAPIスクリプトで一括対応

結果とまとめ

  • 月額$1,432→$233年間$14,388節約
  • 全サービス無停止移行、サーバースペックも大幅向上
  • 移行自動化・スクリプト化・段階的検証による 業務リスク最小化
  • 大規模本番環境の コスト最適化・最新OS/DB化・無停止移行ノウハウ

Hackerたちの意見

MySQLの移行やバックアップにはPercona xtrabackupが最高だよ。ソースにほとんどパフォーマンスの影響を与えずにライブで動くし。これがすごくうまくいくから、新しいMySQLのバージョンにアップグレードする前には、いつも新しい対応バージョンが出るのを待ってるんだ。

数ヶ月前に、LinodeからHetznerにサーバーを2台移動させたんだけど、かなりのコスト削減になったよ。しかも、その2台にはいろんな言語で作られた数十のサイトが動いてて、古いライブラリやMySQL、Redisのインスタンスがあって、めちゃくちゃだったんだ。まあ、Claude Codeが全部移行してくれたんだけど、ライブラリがもう使えなくなった部分は書き直してくれたこともあった。今は複雑な移行もずっと簡単になったから、プロバイダー間の移動がかなり楽になると思うよ。

わお、Claudeの広告がHetznerの広告に埋め込まれてる。これ、どこまで深いんだ?

そうだね、すべてのものが再評価される時期が来てる。

すべてのクソみたいな話がAIについてである必要はない。

それをローカルモデルでできると想像してみて。すべての面でロックインを打破してるってことだよ。素晴らしいね。デジタルエリートのためのデジタルギロチンだ!

AWSからHetznerに移ったことで、年間約1200ドル節約できたよ。マジでおすすめ。AWSは詐欺みたいになってる。

サービスについて何か悪い点はある?

Hetzner Cloudか、彼らのVPSサービスのこと?

AWSはずっと詐欺だよ。Oracleよりもひどいし、法律的な契約すら使ってない。技術自体が問題なんだ。

それぞれにトレードオフがあるよね。AWSは確かに高いけど、Hetznerにはちょっとしたクセがある。最近、いくつかのVMがオフラインになったんだけど、どうやら大容量ストレージプールのアップグレード中にディスクが壊れたみたいで、2つの大きなプールで突然故障したんだ。それを解決するのに3日かかったよ。Hetznerにはボリュームのバックアップを取る統合オプションがなくて、自分でやらなきゃいけない:/ それに、冗長性のためにストレージノードのボリューム配分をコントロールすることもできない。

詐欺?払った分の価値はだいたい得られるよね。確かに、AWSで1つのラムダを運用するのに月6ポンドかかってたし(多分月500リクエストくらい)。すごく良かったし「ちゃんとしてた」けど、めっちゃ高いよね。今はCloudflareで無料でホスティングしてるし、似たようなものを5つ運用してる。でもAWSが提供するものが必要なら、それを得られるってこと。だから、時にはコストパフォーマンスが良くないこともあるよね。

Hacker Newsで議論の続きを見る