factumLog CMS
Минималистичная CMS на PHP без базы данных для преобразования иерархических Markdown-файлов (например, из Obsidian) в статические веб-страницы. Идеально подходит для персональных блогов, баз знаний и сайтов документации.
factumLog — это система, созданная для тех, кто пишет в Markdown и не хочет тратить время на сложные CMS. Она работает по принципу «файлы как контент», не требует базы данных и обеспечивает безопасность через простоту.
Подробнее о системе читайте в Справке. Для быстрого начала работы ознакомьтесь с разделом Быстрый старт на главной странице.
Возможности
- Одностраничное PHP-приложение — легко развернуть и поддерживать
- Markdown с фронтматтером — поддержка метаданных (заголовок, автор, дата, теги)
- Поддержка изображений — отображение изображений из директории
content/images(форматы: JPG, PNG, GIF, WebP) - Организация по категориям/подкатегориям — иерархическая структура папок
- Автоматическая боковая панель — отображение категорий и подкатегорий текущего раздела
- Хлебные крошки — навигация по иерархии категорий (можно отключить)
- Адаптивный дизайн — работает на компьютерах и мобильных устройствах
- Безопасность — защита от обхода путей, ограниченные типы файлов, заголовки безопасности
- Настройка темы — настройка цветов и макета через
config.php - Внешний CSS — стили вынесены в
css/main.css - Без базы данных — весь контент хранится в файлах
- Листинг директорий — автоматическое отображение содержимого папок при отсутствии index.md (настраивается)
- Пользовательская страница 404 — информативная страница с предложениями при ошибке
Структура проекта
.
├── index.php # Основной файл приложения
├── config.php # Конфигурация (тема, настройки)
├── security-headers.json # JSON-конфигурация заголовков безопасности
├── .htaccess # Правила безопасности и перезаписи для Apache
├── .gitignore # Игнорируемые файлы Git
├── components/ # PHP-компоненты для вставки в Markdown
│ └── banner-l.php # Пример компонента (баннер)
├── theme/ # Тема оформления
│ ├── template.html # HTML-шаблон страницы
│ └── css/
│ └── main.css # Основные стили
├── content/ # Весь контент (Markdown-файлы)
│ ├── images/ # Изображения (JPG, PNG, GIF, WebP, SVG)
│ ├── index.md # Домашняя страница
│ ├── Справка/ # Документация по системе
│ │ ├── index.md # Оглавление справки
│ │ ├── factumlogcms.md
│ │ ├── markdown.md
│ │ └── components.md
│ └── ... # Ваши категории и статьи
└── README.md # Этот файл
Требования
- PHP 7.4 или выше
- Веб-сервер (Apache, Nginx, IIS) с поддержкой PHP
- Доступ к файловой системе для обновления контента
Установка
- Загрузите файлы на ваш веб-сервер через FTP, SSH, rsync или Git.
- Убедитесь, что PHP установлен и настроен на сервере.
- Установите правильные права доступа:
- Директория
content/должна быть доступна для записи, если вы планируете загружать изображения через веб config.phpдолжен быть читаемым веб-сервером
- Директория
- Настройте веб-сервер (опционально):
- Для Apache: включённый файл
.htaccessдолжен работать - Для Nginx: см. пример конфигурации ниже
- Для Apache: включённый файл
- Откройте приложение по вашему домену или IP-адресу сервера.
Конфигурация Nginx
server {
listen 80;
server_name yourdomain.com;
root /path/to/your/application;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Запретить доступ к служебным файлам
location ~ /\.ht {
deny all;
}
location ~ /config\.(php)$ {
deny all;
}
}
Конфигурация
Отредактируйте config.php, чтобы настроить:
- Информация о сайте: заголовок, подзаголовок, футер
- Цвета темы: основной, дополнительный, фон, текст, ссылки, границы и т.д.
- Параметры макета: видимость боковой панели, хлебные крошки, максимальная ширина, ширина боковой панели
- Настройки контента: корневая директория, директория изображений, формат даты, длина отрывка
- Настройки безопасности: разрешённые расширения файлов, листинг директорий, отключение выполнения
Пример конфигурации (config.php):
return [
'site' => [
'title' => 'FactumLog CMS',
'subtitle' => 'И никакой это не блог!',
'footer' => '© 2026 FactumLog',
],
'theme' => [
'primary' => '#3b82f6',
'secondary' => '#10b981',
'background' => '#f9fafb',
'text' => '#111827',
'link' => '#2563eb',
'border' => '#d1d5db',
'card_bg' => '#ffffff',
'shadow' => '0 1px 3px rgba(0,0,0,0.1)',
],
'layout' => [
'max_width' => '1200px',
'sidebar_width' => '280px',
'show_sidebar' => true,
'show_breadcrumbs' => true,
],
'content' => [
'root' => 'content',
'images_dir' => 'images',
'default_category' => 'general',
'date_format' => 'F j, Y',
'excerpt_length' => 150,
],
'security' => [
'allow_directory_listing' => true,
'allowed_extensions' => ['md', 'jpg', 'jpeg', 'png', 'gif', 'webp', 'css', 'js', 'svg', 'ico', 'txt'],
'disable_execution' => true,
'security_headers_profile' => 'strict', // strict, moderate, development
],
];
Приоритет загрузки конфигурации: 1. config.php (если существует) 2. Значения по умолчанию из index.php
Добавление контента
Создание новой заметки
- Создайте новый файл
.mdв любой директории внутриcontent/ -
Добавьте фронтматтер в начало (между строками
---):--- title: Заголовок заметки author: Ваше имя date: 2026-05-25 description: Краткое описание заметки tags: [тег1, тег2, тег3] --- # Ваш контент здесь Пишите, используя синтаксис **Markdown**. - Сохраните файл. Он будет автоматически доступен через веб-интерфейс.
Организация контента
- Категории: создавайте папки в
content/(например,content/программирование/) - Подкатегории: создавайте вложенные папки (например,
content/программирование/python/) - Индексные файлы: каждая директория может содержать файл
index.md, который служит страницей категории - Страницы: любой файл
.md, не названныйindex.md, считается страницей
Добавление изображений
- Загрузите изображения в
content/images/(или любую поддиректорию). Поддерживаемые форматы: JPG, PNG, GIF, WebP. -
Ссылайтесь на них в markdown:
Путь должен быть относительным к корню контента. SVG не поддерживается по умолчанию (можно добавить в настройки безопасности).
Функции безопасности
- Защита от обхода путей: предотвращает доступ к файлам вне директории контента
- Разрешённые расширения: только
.mdи файлы изображений (JPG, PNG, GIF, WebP) доступны - Запрет выполнения PHP: PHP-файлы в директории контента блокируются через настройки сервера
- Заголовки безопасности: настраиваемые профили безопасности через JSON-файл
security-headers.json. Включают:- Content-Security-Policy (CSP) с строгими ограничениями
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY / SAMEORIGIN
- X-XSS-Protection: 1; mode=block
- Referrer-Policy: strict-origin-when-cross-origin
- Permissions-Policy: ограничение доступа к API устройств
- Strict-Transport-Security (HSTS)
- Cross-Origin заголовки (Embedder-Policy, Opener-Policy, Resource-Policy)
- Листинг директорий: настраивается через
config.php(по умолчанию включён) - Валидация путей: удаление нулевых байтов, нормализация слешей
Настройка заголовков безопасности
Заголовки безопасности определяются в файле security-headers.json и применяются автоматически при каждом запросе. Доступны три профиля:
- strict (по умолчанию) – максимально строгие заголовки, подходящие для статических сайтов без динамического контента.
- moderate – умеренные заголовки, разрешающие встраивание контента с того же источника и базовые функции.
- development – заголовки для разработки, с минимальными ограничениями для удобства отладки.
Профиль выбирается в config.php в секции security параметром security_headers_profile. Пример:
'security' => [
// ...
'security_headers_profile' => 'strict', // strict, moderate, development
],
Вы можете редактировать security-headers.json для добавления собственных заголовков или изменения существующих.
Методы развёртывания
FTP/FTPS
Загрузите все файлы на ваш веб-сервер с помощью FTP-клиента.
SSH/SCP
scp -r * user@yourserver:/var/www/html/
Rsync
rsync -avz . user@yourserver:/var/www/html/
Git
git clone https://github.com/your-repo.git /var/www/html/
cd /var/www/html/
git pull origin main
Обновление
Поскольку административная панель отсутствует, обновления выполняются путём прямого редактирования файлов:
- Добавляйте/редактируйте markdown-файлы в директории
content/ - Загружайте новые изображения в
content/images/ - Изменяйте конфигурацию в
config.php - Обновляйте код приложения, заменяя
index.php(при необходимости)
Ограничения
- Нет встроенного поиска
- Нет аутентификации пользователей (реализуйте на уровне сервера при необходимости)
- Нет WYSIWYG-редактора (редактируйте markdown-файлы напрямую)
- Нет истории версий (используйте Git для контента при необходимости)
- Нет поддержки SVG изображений по умолчанию (можно добавить вручную в конфигурацию)
- Нет мультиязычности
Решение проблем
Изображения не отображаются
- Проверьте правильность пути к изображению в markdown
- Убедитесь, что изображение существует в директории
content/images/ - Проверьте права доступа (изображения должны быть читаемы веб-сервером)
Ошибки 404 для страниц
- Убедитесь, что markdown-файл имеет расширение
.md - Проверьте, что файл находится в правильной директории
- Убедитесь, что путь URL соответствует структуре директорий
Ошибки PHP
- Проверьте журнал ошибок PHP для деталей
- Проверьте совместимость версии PHP
Предупреждения безопасности
- Убедитесь, что файлы
.htaccessна месте - Проверьте, что
config.phpнедоступен через веб - Убедитесь, что листинг директорий соответствует настройке в
config.php(по умолчанию включён)
Кастомизация
Стили
Измените CSS в css/main.css или переопределите его внешними стилями. Также можно редактировать встроенные стили в index.php (ищите тег <style>).
Функциональность
Расширьте index.php дополнительными возможностями:
- Добавьте поиск
- Реализуйте фильтрацию по тегам
- Создайте RSS-ленту
- Добавьте систему комментариев
Лицензия
Этот проект с открытым исходным кодом, доступен для модификации и распространения.
Поддержка
При возникновении проблем или вопросов: 1. Ознакомьтесь с документацией выше 2. Изучите код в index.php 3. Свяжитесь с разработчиком при необходимости
Просто, безопасно и файлово – идеально для персональных баз знаний и сайтов документации.