# Весь сайт в двух файлах

Без возни с сервером и плагинами: только программа Eile и база SQLite. PHP и MySQL ставить не нужно, а сайт с менеджером запускается одной командой.

$ `curl -fsSL https://github.com/a-sharapov/eile/releases/latest/download/install.sh | bash`

[Скачать](https://github.com/a-sharapov/eile/releases/latest) [GitHub](https://github.com/a-sharapov/eile) [Кукбук](https://eile.site/cookbook)

Linux и macOS, x64 и arm64 v0.1.0-alpha.9.1 *альфа* GPL-3.0

![Менеджер Eile: слева дерево страниц, справа редактор записи блога с заголовком, адресом, анонсом и текстом](https://eile.site/media/screens/editor-light.webp?v=89f9bda303ecdff2)  ![Менеджер Eile: слева дерево страниц, справа редактор записи блога с заголовком, адресом, анонсом и текстом](https://eile.site/media/screens/editor-dark.webp?v=4ed7ecb60464b9d4)

[Как сделать сайт · ролик 1:23](https://eile.site/media/video/howto-ru.mp4?v=e50932a0574662db)

На снимках демо-блог из каркаса blog (cms new blog).

## Где обычно уходит время

Сам сайт делается быстро. Время уходит на всё вокруг: сервер, плагины, переезды и правки по звонку пользователя. Вот что Eile берёт на себя.

- Чтобы показать пользователю сайт, сначала нужно поднять веб-сервер, PHP и MySQL. Eile ставится одной командой и запускает сайт с менеджером ещё одной.
- Обновили плагин, и поехала вёрстка или легла админка. SEO, формы, поиск, копии и HTTPS уже внутри. Обновление одно, cms update, и новую версию оно сначала проверяет.
- Переезд на другой хостинг съедает вечер: дамп базы, файлы, конфиги. Весь сайт лежит в двух файлах, программе и базе SQLite. Скопировали их, и сайт работает на новом сервере.
- Одна опечатка в шаблоне, и вместо сайта ошибка. Шаблон с ошибкой не сохранится: менеджер покажет строку, а сайт продолжит работать на прежней версии.
- Пользователь боится трогать админку и звонит вам по каждой запятой. Понятное дерево страниц, текст блоками и история правок: любую версию можно вернуть одной кнопкой.
- Заявки с сайта теряются в почте. Заявки приходят в менеджер со статусами и сразу уведомляют в Telegram или на почту.

## Что заменяют два файла

Обычный сайт держится на веб-сервере, PHP, базе данных и десятке плагинов, и у каждого свои обновления и поломки. В Eile весь сайт это исполняемый файл и база SQLite. Только их и нужно обновлять, переносить и копировать.

### Обычно

типичный сайт на PHP-CMS

1. Веб-сервер и его настройка
2. PHP с расширениями
3. Сервер базы данных
4. Сама CMS
5. Плагин кэша
6. Плагин SEO и карты сайта
7. Плагин форм
8. Плагин резервных копий
9. Cron для фоновых задач
10. Certbot для HTTPS

У каждого слоя свои обновления, настройки и способы сломаться.

### Eile

весь сайт

`cms`исполняемый файл сервер, менеджер, компилятор Svelte, миграции, HTTPS

`site.db`база SQLite страницы, шаблоны, медиа, пользователи, заявки

`cms backup copy.db` делает копию всего сайта одним файлом. Для переезда нужно скопировать два файла.

## Быстрый сайт без плагина кэша

Не нужно подбирать кэш, CDN и сжатие. Страницу сервер отдаёт готовым HTML из памяти, кэш сбрасывается ровно там, где что-то изменилось, а JavaScript попадает на страницу, только если без него не обойтись.

0,1 мс1 мс10 мс100 мс1 с **0,23 мс** страница из кэша**≈0,5 мс** первая сборка страницы, время процессора**16,7 мс** один кадр экрана 60 Гц**100 мс** до этого порога отклик кажется мгновенным

Замер на сайте из 3000 страниц: медиана (p50), время сервера без сети. Шкала логарифмическая. [Как мерили: docs/roadmap.md](https://github.com/a-sharapov/eile/blob/main/docs/roadmap.md)

**Эта страница тоже на Eile** Замер вашего браузера, прямо сейчас. HTML… скрипты островов… ответ сервера с учётом сети…

Двухфазный кэш Страница целиком лежит в памяти, а живые места (формы, корзина) дорисовываются на каждом запросе.

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

ETag, br и gzip Сжатые копии готовятся заранее, а повторный визит получает 304 без тела.

JavaScript только у островов Страница без островов уходит без единого скрипта. Здесь четыре острова (копирование, меню, ролик и замер выше) и строка в шапке, которая помнит выбранную тему.

## Пользователь правит сам, а любую правку можно откатить

Весь сайт виден деревом, как он вложен. Текст собирается из блоков, картинки берутся из медиатеки, страница выходит сразу или по расписанию. Если правка не удалась, история вернёт любую версию одной кнопкой.

![Обзор сайта в менеджере: все страницы в таблице, где адрес, шаблон, меню и публикацию можно править прямо в строке](https://eile.site/media/screens/overview-light.webp?v=952b7b2d5ee4f385)  ![Обзор сайта в менеджере: все страницы в таблице, где адрес, шаблон, меню и публикацию можно править прямо в строке](https://eile.site/media/screens/overview-dark.webp?v=3fed7b2c13d19c21)

Дерево страниц id у каждой страницы, перетаскивание мышью и курсив у черновиков.

Текст блоками Абзацы, заголовки и картинки вперемешку с компонентами; форма параметров строится сама.

Публикация по расписанию Страница выйдет и снимется сама в назначенный час.

История правок Сравнение версий по словам и возврат любой из них одной кнопкой.

Быстрый переход Ctrl K ведёт к любой странице, элементу или файлу в пару нажатий.

Медиатека Уменьшенные копии картинок для разных экранов делаются сами, а описание для alt подставляется при вставке.

## Вёрстка без сборки и деплоя

Шаблоны пишутся на обычном Svelte и правятся прямо в браузере. Сохранили, и сайт уже другой: без npm, сборщика и выкладки. Шаблон с ошибкой не сохранится, поэтому опечатка не положит сайт.

Blog шаблон

```
<script>
  import Layout from '$components/Layout';
  import { link, listing } from '$core';

  let { page, site } = $props();
  const posts = listing(page.id, { perPage: 10 });
</script>

<Layout {page}>
  <h1>{page.longTitle || page.title}</h1>
  {#each posts.items as post (post.id)}
    <a href={link(post.id)}>{post.title}</a>
  {/each}
  <p>{site.custom.phone}</p>
</Layout>
```

Правка видна сразу Шаблоны и компоненты компилируются при сохранении, без сборки и деплоя.

Ошибка не роняет сайт Если код не компилируется, сохранение отклоняется с указанием места ошибки, а сайт работает на прежней версии.

JavaScript по требованию Страница уходит чистым HTML. Компонент-остров гидрируется в браузере, только если его так подключили.

## Черновик текста по паре слов

Пустое поле больше не держит работу. Палочка у поля пишет черновик заголовка, описания, текста страницы или даже шаблона на Svelte. Напишите, что нужно, посмотрите вариант и вставьте его или попросите другой.

![Окно «Сгенерировать с ИИ» в редакторе шаблона: просьба добавить кнопку записи на замер](https://eile.site/media/screens/ai-light.webp?v=20f3dd7cb112e1f7)  ![Окно «Сгенерировать с ИИ» в редакторе шаблона: просьба добавить кнопку записи на замер](https://eile.site/media/screens/ai-dark.webp?v=ac90aa82852ceb9b)

1. Нажмите палочку у поля или Alt+I.
2. Напишите пару слов: «короче», «анонс в одно предложение», «добавь кнопку записи».
3. Посмотрите вариант и нажмите «Вставить» или «Ещё вариант».

Тексты и код Заголовки, описания, текст страницы, а ещё шаблоны, компоненты и плагины.

Знает ваш сайт С просьбой уходят название и язык сайта, поле и где оно стоит, поэтому хватает пары слов.

Ваша модель DeepSeek, OpenAI или любая модель с таким же API, хоть локальная. Ключ хранится только на сервере и в копию сайта не попадает.

Ваши правила Тон и правила текстов задаются один раз в настройках и уходят с каждой просьбой.

## Всё, ради чего ставят плагины, уже внутри

SEO и находимость для ИИ, формы с заявками, поиск, резервные копии, HTTPS и переводы. Их не нужно подбирать, совмещать и обновлять по отдельности: они приходят и обновляются вместе с Eile.

Обычно ставят В Eile

### Находимость

плагин SEO canonical, Open Graph и JSON-LD без настройки

плагин карты сайта sitemap.xml и robots.txt с правилами для ИИ-ботов

обычно этого нет llms.txt и Markdown-версия каждой страницы для ИИ

плагин редиректов старые адреса сами ведут на новые после переименования

### Формы и заявки

плагин форм форма пишется обычной HTML5-разметкой, заявки приходят в менеджер со статусами

SMTP-плагин и бот уведомления в Telegram и на почту

капча защита от спама без капчи: ловушка, печать и лимит

### Поиск по сайту

плагин поиска или внешний сервис поиск понимает русские окончания («книги» находят «книгу») и подсвечивает отрывки

### Спокойствие владельца

плагин версий история правок со сравнением и возвратом версии

плагин копий и cron автокопии всего сайта по расписанию

проверка ссылок вручную диагностика: битые ссылки, страницы без описания, картинки без alt

### Сервер

Certbot и прокси HTTPS сам, через Let’s Encrypt и без прокси

обновление файлов по FTP cms update скачивает новую версию и сверяет SHA256

сервис мониторинга сообщения о сбоях приходят в Telegram и на почту

### Языки

плагин мультиязычности ветки сайта на разных языках и словари переводов в менеджере

## Первый сайт уже сегодня

Готовый сайт разворачивается одной командой: блог, портфолио, сайт компании, витрина или магазин.

1. 1 Установить `curl -fsSL …/install.sh | bash` Скрипт выберет сборку под систему, сверит SHA256 и положит cms в PATH.
2. 2 Развернуть сайт `cms new blog --db site.db` Каркасы: blog, portfolio, company, showcase, shop. Без каркаса получится пустая база с приветствием.
3. 3 Запустить `cms --db site.db` Сайт и менеджер откроются на localhost:8080. При первом запуске сервер напечатает ссылку, чтобы создать администратора.

Подробно и по шагам, от пустой папки до сайта в интернете: [Кукбук](https://eile.site/cookbook)

$ `curl -fsSL https://github.com/a-sharapov/eile/releases/latest/download/install.sh | bash`

[Скачать](https://github.com/a-sharapov/eile/releases/latest) [GitHub](https://github.com/a-sharapov/eile) [Кукбук](https://eile.site/cookbook)

Linux и macOS, x64 и arm64 v0.1.0-alpha.9.1 *альфа* GPL-3.0

Это альфа-версия: делать сайты уже можно, но до 1.0 возможны несовместимые изменения. Перед обновлением сделайте cms backup.