Compare commits

..

3 Commits

Author SHA1 Message Date
striker
bafd42b774 ci: add Trivy image scan to Gitea Actions 2026-05-21 13:42:46 +03:00
striker
5dca709ff2 feat(indexnow): add IndexNow key file and trigger script 2026-05-21 13:41:52 +03:00
striker
a34a0c6093 feat(seo): add security.txt, humans.txt, Schema.org JSON-LD 2026-05-21 13:39:29 +03:00
25 changed files with 278 additions and 736 deletions

View File

@@ -25,7 +25,24 @@ jobs:
printf '%s\n' "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
- name: Deploy + Trivy scan to web.hhivp.com
- name: Build image for security scan
run: |
docker build -t pushkinohistory-ru-v2:scan .
- name: Trivy image scan (HIGH+CRITICAL, warning only)
run: |
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD":/workspace \
ghcr.io/aquasecurity/trivy:latest \
image \
--severity HIGH,CRITICAL \
--ignore-unfixed \
--no-progress \
--exit-code 0 \
pushkinohistory-ru-v2:scan
- name: Deploy to web.hhivp.com
run: |
ssh -i ~/.ssh/id_deploy striker@web.hhivp.com bash -s <<'REMOTE'
set -euo pipefail
@@ -46,22 +63,6 @@ jobs:
cd "$DEPLOY_PATH"
mkdir -p data
docker compose build
# Trivy scan свежесобранного образа на хосте (docker есть здесь).
# ghcr.io вместо docker.io — обход rate limit. HIGH/CRITICAL warning-only.
echo "=== Trivy scan: pushkinohistory-ru-v2:latest ==="
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/trivy-cache:/root/.cache/ \
ghcr.io/aquasecurity/trivy:latest image \
--severity HIGH,CRITICAL \
--ignore-unfixed \
--no-progress \
--exit-code 0 \
--timeout 5m \
pushkinohistory-ru-v2:latest || true
echo "=== Trivy scan done ==="
docker compose up -d
sleep 5
docker compose ps

View File

@@ -1,72 +0,0 @@
name: security
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
jobs:
security:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # GitLeaks нужна полная история
# ── 1. Hadolint: проверка Dockerfile ──────────────────────────────
# Установка нативного бинаря (act_runner не имеет docker внутри).
- name: Install Hadolint
run: |
if [ -f Dockerfile ]; then
curl -sSL https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64 -o /usr/local/bin/hadolint
chmod +x /usr/local/bin/hadolint
fi
- name: Run Hadolint
run: |
if [ -f Dockerfile ]; then
hadolint --no-fail Dockerfile || true
else
echo "No Dockerfile — skip"
fi
# ── 2. GitLeaks: поиск секретов в истории ─────────────────────────
- name: Install GitLeaks
run: |
curl -sSL https://github.com/gitleaks/gitleaks/releases/download/v8.21.2/gitleaks_8.21.2_linux_x64.tar.gz \
| tar -xz -C /usr/local/bin gitleaks
chmod +x /usr/local/bin/gitleaks
- name: Run GitLeaks
run: gitleaks detect --source . --no-banner --verbose --redact --exit-code 0 || true
# ── 3. Semgrep: SAST ──────────────────────────────────────────────
- name: Install Semgrep
run: |
apt-get update -qq
apt-get install -y --no-install-recommends python3-pip python3-venv
python3 -m venv /tmp/sg && /tmp/sg/bin/pip install --quiet semgrep
ln -sf /tmp/sg/bin/semgrep /usr/local/bin/semgrep
- name: Run Semgrep
run: |
semgrep --config=p/javascript --config=p/react --config=p/typescript --config=p/security-audit \
--severity=ERROR --severity=WARNING --no-error --quiet --metrics=off --timeout=120 . || true
# ── 4. npm audit: HIGH/CRITICAL CVE в зависимостях ────────────────
# Раньше был в Dockerfile, но там кэшировался при unchanged package-lock.json.
# Вынесен сюда — реально запускается каждый push.
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: npm audit
run: |
if [ -f package-lock.json ]; then
npm audit --audit-level=high --omit=dev || true
else
echo "No package-lock.json — skip npm audit"
fi

View File

@@ -1,59 +0,0 @@
name: security
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
schedule:
# Каждый понедельник 03:00 UTC — независимый weekly scan
- cron: '0 3 * * 1'
permissions:
contents: read
security-events: write
jobs:
hadolint:
runs-on: ubuntu-latest
if: hashFiles('Dockerfile') != ''
steps:
- uses: actions/checkout@v4
- uses: hadolint/hadolint-action@v3.1.0
with:
dockerfile: Dockerfile
failure-threshold: error
continue-on-error: true
gitleaks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
semgrep:
runs-on: ubuntu-latest
container:
image: returntocorp/semgrep:latest
steps:
- uses: actions/checkout@v4
- run: semgrep ci --config=p/javascript --config=p/react --config=p/typescript --config=p/security-audit
continue-on-error: true
trivy:
runs-on: ubuntu-latest
if: hashFiles('Dockerfile') != ''
steps:
- uses: actions/checkout@v4
- uses: aquasecurity/trivy-action@master
with:
scan-type: fs
scan-ref: .
severity: HIGH,CRITICAL
ignore-unfixed: true
exit-code: '0'

10
.gitignore vendored
View File

@@ -1,13 +1,3 @@
# Security: НЕ коммитить production logs и CMS data exports
# (могут содержать API keys, JWT, private_key). См. инцидент 2026-05-24.
content/logs/
content/data/
*.production.log
*.production.log.*
ghost.json
ghost.*.json
*.ghost.*.json
node_modules/
dist/
.astro/

