コメントID:1236の詳細[中田さんの投稿]

サーバ契約後の作業

サーバ契約後の作業は、以下になります。

A. サーバー初期設定

Ubuntu の初期状態はタイムゾーンがUTCで、日本語ロケールも入っていません。
この2つを直さないと、cronの実行時刻が9時間ずれ、ASP管理画面から取得した日本語が文字化けします。
取得スクリプトは「前日」を自分で計算しているため、OSの時刻がずれると取得対象日そのものが狂います。

タイムゾーンをJSTへ変更(timedatectl set-timezone Asia/Tokyo)
日本語ロケールの生成(ja_JP.UTF-8)とcron用の環境変数準備
日本語フォントの導入(fonts-noto-cjk)。Chromeが日本語を描画できないとDOM取得やデバッグ用スクショが読めなくなる
作業用一般ユーザーの作成とsudo付与。cronはこのユーザーで動かす(root不要)
パッケージ全体の更新
swapの確認。2GBプランなら通常は不要だが、Chrome多重起動時の保険として1〜2GB確保しておく
不要サービスの停止。今回のサーバーはWebを公開しないので、Apache/nginxは入れない

B. SSH の安全化

Ubuntu 24.04 特有のハマりどころが1つあります。
22.10以降のUbuntuはSSHがsystemdのsocket activationで起動するため、/etc/ssh/sshd_config の Port を変えるだけではポートが変わりません。ssh.socket 側の ListenStream も変更する必要があります。

手元でed25519鍵を作成し、公開鍵をサーバーへ登録
sshd_config でポート変更、PermitRootLogin no、PasswordAuthentication no
systemctl edit ssh.socket で ListenStream を新ポートへ上書き(これを忘れるとポートが22のまま)
変更適用前に別のターミナルで新ポートの接続確認をしてから既存セッションを閉じる(締め出し防止)
ufwで新SSHポートのみ許可
fail2banの導入
手元の ~/.ssh/config にホスト定義を追加
sudo systemctl edit ssh.socket

C. 実行環境のインストール

現行はChrome 86とSelenium 3.141で5年前のまま凍結されています。
新環境ではChromeが最新になるため、ドライバの取得方法そのものが変わります。
Selenium 4.6以降は同梱のSelenium Managerが対応ドライバを自動で解決するので、現行のように chromedriver-binary でバージョンを固定する必要がなくなります。

Python 3.12(Ubuntu 24.04 標準)と python3-venv の確認
プロジェクト用のvenvを作成。システムのPythonを直接汚さない
Google Chrome を公式aptリポジトリから導入。以降 apt upgrade で自動追従する
curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg
依存パッケージの導入: selenium(4系)、pandas(2系)、requests。chromedriver-binary は入れない
Xvfbは入れない。現行も実際には未インストールで、ヘッドレスで動いていた
google-chrome --version と、Selenium から起動してページを取得できるところまで最小サンプルで確認

D. 設置パスの決定(先に決めるべき判断ポイント)

現行コードには /var/www/html/... が50箇所以上ハードコードされています。ここをどう扱うかで以降の作業量が変わるので、Eに入る前に決めます。

A案: 同じ /var/www/html/asp_data_get/ /var/www/html/asp_referrer/ を使う
パス関連の改修が不要になり、移行作業が最短で終わる
ただしWebサーバーを置かないのに /var/www を使う不自然さが残り、次に移設するとき同じ問題を繰り返す

B案: /opt/asp/ 配下へ移し、パスを環境変数化する(推奨)
.env_asp にインストールディレクトリとダウンロード先を持たせ、コードから絶対パスを消す
50箇所の置換が必要だが、これは今回のSelenium 4対応で全ファイルを触るついでに済む
次回以降のサーバー移設がパス無改修で済むようになる

推奨はB案です。 どのみち全32本を触る改修なので、ここで一緒に片付けるのが合理的です。

E. asp_data_get の設定(発生額の取得 / 17本)

現在は毎朝7:44・8:44・9:44の3回動き、前日の発生件数と報酬をplus-creative.xyzへPOSTします。
ASP 8社・16アカウントぶんのログイン情報を扱うため、設定ファイルの権限管理が最重要です。

