Современная система для отслеживания личных финансов с REST API на Go и веб-интерфейсом.
- ✅ Регистрация и аутентификация пользователей (JWT)
- ✅ Управление сессиями
- ✅ Профиль пользователя с настройками
- ✅ Мультивалютность - поддержка RUB, USD, TJS
- ✅ Счета - создание и управление счетами в разных валютах
- ✅ Обмен валют - автоматическое обновление курсов
- ✅ Категории - настройка категорий доходов/расходов
- ✅ Транзакции - добавление, просмотр, фильтрация
- ✅ Статистика - сводки по периодам и категориям
- ✅ Фильтрация транзакций по периоду
- ✅ Статистика по категориям
- ✅ Месячные сводки
- ✅ Графики и диаграммы
- Go 1.23 с чистой архитектурой (Clean Architecture)
- Gin - высокопроизводительный HTTP фреймворк
- PostgreSQL 15 - надежная база данных
- JWT - безопасная аутентификация
- Docker - контейнеризация
- pgx - быстрый PostgreSQL драйвер
- HTML5 + CSS3 + JavaScript - современный веб-интерфейс
- Responsive Design - адаптивный дизайн
- Chart.js - интерактивные графики
- Font Awesome - иконки
- Docker Compose - оркестрация контейнеров
- Health Checks - мониторинг состояния
- Multi-stage builds - оптимизированные образы
- Docker и Docker Compose (рекомендуется)
- Go 1.23+ (для локальной разработки)
- PostgreSQL 15+ (для локального запуска)
- Клонируйте репозиторий
git clone <repository-url>
cd finance-tracker- Запустите все сервисы
docker compose up -d --build- Проверьте статус
docker compose ps- Доступ к приложению
- 🌐 API:
http://localhost:8080/api/v1 - 🏥 Health Check:
http://localhost:8080/api/v1/health - 💻 Frontend: Откройте
web/index.htmlв браузере - 🗄️ Database:
localhost:5432
- Установите PostgreSQL
# Ubuntu/Debian
sudo apt-get install postgresql postgresql-contrib
# macOS
brew install postgresql
# Windows
# Скачайте с https://www.postgresql.org/download/windows/- Создайте базу данных
CREATE DATABASE transactions;
CREATE USER postgres WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE transactions TO postgres;- Настройте переменные окружения
Windows (PowerShell):
$env:DATABASE_URL = "host=localhost port=5432 user=postgres password=fakha dbname=transactions sslmode=disable"
$env:JWT_SECRET = "your-super-secret-jwt-key-change-in-production"
$env:GIN_MODE = "debug"
$env:PORT = "8080"Linux/macOS:
export DATABASE_URL="host=localhost port=5432 user=postgres password=fakha dbname=transactions sslmode=disable"
export JWT_SECRET="your-super-secret-jwt-key-change-in-production"
export GIN_MODE="debug"
export PORT="8080"- Примените миграции
# Выполните SQL файлы в порядке:
# 1. migrations/001_init.sql
# 2. migrations/002_currencies_accounts.up.sql- Запустите сервер
go run ./cmd/server- Откройте фронтенд
Откройте
web/index.htmlв браузере
- Зарегистрируйтесь или войдите на https://vercel.com.
- Подключите репозиторий к Vercel.
- Убедитесь, что в корне проекта есть
vercel.jsonи папкаapi/. - В Vercel > Settings > Environment Variables добавьте:
DATABASE_URLJWT_SECRETGIN_MODE=releaseALLOWED_ORIGIN=https://<ваш-проект>.vercel.app
- Деплой выполнится автоматически.
- Backend размещается как serverless Go-функция из
api/index.go. - Frontend будет обслуживаться как статический сайт из папки
web. - Для работы API нужен внешний PostgreSQL; Vercel не хостит Postgres.
- Фронтенд:
/ - API:
/api/v1 - Проверка здоровья:
/api/v1/health
PORT(по умолчанию8080)DATABASE_URL(пример вdocker-compose.yml)JWT_SECRET(обязательно переопределить в проде!)GIN_MODE(debug/release)
В проекте используется начальная миграция migrations/001_init.sql и обратная migrations/001_init.down.sql.
- Применить up (в Docker — выполняется автоматически при первом старте благодаря монтированию
./migrationsв Postgres init):- вручную: выполнить SQL из
001_init.sql.
- вручную: выполнить SQL из
- Откатить (down):
- выполнить SQL из
001_init.down.sql, который удаляет индексы и таблицы в обратном порядке.
- выполнить SQL из
Важно: откат удалит все данные. Для управляемых миграций рекомендуем использовать инструмент (например, golang-migrate), но текущие файлы совместимы и с ручным применением.
Все защищенные эндпоинты требуют заголовок:
Authorization: Bearer <jwt_token>
POST /api/v1/register- РегистрацияPOST /api/v1/login- ВходPOST /api/v1/logout- ВыходGET /api/v1/user/profile- Профиль пользователяGET /api/v1/user/profile-with-accounts- Профиль с счетамиPUT /api/v1/user/default-currency- Установка валюты по умолчанию
GET /api/v1/currencies- Список валютGET /api/v1/currencies/:id- Валюта по ID
GET /api/v1/accounts- Счета пользователяPOST /api/v1/accounts- Создание счетаGET /api/v1/accounts/:id- Счет по IDPUT /api/v1/accounts/:id/default- Установка счета по умолчанию
GET /api/v1/categories- Категории пользователяPOST /api/v1/categories- Создание категории
GET /api/v1/transactions- Транзакции пользователяPOST /api/v1/transactions- Создание транзакцииGET /api/v1/transactions/:id- Транзакция по IDGET /api/v1/transactions/period- Транзакции по периодуGET /api/v1/transactions/summary- Сводка транзакцийGET /api/v1/transactions/by-category- Статистика по категориямGET /api/v1/transactions/monthly-summary- Месячные сводки
GET /api/v1/exchange/rates- Курсы валютPOST /api/v1/exchange/rates/update- Обновление курсовPOST /api/v1/exchange/convert- Конвертация валютGET /api/v1/exchange/balances- Балансы пользователяGET /api/v1/exchange/rate/:base/:target- Курс между валютами
GET /api/v1/health- Проверка состояния
- users - Пользователи
- currencies - Валюты
- accounts - Счета пользователей
- categories - Категории транзакций
- transactions - Транзакции
- exchange_rates - Курсы валют
- sessions - Сессии пользователей
001_init.sql- Базовая структура (пользователи, категории, транзакции)002_currencies_accounts.up.sql- Валюты и счета002_currencies_accounts.down.sql- Откат валют и счетов
- 🔐 Авторизация: логин/регистрация, хранение токена в
localStorage - 📊 Дашборд: общая статистика и графики
- 💰 Счета: управление мультивалютными счетами
- 📂 Категории: настройка категорий доходов/расходов
- 💸 Транзакции: добавление, просмотр, фильтрация
- 📈 Аналитика: статистика по периодам и категориям
- 🔄 Обмен валют: конвертация и обновление курсов
- HTML5 - семантическая разметка
- CSS3 - современные стили и анимации
- JavaScript ES6+ - интерактивность
- Chart.js - интерактивные графики
- Font Awesome - иконки
finance-tracker/
├── cmd/server/ # Точка входа приложения
├── internal/ # Внутренний код приложения
│ ├── config/ # Конфигурация
│ ├── handler/ # HTTP обработчики
│ ├── middleware/ # Middleware
│ ├── models/ # Модели данных
│ ├── repository/ # Слой данных
│ ├── service/ # Бизнес-логика
│ └── utils/ # Утилиты
├── migrations/ # SQL миграции
├── web/ # Frontend файлы
├── docker-compose.yml # Docker конфигурация
├── Dockerfile # Docker образ
└── README.md # Документация
# Запуск в режиме разработки
docker compose up -d
# Просмотр логов
docker compose logs -f app
# Пересборка после изменений
docker compose up -d --build
# Остановка
docker compose down
# Очистка данных
docker compose down -v# Проверка здоровья сервисов
curl http://localhost:8080/api/v1/health
# Тест регистрации
curl -X POST http://localhost:8080/api/v1/register \
-H "Content-Type: application/json" \
-d '{"username":"test","email":"test@example.com","password":"password123"}'| Переменная | Описание | По умолчанию |
|---|---|---|
PORT |
Порт сервера | 8080 |
DATABASE_URL |
URL базы данных | postgres://postgres:password@localhost:5432/postgres?sslmode=disable |
POSTGRES_URL_NON_POOLING |
Альтернативный URL для Supabase pooler | |
POSTGRES_URL |
Альтернативный URL для Supabase | |
POSTGRES_PRISMA_URL |
Придерживается формата Prisma/Supabase | |
POSTGRES_USER |
Имя пользователя Postgres | postgres |
POSTGRES_PASSWORD |
Пароль Postgres | `` |
POSTGRES_HOST |
Хост Postgres | localhost |
POSTGRES_PORT |
Порт Postgres | 5432 |
POSTGRES_DATABASE |
Название базы данных | postgres |
PGSSLMODE |
SSL режим для Postgres | require |
JWT_SECRET |
Секретный ключ JWT | your-super-secret-jwt-key-change-in-production |
SUPABASE_JWT_SECRET |
Альтернативный JWT секрет из Supabase | |
GIN_MODE |
Режим Gin | debug |
EXCHANGE_API_ENDPOINT |
API курсов валют | https://api.exchangerate-api.com/v4/latest/USD |
- 🔐 JWT токены с истечением срока действия
- 🛡️ Хеширование паролей с bcrypt
- 🔒 CORS настройки для фронтенда
- 🚫 Защита от SQL инъекций через параметризованные запросы
- ⚡ Многоэтапная сборка Docker для минимального размера образа
- 🗄️ Индексы базы данных для быстрых запросов
- 🔄 Connection pooling для PostgreSQL
- 📦 Статическая компиляция Go приложения
- 🏥 Health checks для Docker контейнеров
- 📊 Логирование всех операций
- 🔍 Готовность к интеграции с системами мониторинга
- Fork репозитория
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
Этот проект распространяется под лицензией MIT. См. файл LICENSE для подробностей.
Если у вас возникли вопросы или проблемы:
- Проверьте Issues на GitHub
- Создайте новый Issue с подробным описанием
- Убедитесь, что Docker и все зависимости установлены правильно
Сделано с ❤️ для управления личными финансами
- Склонить репозиторий и перейти в папку проекта
- Запустить через Docker Compose:
docker compose up -d --build
curl http://localhost:8080/api/v1/health- Открыть фронтенд: файл
web/index.htmlв браузере- Локально
web/script.jsавтоматически ставитAPI_BASE = http://localhost:8080/api/v1
- Локально
Требуется установленный Go и PostgreSQL.
- Настроить БД и переменные окружения (см.
env.example):
export DATABASE_URL="host=localhost port=5432 user=postgres password=fakha dbname=transactions sslmode=disable"
export JWT_SECRET="change-me-in-prod"
export PORT=8080-
Применить миграции (вручную выполнить SQL из
migrations/) -
Запустить сервер:
go run ./cmd/server- Открыть
web/index.htmlв браузере
docker compose up -d # старт
docker compose up -d --build # пересборка и старт
docker compose logs -f app # логи приложения
docker compose down # стоп
docker compose down -v # стоп и очистка volume'ов- Инициализация и первый коммит
git init
git add .
git commit -m "feat: initial release of WealthFlow Pro"- Создать пустой репозиторий на GitHub и привязать origin
git remote add origin https://github.com/<username>/<repo>.git
git branch -M main
git push -u origin main- Не коммитьте реальные секреты. Используйте
env.example, а.envдержите локально - Добавьте в
.gitignoreбинарники и локальные файлы (например,*.exe,app,.env) - Поменяйте
JWT_SECRETв проде и храните его в секретах CI/CD/хостинга