View File

@@ -1,49 +0,0 @@
# GitLeaks config для сателлитных сайтов hhivp.
# Extends default rules and adds allowlist for known false-positives.
# https://github.com/gitleaks/gitleaks#configuration
[extend]
useDefault = true
[allowlist]
description = "Allowlist for IndexNow public keys + legacy WP plugin code"
# Пути, которые целиком игнорируем
paths = [
# IndexNow validation file (32-hex .txt в корне или в public/).
# Это публичный ключ, по дизайну отдаётся всем — НЕ секрет.
'''public/[a-f0-9]{32}\.txt''',
'''^[a-f0-9]{32}\.txt$''',
# IndexNow ping-скрипты содержат `const KEY = '<32hex>'` —
# тот же публичный ключ, не секрет (для авторизации перед Яндекс/Bing API).
'''scripts/indexnow\.(js|mjs|sh|ts)$''',
'''scripts/indexnow-ping\.sh$''',
# Legacy WordPress plugin code (akismet, jetpack, wpforms-lite, wp-cache).
# Все "ключи" внутри — placeholder/template/internal параметры,
# не настоящие секреты. Импортировано из старого WP-сайта как static.
'''wp-content/.*''',
# Минифицированные ассеты — часто содержат hash'и/токены, не секреты.
'''.*\.min\.(js|css)$''',
'''dist/.*''',
'''build/.*''',
# Защита на случай возврата CMS exports / production logs в репо
# (см. инцидент 2026-05-24 с Ghost ghost_private_key + members_private_key).
# Сами файлы УЖЕ удалены из history через git filter-repo, allowlist —
# дополнительная защита для будущих commit'ов.
'''content/logs/.*''',
'''content/data/.*''',
'''.*\.production\.log(\.[0-9]+)?$''',
'''.*\.ghost\..*\.json$''',
]
# Конкретные паттерны, которые false-positive
regexes = [
# Наш scripts/indexnow.js: const KEY = '<32-hex>' — IndexNow public key.
'''const\s+KEY\s*=\s*['"][a-f0-9]{32}['"]''',
# Аналог для других форм объявления того же ключа.
'''KEY\s*[:=]\s*['"][a-f0-9]{32}['"]''',
]

View File

@@ -174,17 +174,8 @@ npm run preview
Если 4321 занят — Astro сам найдёт следующий свободный (4322 и т.д.).
## SEO — правила для контента
**Обязательно** для каждого нового поста/страницы в `src/content/{posts,pages}/*.md`:
- `description:` — уникальное, 120160 символов. **Не оставлять пустым** — пустая строка не падает на дефолт `SITE_DESCRIPTION`, а передаётся в `<meta>` как есть.
- `[slug].astro` передаёт `description={entry.data.description ?? ''}` → BaseLayout. Если `''` — meta пустой.
**RSS-агрегатор новостей:** источники добавляются в `src/data/feeds.json` (`{name, url, enabled: true, max}`). После push → CI → на следующем cron-тике (каждый час в `:12`) появятся на `/news/`.
## История
- **2026-05-08:** v1 (WordPress 6.x) контейнеризован, миграция со str-u-01 на web.hhivp.com
- **2026-05-14:** фикс trust-proxy.conf для Docker bridges (Better WP Security)
- **2026-05-21:** v2 редизайн — Vite+React → Astro 5 (стек как у `anotherreflections-website-v2`). Cutover, бэкап старого WP в репо `pushkinohistory-ru` + БД на `db.hhivp.com` (~2 недели на наблюдение).
- **2026-05-30:** заполнены descriptions всем 11 страницам/постам (были пустыми → дубли в Я.Вебмастере).

View File

@@ -3,7 +3,6 @@
# ─── Stage 1: build static site (Astro SSG) ────────────────────────────────
FROM node:22-alpine AS build
WORKDIR /app
SHELL ["/bin/sh", "-o", "pipefail", "-c"]
COPY package.json package-lock.json* ./
RUN npm install --no-audit --no-fund

View File

@@ -1,54 +0,0 @@
# pushkinohistory.ru
Сайт «История города Пушкино» — портал с историческими материалами, новостями и агрегатором региональных RSS-источников.
**Production:** https://pushkinohistory.ru
> **Mirror.** Source-of-truth: `git.striker.su/striker/pushkinohistory-ru-v2`. Этот репозиторий на GitHub — резервная копия + площадка для GitHub Actions security-сканов.
## Стек
- **Astro 5** + Content Collections + markdown
- **nginx:1.29-alpine** в runtime-контейнере
- **PT Serif** (заголовки/тело статьи) + **IBM Plex Sans** (UI)
- **sanitize-html** — очистка тела поста для RSS `<content:encoded>` с CDATA
- **fast-xml-parser** — изолированный cron-агрегатор внешних RSS
## Деплой
`git push` → Gitea Actions (`.gitea/workflows/deploy.yml`) → SSH на `web.hhivp.com`:
1. `git pull --ff-only` в `/opt/docker/sites/pushkinohistory-ru-v2`
2. `docker compose build`
3. **Trivy** scan свежесобранного образа (HIGH/CRITICAL, warning-only)
4. `docker compose up -d` → healthcheck `http://127.0.0.1:4146/`
5. **IndexNow** ping Яндекс/Bing (sitemap-based)
6. `docker image prune -af --filter "until=168h"`
Контейнер `pushkinohistory-ru-v2:4146` за хостовым nginx.
## Security
Все автоматические проверки описаны в [`SECURITY.md`](SECURITY.md):
- **Layer A** (на каждый push): Trivy + npm audit
- **Layer B** (weekly cron на rd.hhivp.com): Nuclei DAST
- **Layer C** (на push + MR): Hadolint + GitLeaks + Semgrep
## Локальная разработка
```bash
npm install
npm run dev # http://localhost:4321
npm run build # → dist/ (статика)
npm run preview
```
## История
- **2026-05-21:** v2 — Astro 5 + Content Collections.
- **2026-05-23:** WordPress v1 контейнер удалён, бэкапы в `/opt/backup/`.
## Контакты
- Email: admin@hhivp.com
- Site: https://hhivp.com/

