Документация / Администрирование

Сайт на VDS: запуск, журналы и резервные копии

Обновлено 12.10.2026

Что получится

Статический сайт на darkhttpd, который запускается после загрузки ОС. Журнал запросов хранится отдельно. Каждый день cron создаёт резервную копию файлов сайта и описания службы; сохраняются три последних успешных копии. В конце инструкции проверим восстановление.

Сценарий проверен на Синапс ОС 0.1.542 Cloud, x86_64. Используйте облачный образ со страницы загрузки. В нём уже есть darkhttpd, nano, Lua, backup, service, cron и logrotate. Исходный образ 0.1.535 для этой инструкции не подходит без обновления компонентов.

Команды рассчитаны на встроенную оболочку Синапс ОС. Bash не требуется. Файлы создаём через nano, автоматизацию выполняем на Lua.

Файлы сайта

Запустите ОС и убедитесь, что она получила сетевой адрес:

ip addr

Создайте каталоги:

mkdir -p /var/www /etc/services /var/log /var/backups/site /root/bin
nano /var/www/index.html

Сохраните страницу:

<!doctype html>
<html lang="ru">
<meta charset="utf-8">
<title>Сайт на Синапс ОС</title>
<h1>Сайт работает</h1>
<p>Эта страница обслуживается darkhttpd.</p>
</html>

В nano нажмите Ctrl+O, Enter, затем Ctrl+X. Подробнее: редактор nano.

Служба и автозапуск

В свежем Cloud для этого сценария отключите встроенный nginx: здесь используем darkhttpd на порту 8080. Затем создайте описание своей службы:

service disable nginx
nano /etc/services/web

Содержимое файла:

exec /bin/darkhttpd /var/www --port 8080 --no-listing --log /var/log/web-access.log

Это описание для supervisor, а не скрипт Bash. Сервер работает на переднем плане; --daemon не добавляйте.

service start web
service status web

Откройте http://АДРЕС_СЕРВЕРА:8080/ в браузере. Для VDS разрешите входящий TCP-порт 8080 в панели провайдера. При запуске через QEMU пробросьте порт гостя 8080 на свободный порт хоста. В каталоге публикации не храните архивы, ключи и настройки.

Проверьте перезапуск:

service restart web
service status web

Обновите страницу в браузере. Для проверки автозапуска сохраните файлы и выполните:

sync
halt -r

После загрузки снова проверьте service status web и страницу. В этом образе перезагрузка выполняется через halt -r.

Журналы

cat /var/log/web-access.log
cat /var/log/web.log
logrotate

Первый файл содержит обращения к сайту, второй - вывод службы. Стандартная ротация обрабатывает файлы .log в /var/log, порог составляет 1 МиБ, сохраняются три предыдущих файла. Задание */10 * * * * /bin/logrotate уже есть в стандартном /etc/crontab; сохраните его.

Три резервные копии

Создайте файл:

nano /root/bin/backup-site.lua

Вставьте скрипт:

local base = '/var/backups/site/'
local function run(command)
  local ok, why, code = os.execute(command)
  if not ok then error(command .. ': ' .. tostring(why) .. ' ' .. tostring(code)) end
end
local function exists(path)
  local f = io.open(path, 'rb')
  if f then f:close(); return true end
  return false
end
run('/bin/mkdir -p ' .. base)
-- Create and validate BEFORE touching the three retained snapshots.
run('/bin/backup create ' .. base .. 'site-new.tar --root / var/www etc/services/web')
run('/bin/backup test ' .. base .. 'site-new.tar')
if exists(base .. 'site-2.tar') then run('/bin/cp ' .. base .. 'site-2.tar ' .. base .. 'site-3.tar') end
if exists(base .. 'site-1.tar') then run('/bin/cp ' .. base .. 'site-1.tar ' .. base .. 'site-2.tar') end
run('/bin/cp ' .. base .. 'site-new.tar ' .. base .. 'site-1.tar')
run('/bin/rm ' .. base .. 'site-new.tar')
print('site backup complete')

Здесь сохраняются /var/www и /etc/services/web. Архив создаётся и проверяется до изменения прежних копий. site-1.tar - последняя копия, site-2.tar и site-3.tar - две предыдущие. Это файловые архивы; для статических файлов отдельная остановка сервера не нужна, но не изменяйте содержимое сайта во время создания копии.

Запустите вручную:

lua /root/bin/backup-site.lua
backup test /var/backups/site/site-1.tar
backup list /var/backups/site/site-1.tar

Ожидаемый результат скрипта: site backup complete. Копии находятся вне каталога сайта и не доступны через darkhttpd. Для их хранения требуется свободное место: во время ротации существует также новый промежуточный архив. Не запускайте второй экземпляр скрипта одновременно.

Расписание

nano /etc/crontab

Добавьте строку, сохранив остальные задания:

0 3 * * * /bin/lua /root/bin/backup-site.lua

Это пять полей времени и команда, без поля пользователя. Задание выполняется ежедневно в 03:00 по системным часам гостя. В проверенном образе используется UTC: 03:00 UTC соответствует 06:00 по Москве. Проверьте время командой date и при необходимости измените час расписания.

service restart cron
service status cron
cat /var/log/cron.log

Подробнее: cron. Вывод скрипта попадёт в журнал cron. Эта схема хранит три успешные копии на том же диске; для защиты от потери диска регулярно переносите их на отдельное хранилище.

Восстановление

Проверьте архив и распакуйте его в новый пустой каталог:

backup test /var/backups/site/site-1.tar
backup restore /var/backups/site/site-1.tar /var/restore-site
cat /var/restore-site/var/www/index.html

Если каталог /var/restore-site уже занят, выберите другое новое имя. Убедитесь, что восстановленная страница содержит ожидаемый текст.

Для сайта с одним файлом из этого примера верните страницу и описание службы:

service stop web
cp /var/restore-site/var/www/index.html /var/www/index.html
cp /var/restore-site/etc/services/web /etc/services/web
service start web
service status web

Обновите страницу в браузере. Для более крупного сайта перенесите все восстановленные файлы при остановленной службе. Другие настройки ОС и скрипт расписания этот архив не сохраняет; их настройка описана выше.

Что проверено

В отдельной виртуальной машине Cloud 0.1.542 проверены HTTP-ответ и журнал запросов, перезапуск службы, автозапуск после двух перезагрузок, ротация журнала, реальное выполнение задания cron и восстановление трёх разных копий. Восстановленные файлы побайтово совпали с исходными. Ошибка создания архива не изменила прежние три копии.

Сценарий публикует статический сайт по HTTP. Для публичного сайта с HTTPS поставьте TLS-прокси перед этим сервером. darkhttpd не запускает PHP или Python и не заменяет сервер динамического приложения.