Международная радиолюбительская дипломная программа для работы из городских парков
Urban Parks — платформа для радиолюбителей, активирующих городские парки (вдохновлена POTA и WWFF). Активаторы выезжают в парки и проводят QSO, охотники связываются с ними и зарабатывают дипломы.
Возможности: интерактивная карта · каталог парков · активации с модерацией · ADIF-экспорт · рейтинг активаторов · мультиязычность RU/EN · админ-панель
Архитектура ADIF-загрузки, модерации и автозачёта: см. ARCHITECTURE.md.
- Backend: Laravel 12.x, PHP 8.4
- Админка: Filament 3
- Frontend: Tailwind CSS 4, Alpine.js, Vite
- Карты: Leaflet.js + MarkerCluster (OpenStreetMap)
- База данных: MySQL 8.0
- Окружение: Docker Compose (nginx, php-fpm, mysql, node, queue worker)
Требуется только Docker Desktop. PHP, Composer, Node и MySQL на хост ставить не нужно.
git clone https://github.com/loloka/urban-parks.git cd urban-parks copy .env.example .env # Поднять контейнеры (первый раз соберётся образ PHP, ~2-3 минуты) docker compose up -d --build # Зависимости и инициализация docker compose exec app composer install docker compose exec app php artisan key:generate docker compose exec app php artisan migrate --seed docker compose exec app php artisan make:filament-user
Готово:
- Сайт: http://localhost:8080
- Админка: http://localhost:8080/admin
- Vite HMR: порт 5173 (контейнер
nodeзапускаетnpm run devсам) - MySQL снаружи (HeidiSQL/DBeaver):
localhost:3306, логин/пароль из.env
docker compose exec app php artisan migrate # миграции docker compose exec app php artisan test # тесты docker compose exec app composer format # php-cs-fixer docker compose exec node npm run build # прод-сборка фронта docker compose logs -f app # логи PHP docker compose down # остановить (данные БД сохраняются) docker compose down -v # остановить и стереть БД
Порты можно поменять в .env: APP_PORT, FORWARD_DB_PORT, VITE_PORT.
| Сервис | Что делает |
|---|---|
app |
PHP 8.4 FPM + Composer (образ из docker/php/Dockerfile) |
nginx |
Веб-сервер, порт 8080 → 80 |
mysql |
MySQL 8.0, данные в томе mysql-data |
queue |
php artisan queue:work — фоновые задачи |
node |
Vite dev-сервер с HMR (только для разработки) |
urban-parks/
├── app/Filament/ # Админ-панель (Resources, Widgets)
├── app/Http/Controllers/ # ParkController, ActivationController
├── app/Models/ # Park, Activation, Qso, ActivationProof
├── app/Services/Adif/ # Парсер ADIF-логов (+ тесты)
├── database/migrations/ # Миграции БД
├── database/seeders/ # Тестовые данные
├── docker/ # Dockerfile, конфиги nginx и PHP
├── resources/views/ # Blade-шаблоны
├── routes/web.php # Роуты + API
└── ARCHITECTURE.md # Архитектура UPTA (БД, ADIF, модерация, СРР)
GET /api/parks— парки (параметры:city,region,search)GET /api/cities— города со счётчикамиGET /api/regions— регионы со счётчикамиGET /park/{park}/adif— экспорт активаций парка в ADIF
UP-<страна>-<регион>-<номер>: например UP-RU-NSK-0001 (Россия, Новосибирская область). Номер выдаётся автоматически при создании парка в админке.
- v1.2 (в работе): загрузка ADIF-логов активаторами · таблица QSO · фото-пруфы · экран модерации · личный кабинет
- v1.3: дипломы и PDF-сертификаты · статистика охотников · email-уведомления
- v2.0: синхронизация с СРР (автозачёт охотников) · Telegram-бот · другие страны
Подробности — в ARCHITECTURE.md, §7.
MIT License
R9OGL & UA9OTW · @loloka
Благодарности: POTA · WWFF · OpenStreetMap · Laravel
📧 info@urbanparks.ru · 🌐 vk.com/urbanparks
73! Приятных QSO из парков! 📡🌳