View File

@@ -1,45 +0,0 @@
# Security Policy
## Supported versions
Только текущая версия `main` — site deployed continuously, отдельных release-веток нет.
## Reporting a vulnerability
Email: **admin@hhivp.com** (PGP опционально по запросу).
Просим **не публиковать** баг до подтверждения исправления (≤14 дней).
## Security stack (automated)
Этот репозиторий покрыт многоуровневой автоматической проверкой:
### Layer A — на каждый push в `main` (deploy CI)
- **Trivy** — сканирование Docker image на HIGH/CRITICAL CVE в OS-пакетах и npm-deps (warning-only, `--ignore-unfixed`).
- **npm audit** — проверка зависимостей на известные CVE в `Dockerfile` после `npm ci` (warning-only, `--audit-level=high --omit=dev`).
### Layer B — еженедельно (Sun 04:00 UTC, cron)
- **Nuclei** — DAST (Dynamic Application Security Testing) живого сайта. Шаблоны: exposures, misconfig, headers, CVE. Severity: HIGH+CRITICAL.
- Нотификация в Telegram при находках.
### Layer C — на каждый push в `main` + на MR/PR (`.gitea/workflows/security.yml`)
- **Hadolint** — bad practices в `Dockerfile`.
- **GitLeaks** — поиск секретов в git-истории (`fetch-depth: 0`).
- **Semgrep** — SAST (Static Application Security Testing) с конфигами `p/javascript`, `p/react`, `p/typescript`, `p/security-audit`.
Все три инструмента **warning-only** — не блокируют deploy, но finding'и видны в логах job'а.
### Дополнительно
- **152-ФЗ consent-gated analytics** — Я.Метрика и Google Analytics загружаются только после явного согласия пользователя в баннере cookies.
- **HTTPS-only** — Let's Encrypt cert, HSTS включён.
- **Security headers** — `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`, `Permissions-Policy`, `Content-Security-Policy`.
- **Rate limiting** — на `/api/contact` (5 req/min per IP) + Cloudflare Turnstile widget.
## Contact
- Email: admin@hhivp.com
- Site: https://hhivp.com/

33
package-lock.json generated
View File

@@ -17,6 +17,7 @@
},
"devDependencies": {
"@types/sanitize-html": "^2.16.0",
"fast-xml-parser": "^4.5.0",
"sharp": "^0.34.5"
},
"engines": {
@@ -2408,6 +2409,25 @@
"xml-naming": "^0.1.0"
}
},
"node_modules/fast-xml-parser": {
"version": "4.5.6",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz",
"integrity": "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT",
"dependencies": {
"strnum": "^1.0.5"
},
"bin": {
"fxparser": "src/cli/cli.js"
}
},
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -4497,6 +4517,19 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/strnum": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz",
"integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT"
},
"node_modules/svgo": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz",

View File

@@ -1,7 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 92 92" role="img" aria-label="hhivp" fill="currentColor">
<g transform="translate(-4 -2)">
<path d="M86.316,43.946V26.322h-8.331v9.961H70.46c-0.845-7.146-6.931-12.711-14.301-12.711H39.842c-7.37,0-13.456,5.564-14.301,12.711h-7.527v-6.162c3.013-1.554,4.934-4.675,4.934-8.083c0-3.775-2.382-7.199-5.928-8.519l-1.012-0.377v10.897H11.69V13.142l-1.012,0.376c-3.546,1.32-5.929,4.744-5.929,8.52c0,3.408,1.921,6.529,4.934,8.083v17.623h8.331v-9.96h7.428c-0.001,0.067-0.01,0.132-0.01,0.199v18.024c0,5.872,3.535,10.926,8.584,13.169l-1.052,4.606c-1.821,1.184-3.031,3.232-3.031,5.561c0,2.352,3.573,3.186,6.632,3.186c3.059,0,6.632-0.834,6.632-3.186c0-2.168-1.05-4.091-2.664-5.302l2.324-3.625h10.283l2.324,3.625c-1.614,1.211-2.664,3.133-2.664,5.301c0,2.352,3.573,3.186,6.632,3.186c3.06,0,6.632-0.834,6.632-3.186c0-2.33-1.209-4.378-3.03-5.562l-1.05-4.606c5.049-2.244,8.583-7.297,8.583-13.169V37.982c0-0.067-0.009-0.132-0.01-0.199h7.427v6.163c-3.012,1.553-4.932,4.674-4.932,8.083c0,3.775,2.382,7.199,5.928,8.52l1.012,0.377V50.027h4.317v10.898l1.012-0.377c3.545-1.32,5.928-4.744,5.928-8.52C91.25,48.62,89.329,45.5,86.316,43.946z M16.957,28.966l-0.442,0.199v17.079h-5.331V29.165l-0.442-0.199C8.013,27.74,6.25,25.021,6.25,22.038c0-2.778,1.546-5.329,3.94-6.649v10.151h7.318V15.388c2.394,1.321,3.939,3.872,3.939,6.649C21.448,25.021,19.685,27.74,16.957,28.966z M41.698,79.343c0,0.814-2.062,1.686-5.132,1.686c-3.07,0-5.132-0.872-5.132-1.686c0-2.83,2.303-5.132,5.133-5.132C39.396,74.211,41.698,76.513,41.698,79.343z M64.566,79.343c0,0.814-2.062,1.686-5.132,1.686c-3.07,0-5.132-0.872-5.132-1.686c0-2.83,2.303-5.132,5.133-5.132C62.264,74.211,64.566,76.513,64.566,79.343z M69.069,56.006c0,7.119-5.792,12.911-12.911,12.911H39.842c-7.119,0-12.91-5.792-12.91-12.911V37.982c0-7.119,5.792-12.91,12.91-12.91h16.316c7.119,0,12.911,5.792,12.911,12.91V56.006z M85.811,58.679V48.527h-7.317v10.151c-2.394-1.322-3.939-3.872-3.939-6.65c0-2.983,1.762-5.703,4.489-6.928l0.443-0.199v-17.08h5.331v17.08l0.443,0.199c2.728,1.226,4.491,3.945,4.491,6.928C89.75,54.808,88.205,57.358,85.811,58.679z"/>
<circle cx="40.222" cy="40.07" r="3.8"/>
<circle cx="55.78" cy="40.07" r="3.8"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -4,14 +4,8 @@ Allow: /
# AI-crawlers
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Applebot-Extended
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: Google-Extended

