Invoice Ninja 自建教程:开源发票和账单管理系统

Invoice Ninja 自建:开源发票和账单管理系统

自由职业者或小工作室向客户开发票,用 Excel 手工做既麻烦又不专业,付费 SaaS 又贵。Invoice Ninja 是功能完整的开源发票系统,支持多货币、多语言、在线支付、费用追踪、时间记录、项目管理,免费自托管版已经足够大多数场景使用。

Invoice Ninja 能做什么

  • 专业发票:自定义品牌、Logo、模板,支持中文
  • 报价单/提案:发送前让客户确认
  • 收款记录:记录已付/未付/逾期状态
  • 在线支付:集成 Stripe、PayPal 等,客户点链接直接付款
  • 费用追踪:记录项目成本,分摊到发票
  • 时间记录:按小时计费项目,自动计算金额
  • 多货币:同时处理人民币、美元、欧元等

服务器配置

2 核 2GB 完全够用,单人或小团队使用。

我把 Invoice Ninja 部署在雨云服务器 rainyun+com 的 2 核 2G 机型上,跑自己的自由职业账单系统非常流畅。注册填优惠码 2026off 领 5 折优惠券,成本远低于任何付费发票 SaaS。

Docker Compose 部署

bash 复制代码
mkdir -p ~/invoice-ninja && cd ~/invoice-ninja

创建 .env 配置文件:

env 复制代码
APP_URL=https://invoice.你的域名.com
APP_KEY=base64:替换为32字节随机字符串
APP_DEBUG=false
APP_ENV=production

DB_HOST=db
DB_PORT=3306
DB_DATABASE=ninja
DB_USERNAME=ninja
DB_PASSWORD=ninja_password

MAIL_MAILER=smtp
MAIL_HOST=smtp.你的邮件服务商.com
MAIL_PORT=587
MAIL_USERNAME=你的邮件账号
MAIL_PASSWORD=你的邮件密码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=invoice@你的域名.com
MAIL_FROM_NAME="Invoice Ninja"

NINJA_LICENCE=

生成 APP_KEY:

bash 复制代码
php -r "echo 'base64:' . base64_encode(random_bytes(32)) . PHP_EOL;"
# 或使用 openssl
openssl rand -base64 32 | awk '{print "base64:" $0}'
yaml 复制代码
# docker-compose.yml
version: "3.8"

services:
  db:
    image: mysql:8.0
    container_name: invoice-ninja-db
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: ninja
      MYSQL_USER: ninja
      MYSQL_PASSWORD: ninja_password
    volumes:
      - mysql_data:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: unless-stopped

  app:
    image: invoiceninja/invoiceninja:5
    container_name: invoice-ninja
    env_file: .env
    volumes:
      - ./storage:/var/app/public/storage
      - ./public:/var/app/public
    depends_on:
      - db
    ports:
      - "127.0.0.1:9000:9000"
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: invoice-nginx
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./public:/var/app/public
    ports:
      - "127.0.0.1:8080:80"
    depends_on:
      - app
    restart: unless-stopped

  caddy:
    image: caddy:alpine
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    restart: unless-stopped

volumes:
  mysql_data:
  caddy_data:
  caddy_config:

创建 nginx.conf

nginx 复制代码
server {
    listen 80;
    server_name _;
    root /var/app/public;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}
复制代码
# Caddyfile
invoice.你的域名.com {
    reverse_proxy nginx:80
}
bash 复制代码
docker compose up -d

# 等待数据库初始化后运行迁移
sleep 30
docker compose exec app php artisan migrate --force
docker compose exec app php artisan db:seed --class=RandomStringSeeder

初始登录

访问 https://invoice.你的域名.com,注册第一个账号(即管理员)。

初始设置建议:

  1. 「设置」→「公司详情」:填写公司名、Logo、联系方式
  2. 「设置」→「本地化」:货币选「人民币 CNY」,语言选「中文」
  3. 「设置」→「发票设计」:选择模板,设置付款条款(如"30天内付款")
  4. 「设置」→「税率」:配置增值税率(如需)