リポジトリを配置(PLUS-Company/asp_data_get、Selenium 4対応ブランチ)
.env_asp を現行サーバーから移送し、chmod 600 で配置。中身はASP各社のID/PW(16アカウント分)、受け先APIのURLとキー、メールAPIのシークレット、Basic認証、通知先アドレスの計38項目
ダウンロード用ディレクトリ(Downloads)の作成と書き込み権限確認
asp_data_get.sh の修正
冒頭の cd /var/www/html/asp_data_get/ を新パスへ
16箇所ある /usr/bin/python3 をvenvのPythonへ
export DISPLAY=:0 は不要になるので削除
16本の取得スクリプトを1本ずつ手動実行して確認
Selenium組(A8×5、Felmat、AccessTrade、afi-B、JANet×5、TG-Affiliate、Lacoco)はログイン動線が各社で違うため、まとめて流さず個別に見る
SLVRBULLETのみSeleniumではなくJSON APIなので、Chrome更新の影響を受けない
send_mail.py の通知が届くか確認
受け先(plus-creative.xyz / asp_data)の画面で前日データが入っていることを確認

F. asp_referrer の設定(リファラーの取得 / 15本)

毎日6:00に動き、CVがどの記事経由で発生したかをdata-organizing.comへ送ります。
asp_data_get とは作りが違い、こちらのほうが移設に強い構造になっているので、対応内容も変わります。

リポジトリを配置(PLUS-Company/asp_referrer)
.env_asp を600で配置。こちらにはSlack Webhook URLが含まれるため、発生額側とは中身が異なる
シェル(data-organizing_asp_referrer_get.sh)の確認
.env_asp はスクリプトと同階層から相対で読むため、この部分は無改修で動く
ただしPythonを python3 とPATH経由で呼んでいるため、cronのPATHにvenvを通すか、シェル側を書き換える必要がある
各スクリプトを最大3回リトライし、成否をSlackへ通知する構造はそのまま活かす
CSVダウンロード先の /var/www/html/referrer_get/ が23箇所にハードコードされているため、D案で決めたパスへ置換
15本を1本ずつ手動実行して確認
全件終了後に呼ばれる api_unsettled.php(未確定の再集計)が叩けることを確認
受け先(data-organizing.com)でCV行が入っていることを確認

G. cron の設定

cronは対話シェルと違い環境変数をほとんど引き継ぎません。
現行のcrontabにある環境変数のうち、新環境で必要なものと不要になるものを仕分ける必要があります。

crontabに設定する環境変数
MAILTO(エラー検知の生命線)
PYTHONIOENCODING=utf-8
LANG=ja_JP.UTF-8
PATH(venvを通す。referrer側のシェルがPATH依存のため必須)
DISPLAY と XAUTHORITY は削除する。 Xvfbを使っておらず、新ヘッドレスでは不要
毎日02:00の reboot は引き継がない。 現行機は稼働134日で、このcronは少なくとも直近134日実行されていません。メモリを2GBにする以上、reboot前提の運用を持ち込む理由がありません
並行稼働のあいだは実行時刻を現行とずらす(例: 発生額10:44、リファラー7:00)。同じASPアカウントへ同時刻に2台からログインすると、同時ログイン制限で片方が弾かれます
初回の自動実行に立ち会い、cron経由でも手動実行と同じ結果になることを確認

H. 検証と並行稼働

「スクリプトが動いた」ことと「正しいデータが入った」ことは別です。
受け先には重複判定があるため二重登録にはなりませんが、後から実行した側で上書きされるので、新サーバーの結果が正しいことを毎日見る必要があります。

1〜2週間、新旧を並行させて登録結果を突き合わせる
突合の観点
発生額: ASP別・アカウント別の件数と報酬額が一致するか
リファラー: CV件数と参照元URLが取れているか
報酬が空欄になっているレコードがないか
手動での再実行時は対象日が常に前日固定である点に注意する。過去日を埋めたい場合は現状スクリプトに日付引数がないため、Pythonを直接触る必要がある
連続7日以上一致したら切替判断


2026-08-18 08:16:46