- Go 71.4%
- Go Template 19.3%
- TypeScript 5.7%
- Makefile 2.1%
- CSS 1.3%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Страница /signin остаётся для ошибок входа и когда включены пароль или dev-вход. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| .forgejo/workflows | ||
| cmd | ||
| models | ||
| modules | ||
| public | ||
| routers | ||
| services | ||
| templates | ||
| tests | ||
| web_src | ||
| .air.toml | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitignore | ||
| .golangci.yml | ||
| .npmrc | ||
| AGENTS.md | ||
| bindata.go | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.ts | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| Makefile | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| README.md | ||
| stylelint.config.ts | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
| vitest.config.ts | ||
| webpack.config.ts | ||
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.