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:
@@ -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` содержит команды для подключения и синхронизации файлов
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
@@ -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. Хотите ли вы добавить фильтры по датам/тегам
|
||||
|
||||
Готов доработать любой из шаблонов под ваши нужды! 🚀
|
||||
@@ -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
|
||||
@@ -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` (если используется).
|
||||
@@ -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
|
||||
```
|
||||
|
||||
Затем при пуше система запросит логин и пароль (или токен доступа).
|
||||
Reference in New Issue
Block a user