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 都低。

相关推荐
码视野2 小时前
完全开源-支持二开-可做毕业答辩-全源码提供-能源管理大屏系统
开源
M ? A2 小时前
VuReact:Vue转React的增量编译利器
前端·vue.js·后端·react.js·面试·开源·vureact
星栈2 小时前
把业务逻辑写成纯函数之后,我再也不想写 Service 层了
后端·开源
codecrafter1232 小时前
LocalAI 开源AI引擎,本地运行多模态模型无需GPU
人工智能·其他·开源
lipku3 小时前
告别呆板!LiveTalking “动作编排”功能深度解析
开源·实时数字人
廖松洋(Alina)3 小时前
04极速划词页面实现-鸿蒙PC端Electron开发
华为·electron·开源·harmonyos·鸿蒙
fakaifa4 小时前
【最新版】CRMEB Pro版v4.0系统源码 全开源+uniapp/PC前端+搭建教程
uni-app·开源·商城小程序·crmeb·crmebpro
廖松洋(Alina)4 小时前
03主入口页面与导航结构-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