経費精算の紙、まだ回していませんか。僕の職場では、交通費の精算書が課長の机で2日止まり、部長が出張でさらに1日止まる。合計3日間、A4の紙が誰かの机の上で寝ているという状態が長く続いていました。

それを解決するために、AI(Claude)と一緒に多段階承認つきの経費精算Webアプリを作りました。UGREEN NASync のDockerにそのまま載せて動いています。せっかくなので無料で公開します。noteからダウンロードして、docker composeを1回叩けば自社で使えます。

製造業の総務課でIT担当をしている、非エンジニアの会社員が書いています。ブログ歴6年、社内Webアプリの内製は3年目です。

  • 配布する経費精算アプリで具体的に何ができるのか
  • UGREEN NASのDockerで動かすまでの5ステップ
  • 導入前に知っておくべき制約(サポートなし・法令対応の線引き)

「ワークフローシステムを入れる予算はないけど、ハンコ待ちだけは消したい」——そういう会社にちょうどいいサイズで作りました。

\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

結論:紙の稟議を回す作業は、NAS1台とDockerで置き換えられます

紙の稟議をUGREEN NASとDockerに置き換える比較図

先に結論から書きます。経費精算の「申請→承認→保管」は、市販のワークフローシステムを買わなくても、社内のNAS1台で完結できます。月額課金はゼロ、データは社外に出ません。

今回配布するのは「expense-approval」というアプリです。Node.js + Express + SQLite というシンプルな構成で、Dockerコンテナ1つで動きます。専用サーバーもクラウド契約も要りません。

この記事で配布するもの
  • 経費精算アプリ「expense-approval」一式(ソースコード)
  • そのまま使える docker-compose.yml
  • MITライセンス/改変・社内利用・商用利用すべて自由
\ 登録不要・そのまま読めます /noteで無料ダウンロードする

なぜ作ったか|Excelの精算書が「ハンコ待ち」で3日止まる

Excel精算書のハンコ待ち3日とアプリ承認の比較

うちの会社の経費精算は、長らくExcelでした。テンプレートに金額を打ち込んで印刷し、上長の印鑑をもらい、経理に回す。よくある流れです。

問題は止まる場所が読めないことでした。誰の机で止まっているのか、申請した本人には分かりません。経理から「先月の出張精算、まだ来てませんけど」と連絡が来て、探しに行ったら課長の書類ケースの一番下から出てきた、ということが実際にありました。

IATF16949の内部監査でも、承認の記録が紙のハンコだけだと「いつ承認したか」の証跡が弱い。日付欄を書き忘れている紙が普通に混ざります。止まっている場所が見える化されるだけで、この手の問題はほぼ消えます。

市販のワークフロー製品も検討しました。ただ、ユーザー数課金だと従業員100人規模で年間数十万円になります。「経費精算だけ」に払う額としては稟議が通りませんでした。だったら自分で作ってしまおう、というのがスタート地点です。

経費精算アプリ「expense-approval」でできること

経費精算アプリexpense-approvalの4つの機能図解

機能を欲張らず、「紙の精算書を回す」という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を開く」ボタンが出ます。承認者ごとの承認日時とコメントもそのまま履歴として残るので、後から「これ誰が通したの」と聞かれても即答できます。

承認完了後に証憑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ステップ)

UGREEN NASのDockerで経費精算アプリを動かす5ステップ図

全体の流れを先に載せます。慣れていれば15分、初めてでも1時間あれば動きます。

STEP1
NASにDockerを入れる

UGOS Proのアプリセンターから「Docker」をインストールします。

STEP2
アプリ一式を共有フォルダに置く

noteからダウンロードしたZIPを展開し、NASの共有フォルダにコピーします。

STEP3
docker-compose.yml を4箇所だけ書き換える

ポート・セッションキー・NASのIP・管理者パスワードを自社用に変更します。ここ以外は触らなくて動きます。

STEP4
プロジェクトを起動する

Docker画面から起動、またはSSHで docker compose up -d を実行します。