View File

@@ -13,14 +13,6 @@ const year = new Date().getFullYear();
<a href="/privacy/">Политика</a>
</div>
</div>
<div class="container dev-credit">
<a href="https://hhivp.com/" target="_blank" rel="noopener" class="hhivp-credit" aria-label="Сделано в hhivp.com">
<span class="hhivp-credit-mark" aria-hidden="true">
<img src="/hhivp-mark.svg" alt="" width="20" height="20" />
</span>
<span class="hhivp-credit-text">Сделано&nbsp;в&nbsp;hhivp.com</span>
</a>
</div>
</footer>
<style>
@@ -41,42 +33,4 @@ const year = new Date().getFullYear();
.footer-nav { display: flex; gap: 1.25rem; }
.footer-nav a { color: var(--muted); text-decoration: none; }
.footer-nav a:hover { color: var(--accent); }
.dev-credit {
margin-top: 0.75rem;
color: var(--muted);
text-align: center;
}
.hhivp-credit {
display: inline-flex;
align-items: center;
vertical-align: middle;
text-decoration: none;
color: inherit;
border: 1px solid currentColor;
border-radius: 999px;
padding: 3px;
gap: 0;
line-height: 1;
opacity: 0.6;
transition: gap 240ms ease, padding-right 240ms ease, opacity 240ms ease;
}
.hhivp-credit:hover,
.hhivp-credit:focus-visible {
opacity: 1;
gap: 8px;
padding-right: 12px;
outline: none;
}
.hhivp-credit-mark { display: inline-flex; flex-shrink: 0; }
.hhivp-credit-mark img { display: block; width: 20px; height: 20px; }
.hhivp-credit-text {
display: inline-block;
overflow: hidden;
white-space: nowrap;
max-width: 0;
font-size: 0.74rem;
transition: max-width 240ms ease;
}
.hhivp-credit:hover .hhivp-credit-text,
.hhivp-credit:focus-visible .hhivp-credit-text { max-width: 200px; }
</style>

View File

@@ -3,20 +3,14 @@ title: "Главная"
slug: dobro-pozhalovat
legacyId: 23
pubDate: 2010-02-22T18:52:14+03:00
description: "Портал об истории, настоящем и будущем города Пушкино: краеведческие материалы, фотоархив и форум для жителей и всех, кто интересуется историей Пушкинского района."
description: ""
oldSlug: "%d0%b4%d0%be%d0%b1%d1%80%d0%be-%d0%bf%d0%be%d0%b6%d0%b0%d0%bb%d0%be%d0%b2%d0%b0%d1%82%d1%8c"
---
<p style="text-align: center;"><strong><span style="color: #000000; size: 18;"><a href="/uploads/IMG_2156.jpg"><img class="aligncenter size-medium wp-image-42" title="Пушкино с высоты" src="/uploads/IMG_2156.jpg" alt="" width="300" height="225" /></a></span></strong></p>
<p style="text-align: center;"><strong><span style="color: #000000; size: 18;">Приветствуем Вас на страницах портала, посвященного</span></strong></p>
<p style="text-align: center;"><strong>истории города Пушкино и всего что с ним связано!</strong></p>
<p>В настоящее время портал находится в стадии разработки, но уже запущен тестовый <span style="text-decoration: underline;"><a href="http://forum.pushkinohistory.ru/">форум</a></span>, на котором уже можно общаться как с нами, создателями сайта, так и с другими пользователями. Надеемся, что вам здесь понравится!</p>

View File

@@ -3,13 +3,10 @@ title: "Форум"
slug: forum
legacyId: 94
pubDate: 2010-04-02T11:00:52+03:00
description: "Форум сайта pushkinohistory.ru — площадка для общения жителей и гостей города Пушкино, обсуждения истории, новостей и событий."
description: ""
---
<p><meta http-equiv="Refresh" content="0;url=http://forum.pushkinohistory.ru"><br />
<center>перенаправление на форум....<br />

View File

