経費精算の紙、まだ回していませんか。僕の職場では、交通費の精算書が課長の机で2日止まり、部長が出張でさらに1日止まる。合計3日間、A4の紙が誰かの机の上で寝ているという状態が長く続いていました。
それを解決するために、AI(Claude)と一緒に多段階承認つきの経費精算Webアプリを作りました。UGREEN NASync のDockerにそのまま載せて動いています。せっかくなので無料で公開します。noteからダウンロードして、docker composeを1回叩けば自社で使えます。
製造業の総務課でIT担当をしている、非エンジニアの会社員が書いています。ブログ歴6年、社内Webアプリの内製は3年目です。
- 配布する経費精算アプリで具体的に何ができるのか
- UGREEN NASのDockerで動かすまでの5ステップ
- 導入前に知っておくべき制約(サポートなし・法令対応の線引き)
「ワークフローシステムを入れる予算はないけど、ハンコ待ちだけは消したい」——そういう会社にちょうどいいサイズで作りました。
目次
結論:紙の稟議を回す作業は、NAS1台とDockerで置き換えられます

先に結論から書きます。経費精算の「申請→承認→保管」は、市販のワークフローシステムを買わなくても、社内のNAS1台で完結できます。月額課金はゼロ、データは社外に出ません。
今回配布するのは「expense-approval」というアプリです。Node.js + Express + SQLite というシンプルな構成で、Dockerコンテナ1つで動きます。専用サーバーもクラウド契約も要りません。
- 経費精算アプリ「expense-approval」一式(ソースコード)
- そのまま使える
docker-compose.yml - MITライセンス/改変・社内利用・商用利用すべて自由
なぜ作ったか|Excelの精算書が「ハンコ待ち」で3日止まる

うちの会社の経費精算は、長らくExcelでした。テンプレートに金額を打ち込んで印刷し、上長の印鑑をもらい、経理に回す。よくある流れです。
問題は止まる場所が読めないことでした。誰の机で止まっているのか、申請した本人には分かりません。経理から「先月の出張精算、まだ来てませんけど」と連絡が来て、探しに行ったら課長の書類ケースの一番下から出てきた、ということが実際にありました。
IATF16949の内部監査でも、承認の記録が紙のハンコだけだと「いつ承認したか」の証跡が弱い。日付欄を書き忘れている紙が普通に混ざります。止まっている場所が見える化されるだけで、この手の問題はほぼ消えます。
市販のワークフロー製品も検討しました。ただ、ユーザー数課金だと従業員100人規模で年間数十万円になります。「経費精算だけ」に払う額としては稟議が通りませんでした。だったら自分で作ってしまおう、というのがスタート地点です。
経費精算アプリ「expense-approval」でできること

機能を欲張らず、「紙の精算書を回す」という1業務だけに絞って作ってあります。中身は4つです。
1. 申請|明細を入力して承認者を2〜5人指定する
社員が交通費・宿泊費・接待費などの明細を入力し、回したい承認者を選びます。通常は2〜3人、最大5人まで指定できます。金額が大きいときだけ役員を4人目に足す、といった運用が現場の実態に合います。
部署とカテゴリは管理画面のマスタから引くので、申請者が自由入力で表記ゆれを起こしません。「交通費」と「旅費交通費」が混在する、あのストレスがなくなります。

2. 多段階承認|承認者1→2→3の順に自動で回覧される
ここがこのアプリの中心機能です。申請が承認者1に届き、承認されると自動で承認者2へ進みます。全員が承認して初めて完了です。
各承認者は「承認」か「却下」を選び、コメントを残せます。誰か1人が却下した時点で回覧はそこで止まり、申請者に差し戻されます。紙だと「3人目まで回ってから却下」という悲劇が起きますが、その無駄が構造的になくなります。
申請者の一覧画面では、いま何番目の承認で止まっているかがバッジで出ます。「承認中(第1承認)」と書いてあれば、まだ課長のところだと一目で分かる。探しに行く必要がなくなったのはこの表示のおかげです。

