Документация / Администрирование
Сайт на 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 и не заменяет сервер динамического приложения.