@@ -3,30 +3,19 @@ title: "Фото"
slug: foto
legacyId: 73
pubDate: 2010-03-27T23:00:41+03:00
description: "Фотоархив города Пушкино: исторические и современные фотографии, виды города в разные эпохи."
description: ""
oldSlug: "%d1%84%d0%be%d1%82%d0%be"
---
<table style="height: 100%;" border="0" cellspacing="0" cellpadding="0" width="100%" align="center">
<tbody>
<tr width="100%">
<td width="50%" align="center" valign="middle">
[caption id="attachment_87" align="aligncenter" width="150" caption="Прошлое"]<a href="http://www.pushkinohistory.ru/archives/75"><img class="size-full wp-image-87" title="pushkino" src="/uploads/pushkino.jpg" alt="Прошлое" width="150" height="200" /></a>[/caption]</td>

View File

@@ -3,107 +3,57 @@ title: "История"
slug: history
legacyId: 20
pubDate: 2010-02-22T18:46:33+03:00
description: "История города Пушкино с XIV века: от боярина Григория Пушки до современного города. Краеведческие материалы, архивные сведения, история поселений Пушкинского района."
description: ""
---
<div id="postContainer32317411">
<div id="post32317411">
<div>
<div id="comment32317411"><a href="/uploads/post-78-1227537465.jpg"><img class="size-medium wp-image-39 alignleft" title="Станция Пушкино" src="/uploads/post-78-1227537465.jpg" alt="" width="300" height="191" /></a>По наиболее распространённой версии, название Пушкино произошло во второй половине XIV века, когда местностью по реке Уче владел боярин Григорий Александрович Морхинин, по прозвищу Пушка — предок поэта Александра Сергеевича Пушкина.Историк С. Б. Веселовский указывает: «По актам известно, что в конце XV века оно принадлежало как „старинное“ митрополитам всея Руси, а после учреждения патриаршества стало домовой вотчиной патриархов. Как и когда оно досталось митрополичьему дому, неизвестно. Возможно, что оно было приобретено в третьей четверти XIV в. митрополитом Алексеем непосредственно у Григория Пушки, но не исключена возможность, что оно было отчуждено кем-либо из многочисленных потомков Григория Пушки в XV в.».
Первое документальное упоминание о селе Пушкино относится к 1499 году («писцовая книга князя В. И. Голенина на митрополичье село Пушкино Московского уезда»). Село находилось на древнейшей в Северо-Восточной Руси торговой дороге по пути в Переславль, Ярославль, Вологду, что способствовало росту его населения и высокому достатку жителей.
Летний театр в городском парке, начало 20 века
Во 2-й половине XVIII века начинает развиваться ткацкий промысел: производство шерстяного сукна, каразеи, кушаков, шёлковых платков. В 1-й половине XIX века в с. Пушкино в это время открываются медный завод, шерстоткацкая фабрика, оснащённая одной из первых в Московском уезде механическими станками. К концу 19 столетия село превратилось в фабричный центр.
В 1867 года началось дачное строительство. В 1868 году было открыто земское училище для детей от 8 до 14 лет. В 1890 году на средства Арманда открылась библиотека.
В 1880 году недалеко от станции был разбит парк, и он стал излюбленным местом отдыха пушкинских дачников. В 1896 году на средства страхового общества «Якорь» был выстроен в парке летний театр, сгоревший летом 1993 года.
По данным справочника 1890 года в селе Пушкино, которое тогда входило в Мытищинскую волость Московского уезда Московской губернии, проживало 1164 человека, а в 1899 году проживало уже 1560 человек. Согласно границам населённых пунктов того времени село Пушкино находилось в 27 километрах от Москвы и в полутора километрах от станции «Пушкино» Московско-Ярославско-Архангельской железной дороги. От вокзала до станции «Пушкино» 30 километров. В то время в Пушкине располагалась квартира урядника, земское училище, училище при фабрике Арманд и богадельня.
В справочнике 1912 года на месте современного города указано два различных населённых пункта:
* село Пушкино в 233 двора, расположенное в 2,7 км от станции «Пушкино». В селе находились квартиры 2-х урядников, земское училище, фабрика Арманд, больница при фабрике и аптека, церковно-приходская школа, потребительская лавка, вольная пожарная дружина, казённая винная лавка, трактир 2-го разряда, трактир 3-го разряда, ренсковый погреб, две пивных трактирного промысла.
* отдельно указано дачное место «Пушкино», расположенное в непосредственной близости от ж/д станции «Пушкино», без указания количества домов. В дачном месте находилась квартира пристава 4 стана и конно-полицейской стражи и церковно-приходская школа. Кроме того, в справочнике 1909 года в дачном посёлке числятся приют для выздоравливающих детей Беренштама, приют для излечения душевнобольных привилегированного сословия и лечебница Голубевской.<!--more-->В 1914 году в селе Пушкине располагалась почтово-телеграфная контора (заведующий Н. И. Лаврентьев). Почтовый адрес на станции «Пушкино» в 1914 году имело несколько предприятий: кирпичный завод Дмитриева в д. Чапчиково, шерстопрядильная фабрика братьев Кеворковых при с. Курове, шерстопрядильная, ткацкая и отделочная фабрика товарищества Лыжина при с. Вантеевке, красильно-аппретурная фабрика товарищества Ветерме, аппретурная фабрика Копылова и Анкудинова при д. Немичнове. Непосредственно в селе Пушкино находились два предприятия:
* Суконная фабрика Товарищества Суконной Мануфактуры, заведующий Н. С. Масленников (основана в 1883 году, в 1914 году 257 работающих, из которых 257 — мужчины);
* Механическая ткацкая и красильно-отделочная фабрика Е. Арманд, заведующий А. Л. Коль (основана в 1860 году, в 1914 году 1059 работающих, из которых 600 — мужчины).
В 1914 году в селе Пушкине была аптека (провизор — В. Ф. Блументаль), Андреевская больница при фабрике Арманд (врачи А. Л. Коль и В. Ф. Буров), Богадельня для престарелых фабричных рабочих обоего пола, учреждённая потомственным почётным гражданином Евгением Ивановичем Арманд (заведующий Е. И. Арманд, призреваемых 18 человек). При станции «Пушкино» действовал приют императорского человеколюбивого общества для выздоравливающих детей имени Альберта и Анны Беренштам (заведующая Е. А. Алексеева, призреваемых 30 детей). В 1914 году в Пушкине было несколько начальных учебных заведений разных ведомств: Пушкинское I-е и Пушкинское II-е начальные земские начальные училища, начальная Пушкинская церковно-приходская школа.7 августа 1925 года Пушкино получает статус города. В его состав вошёл дачный посёлок у станции и часть села Пушкино. 12 июня 1929 года город Пушкино стал районным центром. В состав района вошли два рабочих посёлка — Ивантеевка и Красноармейск, дачный посёлок Мамонтовка; Софринская, Путиловская, Пушкинская волости; несколько селений Щелковской и Хотьковской волостей. В том же году из Москвы в Пушкино прошла первая электричка. Через год электропоезда шли уже до станции Правда.

