# Генерация статического сайта из любого сайта

> Хотите превратить динамический сайт в статику? Показываю, как с помощью одной команды wget сделать полную локальную копию любого сайта и бесплатно разместить её на GitHub Pages.

**Published:** 2015-08-19

**Canonical:** <https://grishy.dev/ru/posts/static-site-via-wget/>

**Translations:** [Русский](https://grishy.dev/ru/posts/static-site-via-wget.md)

![Генерация статического сайта из любого сайта](https://grishy.dev/_astro/wget.BgB7gVA-.avif)

---

**Статья перенесена со старого блога, оригинал.**\
Оригинал: [jiumx60rus.github.io/gienieratsiia-statichieskogho-saita-liubogho-saita](https://jiumx60rus.github.io/gienieratsiia-statichieskogho-saita-liubogho-saita/index.html)

---

Сейчас рассмотрим как сделать статическую(локальную) копию сайта, если у него нет такой функции в CMS и загружать его на [GitHub Pages](https://pages.github.com/). К слову, если нужен простой сайт, то можно попробовать использовать встроенный в GitHub [Jekyll](https://github.com/jekyll/jekyll) и если у вас блог и вам понравилась идея Jekyll, попробуйте [Octopress](http://octopress.org/). Я так собираю этот блог на работающий на Ghost.

Легче всего генерировать просто скачав все файлы, которые использует блог для отображения страниц. Грубо говоря зайдя на все страницы сайта и нажать `Ctrl+S`. Пользоваться мы будет стандартной в Linux консольной программой [wget](https://ru.wikipedia.org/wiki/Wget) и делается все это одной простой командой. Для Ghost можно пользоваться [buster](https://github.com/axitkhurana/buster).

## Что такое wget?

[**Wget**](https://ru.wikipedia.org/wiki/Wget) - свободная неинтерактивная консольная программа для загрузки файлов по сети. Поддерживает протоколы *HTTP*, *FTP* и *HTTPS*, а также поддерживает работу через *HTTP* прокси-сервер. Программа включена почти во все дистрибутивы *GNU/Linux*. *Wikipedia*

Wget очень удобное приложение командной строки для скачивания файлов через различные протоколы, а именно HTTP. С помощью нескольких дополнительных параметров, Wget превращается в веб-архиватора. Можно рекурсивно пройти по сайту и создать его локальную, автономную копию на своём компьютере.

Для Windows она [тоже есть](https://gnuwin32.sourceforge.net/packages/wget.htm), но сам я её там не проверял.

## Как мы будем использовать wget

Будем проходить по всему нашему сайту, скачивая то, что отдаёт нам сервер, и загружая все файлы, которые нужны для нормального отображения страницы (изображения, скрипты, стили и т.п.), в папку на компьютере.

Вот что у меня будет скачано для главной страницы:
![Файлы, скачанные wget для главной страницы](https://grishy.dev/_astro/Screenshot.dMhjm9We.avif)

## Приступаем

- Запускаем свой сайт у себя.
- Используем wget, чтобы получить копию.
  `wget -r -k -E -nH -Pstatic --restrict-file-name=unix http://localhost:2368/`
- Загрузить то, что получили на предыдущем шаге на хостинг.

---

### Запускаем свой сайт у себя.

Я захожу в папку с Ghost и `npm start`. Если у вас WordPress, то можно скачать с [Bitnami установщик](https://bitnami.com/stack/wordpress) и т.п.

```plain
jiumx@jiumx-All-Series:~/src/ghost$ npm start

> ghost@0.6.4 start /home/jiumx/src/ghost
> node index

Migrations: Up to date at version 003
Ghost is running in development...
Listening on 127.0.0.1:2368
Url configured as: http://localhost:2368
Ctrl+C to shut down
```

Как видите, он запустился на `localhost:2368` и если мы откроем в браузере эту ссылку, то там должен быть наш блог. Он доступен только с нашего компьютера и каждая страница генерируется по запросу от пользователя.

---

### Используем wget, чтобы получить копию.

И так приступим к разбору этой большой и сложной команды в пункте 2 :)

1. `wget` - программа, которую мы хотим запустить.
2. `-r` - рекурсивно проходить по ссылкам на страницах.
   Например программа заходит на главную страницу скачивает её и видит ссылку на первый пост, переходит к посту, там тоже ссылки на другие страницы и все повторяется. Таким образом она пройдёт по всему сайту, который доступен пользователю.
3. `-k` - превратить абсолютные ссылки в документе в относительные ссылки. То есть `grishy.ru/post-simple` будет переделан в `post-simple`. Это нужно для того, чтобы сгенерированная копия не зависела от имени сайта и работала в любой папке.
4. `-E` - добавлять расширение `.html` загруженным страницам. Нужно для локального просмотра.
5. `-nH` - Отключает создание хост-каталога. По умолчанию запуск wget создаст структуру каталогов, начиная с localhost:2368.
6. `-Pstatic` - Определяет в какую папку загружать сайт. В данном случае выбрана папка *static*. Иначе все файлы просто вывалятся в директорию, откуда была запущена программа.
7. `--restrict-file-name=unix` - Определяет набор символов, разрешённых в URL. По умолчанию wget экранирует символы, которые не могут быть частью имени файла в вашей операционной системе, а также управляющие символы, как правило непечатные. Иначе у могут появится весёлые названия типа `/\321%81ка\321%87а\321%82\321%8C`
8. `http://localhost:2368/` - URL на сайт для копирования. Можно указать URL не только на своём компьютере, а например небольшой сайт для проверки :)

Так как мы работаем в пределах своего компа, то копия создается очень быстро. Насколько?

```plain
ЗАВЕРШЕНО --2015-08-21 00:16:50--
Общее время: 1,0s
Загружено: 33 файлов, 5,1M за 0,7s (7,24 MB/s)
```

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

```plain
jiumx@jiumx-All-Series:~/src/blog$ tree . -d
.
└── static
    ├── about
    ├── assets
    │   ├── css
    │   ├── fonts
    │   ├── images
    │   └── js
    ├── content
    │   └── images
    │       └── 2015
    │           └── 08
    ├── gienieratsiia-statichieskogho-saita-liubogho-saita
    ├── pochiemu-ghost
    ├── projects
    ├── rss
    └── tag
        ├── ghost-tag
        ├── git
        ├── node-js
        ├── optimizatsiia
        ├── wget
        └── wordpress

22 directories
```

---

### Загружаем на GitHub

И осталось только показать наш блог всем. Я перед этим ещё его оптимизирую, но это не обязательно :). Регистрируемся на GitHub и заходим [GitHub Pages](https://pages.github.com/). Выполняем первый пункт т.е. создайте репозиторий c именем `username.github.io`, где *username* это ник на GitHub. После создания репозитория откроется что-то похожее на
![Страница создания репозитория на GitHub](https://grishy.dev/_astro/Screenshot-2.Cp6Qe6_v.avif)

В папке `static` выполняем команды([Кратко о git, чтобы понимать что к чему](https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9))

- `git init` - создания репозитория
- `git add .` - выбрать все файлы для отправки на github
- `git commit -m "Обновление блога"` - создаем коммит с записью *Обновление блога*. Можно использовать любое описание. У меня, например, с датой его отправления ↓
  ![Скриншот коммита ](https://grishy.dev/_astro/Screenshot-3.B87hambY.avif)
- А теперь надо ввести те те две команды которые я обвёл на скриншоте выше (**красным**). Первая укажет куда отправлять, а вторая отправит его.

Если все прошло без ошибок, то переходим на `username.github.io` и наслаждается сайтом.
К слову обновление происходит не мгновенно. А в репозитории теперь есть история вашего сайта и и при желании можно откатиться на неделю назад, если что-то не понравилось или посмотреть как он развивался.

[Загрузка статического сайта на GitHub Pages](https://www.youtube.com/watch?v=insM7oUYNOE)
