Node 版
ご自身で管理するサーバー向け。一台の機械、常駐するサービス、その前に置くリバースプロキシ。
Node 22、C コンパイラ、ローカルディスク。数十人なら 1 コアで足ります。MySQL サーバーがあれば使えますし、なければ SQLite が何も要求しません。
同じ製品の二つの版。一方はサーバー上でサービスとして動き、もう一方は共用レンタルサーバーに置くだけです。データベースは必須ではなく、他社のサービスも要りません——ただし MySQL サーバーをお持ちなら、それも使えます。一時間を見てください。
欧州に置かれ、入れるものは何もありません。五人までは無料で、初日から製品はまるごとです。
無料の形は SaaS で終わりではありません。五人までなら、製品をご自分の場に据えても —— ご自分の綴り、ご自分の台帳、ご自分の控え —— 一文も要りません。形を決めるのは人数であって、instance がどこで動くかではありません。五人を超えると月ぎめが要ります。こちらで動かす場合も、ご自分の場で動かす場合も同じです。
決め手は機能ではなくサーバー環境です。二つの版にできることは、まったく同じです。
ご自身で管理するサーバー向け。一台の機械、常駐するサービス、その前に置くリバースプロキシ。
Node 22、C コンパイラ、ローカルディスク。数十人なら 1 コアで足ります。MySQL サーバーがあれば使えますし、なければ SQLite が何も要求しません。
共用レンタルサーバー向け。フォルダーを上げ、ファイルを埋め、定期実行を一つ登録するだけ。コマンドラインは不要です。
PHP 8.1 と SQLite 拡張。導入すべき依存はありません。Composer もパッケージ管理も不要です。データベースサーバーを選ぶなら PDO MySQL 拡張も。
二つの版はデータベースの構造もパスワードの形式も共通です。乗り換えは、データベースのファイル一つとフォルダー五つを写すだけ。変換作業はなく、誰もパスワードを変えずに済みます。
二つめの選択であり、変えるのが難しい唯一の選択です。版には依りません。どちらの版も両方のエンジンを受け入れ、四つの組み合わせが同じテストを通ります。
サーバーのディスク上のファイル一つ。導入するものも、管理するものも、見張るものもありません——インスタンスはフォルダーを写すだけで移せます。
これが既定であり、多くの場合の正解です。アプリケーションサーバーが一台、そして配備をまたいで残るローカルディスクがあれば。
データベースサーバー。同じ機械でも、網の別の場所でも。データは、貴社の情報システム部門がすでに保存し、複製し、監視している場所に住みます。
取る理由は三つ。同じデータベースに複数のアプリケーションサーバー、それを求める社内規定、あるいは揮発性のアプリケーションディスク——配備のたびに作り直されるコンテナ。
これが最も広く信じられていることで、そして誤りです。SQLite はプロセスの内側に、MySQL はソケットの向こうに住みます。当方で二千回の操作を測ったところ、SQLite は操作に応じて二・五倍から百五十倍速く、八つの書き手が同時に走っても比較に耐えます。MySQL は、データがどこに住み、誰が管理するかのために選ぶものであって、応答時間のためではありません。
案内役を開くのに足りるだけ。細かいところはすぐ後に、一段ずつ —— どの命令が何をして、なぜそうするのかとともに。
ご自分で見るサーバーで三つの命令。最後の一つが導入の合言葉をこしらえ、instance を立ち上げます。
git clone <votre-dépôt> toutadmin
cd toutadmin && npm ci --omit=dev
INSTALL_TOKEN=$(openssl rand -hex 16) \
NODE_ENV=production node src/server.js
命令行はいっさい要りません。置く一つの入れ物、写す一つの綴り、開く一つの書き込みの許し。
# 1. déposer le dossier (racine web → public/)
# 2. cp config.sample.php config.php
# 3. chmod 770 data/
# 4. ouvrir https://votre-domaine/install
instance は空のまま立ち上がり、自らの上に閉じます。据え付けが済むまではどの宛先も案内役に行き着き、済んだとたんに案内役は二度と現れません。
https://votre-domaine/install
最初の立ち上げからあなたが案内役を通るまでのあいだ、先に来た者が管理の口座をこしらえてしまいます。INSTALL_TOKEN はその隙間を閉じます。これがなければ案内役は開きません。
npm install ではなく npm ci を。ロックファイルの記述どおりに入ります。サーバーで版がずれると、誰にも理由の分からない障害になります。
git clone <votre-dépôt> /var/www/toutadmin
cd /var/www/toutadmin
npm ci --omit=dev
設定はすべて環境変数で、必須のものは一つもありません。ポートを開ける前に INSTALL_TOKEN を置いてください。初回起動からあなたが導入画面に入るまでの間は、先に来た者が管理者アカウントを作れてしまいます。
cp .env.example .env
# PORT, NODE_ENV=production, INSTALL_TOKEN…
手で起動すると、端末を閉じた時点で止まります。サービスなら自分で立ち上がり直し、書き込めるのは自分のデータフォルダーだけです。
sudo systemctl enable --now toutadmin
journalctl -u toutadmin -f
アプリの待ち受けポートをそのままインターネットに出さないでください。プロキシの後ろで、本体が自ら安全性のヘッダーを付けます。HSTS も含め、すでに暗号化された通信でだけ付けます。
sudo certbot --nginx -d intranet.exemple.fr
間違えるのはここです。フォルダー全体を公開してしまうと、データベースが誰にでも落とせるようになります。アカウントもパスワードの要約も金庫も、まとめて。
# déposer le dossier ; la racine web pointe sur public/, pas sur le dossier
設定を書くのはウィザードで、しかも最後に書きます。ファイルが無い限り、途中で止まったインストールは何も残していません。そこにインスタンス固有の鍵を置きます。署名を封じ、データベースの機密を暗号化する鍵です。ほかのものと一緒に控えを取ってください。
cp config.sample.php config.php
php -r "echo bin2hex(random_bytes(32));" # session_secret
SQLite はデータベースの隣にも書き込みます。書き込めるべきはフォルダーであって、ファイルだけではありません。製品の残りは読み取り専用のままで構いません。
chmod 770 data/ # le dossier, pas seulement la base
PHP のサイトは要求のあいだしか生きていません。定期実行が、満了した契約を閉じ、定期請求を起こし、Webhook を送り、バックアップを作ります。
* * * * * /usr/bin/php /var/www/toutadmin/tools/cron.php
データベースが小さいうちに一つ取り、外部の保管先を設定してください。守る対象と同じサーバーに残る書庫は、何も守りません。
それで入って歩き回ってください。同僚の目で製品を見る方法はこれだけで、そして最もよく飛ばされる確認でもあります。
二要素認証を入れたうえで、端末と再発行コードを両方なくすと、扉を開けられるのは別の管理者だけです。抜け道はありません。
このページは筋道だけです。残りはすべてドキュメントに。前段サーバーの設定、正確な権限、証明書、復元、更新、症状からたどるトラブル対応、そして版ごとに一つずつ、二つの手引きの全文です。