View File

@@ -3,7 +3,7 @@ title: "C наступающим Новым 2014 Годом!"
slug: c-nastupayushhim-novym-2014-godom
legacyId: 145
pubDate: 2013-12-31T19:29:10+03:00
description: "Поздравление с Новым 2014 годом от администрации краеведческого портала pushkinohistory.ru."
description: ""
categories:
- "Главная"
- "Настоящее"
@@ -18,10 +18,6 @@ hideFromList: true
От лица администрации и от себя лично поздравляю всех с Новым годом! Желаю всем счастья, здоровья, сбытия всех Ваших мечт, финансового и душевного спокойствия, искорки в глазах и успехов в выполнении всех Ваших начинаний.Постарайтесь забыть все то плохое, что у Вас может быть случилось, помните, что свою жизнь Вы делаете и сами, а значит нужно стремиться к самому лучшему! Еще раз всех с праздником, до встречи уже в Новом году!)
&nbsp;

View File

@@ -3,7 +3,7 @@ title: "Первые 20-градусные морозы"
slug: pervye-20-gradusnye-morozy
legacyId: 235
pubDate: 2026-01-05T02:26:32+03:00
description: "Синоптики прогнозируют первые 20-градусные морозы в Москве и Московской области — местами до -25°C к концу следующей недели."
description: ""
categories:
- "Главная"
categorySlugs:

View File

@@ -3,7 +3,7 @@ title: "Сегодня ночью россияне увидят первое с
slug: segodnya-nochyu-rossiyane-uvidyat-pervoe
legacyId: 226
pubDate: 2026-01-04T04:19:20+03:00
description: "Волчья Луна — первое суперполнолуние 2026 года: в ночь с 3 на 4 января Луна приблизится к Земле на максимальное расстояние, диск будет на 15% ярче обычного."
description: ""
categories:
- "Главная"
categorySlugs:

View File

@@ -3,7 +3,7 @@ title: "Старое, Старое Село"
slug: staroe-staroe-selo
legacyId: 137
pubDate: 2012-05-16T18:28:48+03:00
description: "История древнего села в Пушкинском районе с XIV века: боярские владения, усадьбы Несвицких, предание о море и возрождении поселения. Автор — Василий Коршун."
description: ""
categories:
- "Главная"
categorySlugs:
@@ -14,15 +14,9 @@ featuredImage: "/uploads/IMG_2754.jpg"
---
<div align="justify"> Старое село и вправду является одним из древнейших поселений на территории Пушкинского района. По данным археологов оно возникло в конце XIII первой четверти XIV веков. Его возникновение связано, скорее всего, с началом бурного развития Московского княжества после татаро-монгольского нашествия. Расцвет села был, видимо, во второй половине XV в. Письменные источники доносят до нас весть о существовании в 1495-99 гг. <span style="color: #009900;"><em><span style="color: #006600;">Веденской*</span> </em></span>волости, принадлежавшей Великому Князю Иоанну Васильевичу. Несложный анализ топонимики позволяет предположить, что центром волости было село с церковью Введения во храм Пресвятой Богородицы. Нет особых оснований предполагать, что речь идет о каком-то другом поселении, так как Веденская в верховьях Прорванихи упоминается в 1503 г., правда, уже как деревня. Что ж, пожары церквей в те времена были делом обыденным… Согласно местной легенде, в незапамятные времена в селе произошел мор. Выжившие жители покинули насиженные места и, спустившись вниз по реке, основали селение с тем же названием. Видимо, речь в предании идет об эпидемии 1571 г., после которой село и вправду запустело. К этому же периоду относится основание села Введенского, которое дожило до нашего времени под тем же названием. Продолжая изучать вышеупомянутую легенду, мы узнаем, что жителей постоянно тянуло в родные места, и, спустя некоторое время, они вернулись на пепелище, основав поселение с названием Старое Веденское. И действительно, в середине XVII в. писцовые книги упоминают село Старое Веденское владения дьяка Семена Филатовича Домашнева. Как мы видим, местное придание целиком подтверждается документально. Это достаточно редкое явление, так как полет народной фантазии в вопросах трактования топонимики просто потрясающий! Что только не придумывают! Возьмем хотя бы то же Пушкино. И по Уче оно стояло (Поучкино), и пушки здесь отливали, и к опушке леса оно тяготело… Правда, мне видится, наиболее правдоподобным вариант академика С.Б. Веселовского, предполагавшего, что первым владельцем селения был в начале XIV века боярин Григорий Алек­сандрович Морхинин по прозвищу Пушка, и оно получило название по его имени, но документаль­ных доказательств этого нет. Действительно, почти 80% процентов древних названий связано с именами и фамилиями владельцев (<span style="color: #006600;"><em>Борково*, Елдегино*</em>,</span> Курово, Муромцево, Рахманово,<span style="color: #006600;"><em>Сафарино*</em></span>, Тишково, Царево и др.) На втором месте идут названия по церквям (Богородское, Введенское, Спасское и т.д.), на третьем особенности местности (Березняки, Могильцы, Нагорное, Подлипки, Подвязное и т.д.). Прочие варианты крайне редки, особенно для Московской области.</div>
<div align="justify">     Однако вернемся в наше Старое Село. С конца XVII в. сельцо Старое Веденское принадлежало князьям Несвицким, род которых идет от великого князя литовского Гедимина: в 1704 г. стольнику Ивану Михайловичу Несвицкому, в 1709 г. его сыну Михаилу Ивановичу, а в 1720 г. вдове Михаила Иванович Марии Ивановне. Затем сельцо унаследовал их сын лейб гвардии Семеновского полка поручик князь Василий Михайлович Несвицкий, а в 1768 г. его брат Николай Михайлович. Тогда сельцо представляло собой типичную сельскую помещичью средней руки усадьбу той поры. Там находился деревянный господский дом, хозяйственные постройки и парк с диагональными аллеями при двух прудах. Интересно, что Василий Михайлович имел дом в Москве, который впоследствии принадлежал П.А. Офросимову, о котором уже в этом году сообщалось как о владельце сельца Паршино. Однако постепенно усадьба в Старом Веденском приходит в упадок и в 1852 г. селение упоминается как деревня Старое Село, владение коллежской советницы Марии Осиповны Зверевой. Под этим названием оно известно и в наши дни.
</div>
<div align="justify">   <em>  <span style="color: #006600;">* Названия приведены по написанию их в документах XV-XVIII вв. С этим связана одна буква «В» в названии Введенское. В названиях владельческих сел явно читаются фамилии владельцев Борков, Елдегин, Сафарин.</span></em></div>

