chore(docs): уборка структуры — вся документация в docs/, краткий README, добавлен AGENTS.md

- AGENTS.md: правила проекта (структура доков, стек, статьи, деплой, git, openspec, проверки)
- README.md: сокращён до введения + указателей на docs/
- docs/: DEPLOY_INSTRUCTIONS, ROADMAP, PAPERMOD_PARAMS, QWEN, gitea-setup,
  Telegram_frontend, ssh_setup, archive/PROJECT_SUMMARY (из .qwen/)
- tools/: winscp_script.txt переехал из корня к deploy_sftp.py
- Makefile и deploy_sftp.py: ссылки на docs/DEPLOY_INSTRUCTIONS.md
This commit is contained in:
2026-09-12 09:58:09 +00:00
parent 80eb3c709d
commit d426aa39ed
13 changed files with 145 additions and 103 deletions
+109
View File
@@ -0,0 +1,109 @@
# Инструкция по публикации сайта через SFTP
## Описание
Этот документ описывает процесс публикации сгенерированного сайта (папка `public`)
на хостинге через SFTP. Решение кроссплатформенное и работает как на Unix-подобных
системах (Linux/macOS), так и на Windows.
> **ВАЖНО: деплой сайта выполняется ТОЛЬКО через `make deploy`.** Аккаунт Jino —
> SFTP-only: удалённый запуск команд (rsync, ssh-exec) запрещён сервером
> (ошибка `exec request failed on channel 0`). Прямой rsync на этот аккаунт
> НЕ РАБОТАЕТ.
## Учетные данные и параметры подключения
- **Хост**: kpa39l.myjino.ru
- **Порт SFTP**: 2222
- **Пользователь**: kpa39l_dedinit
- **Пароль**: -Zp4ep747t25
- **Целевой путь**: /dedinit.ru (относительно корня аккаунта)
## Установка зависимостей
### Для Linux/macOS
- **Python 3** (с venv/pip)
- **Make** — для выполнения команд из Makefile
- Пакет `paramiko` ставится автоматически в `.venv/` при первом `make deploy`
(таргет `venv`), либо вручную: `pip install paramiko`
### Для Windows
- **WinSCP** — установите с официального сайта (<https://winscp.net/>)
- **Make** — можно установить через Chocolatey, MinGW или Git for Windows
## Использование Makefile
### Сборка сайта
```bash
make build
```
Команда генерирует сайт в папку `public/`.
### Деплой сайта
```bash
# один раз экспортируем пароль SFTP (каждый раз в новой сессии)
export SSHPASS='-Zp4ep747t25'
make deploy
```
ЕДИНСТВЕННЫЙ способ публикации. Сначала собирает сайт, затем зеркалирует
`public/` на сервер (`/dedinit.ru`) с удалением устаревших файлов
(аналог `rsync --delete`):
- **Unix**: `tools/deploy_sftp.py` (paramiko, SFTP + рекурсивный mirror)
- **Windows**: WinSCP.com (скрипт `winscp_script.txt`)
Если `SSHPASS` не задана — `make deploy` завершится с ошибкой и подсказкой.
### Симуляция деплоя
```bash
export SSHPASS='-Zp4ep747t25'
make deploy-dry-run
```
Собирает сайт и показывает, какие файлы будут загружены/удалены, без заливки.
### Очистка
```bash
make clean
```
Команда удаляет папку `public/`.
### Полная пересборка
```bash
make rebuild
```
Команда удаляет папку `public/`, затем заново собирает и деплоит сайт.
### Справка
```bash
make help
```
Показывает список доступных команд.
## Конфигурация
Параметры подключения для Unix находятся в `tools/deploy_sftp.py`
(переменные `DEDINIT_HOST`, `DEDINIT_PORT`, `DEDINIT_USER`, `DEDINIT_REMOTE`,
по умолчанию — kpa39l.myjino.ru:2222 / kpa39l_dedinit / /dedinit.ru).
На Windows — в `Makefile` и `winscp_script.txt`.
При необходимости вы можете изменить эти параметры.
## Настройка для Windows
1. Убедиться, что WinSCP установлен в стандартную директорию
`C:\Program Files (x86)\WinSCP\`
2. Файл `winscp_script.txt` содержит команды для подключения и синхронизации файлов
+625
View File
@@ -0,0 +1,625 @@
# 📋 Полный справочник параметров темы rDedInit (PaperMod)
## Описание
Этот документ содержит **все параметры конфигурации** темы rDedInit (форк PaperMod), которые вы можете использовать в файле `hugo.toml` (или `hugo.yaml`/`config.yaml`) и во frontmatter постов.
---
## 📁 Глобальные параметры (в hugo.toml)
### Базовые параметры сайта
| Параметр | Описание | Пример |
|----------|----------|--------|
| `baseURL` | Базовый URL сайта | `baseURL = 'https://dedinit.ru/'` |
| `languageCode` | Код языка сайта | `languageCode = 'ru-ru'` |
| `title` | Заголовок сайта | `title = 'dedinit()'` |
| `theme` | Используемая тема | `theme = 'rDedInit'` |
| `timeZone` | Часовой пояс для дат | `timeZone = 'Europe/Moscow'` |
| `preserveTaxonomyNames` | Сохранять имена таксономий | `preserveTaxonomyNames = true` |
| `metaDataFormat` | Формат frontmatter | `metaDataFormat = "yaml"` |
---
## ⚙️ Параметры в секции [params]
### 🎨 Тема и внешний вид
| Параметр | Описание | Значения | По умолчанию |
|----------|----------|----------|--------------|
| `defaultTheme` | Тема по умолчанию | `"light"`, `"dark"`, `"auto"` | `"auto"` |
| `disableThemeToggle` | Отключить переключатель темы | `true`, `false` | `false` |
| `env` | Окружение (влияет на SEO, аналитику) | `"production"`, `"development"` | `"development"` |
**Пример:**
```toml
[params]
defaultTheme = "auto"
disableThemeToggle = false
env = "production"
```
---
### 📝 Информация о сайте
| Параметр | Описание | Пример |
|----------|----------|--------|
| `title` | Заголовок сайта (альтернативный) | `title = "dedinit.ru"` |
| `description` | Описание сайта для мета-тегов | `description = "Блог об_ops-ах..."` |
| `keywords` | Ключевые слова сайта | `keywords = ["блог", "программирование"]` |
| `author` | Автор сайта (по умолчанию для всех постов) | `author = "Кразя"` |
| `DateFormat` | Формат отображения даты | `DateFormat = "02.01.2006 15:04"` |
| `language` | Код языка | `language = "ru"` |
| `languageAlt` | Альтернативный код языка | `languageAlt = "ru"` |
---
### 🏠 Главная страница (Home-Info Mode)
| Параметр | Описание | Пример |
|----------|----------|--------|
| `homeInfoParams.Title` | Заголовок информационной секции | `Title = "Привет! 👋"` |
| `homeInfoParams.Content` | Содержимое информационной секции | `Content = "Добро пожаловать..."` |
| `homeInfoParams.AlignSocialIconsTo` | Выравнивание соц. иконок | `AlignSocialIconsTo = "center"` |
**Пример:**
```toml
[params.homeInfoParams]
Title = "Привет! 👋"
Content = "Добро пожаловать в мой блог!"
AlignSocialIconsTo = "center"
```
---
### 👤 Режим профиля (Profile Mode)
| Параметр | Описание | Значения |
|----------|----------|----------|
| `profileMode.enabled` | Включить режим профиля | `true`, `false` |
| `profileMode.title` | Заголовок профиля | Текст |
| `profileMode.subtitle` | Подзаголовок профиля | Текст |
| `profileMode.imageUrl` | Путь к изображению профиля | Путь или URL |
| `profileMode.imageTitle` | Alt-текст изображения | Текст |
| `profileMode.imageWidth` | Ширина изображения | Число (px) |
| `profileMode.imageHeight` | Высота изображения | Число (px) |
| `profileMode.buttons` | Кнопки действий | Массив `{name, url}` |
**Пример:**
```toml
[params.profileMode]
enabled = true
title = "Имя Фамилия"
subtitle = "Разработчик, блогер, энтузиаст"
imageUrl = "/images/profile.jpg"
imageTitle = "Моё фото"
imageWidth = 150
imageHeight = 150
[[params.profileMode.buttons]]
name = "Архив"
url = "/posts/"
[[params.profileMode.buttons]]
name = "GitHub"
url = "https://github.com/username"
```
---
### 📱 Социальные иконки
| Параметр | Описание | Пример |
|----------|----------|--------|
| `socialIcons` | Список соц. иконок | Массив `{name, url}` |
**Пример:**
```toml
[[params.socialIcons]]
name = "telegram"
url = "https://t.me/username"
[[params.socialIcons]]
name = "github"
url = "https://github.com/username"
[[params.socialIcons]]
name = "linkedin"
url = "https://linkedin.com/in/username"
```
**Поддерживаемые платформы:** telegram, github, gitlab, twitter, x-twitter, linkedin, facebook, instagram, youtube, reddit, discord, stack-overflow, mastodon, и другие.
---
### 📄 Параметры постов (глобальные)
| Параметр | Описание | Значения | По умолчанию |
|----------|----------|----------|--------------|
| `ShowReadingTime` | Показывать время чтения | `true`, `false` | `false` |
| `ShowWordCount` | Показывать количество слов | `true`, `false` | `false` |
| `ShowShareButtons` | Показывать кнопки шеринга | `true`, `false` | `false` |
| `ShareButtons` | Какие кнопки шеринга показывать | Массив | `["twitter", "facebook", "linkedin"]` |
| `ShowBreadCrumbs` | Показывать хлебные крошки | `true`, `false` | `false` |
| `ShowPostNavLinks` | Показывать навигацию между постами | `true`, `false` | `false` |
| `ShowCodeCopyButtons` | Показывать кнопки копирования кода | `true`, `false` | `false` |
| `hideAuthor` | Скрывать информацию об авторе | `true`, `false` | `false` |
| `disableSpecial1stPost` | Отключить специальный стиль первого поста | `true`, `false` | `false` |
| `ShowAllPagesInArchive` | Показывать все страницы в архиве | `true`, `false` | `false` |
| `mainSections` | Основные секции для главной | Массив | `["posts"]` |
**Пример:**
```toml
[params]
ShowReadingTime = true
ShowWordCount = true
ShowShareButtons = true
ShareButtons = ["telegram", "twitter", "linkedin", "reddit"]
ShowBreadCrumbs = true
ShowPostNavLinks = true
ShowCodeCopyButtons = true
mainSections = ["posts", "blog"]
```
---
### 🖼️ Обложки (Cover)
| Параметр | Описание | Значения |
|----------|----------|----------|
| `cover.responsiveImages` | Генерировать адаптивные изображения | `true`, `false` |
| `cover.linkFullImages` | Ссылка на полное изображение | `true`, `false` |
| `cover.hidden` | Скрывать обложку в списках | `true`, `false` |
| `cover.hiddenInList` | Скрывать обложку только в списках | `true`, `false` |
**Пример:**
```toml
[params.cover]
responsiveImages = true
linkFullImages = true
```
---
### ✏️ Редактирование постов
| Параметр | Описание | Пример |
|----------|----------|--------|
| `editPost.URL` | URL репозитория для редактирования | `"https://github.com/user/repo/content"` |
| `editPost.Text` | Текст кнопки редактирования | `"Редактировать"` |
| `editPost.appendFilePath` | Добавлять путь к файлу в URL | `true`, `false` |
**Пример:**
```toml
[params.editPost]
URL = "https://github.com/dedinit/dedinit.ru/content"
Text = "Предложить правки"
appendFilePath = true
```
---
### 🔍 Поиск (Fuse.js)
| Параметр | Описание | Значения |
|----------|----------|----------|
| `fuseOpts.isCaseSensitive` | Чувствительность к регистру | `true`, `false` |
| `fuseOpts.shouldSort` | Сортировать результаты | `true`, `false` |
| `fuseOpts.location` | Позиция начала поиска | Число |
| `fuseOpts.distance` | Расстояние для поиска | Число |
| `fuseOpts.threshold` | Порог соответствия (0.0–1.0) | Число |
| `fuseOpts.minMatchCharLength` | Мин. длина совпадения | Число |
| `fuseOpts.limit` | Ограничение результатов | Число |
| `fuseOpts.keys` | Поля для поиска | Массив |
**Пример:**
```toml
[params.fuseOpts]
isCaseSensitive = false
shouldSort = true
location = 0
distance = 1000
threshold = 0.4
minMatchCharLength = 2
limit = 10
keys = ["title", "summary", "content"]
```
---
### 👥 Авторы
| Параметр | Описание | Пример |
|----------|----------|--------|
| `author` | Авторы сайта по умолчанию | `author = ["Кразя"]` |
Может быть переопределено во frontmatter поста:
```yaml
---
author: ["Автор 1", "Автор 2"]
---
```
---
### 📊 Footer (Подвал)
| Параметр | Описание | Значения |
|----------|----------|----------|
| `footer.hideCopyright` | Скрыть информацию о копирайте | `true`, `false` |
| `footer.text` | Текст в подвале (до ссылки на Hugo) | Текст (markdown) |
| `hideFooter` | Полностью скрыть подвал | `true`, `false` |
| `disableScrollToTop` | Отключить кнопку "Наверх" | `true`, `false` |
**Пример:**
```toml
[params.footer]
hideCopyright = false
text = "Сделано с ❤️"
```
---
### 🔗 Label (Логотип в шапке)
| Параметр | Описание | Пример |
|----------|----------|--------|
| `label.text` | Текст логотипа | `text = "dedinit()"` |
| `label.icon` | Путь к иконке логотипа | `icon = "/images/logo.png"` |
| `label.iconSVG` | SVG логотипа (inline) | `iconSVG = "<svg>..."` |
| `label.iconHeight` | Высота иконки | `iconHeight = 30` |
**Пример:**
```toml
[params.label]
text = "dedinit()"
icon = "/images/favicon/favicon48x48.ico"
iconHeight = 30
```
---
### 📈 Аналитика и верификация
| Параметр | Описание | Пример |
|----------|----------|--------|
| `analytics.google.SiteVerificationTag` | Тег верификации Google | `SiteVerificationTag = "XXXXXXXXXX"` |
| `analytics.yandex.SiteVerificationTag` | Тег верификации Яндекс | `SiteVerificationTag = "YYYYYYYYYY"` |
| `analytics.bing.SiteVerificationTag` | Тег верификации Bing | `SiteVerificationTag = "ZZZZZZZZZZ"` |
| `analytics.naver.SiteVerificationTag` | Тег верификации Naver | `SiteVerificationTag = "AAAAAAAAAA"` |
**Пример:**
```toml
[params.analytics.google]
SiteVerificationTag = "XXXXXXXXXX"
[params.analytics.yandex]
SiteVerificationTag = "YYYYYYYYYY"
```
**Google Analytics (в секции services):**
```toml
[services.googleAnalytics]
ID = "G-XXXXXXXXXX"
```
---
### 🎯 Прочие параметры
| Параметр | Описание | Значения |
|----------|----------|----------|
| `CanonicalLinkText` | Текст для canonical ссылки | `"Originally published at"` |
| `displayFullLangName` | Показывать полное название языка | `true`, `false` |
| `ShowPageNums` | Показывать номера страниц в пагинации | `true`, `false` |
| `ShowRssButtonInSectionTermList` | Показывать RSS кнопку в разделах | `true`, `false` |
---
### 🔧 Assets (Ресурсы)
| Параметр | Описание | Значения |
|----------|----------|----------|
| `assets.favicon` | Путь к favicon.ico | Путь |
| `assets.favicon16x16` | Путь к favicon 16x16 | Путь |
| `assets.favicon32x32` | Путь к favicon 32x32 | Путь |
| `assets.apple_touch_icon` | Путь к Apple touch icon | Путь |
| `assets.safari_pinned_tab` | Путь к Safari pinned tab | Путь |
| `assets.theme_color` | Цвет темы для браузера | HEX цвет |
| `assets.msapplication_TileColor` | Цвет плитки MS | HEX цвет |
| `assets.disableScrollBarStyle` | Отключить стили скроллбара | `true`, `false` |
| `assets.disableFingerprinting` | Отключить fingerprinting | `true`, `false` |
**Пример:**
```toml
[params.assets]
favicon = "images/favicon/favicon48x48.ico"
favicon16x16 = "images/favicon/favicon-16x16.png"
favicon32x32 = "images/favicon/favicon-32x32.png"
apple_touch_icon = "images/favicon/apple-touch-icon.png"
theme_color = "#2e2e33"
```
---
### 📑 Schema.org разметка
| Параметр | Описание | Пример |
|----------|----------|--------|
| `schema.publisherType` | Тип издателя | `"Organization"`, `"Person"` |
| `schema.sameAs` | Ссылки на соц. профили | Массив URL |
**Пример:**
```toml
[params.schema]
publisherType = "Person"
sameAs = ["https://t.me/username", "https://github.com/username"]
```
---
## 📝 Frontmatter параметры (в постах)
Эти параметры указываются в начале каждого поста (в YAML/TOML):
| Параметр | Описание | Пример |
|----------|----------|--------|
| `title` | Заголовок поста | `title = "Мой пост"` |
| `description` | Описание поста | `description = "Краткое описание"` |
| `date` | Дата публикации | `date = 2026-03-06T19:30:00+03:00` |
| `lastmod` | Дата последнего изменения | `lastmod = 2026-03-07T10:00:00+03:00` |
| `publishDate` | Дата публикации (альтернативная) | `publishDate = 2026-03-06` |
| `draft` | Черновик (не публиковать) | `draft = true` |
| `tags` | Теги поста | `tags = ["hugo", "blog"]` |
| `categories` | Категории поста | `categories = ["технологии"]` |
| `keywords` | Ключевые слова поста | `keywords = ["hugo", "golang"]` |
| `author` | Автор поста (переопределение) | `author = ["Имя"]` |
| `canonicalURL` | Canonical URL | `canonicalURL = "https://..."` |
| `CanonicalLinkText` | Текст canonical ссылки | `CanonicalLinkText = "Оригинал"` |
### Параметры отображения поста
| Параметр | Описание | Значения |
|----------|----------|----------|
| `ShowReadingTime` | Показывать время чтения | `true`, `false` |
| `ShowWordCount` | Показывать количество слов | `true`, `false` |
| `ShowBreadCrumbs` | Показывать хлебные крошки | `true`, `false` |
| `ShowPostNavLinks` | Показывать навигацию | `true`, `false` |
| `ShowShareButtons` | Показывать кнопки шеринга | `true`, `false` |
| `ShowCodeCopyButtons` | Показывать кнопки копирования | `true`, `false` |
| `ShowToc` | Показывать оглавление | `true`, `false` |
| `TocOpen` | Оглавление открыто по умолчанию | `true`, `false` |
| `UseHugoToc` | Использовать встроенный Hugo TOC | `true`, `false` |
| `disableAnchoredHeadings` | Отключить якорные заголовки | `true`, `false` |
| `hideSummary` | Скрыть саммари в списке | `true`, `false` |
| `hideMeta` | Скрыть мета-информацию | `true`, `false` |
| `hideAuthor` | Скрыть автора | `true`, `false` |
| `hideFooter` | Скрыть подвал на странице | `true`, `false` |
| `searchHidden` | Скрыть из поиска | `true`, `false` |
| `hiddenInHomeList` | Скрыть с главной страницы | `true`, `false` |
| `robotsNoIndex` | Запретить индексацию | `true`, `false` |
### Обложка поста
```yaml
cover:
image: "/images/cover.jpg"
alt: "Описание изображения"
caption: "Подпись к изображению"
relative: false
hidden: false
hiddenInList: false
```
### Редактирование поста
```yaml
editPost:
URL: "https://github.com/user/repo/content/post.md"
Text: "Предложить правки"
appendFilePath: true
```
---
## 🗂️ Структура [outputs]
Настройка форматов вывода для разных типов страниц:
```toml
[outputs]
home = ["HTML", "RSS", "JSON"] # JSON нужен для поиска
page = ["HTML"]
section = ["HTML", "RSS"]
taxonomy = ["HTML", "RSS"]
term = ["HTML", "RSS"]
```
---
## 🏷️ Таксономии
```toml
[taxonomies]
category = "categories"
tag = "tags"
```
---
## 🎨 Подсветка синтаксиса (Chroma)
```toml
[markup.highlight]
style = "github-dark"
lineNos = true
tabWidth = 4
```
**Доступные стили:** `github`, `github-dark`, `monokai`, `dracula`, `one-dark`, и другие.
---
## 🌐 Многоязычность
```toml
[languages]
[languages.ru]
languageName = "Русский"
languageCode = "ru-ru"
weight = 1
title = "dedinit()"
[languages.ru.params]
languageAltTitle = "Russian"
[languages.en]
languageName = "English"
languageCode = "en-us"
weight = 2
title = "dedinit()"
```
---
## 📜 Меню
```toml
[[menu.main]]
name = "Главная"
url = "/"
weight = 10
[[menu.main]]
name = "Архив"
url = "/posts/"
weight = 20
[[menu.main]]
name = "Категории"
url = "/categories/"
weight = 30
```
---
## 🔑 Горячие клавиши (AccessKeys)
| Клавиша | Действие |
|---------|----------|
| `Alt + H` | Перейти на главную |
| `Alt + T` | Переключить тему |
| `Alt + C` | Открыть/закрыть оглавление |
| `Alt + G` | Перейти к началу страницы |
| `Alt + /` | Перейти к поиску (если в меню) |
---
## 📌 Пример полной конфигурации
```toml
baseURL = 'https://dedinit.ru/'
languageCode = 'ru-ru'
title = 'dedinit()'
theme = 'rDedInit'
timeZone = 'Europe/Moscow'
preserveTaxonomyNames = true
metaDataFormat = "yaml"
[params]
env = "production"
title = "dedinit.ru"
description = "Блог об_ops-ах"
keywords = ["блог", "программирование", "mlops", "devops"]
author = "Кразя"
DateFormat = "02.01.2006 15:04"
language = "ru"
languageAlt = "ru"
# Тема
defaultTheme = "auto"
disableThemeToggle = false
# Посты
ShowReadingTime = true
ShowWordCount = true
ShowShareButtons = false
ShareButtons = ["telegram", "twitter", "linkedin"]
ShowPostNavLinks = true
ShowBreadCrumbs = true
ShowCodeCopyButtons = true
disableSpecial1stPost = true
# Главная
mainSections = ["posts"]
# Footer
disableScrollToTop = false
[params.assets]
favicon = "images/favicon/favicon48x48.ico"
favicon16x16 = "images/favicon/favicon-16x16.png"
favicon32x32 = "images/favicon/favicon-32x32.png"
[params.label]
text = "dedinit()"
icon = "images/favicon/favicon48x48.ico"
iconHeight = 30
[outputs]
home = ["HTML", "RSS"]
page = ["HTML"]
section = ["HTML", "RSS"]
[taxonomies]
category = "categories"
tag = "tags"
[markup.highlight]
style = "github-dark"
lineNos = true
tabWidth = 4
[menu]
[[menu.main]]
name = "Главная"
url = "/"
weight = 10
[[menu.main]]
name = "Архив"
url = "/posts/"
weight = 20
[languages]
[languages.ru]
languageName = "Русский"
languageCode = "ru-ru"
weight = 1
title = "dedinit()"
[services.googleAnalytics]
ID = ""
```
---
## 📚 Источники
- [Официальная документация PaperMod](https://github.com/adityatelange/hugo-PaperMod/wiki)
- [Документация Hugo](https://gohugo.io/documentation/)
- [Пример конфигурации PaperMod](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite)
---
## 💡 Советы
1. **Минимальная конфигурация**: Для начала достаточно указать `title`, `description`, `author`, `defaultTheme`
2. **SEO**: Включите `env = "production"` для активации мета-тегов
3. **Производительность**: `ShowCodeCopyButtons` и `ShowReadingTime` не влияют на скорость
4. **Кастомизация**: Используйте `assets/css/extended/blank.css` для своих стилей
5. **Frontmatter**: Параметры во frontmatter переопределяют глобальные настройки
---
**Документ актуален для версии темы rDedInit на базе PaperMod v9.x**
+185
View File
@@ -0,0 +1,185 @@
# Настройки взаимодействия
## Общие принципы работы
1. Все важные решения и изменения фиксируются в README.md
2. Взаимодействие происходит на русском языке
3. Перед применением изменений проверяется корректность принятых решений
4. Цель — максимально быстро запустить проект для публикации контента
## Описание проекта
**dedinit.ru** — блог на основе генератора статических сайтов Hugo с кастомной темой **rDedInit** (форк PaperMod).
**Основная цель:** платформа для публикации лонгридов с поддержкой блоков кода и подсветки синтаксиса.
### Технические характеристики
| Параметр | Значение |
|----------|----------|
| Генератор | Hugo Extended 0.155.1 |
| Тема | rDedInit (форк PaperMod) |
| Язык | Русский (ru-ru) |
| Формат статей | Bundle (папка с index.md) |
| Деплой | SFTP (kpa39l.myjino.ru:2222) |
### Структура проекта
```
dedinit.ru/
├── content/
│ ├── posts/ # Статьи блога (bundle формат)
│ └── telegram/ # Telegram-посты (планируется)
├── themes/
│ └── rDedInit/ # Кастомная тема на базе PaperMod
├── static/
│ └── images/
│ └── favicon/ # Favicon в стиле пиксель-арт (SmileDed)
├── public/ # Сгенерированный сайт (исключён из git)
├── layouts/ # Кастомные шаблоны (если есть)
├── assets/ # CSS/JS ресурсы
├── hugo.toml # Конфигурация Hugo
├── Makefile # Команды сборки и деплоя
└── docs/ # Документация
```
## Проверочные действия
Перед выполнением каждого этапа выполняются проверки:
- Наличие установленного Hugo (`hugo version`)
- Возможность сборки сайта (`hugo`)
- Корректность настроек темы (проверка `hugo.toml`)
- Работоспособность деплоя (`make deploy-dry-run`)
## Команды проекта
### Сборка и запуск
```bash
hugo # Генерация сайта в public/
hugo server # Локальный сервер (http://localhost:1313)
make build # Сборка через Makefile
make clean # Очистка public/
make rebuild # Полная пересборка
```
### Деплой
```bash
make deploy # Сборка + деплой на хостинг
make deploy-dry-run # Симуляция деплоя
make help # Список доступных команд
```
### Параметры деплоя
| Параметр | Значение |
|----------|----------|
| Хост | kpa39l.myjino.ru |
| Порт SFTP | 2222 |
| Пользователь | kpa39l_dedinit |
| Путь | /dedinit.ru |
## Принятые технические решения
1. **Структура проекта**: Git-репозиторий инициализирован в папке с Hugo-сайтом
2. **Формат статей**: Bundle (папка с index.md) для удобного хранения статьи и связанных файлов
3. **Тема rDedInit**: Собственная тема на базе PaperMod с русификацией
4. **Деплой**: Кроссплатформенный (rsync для Unix, WinSCP для Windows)
5. **Favicon**: Набор в стиле пиксель-арт (SmileDed) с логотипом 48px в шапке
6. **Подсветка кода**: github-dark стиль с номерами строк
## Конфигурация темы (hugo.toml)
### Основные параметры
```toml
baseURL = 'https://dedinit.ru/'
title = 'dedinit()'
theme = 'rDedInit'
timeZone = 'Europe/Moscow'
metaDataFormat = "yaml"
```
### Параметры PaperMod
```toml
[params]
env = "production"
defaultTheme = "auto"
ShowReadingTime = true
ShowPostNavLinks = true
ShowBreadCrumbs = true
ShowCodeCopyButtons = true
disableSpecial1stPost = true
[markup.highlight]
style = "github-dark"
lineNos = true
tabWidth = 4
```
## Дорожная карта (ROADMAP)
### Завершённые задачи ✅
- [x] Установка Hugo Extended 0.155.1
- [x] Создание сайта dedinit.ru
- [x] Установка темы PaperMod (submodule)
- [x] Создание собственной темы rDedInit
- [x] Настройка bundle формата статей
- [x] Настройка favicon и логотипа (SmileDed)
- [x] SFTP-деплой на kpa39l.myjino.ru
- [x] Написание первых статей (6 публикаций)
### Текущие задачи 🎯
- [ ] Настройка цветовой схемы темы
- [ ] Русификация интерфейса (i18n/ru.yaml)
- [ ] Визуальное оформление Telegram-постов
- [ ] Публикация новых статей
### Планы 📈
- [ ] SEO оптимизация (Open Graph, sitemap)
- [ ] Аналитика (Google Analytics/Яндекс.Метрика)
- [ ] Поиск по сайту (Fuse.js)
- [ ] Комментарии (Giscus/Utterances)
## Примечания
- Важно обеспечить поддержку блоков кода и подсветки синтаксиса
- Проект должен быть готов к публикации контента как можно скорее
- Папка `public/` исключена из git-репозитория
- Для обновления Hugo: `winget install Hugo.Hugo.Extended`
## Информация о системе
- ОС: Windows 11
- Hugo установлена через winget
- Требуется перезапуск терминала после установки/обновления Hugo
- Текущая версия Hugo: 0.155.1
## Полезные ссылки
- [Документация PaperMod](https://github.com/adityatelange/hugo-PaperMod/wiki)
- [Документация Hugo](https://gohugo.io/documentation/)
- [PAPERMOD_PARAMS.md](PAPERMOD_PARAMS.md) — полный справочник параметров темы
- [ROADMAP.md](ROADMAP.md) — дорожная карта проекта
- [DEPLOY_INSTRUCTIONS.md](DEPLOY_INSTRUCTIONS.md) — инструкция по деплою
## Файлы документации
| Файл | Описание |
|------|----------|
| README.md | Основное описание проекта (кратко) |
| docs/ROADMAP.md | Дорожная карта развития |
| docs/PAPERMOD_PARAMS.md | Справочник параметров темы |
| docs/DEPLOY_INSTRUCTIONS.md | Инструкция по деплою |
| docs/gitea-setup.md | Настройка интеграции с Gitea |
| docs/favicon-logo-setup.md | Настройка favicon и логотипа |
| docs/Telegram_frontend.md | Оформление Telegram-постов |
---
**Последнее обновление:** 5 марта 2026 г.
+202
View File
@@ -0,0 +1,202 @@
# 🗺️ Дорожная карта проекта dedinit.ru
## О документе
Этот файл содержит план развития блога на базе Hugo и темы PaperMod.
Основная цель — создать кастомизированную русскоязычную тему для блога с поддержкой лонгридов, блоков кода и подсветки синтаксиса.
---
## ✅ Завершённые задачи
### Инфраструктура
- [x] Установка Hugo Extended 0.155.1
- [x] Создание сайта dedinit.ru
- [x] Установка темы PaperMod (как submodule)
- [x] Настройка bundle формата для статей (папка с index.md)
- [x] Решение проблемы совместимости Hugo и темы
- [x] Настройка Git-репозитория
- [x] Интеграция с Gitea (gitea.nixg.ru:2222 через SSH)
### Кастомизация темы
- [x] **Создание собственной темы rDedInit** на базе PaperMod
- [x] Документирование структуры темы (STRUCTURE.md)
- [x] **Настройка favicon и логотипа сайта** (docs/favicon-logo-setup.md)
- [x] Создан набор favicon в стиле пиксель-арт (SmileDed)
- [x] Добавлен логотип в шапку сайта (48px)
- [x] Настроены все стандартные размеры для браузеров и устройств
### Контент
- [x] Создание структуры папок content/posts/
- [x] Написание первых статей (6 публикаций)
### Деплой
- [x] Настройка SFTP-деплоя на kpa39l.myjino.ru
- [x] Создание Makefile для кроссплатформенной сборки и деплоя
- [x] Настройка WinSCP для Windows
### Конфигурация
- [x] Базовая настройка hugo.toml
- [x] Включение подсветки синтаксиса (github-dark)
- [x] Настройка навигации и меню
- [x] Включение отображения времени чтения, кнопок копирования кода
---
## 🎯 Краткосрочные задачи (1-2 недели)
### Кастомизация темы rDedInit
- [ ] **Настроить цветовую схему**
- [ ] Изменить CSS-переменные в `themes/rDedInit/assets/css/core/theme-vars.css`
- [ ] Подобрать цвета под бренд dedinit()
- [ ] Протестировать светлую и тёмную версии
### Русификация и локализация
- [ ] Проверить и дополнить русскоязычные переводы в `i18n/ru.toml`
- [ ] Адаптировать тексты интерфейса под русскоязычную аудиторию
- [ ] «Read more» → «Читать далее»
- [ ] «Posted on» → «Опубликовано»
- [ ] «Tags» → «Теги»
- [ ] «Categories» → «Категории»
### Визуальные изменения
- [ ] Настроить цветовую схему под бренд dedinit()
- [ ] Кастомизировать главную страницу
- [x] Добавить кастомный favicon
- [ ] Настроить типографику для удобного чтения лонгридов
### Контент
- [ ] Опубликовать 3-5 новых статей
- [ ] Добавить обложки к статьям
- [ ] Протестировать отображение на разных устройствах
---
## 📈 Среднесрочные задачи (1-2 месяца)
### Улучшение темы
- [x] **Кастомный header с логотипом** — добавлен логотип SmileDed 48px (docs/favicon-logo-setup.md)
- [ ] **Разработка уникальных элементов дизайна**
- [ ] Уникальные стили для блоков кода
- [ ] Анимации и переходы (минималистичные)
- [ ] Кастомные иконки для социальных сетей
- [ ] **Визуальное оформление Telegram-постов** ([Telegram_frontend.md](Telegram_frontend.md))
- [ ] Создать layout для типа контента `telegram`
- [ ] Реализовать карточки постов в стиле виджета Telegram
- [ ] Поддержка светлой/тёмной темы PaperMod
- [ ] Адаптивная вёрстка для мобильных устройств
- [ ] Shortcode для встраивания постов Telegram
- [ ] Страница списка всех Telegram-постов с пагинацией
- [ ] Разработать блок на главную страницу с последним постом из Telegram
- [ ] **Улучшение навигации**
- [ ] Добавить хлебные крошки (breadcrumbs)
- [ ] Улучшить пагинацию
- [ ] Добавить оглавление для длинных статей
- [ ] **SEO и метаданные**
- [ ] Настроить Open Graph теги
- [ ] Добавить Twitter Cards
- [ ] Настроить sitemap.xml
- [ ] Добавить schema.org разметку
### Аналитика и мониторинг
- [ ] Подключить Google Analytics / Яндекс.Метрику
- [ ] Настроить отслеживание целей
- [ ] Добавить robots.txt и sitemap
### Производительность
- [ ] Оптимизировать изображения (WebP, lazy loading)
- [ ] Настроить кэширование
- [ ] Провести аудит Lighthouse и устранить замечания
---
## 🚀 Долгосрочные задачи (3-6 месяцев)
### Расширение функциональности
- [ ] **Комментарии**
- [ ] Интеграция системы комментариев (Giscus, Utterances, или собственная)
- [ ] Модерация и управление
- [ ] **Микроблог на основе Git-коммитов**
- [ ] Вывод комментариев к коммитам из Gitea/GitHub как отдельный раздел микроблога
- [ ] Автоматическая генерация постов на основе commit messages
- [ ] Интеграция с API Gitea для получения истории коммитов
- [ ] *Обоснование:* комментарии к коммитам — это часть технического лога проекта, которая может быть интересна читателям как «закулисный» контент о разработке
- [ ] **Поиск по сайту**
- [ ] Настроить Fuse.js поиск (встроен в PaperMod)
- [ ] Улучшить выдачу результатов
- [ ] **RSS и подписка**
- [ ] Настроить полноценные RSS-ленты
- [ ] Добавить возможность email-подписки
- [ ] **Мультиязычность** (опционально)
- [ ] Добавить поддержку en/ru
- [ ] Переключатель языков
### Контент-стратегия
- [ ] Определить рубрики и категории
- [ ] Составить контент-план на квартал
- [ ] Написать серию статей по ключевым темам:
- [ ] MLOps / DevOps / SysOps
- [ ] Linux и администрирование
- [ ] CI/CD и автоматизация
- [ ] Личный опыт и best practices
### Сообщество и продвижение
- [ ] Добавить кнопки шеринга в соцсети
- [ ] Подключить веб-манифест (PWA)
- [ ] Зарегистрировать сайт в поисковых системах
- [ ] Настроить обратные ссылки
---
## 🛠️ Технические долги
- [ ] Обновлять Hugo и тему PaperMod регулярно
- [ ] Следить за безопасностью зависимостей
- [ ] Делать бэкапы контента
- [ ] Документировать изменения в теме
---
## 📝 Идеи на будущее
- [ ] Тёмная тема с уникальным дизайном
- [ ] Интерактивные элементы в статьях (диаграммы, графики)
- [ ] Интеграция с Mermaid.js для схем
- [ ] Страница «Об авторе» с фото и биографией
- [ ] Страница 404 с кастомным дизайном
- [ ] Страница «Спасибо» / «Поддержать проект»
---
## 📊 Приоритеты
| Приоритет | Задача | Оценка времени |
|-----------|--------|----------------|
| 🔴 Высокий | Создание собственной темы на базе PaperMod | 2-3 дня |
| 🔴 Высокий | Русификация интерфейса | 1 день |
| 🟡 Средний | Визуальная кастомизация | 3-5 дней |
| 🟡 Средний | SEO и аналитика | 2-3 дня |
| 🟢 Низкий | Комментарии и поиск | 1-2 недели |
---
## 📅 Последнее обновление
**Дата:** 27 февраля 2026 г.
**Статус:** В работе
---
## 🔗 Полезные ссылки
- [Документация PaperMod](https://github.com/adityatelange/hugo-PaperMod/wiki)
- [Документация Hugo](https://gohugo.io/documentation/)
- [Темы Hugo](https://themes.gohugo.io/)
- [Hugo Discord сообщество](https://discord.gg/ahpmTvhVmp)
+558
View File
@@ -0,0 +1,558 @@
# Запрос:
Давай посмотрим как сделать красивое представление постов из Телеграма в моём блоге с темой pappermode для hugo. Для телеграма есть вот такой виджет для встаивания поста в любой сойт. Мне очень нравится как это выглядит. https://core.telegram.org/widgets/post. Ты сможешь каким-то образом скопировать оформление и что тебе для этого от меня нужно?
# Ответ:
Отличная идея! Виджет Telegram выглядит действительно красиво и минималистично. Давайте разберем варианты интеграции с Hugo PaperMod.
## Что мне нужно от вас:
1. **Ссылка на ваш Telegram-канал** (публичный)
2. **Предпочтительный способ интеграции** (выберите один):
- Простое встраивание через iframe (официальный виджет)
- Кастомный shortcode с похожим дизайном
- Автоматический импорт постов как контента Hugo
## Варианты решения:
### Вариант 1: Официальный виджет Telegram (самый простой)
Можно создавать **shortcode** для Hugo, который встраивает посты:
```html
<!-- layouts/shortcodes/telegram-post.html -->
<div class="telegram-embed-wrapper">
<blockquote class="telegram-post">
<a href="{{ .Get 0 }}">Смотреть пост в Telegram</a>
</blockquote>
<script async src="https://telegram.org/js/telegram-widget.js"
data-telegram-post="{{ .Get 0 }}"
data-width="100%"
data-userpic="{{ default "true" (.Get 1) }}"
data-color="{{ default "#2481cc" (.Get 2) }}"
data-dark="{{ default "false" (.Get 3) }}"></script>
</div>
```
**Использование:**
```markdown
{{< telegram-post "https://t.me/yourchannel/123" >}}
```
### Вариант 2: Кастомный стиль (полный контроль)
Я могу помочь создать **собственный CSS-дизайн**, имитирующий стиль Telegram с:
- Адаптивной версткой
- Поддержкой темной/светлой темы PaperMod
- Кастомными цветами
- Оптимизацией под мобильные устройства
### Вариант 3: Автоматический импорт (самый мощный)
Создать скрипт, который:
- Скачивает посты из канала
- Конвертирует их в Markdown для Hugo
- Сохраняет медиафайлы
- Создает фронтматтер с датами и тегами
**Какой вариант вас больше интересует?** Или, может быть, комбинация нескольких подходов?
Также покажите, пожалуйста, ваш текущий сайт (если уже есть), чтобы я мог предложить стили, которые будут гармонично сочетаться с PaperMod.
Отлично! Раз у вас уже есть структура с папками по ID постов, давайте определим полную структуру layouts для типа контента "telegram-posts".
## Необходимые layouts:
```
layouts/
├── telegram/ # или telegram-posts
│ ├── list.html # Страница списка всех постов
│ ├── single.html # Страница отдельного поста
│ ├── baseof.html # Базовый шаблон (опционально)
│ └── summary.html # Карточка поста для списка (важно!)
├── partials/
│ ├── telegram-card.html # Компонент карточки поста
│ └── telegram-header.html # Шапка с аватаром и именем канала
└── shortcodes/
└── telegram-embed.html # Шорткод для встраивания
```
**Ключевой момент:** `summary.html` - это то, что будет отображаться в списках (на главной, в разделах).
## Что нужно от вас:
1. **Как называется ваш content type?** (telegram, posts, tg-posts?)
2. **Покажите структуру папок** с одним постом:
```
content/
└── telegram/
└── 123/
├── index.md
├── photo1.jpg
└── video.mp4
```
3. **Какие поля во фронтматтере** index.md? (date, title, text, media и т.д.)
Как только покажете структуру - создам:
- ✅ Карточки в стиле Telegram (копирование дизайна виджета)
- ✅ Список постов с пагинацией
- ✅ Отдельные страницы постов
- ✅ Адаптацию под PaperMod (темная/светлая тема)
- ✅ CSS стили с анимациями
Покажите пример вашего index.md и я начну создавать шаблоны! 🚀
Отлично! Теперь давайте создадим полную интеграцию.
## План действий:
### 1. Сначала создайте структуру в Hugo:
```bash
cd ваш-hugo-сайт
mkdir -p content/telegram
mkdir -p layouts/telegram
mkdir -p layouts/partials
mkdir -p assets/css
```
### 2. Напишите скрипт синхронизации (Python):
Создайте `scripts/sync_telegram.py`:
```python
#!/usr/bin/env python3
import shutil
import yaml
from pathlib import Path
ARCHIVES_DIR = Path("../telegram-archiver/archives/dedinit")
CONTENT_DIR = Path("content/telegram")
def sync_telegram_posts():
CONTENT_DIR.mkdir(parents=True, exist_ok=True)
for post_folder in ARCHIVES_DIR.iterdir():
if not post_folder.is_dir():
continue
post_id = post_folder.name
dest_folder = CONTENT_DIR / post_id
dest_folder.mkdir(parents=True, exist_ok=True)
# Копируем index.md
src_md = post_folder / "index.md"
if src_md.exists():
# Читаем и добавляем type
content = src_md.read_text(encoding='utf-8')
if 'type: telegram' not in content:
content = content.rstrip() + "\ntype: telegram\n"
src_md.write_text(content, encoding='utf-8')
shutil.copy2(src_md, dest_folder / "index.md")
# Копируем медиафайлы
for media_file in post_folder.glob("*"):
if media_file.name != "index.md":
shutil.copy2(media_file, dest_folder / media_file.name)
print(f"Synced post {post_id}")
if __name__ == "__main__":
sync_telegram_posts()
```
### 3. Создайте базовый шаблон `layouts/telegram/single.html`:
```html
{{ define "main" }}
<article class="telegram-post-container">
<div class="telegram-post">
<!-- Header -->
<div class="telegram-post-header">
<div class="telegram-post-avatar">
<img src="{{ .Site.Params.telegram.avatar | default "images/telegram-avatar.jpg" }}" alt="{{ .Site.Params.telegram.channelName | default "Telegram Channel" }}">
</div>
<div class="telegram-post-info">
<div class="telegram-post-channel">{{ .Site.Params.telegram.channelName | default "Channel" }}</div>
<div class="telegram-post-date">{{ .Date.Format "Jan 2, 2006 at 15:04" }}</div>
</div>
</div>
<!-- Content -->
<div class="telegram-post-content">
{{ .Content }}
</div>
<!-- Media Files -->
{{ if .Params.media_files }}
<div class="telegram-post-media">
{{ range .Params.media_files }}
{{ if eq .type "photo" }}
<div class="telegram-photo">
<img src="{{ $.RelPermalink }}{{ .filename }}" alt="{{ .caption | default "Photo" }}" loading="lazy">
{{ if .caption }}
<div class="telegram-photo-caption">{{ .caption }}</div>
{{ end }}
</div>
{{ else if eq .type "video" }}
<div class="telegram-video">
<video controls poster="{{ $.RelPermalink }}{{ .filename | replaceRE "\\.mp4$" ".jpg" }}">
<source src="{{ $.RelPermalink }}{{ .filename }}" type="video/mp4">
</video>
</div>
{{ end }}
{{ end }}
</div>
{{ end }}
<!-- Footer -->
<div class="telegram-post-footer">
<span class="telegram-views">{{ .Params.views | default "—" }} views</span>
<a href="{{ .Site.Params.telegram.channelUrl }}/{{ .Params.message_id }}" target="_blank" class="telegram-link">
Open in Telegram →
</a>
</div>
</div>
{{ template "_internal/disqus.html" . }}
</article>
{{ end }}
```
### 4. Создайте шаблон списка `layouts/telegram/list.html`:
```html
{{ define "main" }}
<div class="telegram-list-container">
<header class="telegram-list-header">
<h1 class="telegram-list-title">{{ .Title }}</h1>
{{ if .Site.Params.telegram.channelName }}
<p class="telegram-list-description">Archive of {{ .Site.Params.telegram.channelName }}</p>
{{ end }}
</header>
<div class="telegram-posts-grid">
{{ range .Pages }}
<article class="telegram-post-card">
<a href="{{ .Permalink }}" class="telegram-post-card-link">
<div class="telegram-post-card-header">
<div class="telegram-post-card-date">{{ .Date.Format "Jan 2, 2006" }}</div>
</div>
<div class="telegram-post-card-content">
{{ .Summary | truncate 200 }}
</div>
{{ if .Params.media_files }}
<div class="telegram-post-card-media">
{{ range first 1 .Params.media_files }}
{{ if eq .type "photo" }}
<img src="{{ $.RelPermalink }}{{ .filename }}" alt="" loading="lazy">
{{ end }}
{{ end }}
</div>
{{ end }}
<div class="telegram-post-card-footer">
<span>Message #{{ .Params.message_id }}</span>
</div>
</a>
</article>
{{ end }}
</div>
{{ template "_internal/pagination.html" . }}
</div>
{{ end }}
```
### 5. Создайте CSS стили `assets/css/telegram.css`:
```css
/* Telegram Post Styles - PaperMod Compatible */
:root {
--telegram-bg: var(--theme);
--telegram-card-bg: var(--code-bg);
--telegram-text: var(--primary);
--telegram-secondary: var(--secondary);
--telegram-border: var(--border);
--telegram-blue: #2481cc;
--telegram-blue-hover: #1a68a8;
}
/* Single Post */
.telegram-post-container {
max-width: 640px;
margin: 0 auto;
padding: 20px;
}
.telegram-post {
background: var(--telegram-card-bg);
border-radius: 12px;
padding: 16px;
box-shadow: 0 1px 2px rgba(0,0,0,0.1);
}
.telegram-post-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.telegram-post-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
overflow: hidden;
flex-shrink: 0;
}
.telegram-post-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.telegram-post-info {
flex: 1;
}
.telegram-post-channel {
font-weight: 600;
color: var(--telegram-blue);
font-size: 15px;
}
.telegram-post-date {
font-size: 13px;
color: var(--telegram-secondary);
}
.telegram-post-content {
font-size: 15px;
line-height: 1.6;
color: var(--telegram-text);
margin-bottom: 12px;
}
.telegram-post-content p {
margin: 0 0 12px 0;
}
.telegram-post-content p:last-child {
margin-bottom: 0;
}
/* Media */
.telegram-post-media {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 12px;
}
.telegram-photo {
border-radius: 8px;
overflow: hidden;
}
.telegram-photo img {
width: 100%;
height: auto;
display: block;
}
.telegram-photo-caption {
padding: 8px;
font-size: 14px;
color: var(--telegram-secondary);
background: rgba(0,0,0,0.05);
}
.telegram-video {
border-radius: 8px;
overflow: hidden;
}
.telegram-video video {
width: 100%;
display: block;
}
/* Footer */
.telegram-post-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 12px;
border-top: 1px solid var(--telegram-border);
font-size: 13px;
color: var(--telegram-secondary);
}
.telegram-link {
color: var(--telegram-blue);
text-decoration: none;
font-weight: 500;
transition: color 0.2s;
}
.telegram-link:hover {
color: var(--telegram-blue-hover);
text-decoration: underline;
}
/* Posts List */
.telegram-list-container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.telegram-list-header {
margin-bottom: 32px;
text-align: center;
}
.telegram-list-title {
font-size: 28px;
margin-bottom: 8px;
}
.telegram-list-description {
color: var(--telegram-secondary);
}
.telegram-posts-grid {
display: grid;
gap: 16px;
}
.telegram-post-card {
background: var(--telegram-card-bg);
border-radius: 12px;
overflow: hidden;
transition: transform 0.2s, box-shadow 0.2s;
border: 1px solid var(--telegram-border);
}
.telegram-post-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.telegram-post-card-link {
display: block;
text-decoration: none;
color: inherit;
}
.telegram-post-card-header {
padding: 12px 16px;
border-bottom: 1px solid var(--telegram-border);
}
.telegram-post-card-date {
font-size: 13px;
color: var(--telegram-secondary);
}
.telegram-post-card-content {
padding: 16px;
font-size: 15px;
line-height: 1.6;
}
.telegram-post-card-media {
max-height: 300px;
overflow: hidden;
}
.telegram-post-card-media img {
width: 100%;
height: 100%;
object-fit: cover;
}
.telegram-post-card-footer {
padding: 12px 16px;
font-size: 13px;
color: var(--telegram-secondary);
border-top: 1px solid var(--telegram-border);
}
/* Responsive */
@media (max-width: 768px) {
.telegram-post-container,
.telegram-list-container {
padding: 12px;
}
.telegram-post {
padding: 12px;
}
}
```
### 6. Добавьте в `config.yml`:
```yaml
params:
telegram:
channelName: "Дед in АйТи"
channelUrl: "https://t.me/dedinit"
avatar: "images/channel-avatar.jpg"
# Если используете модули
module:
mounts:
- source: content/telegram
target: content/telegram
```
### 7. Подключите CSS в `layouts/_default/baseof.html` или создайте partial:
```html
<!-- layouts/partials/telegram-styles.html -->
{{ $telegram := resources.Get "css/telegram.css" }}
{{ $telegram = $telegram | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $telegram.Permalink }}">
```
И добавьте в `layouts/telegram/baseof.html`:
```html
<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode }}">
<head>
{{ partial "head.html" . }}
{{ partial "telegram-styles.html" . }}
</head>
<body>
{{ partial "header.html" . }}
<main>
{{ block "main" . }}{{ end }}
</main>
{{ partial "footer.html" . }}
</body>
</html>
```
### 8. Запустите синхронизацию:
```bash
python scripts/sync_telegram.py
hugo
```
**Что дальше:**
1. Покажите мне пример контента из `index.md` (текст поста)
2. Скажите, нужно ли добавить поддержку видео/аудио
3. Хотите ли вы добавить фильтры по датам/тегам
Готов доработать любой из шаблонов под ваши нужды! 🚀
+112
View File
@@ -0,0 +1,112 @@
The user wants me to create a comprehensive project summary in markdown format based on the conversation history. Let me analyze what has been done:
1. This is a Hugo blog project with PaperMod theme
2. The site is deployed to a remote server via SFTP/WinSCP
3. Recent work included:
- Favicon configuration
- TOML structure fixes
- Russian localization
- Date format customization
- Git commits and deployment
Let me create a comprehensive summary that captures all the important context for future sessions.# Project Summary
## Overall Goal
Организация блога на основе Hugo с темой PaperMod для публикации контента на dedinit.ru с интеграцией Gitea (gitverse.ru) и деплоем на хостинг (myjino.ru).
## Key Knowledge
### Technology Stack
- **Hugo Extended** v0.155.1 (установлена через winget)
- **Тема**: PaperMod (форк `rDedInit` как submodule)
- **Хранение статей**: bundle format (папка с `index.md`)
- **Frontmatter**: YAML формат
- **Git**: Gitea сервер `gitverse.ru:kpa39l/dedinit.ru` (SSH порт 2222)
- **Деплой**: WinSCP через Makefile на `kpa39l.myjino.ru:2222`
### Конфигурация (hugo.toml)
```toml
baseURL = 'https://dedinit.ru/'
languageCode = 'ru-ru'
timeZone = 'Europe/Moscow'
DateFormat = "02.01.2006 15:04" # формат: 06.03.2026 19:30
[languages.ru]
languageName = "Русский"
languageCode = "ru-ru"
weight = 1
[params.assets]
favicon = "images/favicon/favicon48x48.ico"
favicon16x16 = "images/favicon/favicon-16x16.png"
favicon32x32 = "images/favicon/favicon-32x32.png"
```
### Важные решения
1. Git-репозиторий инициализирован в папке Hugo-сайта (не во внешней папке)
2. Папка `public/` исключена из репозитория через `.gitignore`
3. Настройки PaperMod должны быть в `[params]`, а favicon — в `[params.assets]`
4. Для русификации требуется секция `[languages.ru]` (не только `languageCode`)
### Команды
```bash
make build # собрать сайт
make deploy # собрать и задеплоить
make deploy-dry-run # симуляция деплоя
hugo server # локальный сервер разработки
```
## Recent Actions
### Выполнено
1. **[DONE] Настройка favicon**
- Файлы: `static/images/favicon/*.ico`, `*.png`
- Конфигурация в `[params.assets]`
- `.gitignore` обновлён для исключения лишних файлов (zip, piscel, android-chrome)
2. **[DONE] Исправление структуры hugo.toml**
- Объединены дублирующиеся секции `[params]`
- Настройки PaperMod перемещены в `[params]` (работает `disableSpecial1stPost`)
3. **[DONE] Русификация темы**
- Добавлена секция `[languages.ru]`
- Формат даты: `02.01.2006 15:04` → `06.03.2026 19:30`
- Время чтения: "минута/минуты/минут" (склонение работает)
- Язык в сборке: `│ RU`
4. **[DONE] Деплой**
- Коммит запушен в `gitverse.ru:kpa39l/dedinit.ru`
- Сайт загружен на `kpa39l.myjino.ru` через WinSCP
### Статус репозитория
- Последний коммит: «Русификация сайта и настройка формата даты»
- Ветка: `main` (синхронизирована с origin)
- Untracked файлы: `favicon.png`, `static/` (требуют решения)
## Current Plan
### Текущий статус
1. **[DONE]** Установка Hugo Extended
2. **[DONE]** Создание сайта dedinit.ru
3. **[DONE]** Установка темы PaperMod (submodule)
4. **[DONE]** Настройка bundle формата статей
5. **[DONE]** Интеграция с Gitea (gitverse.ru)
6. **[DONE]** Настройка favicon
7. **[DONE]** Русификация (даты, время чтения)
8. **[DONE]** Первый деплой на myjino.ru
### Следующие шаги [TODO]
1. Решить судьбу untracked файлов (`favicon.png`, `static/`)
2. Проверить работу сайта на dedinit.ru
3. Настроить CI/CD (опционально)
4. Добавить новые статьи в блог
### Примечания
- После обновления Hugo требуется перезапуск терминала (обновление PATH)
- Для локальной разработки: `hugo server`
- Все изменения фиксируются в README.md и QWEN.md
---
## Summary Metadata
**Update time**: 2026-03-06T11:03:13.225Z
+60
View File
@@ -0,0 +1,60 @@
# Настройка интеграции с Gitea
## Требуемые данные для интеграции с gitea.nixg.ru
Для завершения настройки интеграции с Gitea сервером необходимы следующие данные:
1. **SSH ключи** - должны быть уже настроены на вашем компьютере
2. **URL репозитория** - полный URL к репозиторию на gitea.nixg.ru
3. **Имя пользователя** - для доступа к Gitea серверу
4. **Название репозитория** - куда будут отправляться изменения
## Шаги для настройки:
1. Убедитесь, что SSH ключи настроены и работают с gitea.nixg.ru
2. Создайте репозиторий на gitea.nixg.ru
3. Добавьте удаленный репозиторий в локальный проект:
```bash
cd dedinit.ru
git remote add origin ssh://git@gitea.nixg.ru/ВАШ_ЛОГИН/НАЗВАНИЕ_РЕПОЗИТОРИЯ.git
```
4. Инициализируйте Git и сделайте первый коммит:
```bash
git add .
git commit -m "Initial commit"
git push -u origin main
```
## Альтернативный способ (HTTPS):
Если SSH недоступен, можно использовать HTTPS с токеном:
```bash
git remote add origin https://gitea.nixg.ru/ВАШ_ЛОГИН/НАЗВАНИЕ_РЕПОЗИТОРИЯ.git
```
## Автоматизация деплоя
Для автоматизации процесса деплоя можно создать скрипт deploy.sh:
```bash
#!/bin/bash
echo "Сборка сайта..."
hugo
echo "Добавление изменений в репозиторий..."
git add .
git commit -m "Обновление сайта $(date)"
echo "Отправка изменений на сервер..."
git push origin main
echo "Сайт успешно обновлен!"
```
## Примечание
Все файлы в директории `dedinit.ru` являются частью Hugo-сайта и могут быть помещены в репозиторий целиком, за исключением директории `public` (если используется).
+37
View File
@@ -0,0 +1,37 @@
# Инструкция по настройке SSH подключения к Gitea серверу
Для завершения настройки интеграции с Gitea сервером, необходимо выполнить следующие шаги вручную:
## 1. Проверка подключения к серверу
Откройте терминал и выполните команду для проверки подключения:
```bash
ssh -p 2222 git@gitea.nixg.ru
```
При первом подключении система запросит подтверждение добавления ключа сервера в known_hosts. Ответьте "yes".
## 2. Если подключение прошло успешно, завершите SSH сессию командой:
```bash
exit
```
## 3. Теперь можно выполнить команды Git:
```bash
cd e:/yandex.disk/YandexDisk/projects/dedinit.ru/dedinit.ru
git remote set-url origin ssh://git@gitea.nixg.ru:2222/estorozhenko/dedinit.ru.git
git push -u origin main
```
## Альтернативный вариант (если SSH по-прежнему не работает)
Если SSH соединение не удается настроить, можно использовать HTTPS с токеном:
```bash
git remote set-url origin https://gitea.nixg.ru/estorozhenko/dedinit.ru.git
```
Затем при пуше система запросит логин и пароль (или токен доступа).