README.md

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
  • Доступ к файловой системе для обновления контента

Установка

  1. Загрузите файлы на ваш веб-сервер через FTP, SSH, rsync или Git.
  2. Убедитесь, что PHP установлен и настроен на сервере.
  3. Установите правильные права доступа:
    • Директория content/ должна быть доступна для записи, если вы планируете загружать изображения через веб
    • config.php должен быть читаемым веб-сервером
  4. Настройте веб-сервер (опционально):
    • Для Apache: включённый файл .htaccess должен работать
    • Для Nginx: см. пример конфигурации ниже
  5. Откройте приложение по вашему домену или 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

Добавление контента

Создание новой заметки

  1. Создайте новый файл .md в любой директории внутри content/
  2. Добавьте фронтматтер в начало (между строками ---):

    ---
    title: Заголовок заметки
    author: Ваше имя
    date: 2026-05-25
    description: Краткое описание заметки
    tags: [тег1, тег2, тег3]
    ---
    
    # Ваш контент здесь
    
    Пишите, используя синтаксис **Markdown**.
    
  3. Сохраните файл. Он будет автоматически доступен через веб-интерфейс.

Организация контента

  • Категории: создавайте папки в content/ (например, content/программирование/)
  • Подкатегории: создавайте вложенные папки (например, content/программирование/python/)
  • Индексные файлы: каждая директория может содержать файл index.md, который служит страницей категории
  • Страницы: любой файл .md, не названный index.md, считается страницей

Добавление изображений

  1. Загрузите изображения в content/images/ (или любую поддиректорию). Поддерживаемые форматы: JPG, PNG, GIF, WebP.
  2. Ссылайтесь на них в markdown:

    ![Альтернативный текст](/images/мое-изображение.jpg)
    

    Путь должен быть относительным к корню контента. 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 и применяются автоматически при каждом запросе. Доступны три профиля:

  1. strict (по умолчанию) – максимально строгие заголовки, подходящие для статических сайтов без динамического контента.
  2. moderate – умеренные заголовки, разрешающие встраивание контента с того же источника и базовые функции.
  3. 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

Обновление

Поскольку административная панель отсутствует, обновления выполняются путём прямого редактирования файлов:

  1. Добавляйте/редактируйте markdown-файлы в директории content/
  2. Загружайте новые изображения в content/images/
  3. Изменяйте конфигурацию в config.php
  4. Обновляйте код приложения, заменяя 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. Свяжитесь с разработчиком при необходимости


Просто, безопасно и файлово – идеально для персональных баз знаний и сайтов документации.

Описание
Конвейеры
0 успешных
0 с ошибкой
Разработчики