Xサーバーでpuppeteerを動かせなかった

我が家は図書館を頻繁に利用するのですが、1つ不満なことがありました。

それは「誰がどの本を予約していて今どの本を借りているのか」を見るために、わざわざ各々のIDとPWでログインしていちいち確認しないといけない点です。

我が家は本を借りまくります。
なので「今何を借りているのか」「何を予約しているのか」を忘れがちになるのです。

 

そんなわけで「ログインしなくても指定のアドレスにアクセスすれば全員分の貸出一覧・予約一覧が見れるようにしたいなぁ」と思って、Node.js + puppeteerを使って利用している図書館の

  • 貸出一覧
  • 予約一覧

を自動で取得→それを元にHTMLファイルを作成→HTMLファイルをサーバーに自動でデプロイする・・・というプログラムを作りました。

それでデプロイしたのがコレです↓

https://library-osakashi.web.app/GitHubソース

 

作ったまでは良かったのですが、「作ったプログラムをどうやって定期実行させるか」は深く考えていなくて

今契約しているレンタルサーバー(Xサーバー:x10プラン)上で動かせるだろーと軽く考えていました。

 

ところがどっこい、実際にXサーバー上で動かしてみると以下のようなエラーが出て動きませんでした🤔

UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/home/○○○○/penpen-dev.com/public_html/library-list/node_modules/puppeteer/.local-chromium/linux-869685/chrome-linux/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory

要約すると

launchできなかったよ!

chromeを動かすときにlibatk-1.0.so.0ってファイルが見つからなかったよ!

って言われてるみたい。

 

このエラー名でググってみると、「Linuxとかの場合は追加でインストールしないといけないパッケージがあるかもだぜ」みたいなことが書かれていたので

lddというコマンドを使って「実行ファイルが利用する共有ライブラリ一覧」を見てみると、以下のようにnot foundと書かれたライブラリが不足しているとのこと。

$ ldd ./node_modules/puppeteer/.local-chromium/linux-869685/chrome-linux/chrome | grep "not"
libatk-1.0.so.0 => not found
libatk-bridge-2.0.so.0 => not found
libxkbcommon.so.0 => not found
libXcomposite.so.1 => not found
libgtk-3.so.0 => not found
libgdk-3.so.0 => not found
libatspi.so.0 => not found

なるほどな。じゃあこれらを追加すればいいのか。

と思ったのですが、追加するには管理者権限(su,sudo)が必要。だけどXサーバーには管理者権限がない。

え?詰んでね?😭😭😭

 

厳密にいうとXサーバーのように、管理者権限がないサーバーの場合は

  1. 開発環境(C,C++)を用意する
  2. 自分でソースコードをダウンロードしてきて、自分でビルドする
  3. 環境変数のLD_LIBRARY_PATHにパスを設定する
  4. 3.で設定したパスにビルドした共有ファイルを突っ込む

みたいにすれば共有ライブラリを手動で追加できるっぽいけど、難易度高くね・・・?何より面倒くさすぎね・・・?

不足しているライブラリが1つだけなら「頑張ってビルドしてみるか」とか思えたかもだけど、ライブラリごとにソースをダウンロードしてきてビルドしなきゃいけないとか面倒くさすぎて死ぬ・・・。

管理者権限さえあればパッケージ管理コマンドを叩くだけなのに・・・。

 

というわけで私はもう諦めました😑

その代わりに、自分のローカルのパソコンで以下のようなバッチファイルを作って

cd /C/Users/○○○○/dev/library-fetch/
node index.js
firebase deploy

それをタスクスケジューラー(Windowsなので)に登録して、30分ごとに実行するという風にしました。

タスクスケジューラーでnodejs

自分の場合、ほぼ1日中パソコンを起動しているし、まぁこれでも特に不都合はないだろうということで。

(デプロイにfirebaseを使っているのは「firebaseを使ってみたかった」というのと「無料の範囲内で使えるから」です。)

 

それにしても今までレンタルサーバーで不自由を感じたことはなかったけど、今回はじめて不自由を味わったぜ!😋

おわり

 

参考にしたページなど:

puppeteerをcentos7/8に入れて動かす時のポイント

CentOS7で実行ファイルの不足している依存関係を解消する(CentOS7でElectronが試せない話に関連して) – Qiita

main・puppeteer / puppeteerのpuppeteer / troubleshooting.md

C++の共有ライブラリの作成と利用 · ByzantinePosts

コメント

タイトルとURLをコピーしました