承認する側の画面はもっと単純です。明細と承認フローを確認して、赤い「却下」か緑の「承認する」を押すだけ。スマホで開いても押し間違えないように、ボタンは大きめにしてあります。

3. 長期保存|証憑PDFの自動生成と毎日2時の自動バックアップ
承認が完了した申請はSQLiteのデータベースに保存され、同時に証憑PDFが自動生成されます。誰がいつ承認したかが1枚に入るので、監査や経理からの問い合わせにそのまま出せます。
バックアップは毎日深夜2時に自動実行し、14日分を保持します。自作アプリで一番怖いのはデータが飛ぶことなので、ここは最初から組み込みました。
全員の承認が終わると、詳細画面に「証憑PDFを開く」ボタンが出ます。承認者ごとの承認日時とコメントもそのまま履歴として残るので、後から「これ誰が通したの」と聞かれても即答できます。

4. 管理画面|ユーザー登録・マスタ管理・監査ログ
管理者アカウントでログインすると、ユーザーの追加・削除、部署とカテゴリのマスタ管理、バックアップの実行状況の確認、監査ログの閲覧ができます。
監査ログには誰がいつ何を操作したかが残ります。総務としてはここが一番安心できるポイントで、「勝手に金額が書き換わっていないか」を後から追えます。
動かすために必要なもの
用意するものは多くありません。すでにDocker対応NASを持っているなら、追加の出費はゼロです。
| 必要なもの | 条件 | 備考 |
|---|---|---|
| Docker対応NAS | 必須 | UGREEN NASync DXP2800で動作確認 |
| メモリ | 4GB以上 | アプリ単体なら1GB未満で動く |
| ストレージ | 数GBで十分 | SQLite+PDFのみ。写真も動画も持たない |
| 固定IP・ドメイン | 社内利用なら不要 | 社外から使うならVPSかVPNを検討 |
| プログラミング知識 | 不要 | コマンドはコピペで通る |
僕が使っているのは UGREEN NASync DXP2800 です。Dockerがネイティブで動くうえに、UGOS Proの管理画面からcomposeファイルを貼り付けるだけでコンテナが立ちます。NAS選びで迷っている方は、Docker対応かどうかだけは絶対に確認してください。ここを外すとこの記事の内容は再現できません。
UGREEN NASのDockerで動かす手順(5ステップ)

全体の流れを先に載せます。慣れていれば15分、初めてでも1時間あれば動きます。
UGOS Proのアプリセンターから「Docker」をインストールします。
noteからダウンロードしたZIPを展開し、NASの共有フォルダにコピーします。
ポート・セッションキー・NASのIP・管理者パスワードを自社用に変更します。ここ以外は触らなくて動きます。
Docker画面から起動、またはSSHで docker compose up -d を実行します。
http://NASのIP:3100 にアクセスし、最初の管理者アカウントを登録します。
STEP3で書き換える4箇所(ここだけ注意)
配布ファイルに入っている docker-compose.yml はこの形です。UGOS ProのDocker画面に、この中身をそのまま貼り付けます。
name: expense-approval # 日本語フォルダの下でも動くように必ず書く services: app: build: . ports: - "3100:3000" # 左がアクセス用ポート。コンテナ内は3000で固定 volumes: - ./data:/app/data # app.db・backups・pdfs をまとめて永続化 restart: unless-stopped environment: TZ: Asia/Tokyo DB_PATH: ./data/app.db SESSION_SECRET: "<変更必須:ランダムな長い文字列>" APP_BASE_URL: "http://<NASのIPアドレス>:3100" ADMIN_USERNAME: "admin" ADMIN_PASSWORD: "<変更必須:初回ログイン後すぐ変更>" # メール通知(任意。未設定なら通知だけスキップされ、アプリ自体は動きます) SMTP_HOST: "" SMTP_PORT: "587" SMTP_SECURE: "false" SMTP_USER: "" SMTP_PASS: ""
書き換えるのは次の4箇所だけです。ほかは触らなくて動きます。
- ポート番号(
"3100:3000"の左側)… ほかのコンテナと重なるときだけ変更 - SESSION_SECRET … ログインセッションの署名鍵。英数字を20文字ほど適当に並べる
- APP_BASE_URL … NASのIPアドレスに置き換える。証憑PDFのリンク生成に使う
- ADMIN_PASSWORD … 初期管理者のパスワード。ログイン後すぐ変える前提でも、初期値のままにはしない
先頭の name: expense-approval は消さないでください。共有フォルダのパスに日本語が混ざっていると、この行がないとプロジェクト名の解決で落ちることがあります。

