open finances dashboards
  • Go 71.4%
  • Go Template 19.3%
  • TypeScript 5.7%
  • Makefile 2.1%
  • CSS 1.3%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
xfx1337 aa99640f13
All checks were successful
Test, publish and deploy / test (push) Successful in 2m33s
Test, publish and deploy / deploy (push) Successful in 36s
Вход: сразу на git.cu3rd.ru, если других способов нет
Страница /signin остаётся для ошибок входа и когда включены пароль или dev-вход.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 04:01:39 +03:00
.forgejo/workflows dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
cmd Перенос данных: dash export и импорт JSON в настройках 2026-11-10 03:43:13 +03:00
models dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
modules dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
public dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
routers Вход: сразу на git.cu3rd.ru, если других способов нет 2026-11-10 04:01:39 +03:00
services Перенос данных: dash export и импорт JSON в настройках 2026-11-10 03:43:13 +03:00
templates Перенос данных: dash export и импорт JSON в настройках 2026-11-10 03:43:13 +03:00
tests Вход: сразу на git.cu3rd.ru, если других способов нет 2026-11-10 04:01:39 +03:00
web_src dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
.air.toml dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
.dockerignore dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
.editorconfig dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
.gitignore dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
.golangci.yml Перенос данных: dash export и импорт JSON в настройках 2026-11-10 03:43:13 +03:00
.npmrc dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
AGENTS.md dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
bindata.go dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
docker-compose.yml dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
Dockerfile dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
eslint.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
go.mod dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
go.sum dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
main.go dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
Makefile dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
package-lock.json dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
package.json dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
playwright.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
README.md dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
stylelint.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
tailwind.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
tsconfig.json dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
vitest.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00
webpack.config.ts dash: расходы и донаты cu3rd 2026-11-10 03:38:58 +03:00

dash

Расходы и донаты cu3rd: https://dash.cu3rd.ru. Публичная страница показывает, во что обходится инфраструктура и кто помогает её оплачивать. Админка /admin — вход через git.cu3rd.ru.

Что внутри

  • Категории — «Серверы» и «Домены» создаются миграцией, остальные добавляются во вкладке «Категории».
  • Статья расхода — серия платежей: стоимость за период (месяц, квартал, год или разово), валюта, ответственный, провайдер, ссылка на панель, описание всей серии, срок следующей оплаты. Флаг «Активна» убирает статью в архив, «Публичная» прячет её с главной (в итог она входит всё равно).
  • Оплата — конкретный платёж: дата, сумма, сколько периодов покрывает, комментарий. При записи срок следующей оплаты сдвигается на эти периоды от текущего срока, так что ранняя или поздняя оплата не сбивает день списания. Давно просроченная статья отсчитывается от даты оплаты.
  • Донат — имя или аноним, сумма, источник, сообщение. Вносится вручную или приходит в POST /api/donations (ниже).
  • Итоги считаются в рублях по курсам из «Настроек». Курсы USD и EUR раз в сутки (и при старте) загружаются из ЦБ РФ (XML_daily.asp), кнопка «Обновить курс из ЦБ» делает это сразу. При ошибке остаётся прежний курс, повтор через час. Значение, введённое вручную, действует до следующей загрузки. Итоги: расходы в месяц и год, по категориям и по ответственным, донаты, оплачено, баланс и какую долю годовых расходов покрывают донаты за 12 месяцев.
  • Все изменения пишутся в «Журнал».

Доступ

Вход только через Forgejo (OAuth2 + PKCE). Пускают тех, кто есть в списке «Пользователи»:

Роль Может
Наблюдатель смотреть админку, включая скрытые статьи и донаты
Редактор + расходы, оплаты, донаты, категории
Владелец + пользователи и настройки

Роль проверяется на каждом запросе: после отзыва доступа сессия перестаёт работать сразу. Логины из DASH_BOOTSTRAP_OWNERS при старте становятся владельцами, их нельзя понизить или удалить из интерфейса. Межсайтовые POST отклоняет http.CrossOriginProtection, cookie сессии подписана HMAC.

Приём донатов

Провайдер ещё не выбран, поэтому есть общий вебхук. Скрипт-адаптер или сам провайдер отправляет:

curl -X POST https://dash.cu3rd.ru/api/donations \
  -H "Authorization: Bearer $DASH_DONATION_WEBHOOK_TOKEN" \
  -d '{"source":"boosty","external_id":"tx-123","donor":"Вася","anonymous":false,
       "amount":500,"currency":"RUB","donated_at":"2026-11-10T12:00:00Z","message":"спасибо!"}'

Ответ 201 — донат создан, 200 — такой source + external_id уже был (повтор не задвоит сумму). GET /api/summary отдаёт публичные итоги в JSON, например для виджета на другом сайте.

Настройка

Переменная По умолчанию Назначение
DASH_DB_DSN data/dash.db своя база, выдаёт self-service
DASH_DB_TYPE sqlite в образе postgres
DASH_BASE_URL http://localhost:3000 внешний адрес, из него строится redirect …/auth/callback
DASH_SESSION_SECRET подпись cookie, от 32 символов
DASH_OAUTH_CLIENT_ID, DASH_OAUTH_CLIENT_SECRET OAuth2-приложение в git.cu3rd.ru
DASH_FORGEJO_URL https://git.cu3rd.ru провайдер входа
DASH_PASSWORD_LOGIN, DASH_PASSWORD вход по паролю для одного участника (стенд без OAuth); пароль от 12 символов, 10 неудачных попыток с адреса — блок на 15 минут
DASH_BOOTSTRAP_OWNERS логины Forgejo через запятую
DASH_DONATION_WEBHOOK_TOKEN токен вебхука; пусто — вебхук выключен
DASH_RATES_URL https://www.cbr.ru/scripts/XML_daily.asp фид курсов ЦБ; пусто — курс только вручную
DASH_DEV_LOGIN, DASH_SEED_DEMO false только локально: вход без пароля и демо-данные

OAuth2-приложение: git.cu3rd.ru → Settings → Applications → OAuth2 Applications, redirect https://dash.cu3rd.ru/auth/callback. Сервис рассчитан на одну реплику.

Разработка

make build && DASH_SESSION_SECRET=local-only-session-secret-0123456789abcdef \
  DASH_COOKIE_SECURE=false DASH_DEV_LOGIN=true DASH_SEED_DEMO=true ./dash web
docker compose up --build      # приложение и Postgres, http://localhost:3000
make lint test test-sqlite     # линтеры, юнит- и интеграционные тесты
make test-pgsql                # то же на Postgres (TEST_PGSQL_DSN)
make test-e2e                  # Playwright (один раз: make playwright)

Вход локально: «Войти» → dev-форма, логины admin (владелец), editor, viewer.

Архитектура и соглашения: AGENTS.md.