创建第一张发票

  1. 「客户」→「新建客户」:填写客户公司名、联系人、邮箱
  2. 「发票」→「新建发票」
  3. 选择客户,添加服务项(描述、数量、单价)
  4. 保存后可以「发送」(邮件给客户)或「下载 PDF」

配置在线收款

接入 Stripe 实现客户在线付款:

复制代码
设置 → 支付网关 → 添加网关 → Stripe
填入 Stripe API 密钥(在 Stripe 控制台获取)

开启后,发票邮件里会附带「立即付款」按钮,客户点击用信用卡或支付宝付款(取决于 Stripe 支持的方式)。

配置定时任务

Invoice Ninja 需要定时任务来处理逾期提醒、自动发票等功能:

bash 复制代码
# 在服务器上添加 crontab
(crontab -l 2>/dev/null; echo "* * * * * docker exec invoice-ninja php artisan schedule:run >> /dev/null 2>&1") | crontab -

数据备份

bash 复制代码
cat > ~/invoice-ninja/backup.sh << 'EOF'
#!/bin/bash

DATE=$(date +%Y%m%d)
BACKUP_DIR=~/invoice-ninja-backups
mkdir -p "$BACKUP_DIR"

docker exec invoice-ninja-db mysqldump -u ninja -pninja_password ninja | \
  gzip > "$BACKUP_DIR/db-$DATE.sql.gz"

tar -czf "$BACKUP_DIR/storage-$DATE.tar.gz" ~/invoice-ninja/storage/

find "$BACKUP_DIR" -mtime +30 -delete
echo "[$(date)] 备份完成"
EOF

chmod +x ~/invoice-ninja/backup.sh
(crontab -l 2>/dev/null; echo "0 4 * * * ~/invoice-ninja/backup.sh") | crontab -

Invoice Ninja 让发票管理从 Excel 升级到专业系统,客户端在线查看、在线付款,逾期自动提醒,时间记录自动生成账单。在雨云服务器 rainyun+com 的 2 核 2G 机型上部署,注册填优惠码 2026off 领 5 折优惠券,一次部署长期使用,成本比任何付费发票 SaaS 都低。

相关推荐
云樱梦海12 小时前
FunASR:阿里达摩院开源的工业级语音识别工具包(4 款模型 + Gradio 可视化)
人工智能·开源·语音识别
X54先生(人文科技)12 小时前
《元创力》纪实录·桥段刻舟遗碑:当“唯一解”的文明抵达终点
人工智能·开源·开源协议·零知识证明
DisonTangor12 小时前
微软重磅开源 Lens: 重新思考基础文本到图像模型的训练效率
人工智能·microsoft·ai作画·开源·aigc
星栈12 小时前
我把售后模块砍到只剩 64 行:Rust 全栈 CRM 的 MVP 取舍实录
前端·后端·开源
darkb1rd13 小时前
Odysseus:私有化 AI 工作流部署实战指南
开源·github·好物分享
智碳未来科技有限公司14 小时前
双碳时代的工业能源数字化:智碳 EMS 开源系统技术解析与实践
开源·能源·能源管理系统·开源能源管理系统·能碳管理系统·绿色工厂申报
数据法师14 小时前
BeeCount技术深度解析:一款开源免费的本地化智能记账工具
开源
白狐_79814 小时前
从功能开发到开源维护:一个 Python 可视化项目的 Git 分支、维护文件与 PR 流程实践
git·python·开源
OpenCSG14 小时前
OpenCSG全程赋能2026 WAIC Future Tech OPC 先锋挑战赛:以开放AI平台助力“全民Agent创业时代”
人工智能·开源·opencsg·waic
cup111 天前
[Full Clock 技术复盘] 一、浏览器前端如何实现百毫秒级时间校准?时间 API 推荐、模拟 NTP 算法原理及局限
typescript·开源·api·时钟·时间同步