STEP5
ブラウザで開いて管理者を作る

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 は消さないでください。共有フォルダのパスに日本語が混ざっていると、この行がないとプロジェクト名の解決で落ちることがあります。

UGREEN NASのDocker画面に貼り付けたCompose設定

「設定を .env に分けたい」という方へ。UGREEN NASでも .env は普通に使えます。ただしUGOS Proのファイル画面は初期状態で隠しファイルを表示しないので、ドットで始まる .env が「消えた」ように見えます。ファイルアプリの表示設定で隠しファイルの表示をONにすれば出てきます。パスワード類を別ファイルに逃がしたいならこちらの方が扱いやすいです。

ちなみにSMTPの5行は空のままで構いません。設定すると承認依頼のメール通知が飛びますが、未設定なら通知だけスキップされてアプリは普通に動きます。うちは社内チャットで足りているので空のままです。

UGOS Proの画面名称はバージョンで変わることがあります。「Docker」→「プロジェクト」あたりを探せば、compose貼り付け欄にたどり着けます。

つまずきやすいポイント3つ

導入時につまずきやすい3つの注意点まとめ

僕が実際に詰まった箇所を先に共有しておきます。この3つを避ければ、初回で立ち上がります。

ポート番号がほかのコンテナとぶつかる

NASでいくつもコンテナを動かしていると、よく起きます。起動直後にコンテナが落ちる場合はまずこれを疑ってください。3100が埋まっているなら3101、3102と後ろにずらせば解決します。

タイムゾーンを設定し忘れて申請日時が9時間ずれる

TZ=Asia/Tokyo を消すとUTCで記録されます。承認履歴の時刻が9時間前になるので、監査資料として使うつもりなら必ず残してください。僕は最初これを削ってしまい、テスト申請の時刻を見て頭を抱えました。

バックアップ先をNASの同じディスクに置いたままにする

バックアップの出力先は ./data/backups、つまりデータベース本体と同じフォルダの中です。ディスクが壊れたら本体もバックアップも一緒に消えます。別ドライブか別NAS、あるいはクラウドへ週1でコピーする運用を必ず足してください。ここを怠ると、自動バックアップがあるという安心感だけが残る危険な状態になります。

本番稼働の前に、テスト用の申請を3件ほど流して、承認・却下・差し戻しを一通り試してください。運用ルールの穴はだいたいそこで見つかります。

NASがない人はXServer VPSでも同じように動きます

NASがない場合にXServer VPSで代替する構成イメージ

「NASを買うところから始めるのはハードルが高い」という方には、VPSという選択肢があります。Dockerが動く環境であれば、compose の中身は同じで構いません。

僕は社外から使う社内アプリをXServer VPSに置いています。2GBプランで月額1,000円台から始められて、初期費用もかかりません。NASと違って外部からのアクセスが前提なので、営業所や在宅勤務者からも申請してもらう運用ならこちらが向いています。

逆に、社内LANだけで完結するならNASの方が有利です。ランニングコストがゼロで、データが社外に一切出ません。この判断軸は「社外から申請する人がいるかどうか」だけで決めて問題ありません。

※料金・プラン内容は変動します。最新の情報は公式サイトで確認してください。

\ 初期費用0円・Docker標準対応 /XServer VPSの料金を見る

配布前に正直に書いておく制約

無料配布アプリの個別サポート無しと法令対応の注意

無料配布なので良いことだけ書いても仕方ありません。導入前に把握しておいてほしい点を4つ挙げます。

個別サポートはできません

MITライセンスで公開しますが、本業の合間に作ったものなので個別サポートは行いません。改変も再配布も自由です。自社に合わせて作り替えて使ってください。動かなかった場合の責任も負えないので、そこは了承のうえダウンロードをお願いします。

会計ソフトとの連携機能はありません

承認済みデータはCSVで書き出す想定です。freeeやマネーフォワードへ自動連携する仕組みは入っていません。ここまで作り込むと個別要件が強くなりすぎるので、あえて外しました。

