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,注册第一个账号(即管理员)。
初始设置建议:
- 「设置」→「公司详情」:填写公司名、Logo、联系方式
- 「设置」→「本地化」:货币选「人民币 CNY」,语言选「中文」
- 「设置」→「发票设计」:选择模板,设置付款条款(如"30天内付款")
- 「设置」→「税率」:配置增值税率(如需)
创建第一张发票
- 「客户」→「新建客户」:填写客户公司名、联系人、邮箱
- 「发票」→「新建发票」
- 选择客户,添加服务项(描述、数量、单价)
- 保存后可以「发送」(邮件给客户)或「下载 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 都低。