「設定を .env に分けたい」という方へ。UGREEN NASでも .env は普通に使えます。ただしUGOS Proのファイル画面は初期状態で隠しファイルを表示しないので、ドットで始まる .env が「消えた」ように見えます。ファイルアプリの表示設定で隠しファイルの表示をONにすれば出てきます。パスワード類を別ファイルに逃がしたいならこちらの方が扱いやすいです。
ちなみにSMTPの5行は空のままで構いません。設定すると承認依頼のメール通知が飛びますが、未設定なら通知だけスキップされてアプリは普通に動きます。うちは社内チャットで足りているので空のままです。
UGOS Proの画面名称はバージョンで変わることがあります。「Docker」→「プロジェクト」あたりを探せば、compose貼り付け欄にたどり着けます。
つまずきやすいポイント3つ

僕が実際に詰まった箇所を先に共有しておきます。この3つを避ければ、初回で立ち上がります。
ポート番号がほかのコンテナとぶつかる
NASでいくつもコンテナを動かしていると、よく起きます。起動直後にコンテナが落ちる場合はまずこれを疑ってください。3100が埋まっているなら3101、3102と後ろにずらせば解決します。
タイムゾーンを設定し忘れて申請日時が9時間ずれる
TZ=Asia/Tokyo を消すとUTCで記録されます。承認履歴の時刻が9時間前になるので、監査資料として使うつもりなら必ず残してください。僕は最初これを削ってしまい、テスト申請の時刻を見て頭を抱えました。
バックアップ先をNASの同じディスクに置いたままにする
バックアップの出力先は ./data/backups、つまりデータベース本体と同じフォルダの中です。ディスクが壊れたら本体もバックアップも一緒に消えます。別ドライブか別NAS、あるいはクラウドへ週1でコピーする運用を必ず足してください。ここを怠ると、自動バックアップがあるという安心感だけが残る危険な状態になります。
NASがない人はXServer VPSでも同じように動きます

「NASを買うところから始めるのはハードルが高い」という方には、VPSという選択肢があります。Dockerが動く環境であれば、compose の中身は同じで構いません。
僕は社外から使う社内アプリをXServer VPSに置いています。2GBプランで月額1,000円台から始められて、初期費用もかかりません。NASと違って外部からのアクセスが前提なので、営業所や在宅勤務者からも申請してもらう運用ならこちらが向いています。
逆に、社内LANだけで完結するならNASの方が有利です。ランニングコストがゼロで、データが社外に一切出ません。この判断軸は「社外から申請する人がいるかどうか」だけで決めて問題ありません。
※料金・プラン内容は変動します。最新の情報は公式サイトで確認してください。
配布前に正直に書いておく制約

