Минимальный, но полнофункциональный backend для поиска и фильтрации организаций из базы данных 2ГИС.
Стек:
- FastAPI (Python 3.10+)
- PostgreSQL 12+
- HTML5 + Vanilla JS + Tailwind CSS
- Jinja2 (для шаблонов)
Без Docker, без лишних зависимостей.
Смотрите INSTALL.md
psql -U postgres -f schema.sqlpython -m venv venv
source venv/bin/activate # или venv\Scripts\activate на Windows
pip install -r requirements.txtcp .env.example .env
# Отредактируйте .env с вашими параметрами PostgreSQLЕсли у вас уже есть SQLite база:
python migrate_sqlite_to_postgres.pypython main.py
# или
python -m uvicorn main:app --reloadОткройте браузер: http://localhost:8000
- Фильтрация по городу
- Фильтрация по категории/рубрике
- Фильтр по наличию email, телефона, сайта
- Регулировка количества результатов
- Таблица с результатами (имя, город, домен, телефон, email, категории)
- Экспорт в CSV
GET /api/companies?city=Москва&category=Кафе&has_email=true&limit=50
GET /api/companies/{id}
GET /api/export?city=Москва&limit=1000
- Batch insert при миграции (1000 записей за раз)
- Индексы на все поля поиска
- Пулинг соединений к БД
- Легкий HTML + CSS без излишеств
dbgis-backend/
├── main.py # FastAPI сервер + API endpoints
├── migrate_sqlite_to_postgres.py # Миграция из SQLite
├── schema.sql # Схема PostgreSQL
├── requirements.txt # Python зависимости
├── .env.example # Пример конфигурации
├── INSTALL.md # Подробная инструкция установки
├── README.md # Этот файл
└── templates/
└── index.html # Web интерфейс
8 таблиц, синхронизированы с dgdat2xlsx/import_db.py:
- companies — организации
- branches — филиалы/подразделения
- phones — телефоны филиалов
- emails — email адреса
- socials — соцсети (VK, Facebook, Twitter...)
- categories — иерархия рубрик
- company_categories — связь компаний с рубриками
- company_aliases — альтернативные названия
GET /health
Response:
{
"status": "ok",
"message": "API и БД работают"
}GET /api/companies?city=Москва&category=Кафе&has_email=true&limit=50&offset=0
Query Parameters:
city(str) — фильтр по городу (ILIKE)category(str) — фильтр по категорииhas_email(bool) — только с emailhas_phone(bool) — только с телефономhas_website(bool) — только с сайтомlimit(int, default 50) — количество результатовoffset(int, default 0) — смещение
Response:
{
"total": 1234,
"limit": 50,
"offset": 0,
"data": [
{
"id": 123,
"name": "Кафе Парадиз",
"city": "Москва",
"domain": "cafe-paradiz.ru",
"website": "http://cafe-paradiz.ru",
"phone": "+7-999-123-45-67",
"email": "info@cafe-paradiz.ru",
"categories": "Питание, Кафе, Сладкое"
}
]
}GET /api/companies/123
Response:
{
"company": {
"id": 123,
"name": "Кафе Парадиз",
"city": "Москва",
"domain": "cafe-paradiz.ru",
"website": "http://cafe-paradiz.ru",
"created_at": "2024-01-15T10:30:00"
},
"branches": [
{
"id": 1,
"address": "ул. Ленина, д. 10",
"postal_code": "119991",
"working_hours": "пн-вс: 10:00 - 22:00",
"phones": ["+7-999-123-45-67"]
}
],
"emails": ["info@cafe-paradiz.ru"],
"categories": [{"name": "Кафе", "parent_id": null}],
"socials": {
"v": "https://vk.com/cafe_paradiz",
"a": "https://facebook.com/cafe.paradiz"
}
}GET /api/export?city=Москва&category=Кафе&limit=5000
Возвращает CSV файл: dbgis_export_20240315_143022.csv
Колонки:
ID,Название,Город,Домен,Сайт,Телефон,Email,Категории
123,"Кафе Парадиз","Москва","cafe-paradiz.ru","http://cafe-paradiz.ru","+7-999-123-45-67","info@cafe-paradiz.ru","Питание, Кафе"
.env файл:
# PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=dbgis
DB_USER=postgres
DB_PASSWORD=your_password
# FastAPI
API_HOST=0.0.0.0
API_PORT=8000
DEBUG=False
# Миграция
SQLITE_PATH=../dgdat2xlsx/data/local.dbhttp://localhost:8000/?city=Москва&category=Кафе&has_website=on
curl "http://localhost:8000/api/companies?limit=100"curl "http://localhost:8000/api/companies?has_email=true&has_website=true&limit=50"curl "http://localhost:8000/api/export?city=Санкт-Петербург&limit=10000" > spb_companies.csvpip install gunicorn
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000Создайте /etc/systemd/system/dbgis.service:
[Unit]
Description=dbgis API Server
After=network.target postgresql.service
[Service]
Type=notify
User=www-data
WorkingDirectory=/path/to/dbgis-backend
Environment="PATH=/path/to/dbgis-backend/venv/bin"
ExecStart=/path/to/dbgis-backend/venv/bin/gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker
[Install]
WantedBy=multi-user.targetВключить и запустить:
sudo systemctl enable dbgis
sudo systemctl start dbgis# Проверьте, запущен ли PostgreSQL
psql -U postgres -c "SELECT 1"
# Проверьте .env параметры
cat .env | grep DB_psql -U postgres -d dbgis
# В psql:
SELECT COUNT(*) FROM companies;
SELECT COUNT(*) FROM categories;# С DEBUG=True в .env будут подробные логи
python main.py- API Schema — Swagger UI (автоматически)
- Альтернативная документация — ReDoc
- PostgreSQL Docs
- FastAPI Tutorial
Проект полностью синхронизирован с dgdat2xlsx:
- Схема БД совпадает с
import_db.py - Миграция читает из SQLite базы (
dgdat2xlsx/data/local.db) - Одна команда:
python migrate_sqlite_to_postgres.py
Этот проект использует алгоритмы из DgdatToXlsx.
- ✅ Основной backend готов
- ✅ Web интерфейс работает
- ✅ CSV экспорт готов
Идеи для расширения:
- Кеширование Redis
- Аутентификация (JWT)
- История поисков
- Сохраненные фильтры
- Расширенные статистики
- Интеграция с Telegram Bot API
- Mobile app (React Native)
Успехов! 🚀