電子帳簿保存法への対応は各社で確認が必要です

証憑PDFの自動生成と監査ログは入れていますが、このアプリを入れれば電子帳簿保存法の要件を満たす、とは言えません。要件は保存方法や社内規程とセットで判断されるものです。導入前に顧問税理士や社内の経理責任者に確認してください。

AIが書いたコードなので、レビューはしてください

設計と実装の大部分はClaudeに書かせています。僕が動作確認をして手直ししていますが、非エンジニアが検証した範囲には限界があります。金額を扱うアプリなので、社内にコードを読める人がいるなら一度目を通してもらうのが安全です。

逆に言うと、この4点が許容できるなら導入コストはゼロです。うちの会社では小さい部署から試験導入し、問題がないことを確認してから全社に広げました。同じ進め方をおすすめします。

ダウンロードはnoteから(無料)

noteで経費精算アプリを無料ダウンロードする案内

アプリ一式はnoteで公開しています。ソースコード、docker-compose.yml、セットアップ手順をまとめてあります。会員登録なしで読めますし、費用も一切かかりません。

使ってみた感想や「この機能が欲しい」という要望があれば、noteのコメントに書いてもらえると次の改良の参考にします。実際、承認者を最大5人に増やしたのは前作のアプリで届いた要望がきっかけでした。

\ MITライセンス・改変自由 /経費精算アプリを無料で受け取る

よくある質問(FAQ)

経費精算アプリのよくある質問3項目のまとめ
UGREEN以外のNASでも動きますか?

Dockerが動くNASであれば動作します。SynologyやQNAPのDocker対応機でも同じcomposeが使えます。ただし僕が実機で確認したのはUGREEN NASync DXP2800だけなので、他機種は各自で検証してください。

何人まで使えますか?

ユーザー数の制限は設けていません。SQLiteを使っているので同時書き込みが集中する規模には向きませんが、数十人が日常的に申請する程度なら問題なく動いています。数百人規模で使うならPostgreSQLへの置き換えを検討してください。

スマホからも申請できますか?

できます。画面はレスポンシブ対応にしてあるので、社内Wi-Fiにつながっているスマホのブラウザからそのまま使えます。出張先で領収書を受け取ったその場で入力する、という使い方が現場では一番喜ばれました。

社外から使うにはどうすればいいですか?

NASを直接インターネットに公開するのは避けてください。VPNで社内LANに入る方法か、VPSに同じアプリを立てる方法のどちらかを選ぶのが安全です。僕は後者を採用しています。

機能を追加したいのですが自分で改造できますか?

MITライセンスなので自由に改変できます。コードごとClaudeやChatGPTに渡して「承認者にメール通知を追加して」と頼めば、非エンジニアでもかなりのところまで改造できます。僕自身がその方法で作ってきました。

まとめ|ハンコ待ちを消すのに、予算稟議はいりません

NASとDockerで経費精算を完結させるまとめ図

経費精算アプリ「expense-approval」を無料で公開しました。多段階承認、証憑PDFの自動生成、毎日の自動バックアップ、監査ログまで入っています。UGREEN NASync のDockerに載せれば、月額0円で今日から動きます。

  • 申請者は承認者を2〜5人まで指定でき、順番に自動で回る
  • 1人でも却下すればそこで止まるので、無駄な回覧が発生しない
  • Docker対応NASがあれば追加コストゼロ、なければVPSでも同じ構成で動く
  • MITライセンス・サポートなし・法令対応は各社で要確認

ワークフローシステムの導入は、稟議を通すだけで数か月かかります。その間ずっと紙は机の上で寝ています。まずは自分の部署だけで試して、効果を数字で見せてから稟議を出す。この順番の方が、総務担当としては確実に前に進みました。

エンジニアじゃなくても、ここまでは作れます。同じように困っている総務・情シスの方に届けば嬉しいです。

\ 費用0円・すぐ試せます /noteでアプリを受け取る
この記事は役に立ちましたか?
ご投票ありがとうございます!
理由を教えてください