View File

@@ -3,7 +3,7 @@ title: "Внимание! Технические работы!"
slug: vnimanie-texnicheskie-raboty-2
legacyId: 158
pubDate: 2015-05-29T01:33:35+03:00
description: "2 июня 2015 года с 3:00 до 4:00 возможны кратковременные перебои в работе сайта в связи с плановыми техническими работами на серверах."
description: ""
categories:
- "Главная"
- "Техническое"
@@ -15,5 +15,4 @@ hideFromList: true
---
2  июня  2015г. с 3 до 4 утра, в связи с проведением технических работ на площадке оператора связи, обслуживающего нашу инфраструктуру, возможны перебои с предоставлением услуг длительностью до 30 минут.

View File

@@ -3,7 +3,7 @@ title: "Внимание! Технические работы!"
slug: vnimanie-texnicheskie-raboty
legacyId: 142
pubDate: 2013-08-24T00:56:06+03:00
description: "24 августа 2013 года с 2:00 до 4:00 возможны кратковременные перебои в работе сайта в связи с техническими работами на серверах."
description: ""
categories:
- "Главная"
categorySlugs:
@@ -14,6 +14,4 @@ hideFromList: true
В связи с проведением технических работ на серверах с 02:00 до 04:00 24 августа 2013 г. возможны перерывы в работе до 30 минут.

View File

