docs(awesome): add Infra Billing to Awesome Remnawave (#492)
Some checks failed
Build docs and landing / Build landing (push) Has been cancelled
Build docs and landing / Build documentation (push) Has been cancelled
Build docs and landing / Build and push Docker image (push) Has been cancelled

This commit is contained in:
Mishkat 2026-06-29 23:10:07 +03:00 committed by GitHub
parent 385d45387b
commit 97fd0edbd7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 66 additions and 0 deletions

View file

@ -29,6 +29,7 @@ import XrayCheckerGuide from '/docs/awesome-remnawave/\_install-guides/xray-chec
import WhiteboxGuide from '/docs/awesome-remnawave/\_install-guides/whitebox.md'
import XrayCheckerStatuspageGuide from '/docs/awesome-remnawave/\_install-guides/xray-checker-statuspage.md'
import McpRemnawaveGuide from '/docs/awesome-remnawave/\_install-guides/mcp-remnawave.md'
import InfraBillingGuide from '/docs/awesome-remnawave/\_install-guides/infra-billing.md'
<HeroSection
title="❤️ Awesome Remnawave"
@ -100,6 +101,20 @@ import McpRemnawaveGuide from '/docs/awesome-remnawave/\_install-guides/mcp-remn
>
<XrayCheckerStatuspageGuide />
</ProjectCard>
<ProjectCard
id="infra-billing"
title="Infra Billing"
description="Self-hosted dashboard for tracking infrastructure costs across 14+ hosting providers (Hetzner, netcup, Vultr, Linode, Selectel, and more). Auto-syncs servers, balances, and payments via provider APIs, with multi-currency conversion, monthly/yearly analytics and forecasting, and Telegram alerts for low balances and upcoming charges."
author="mishkatik"
authorLink="https://github.com/mishkatik"
image="/awesome/infra-billing.webp"
githubRepo="mishkatik/infra-billing"
links={{
github: 'https://github.com/mishkatik/infra-billing'
}}
>
<InfraBillingGuide />
</ProjectCard>
</CategorySection>
<CategorySection

View file

@ -0,0 +1,51 @@
### Key Features
- **Multi-provider support** — Timeweb Cloud, Hetzner Cloud, netcup, HostBill, ISPsystem BILLmanager, Selectel, 4VPS.SU, Netlen, Beget Cloud, Porkbun, Vultr, Linode, Aeza, Cloudflare, plus manual entries
- **Automated syncing** — balances, account currency, resource lists, billing dates, and daily snapshots via provider APIs
- **Payment imports** — transaction history where the provider API exposes it; manual entries via journal
- **Analytics & forecasting** — monthly/yearly expenses, breakdowns by provider/country/type/currency, and upcoming charges
- **Multi-currency** — automatic conversion (Central Bank of Russia rates) or manual rates
- **Telegram alerts** — low balance, upcoming charges, and sync errors
- **Secure by design** — password and/or passkey (WebAuthn) auth, provider tokens encrypted with AES-256-GCM
### Installation (production)
Requirements: Docker + the Docker Compose plugin, a domain, and a reverse proxy with TLS in front (login does not work without HTTPS — the session cookie is `Secure`). The image is pulled from GHCR (`ghcr.io/mishkatik/infra-billing`).
```bash
# 1. Directory
mkdir -p /opt/infra-billing && cd /opt/infra-billing
# 2. Download the prod compose file and the example config into .env
curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/mishkatik/infra-billing/main/docker-compose-prod.yml
curl -fsSL -o .env https://raw.githubusercontent.com/mishkatik/infra-billing/main/.env.example
# 3. Generate the encryption key (GNU sed; '#' separator because base64 can contain '/')
sed -i "s#^ENCRYPTION_KEY=.*#ENCRYPTION_KEY=$(openssl rand -base64 32)#" .env
# 4. Database password — the same value in POSTGRES_PASSWORD and in DATABASE_URL
pw=$(openssl rand -hex 24) && sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env && sed -i "s|^\(DATABASE_URL=\"postgresql://infra:\)[^\@]*\(@.*\)|\1$pw\2|" .env
# 5. Start (migrations run on startup)
docker compose up -d && docker compose logs -f
```
On first open the panel shows a registration screen — create the owner account (login + password; a passkey can be added later). The panel comes up on `127.0.0.1:8080`; put a reverse proxy with TLS in front of it.
### Reverse proxy + TLS (required)
The container only listens on `127.0.0.1:8080`, so it is not exposed directly. Put a reverse proxy in front that terminates TLS. **Login will not work without HTTPS** (the session cookie is marked `Secure`).
[Caddy](https://caddyserver.com) example (issues the certificate automatically):
```caddy
billing.example.com {
reverse_proxy 127.0.0.1:8080
}
```
### Updating
```bash
cd /opt/infra-billing && docker compose pull && docker compose down && docker compose up -d && docker compose logs -f
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB