MAPPEX: прототип межведомственного пункта наблюдения

Интерактивный дашборд по макету Figma «Government Dashboards»: карта РФ
(2D, вид с дрона в 3D, спутник, гибрид), ленты событий с вызовом ведомств
в 1 клик, ИИ-автопилот назначений, журнал, профиль, радар, статистика,
режимы «Ночное время», «Плохое зрение» и «Максимальная контрастность».
Vite + React + TypeScript, MapLibre GL, zustand. Лицензия MIT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Renat Usmanov
2026-10-23 12:59:45 +03:00
co-authored by Claude Opus 5.5
commit 57a4411f57
138 changed files with 10815 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
# MAPPEX — статический прототип на mappex.yappix.ru.
# Установка на сервере:
# sudo certbot certonly --webroot -w /var/www/certbot -d mappex.yappix.ru # сертификат (нужен блок :80)
# sudo cp deploy/nginx-mappex.yappix.ru.conf /etc/nginx/sites-available/mappex.yappix.ru
# sudo ln -sf /etc/nginx/sites-available/mappex.yappix.ru /etc/nginx/sites-enabled/
# sudo nginx -t && sudo systemctl reload nginx
server {
listen 80;
listen [::]:80;
server_name mappex.yappix.ru;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
default_type "text/plain";
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name mappex.yappix.ru;
ssl_certificate /etc/letsencrypt/live/mappex.yappix.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mappex.yappix.ru/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/mappex;
index index.html;
# воркер MapLibre — ES-модуль: браузер требует JavaScript-тип
types {
text/html html;
text/css css;
application/javascript js mjs;
application/json json;
application/geo+json geojson;
image/svg+xml svg;
image/png png;
image/jpeg jpg jpeg;
font/woff2 woff2;
image/x-icon ico;
}
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/css application/javascript application/json application/geo+json image/svg+xml;
# файлы сборки с хешем в имени — навсегда
location /assets/ {
add_header Cache-Control "public, max-age=31536000, immutable" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
try_files $uri =404;
}
location /data/ {
add_header Cache-Control "public, max-age=86400" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
try_files $uri =404;
}
location / {
add_header Cache-Control "no-cache" always;
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
try_files $uri $uri/ /index.html;
}
# заголовки безопасности — в каждом location: add_header там отменяет наследование с уровня server
access_log /var/log/nginx/mappex-yappix-access.log;
error_log /var/log/nginx/mappex-yappix-error.log;
}
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Выкладка прототипа на сервер: сборка → rsync dist/ → права для nginx.
# DEPLOY_HOST=root@host DEPLOY_REMOTE=/var/www/mappex/ bash deploy/publish.sh
# По умолчанию — VDS YappiX (алиас yappix-vds из ~/.ssh/config) и https://mappex.yappix.ru.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
HOST="${DEPLOY_HOST:-yappix-vds}"
REMOTE="${DEPLOY_REMOTE:-/var/www/mappex/}"
cd "$ROOT"
npm run build
ssh "$HOST" "mkdir -p $REMOTE"
# rsync переносит права macOS (например, 700) — без chmod nginx (www-data) ответит 403
rsync -az --delete dist/ "$HOST:$REMOTE"
ssh "$HOST" "chown -R www-data:www-data $REMOTE && find $REMOTE -type f -exec chmod 644 {} + && find $REMOTE -type d -exec chmod 755 {} +"
echo "Выложено: $HOST:$REMOTE"