@@ -3,7 +3,7 @@ title: "Воронино"
slug: voronino
legacyId: 139
pubDate: 2012-05-16T18:30:34+03:00
description: "История исчезнувшего села Воронино в Пушкинском районе с XV века до пожара 1940-х годов: усадьбы Шереметевых, Долгоруковых, Верстовского и Толстых."
description: ""
categories:
- "Главная"
categorySlugs:
@@ -15,42 +15,22 @@ featuredImage: "/uploads/IMG_2156.jpg"
<div align="justify"><em>Населенного пункта с таким названием сейчас нет на карте Пушкинского района. Село сгорело в 1940-х гг. и более не возрождалось. Однако не хотелось бы, что бы его многовековая история была полностью забыта. Некоторые страницы ее мы попробуем сейчас приоткрыть.</em>
Село известно с первой четверти XV в. Это подтверждает найденная там створка <em>энколпиона*</em> с изображением сюжета Крещения. Иконография ее близка к изделиям новгородской культовой металлопластики XIV в. Возможное время отливки XIV-XVI вв.
<a name="cutid1"></a><a href="http://pics.livejournal.com/pushkino_2009/pic/0009ywcp"><img src="http://pics.livejournal.com/pushkino_2009/pic/0009ywcp/s640x480" alt="" width="202" height="291" border="0" /></a>
</div>
<div align="justify">Воронино с 1582 г. находится в дворцовом ведомстве. В 1619 г. по государевой грамоте дача села Воронино переходит в вотчину князьям Василию и Борису Петровичам Шереметевым и в поместье «князю Луке да сыну его Миките Щербатовым». В 1623 г. там числились два двора помещиков и деревянная церковь Покрова Пресвятой Богородицы. Впоследствии владение распадается на две части: левобережную Большое Воронино и правобережную Малое Воронино. Судьба церкви неизвестна, но в 1646 г. сельцо Большое Воронино вотчина боярина Василия Петровича Шереметева. Василий Петрович был талантливым военноначальником и помогал Богдану Хмельницкому в его борьбе с поляками в 1654-1655 гг. В 1677 г. Большое Воронино числится собственностью его сына Петра. Тогда же упоминается деревянная часовня при кладбище. В 1704 г. сельцо унаследовал Киевский губернатор, генерал-лейтенант Шереметев Владимир Петрович, который в 1710-х гг. отдает сельцо в качестве приданного за своей дочерью Анастасией при ее браке с лейб-гвардии Преображенского полка прапорщиком князем Алексеем Васильевичем Долгоруковым. Последний в 1720 г. пишет прошение о строительстве в Воронино деревянной церкви Успения Пресвятой Богородицы на месте бывшей Покровской церкви и получает разрешение. Когда была построена церковь, из дела не видно, но по «Ревизским сказкам» 1723-1727 гг. Воронино еще сельцо. Селом оно значится в 1748 г., когда им владеет княгиня Анастасия Владимировна, вдова Алексея Васильевича Долгорукова, дочь Владимира Петровича Шереметева.
<div align="center"><img src="http://pics.livejournal.com/pushkino_2009/pic/0009z9sk" alt="http://pics.livejournal.com/pushkino_2009/pic/0009z9sk" /></div>
</div>
<div align="justify">     В 1768 г. селом владел полковник, граф Василий Иванович Толстой, впоследствии ставший действительным статским советником. Его женою была Александра Ивановна, урожденная Майкова, сестра известного писатели Василия Ивановича Майкова. Их дочь Мария была выдана замуж за Павла Ивановича Фонвизина, писателя, директора Московского университета, брата великого комедиографа Дениса Ивановича Фонвизина. В конце 1760-х гг. усадьба Воронино представляла собой барский дом с флигелями и садом на заднем дворе. Через дорогу от дома стояла деревянная Успенская церковь, за которой начинался большой липовый парк. Южнее парка ютились крестьянские дворы. К концу века Толстой переустраивает усадьбу. На реке Вязь были поставлены запруды, в результате чего образовались три огромных каскадных пруда. От берега вверх поднимались пятью уступами террасы. На нижней находился обложенный дубовым тесом пруд для купания. На средней террасе был построен новый господский дом. Следующий ярус окаймлял его по бокам, образуя, видимо, также смотровые площадки. Весь этот комплекс утопал в зелени сада. По его северной и южной границам в специально вырытых каналах к Вязи струились два водным потока. На верхнем ярусе находились господское кладбище и церковь (в XX в. - деревянная часовня) при нем.</div>
<div align="justify">     В начале XIX в. усадьбой владел Дмитрий Сергеевич Лужин, затем его сын, Иван. <img src="http://pics.livejournal.com/pushkino_2009/pic/0009xrkc" alt="http://pics.livejournal.com/pushkino_2009/pic/0009xrkc" width="169" height="206" />Иван Дмитриевич Лужин в двадцатилетнем возрасте был корнетом из эстандарт-юнкеров лейб-гвардии Конного полка. В 1831 г. он проявил себя в подавлении польского восстания, за что был награжден орденом Владимира 4 степени с бантом и назначен на должность флигель-адъютант Николая I. Через двенадцать лет он исправляющий должность московского обер-полицеймейстера, генерал-майор свиты,в 1854 г. курский, а два года спустя харьковский военный и гражданский губернатор. Перед отъездом из Москвы он продает Воронино А.Н. Верстовскому. <img src="http://pics.livejournal.com/pushkino_2009/pic/0009pwpk" alt="http://pics.livejournal.com/pushkino_2009/pic/0009pwpk" width="152" height="236" />Алексей Николаевич Верстовский родился в имении Селиверстово, близ села Мезинец, Козловского уезда Тамбовской губернии, расположенном на живописном берегу реки Лесной Воронеж. С детства у него проявился талант к музыке, которой он посвятил всю свою жизнь. Среди произведений композитора оперы "Пан Твардовский", "Цыгане", "Аскольдова могила", много романсов и баллад.
В 1890 г. усадьбой владеет дочь статского советника Надежда Николаевна Топорова, в 1911 г. Арманды. Усадебный дом и церковь разобраны на стройматериал в 1930-х гг. От усадьбы сохранились в весьма заросшем состоянии постепенно переходящий в лес парк и пересохший пруд. Кое-где можно отыскать остатки построек.</div>

View File

@@ -38,14 +38,6 @@ const jsonLd = {
description: SITE_DESCRIPTION,
inLanguage: 'ru-RU',
publisher: { '@id': `${SITE_URL}/#publisher` },
// creator — тех-партнёр (hhivp.com). Entity-сигнал для AI Overviews.
creator: {
'@type': 'Organization',
'@id': 'https://hhivp.com/#organization',
name: 'ООО «АйТи Решения»',
url: 'https://hhivp.com/',
sameAs: ['https://hhivp.com'],
},
},
{
'@type': 'NewsMediaOrganization',
@@ -85,29 +77,6 @@ const jsonLd = {
<script type="application/ld+json" is:inline set:html={JSON.stringify(jsonLd)} />
<!--
Speculation Rules API (Chromium 122+) — prerender same-origin pages on
hover/pointerdown for near-instant navigation.
-->
<script type="speculationrules" is:inline set:html={JSON.stringify({
prerender: [
{
where: {
and: [
{ href_matches: '/*' },
{ not: { href_matches: '/assets/*' } },
{ not: { href_matches: '/uploads/*' } },
{ not: { href_matches: '/api/*' } },
{ not: { href_matches: '/sitemap*' } },
{ not: { href_matches: '/feed*' } },
{ not: { href_matches: '/llms*' } }
]
},
eagerness: 'moderate'
}
]
})} />
<Analytics />
</head>
<body>