OCI(Oracle Cloud Infrastructure)で、ボートレースの分析サーバーを0円で動かしている話
AIの使い方の記事で、分析用サーバーは0円と書きました。この記事では、そのサーバーが、どんな構成で、何をしていて、なぜ0円で済むのかを、中身まで書きます。
結論:無料枠で、一人の分析基盤は動かせる
結論から言うと、ボートレースの分析基盤は、無料のクラウドで動かせます。 ただし、ディスク容量は逼迫してきていて、課題も残っています(後述)。
使っているのは、Oracle Cloud Infrastructure(OCI)の「Always Free」という、期限のない無料枠です。OCIとは、Oracle社が提供しているクラウドサービスのことです。2005年からのレース結果を貯めて、毎日更新して、バックアップまで取っています。それでも、請求はゼロです。
なぜOCIを選んだのか
理由は2つあります。
1. Always Freeが圧倒的だったから。
AWSやGoogle Cloudにも無料枠はありますが、期間が限られていたり、使える性能が小さかったりします。OCIの無料枠は、サーバーの性能(CPU・メモリ)、ディスク容量、オブジェクトストレージの、どれも大きく、しかも期間の制限がありません。データを大量に貯める分析には、この「ディスクの大きさ」が決め手でした。
2. もともと、Oracle製品を触ってきたエンジニアだから。
私は、本業でOracle製品を触ってきたエンジニアです。OCIも、オンプレミスからクラウドへ移行するプロジェクトに参画して、実際に触ってきました。
Oracleのサービスは、仕組みも画面も、すでに慣れ親しんだものです。構築で迷う時間が少なくて済みました。
今の構成

サーバーの中身、外とのつながり、バックアップ先を、1枚にまとめました。
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04 LTS |
| CPU | Arm 2コア |
| メモリ | 12GB |
| ディスク | 約200GB(起動用50GB+追加150GB) |
| データベース | PostgreSQL 17(Dockerのコンテナ) |
| 言語 | Python 3.12 |
| バックアップ先 | オブジェクトストレージ(各層で約10GB) |
データベースは、無料枠のAutonomous Database(Oracleのマネージド型データベース)も使えます。ただ、無料枠では20GBまでしか使えないため、PostgreSQLにしています。
OSからデータベースまで、すべて無料のオープンソースです。つまり、サーバー代も、ソフトの代金も、0円です。
※無料枠の内容は、変更されることがあります。始める前に、公式の最新情報を確認してください。
動いているもの:Dockerで収集・Web・DBを分ける
全体像は、次のとおりです(図は、実際の構成を簡略化したものです)。
- Collectorコンテナ:公式データを取りに行くPythonのプログラムと、毎日の定期ジョブが入っています。
- Webコンテナ:サイト本体(Flask)が入っています。
- DBコンテナ:PostgreSQL 17 が入っています。
データベースをコンテナにしておくと、バージョンを上げたり、作り直したりが楽になります。公式データの取り込みは、毎日自動で動きます。「未取り込みの日を自動で探して取りに行く」作りにしてあるので、数日止まっても、次の実行で追いつきます。
取り込み元:公式が配信しているTXT
データの取り込み元は、ボートレース公式が日別に配信している、2種類のテキストファイルです。
| ファイル | 中身 |
|---|---|
| 番組表(Bファイル) | これから行われるレースの出走表。選手の登録番号・名前・年齢・支部・級別、全国と当地の勝率・2連率、モーターとボートの番号・2連率、今節の成績など |
| 競走成績(Kファイル) | 終わったレースの結果。着順・艇番・選手・モーター・ボート・展示タイム・進入コース・スタートタイミング・レースタイム、天候・風・波、単勝から3連単までの払戻金 |
どちらも、1日分が1ファイルで、LZH(古い圧縮形式)で配られています。文字コードは Shift_JIS 系で、中身は区切り文字のない固定長のテキストです。人間が読む前提の、見やすい帳票の形をしています。
公式のデータは、次のURLから取得しています。
https://www.boatrace.jp/owpc/pc/extra/data/download.html
取得は、1日1回、1ファイルずつにとどめています。公式のサーバーに負荷をかけないことが、第一です。データの利用条件は、公式の案内を確認してください。
最初の関門:サーバーの確保
構築で、一番手間取ったのが、サーバーの確保でした。無料枠のサーバーは人気があり、作ろうとしても、すぐには作れないことがあります。私も、なかなか取れませんでした。
解決したのは、PAYG(従量課金)アカウントにアップグレードすることです。切り替えたら、一瞬で取れました。
PAYGにしても、無料枠の範囲で使っている限り、請求はゼロのままです。ただし、課金されるリソースを作ってしまうと、料金が発生します。無料のものだけを使っているか、確認しておくのが大事です。
運用で踏んだ地雷
作ってからが、本番でした。
ディスクがいっぱいになって、止まる。 データは、毎日増えます。気づかないうちに容量が埋まって、全部止まったことがあります。
バックアップに失敗していた。 バックアップの置き場も、無料枠の容量には上限があります。そこがいっぱいになって、バックアップが失敗していたのに、気づくのが遅れたことがあります。
「取り込み済み」と誤判定していた。 取り込み済みかどうかを、その日の「レース数」だけで判断していました。そのため、行だけが先に入って、詳細な列が空のままの日が、2か月以上見過ごされていました。空のデータで検証すれば、結果は全部ウソになります。今は、レース数だけでなく、詳細な列がどれだけ埋まっているかも見て、足りない日は取り込み直すようにしています。
今は、毎日自動でバックアップを取り、古いものは自動で整理し、失敗したらすぐ気づけるようにしています。バックアップは、取れているかを確認して、はじめて意味があります。
今後の課題:ディスク容量
いま一番の課題は、ディスク容量です。データ用に追加したディスク(約150GB)は、すでに約7割が埋まっています。データは毎日増えるので、このままだと、いずれ足りなくなります。
容量を足せば解決しますが、有料になります。どうにか無課金のまま使い続けられないか、模索中です。古いデータの持ち方を見直す、使っていない項目を整理する、などを考えています。
まとめ
ボートレースの分析基盤は、無料のクラウドで動かせます。ただし、無料枠には上限があります。 有料なら、足りなくなったら容量を足せば済みますが、無料枠はそうはいきません。上限を超える前に気づく仕組みが、必要になります。
そして、公式のデータは、人間向けに作られています。機械で読むときの癖は、実際に取り込んで、壊れてみないと分かりません。
サーバー代は、今日も0円です。