無料配布なので良いことだけ書いても仕方ありません。導入前に把握しておいてほしい点を4つ挙げます。
個別サポートはできません
MITライセンスで公開しますが、本業の合間に作ったものなので個別サポートは行いません。改変も再配布も自由です。自社に合わせて作り替えて使ってください。動かなかった場合の責任も負えないので、そこは了承のうえダウンロードをお願いします。
会計ソフトとの連携機能はありません
承認済みデータはCSVで書き出す想定です。freeeやマネーフォワードへ自動連携する仕組みは入っていません。ここまで作り込むと個別要件が強くなりすぎるので、あえて外しました。
電子帳簿保存法への対応は各社で確認が必要です
証憑PDFの自動生成と監査ログは入れていますが、このアプリを入れれば電子帳簿保存法の要件を満たす、とは言えません。要件は保存方法や社内規程とセットで判断されるものです。導入前に顧問税理士や社内の経理責任者に確認してください。
AIが書いたコードなので、レビューはしてください
設計と実装の大部分はClaudeに書かせています。僕が動作確認をして手直ししていますが、非エンジニアが検証した範囲には限界があります。金額を扱うアプリなので、社内にコードを読める人がいるなら一度目を通してもらうのが安全です。
逆に言うと、この4点が許容できるなら導入コストはゼロです。うちの会社では小さい部署から試験導入し、問題がないことを確認してから全社に広げました。同じ進め方をおすすめします。
ダウンロードはnoteから(無料)

アプリ一式はnoteで公開しています。ソースコード、docker-compose.yml、セットアップ手順をまとめてあります。会員登録なしで読めますし、費用も一切かかりません。
使ってみた感想や「この機能が欲しい」という要望があれば、noteのコメントに書いてもらえると次の改良の参考にします。実際、承認者を最大5人に増やしたのは前作のアプリで届いた要望がきっかけでした。
よくある質問(FAQ)

- UGREEN以外のNASでも動きますか?
Dockerが動くNASであれば動作します。SynologyやQNAPのDocker対応機でも同じcomposeが使えます。ただし僕が実機で確認したのはUGREEN NASync DXP2800だけなので、他機種は各自で検証してください。
- 何人まで使えますか?
ユーザー数の制限は設けていません。SQLiteを使っているので同時書き込みが集中する規模には向きませんが、数十人が日常的に申請する程度なら問題なく動いています。数百人規模で使うならPostgreSQLへの置き換えを検討してください。
- スマホからも申請できますか?
できます。画面はレスポンシブ対応にしてあるので、社内Wi-Fiにつながっているスマホのブラウザからそのまま使えます。出張先で領収書を受け取ったその場で入力する、という使い方が現場では一番喜ばれました。
- 社外から使うにはどうすればいいですか?
NASを直接インターネットに公開するのは避けてください。VPNで社内LANに入る方法か、VPSに同じアプリを立てる方法のどちらかを選ぶのが安全です。僕は後者を採用しています。
- 機能を追加したいのですが自分で改造できますか?
MITライセンスなので自由に改変できます。コードごとClaudeやChatGPTに渡して「承認者にメール通知を追加して」と頼めば、非エンジニアでもかなりのところまで改造できます。僕自身がその方法で作ってきました。
まとめ|ハンコ待ちを消すのに、予算稟議はいりません

経費精算アプリ「expense-approval」を無料で公開しました。多段階承認、証憑PDFの自動生成、毎日の自動バックアップ、監査ログまで入っています。UGREEN NASync のDockerに載せれば、月額0円で今日から動きます。
- 申請者は承認者を2〜5人まで指定でき、順番に自動で回る
- 1人でも却下すればそこで止まるので、無駄な回覧が発生しない
- Docker対応NASがあれば追加コストゼロ、なければVPSでも同じ構成で動く
- MITライセンス・サポートなし・法令対応は各社で要確認
ワークフローシステムの導入は、稟議を通すだけで数か月かかります。その間ずっと紙は机の上で寝ています。まずは自分の部署だけで試して、効果を数字で見せてから稟議を出す。この順番の方が、総務担当としては確実に前に進みました。
エンジニアじゃなくても、ここまでは作れます。同じように困っている総務・情シスの方に届けば嬉しいです。

