▍Как размещен мой сайт¶
Так как мой сайт генерируется с помощью MkDocs, т.е. по итогу мы получаем сборник статических файлов, которые в свою очередь мы можем разместить на разных платформах, например, на страницах GitHub, Amazon S3 и т.д.
В моём случае разместим на практически "бесплатном" объектном хранилище в Selectel.
Создание S3 хранилища¶
Заходим в панель управления в разел Объектное хранилище ⟶ Хранилище.
Нажимаем Создать контейнер. Указываем имя, например, daffin. Главное в качестве типа контейнера выбрать Публичный и класс хранения - Стандартное хранение.
Переходим в раздел Пользователи и нажимаем на кнопку Создать пользователя. Указываем префикс, в моём случае это _s3, задаём пароль и ставим галочку напротив пункта Использовать эти данные для доступа по протоколу S3
Возвращаемся в раздел Хранилище и нажимаем на созданый ранее контейнер, в моём случае это daffin, и переходим на вкладку Настройки контейнера. В подразделе Управление доступом указываем созданного пользователя и выбираем Чтение и запись
Указываем данные как на скрине
И добавляем наши домены
Загрузка файлов¶
Для загрузки файлов воспользуемся утилитой rclone. Можно выполнить интерактивную настройку подключения через команду:
или просто создать конфиг:[selectel_s3]
type = s3
provider = Other
env_auth = false
access_key_id = имяпользователя_s3
secret_access_key = парольпользователя
region = ru-1
endpoint = https://s3.storage.selcloud.ru
Теперь чтобы загрузить файлы в хранилище выполним команду
где selectel_s3 - это имя из первой строки конфига rclone.conf [selectel_s3], daffin - это имя контейнера.
Вывести список загруженных файлов:
Настройка SSL¶
В качестве простого решения настройки SSL будет подключение домена к Cloudflare. Главное чтобы записи в графе Proxy status значились как Proxied
Если необходимо настроить 301 редирект с поддомена www на основной домен, то это можно сделать в разделе Page Rules как на скрине:
Готово!
CI/CD Pipeline¶
Для автоматизации сборки и загрузки сайта в S3 хранилище
stages:
- build
- test
- deploy
build_docs_job:
stage: build
tags: [mkdocs]
only:
- /^master$/
- merge_requests
image:
name: registry.example.ru/mkdocs:0.1
entrypoint: [""]
script:
- 'mkdocs build --site-dir site'
artifacts:
name: "site_$($CI_PIPELINE_IID)"
paths:
- site
test:
stage: test
tags: [mkdocs]
image:
name: registry.example.ru/mkdocs:0.1
entrypoint: [""]
dependencies:
- build_docs_job
only:
- /^master$/
before_script:
- (if [ -d "site" ]; then echo ok; else exit "no build folder, try to run pipeline again"; fi);
script:
# Копия для локального теста
- 'rsync -va -P -p --delete site/ /site'
deploy:
stage: deploy
tags: [mkdocs]
image:
name: registry.example.ru/mkdocs:0.1
entrypoint: [""]
dependencies:
- build_docs_job
only:
- /^master$/
before_script:
- (if [ -d "site" ]; then echo ok; else exit "no build folder, try to run pipeline again"; fi);
script:
# Копия для загрузки в S3 Selectel
- 'rclone copy site/ selectel_s3:daffin'
when: manual
Dockerfile¶
FROM squidfunk/mkdocs-material
COPY ./rclone.conf /root/.config/rclone/rclone.conf
RUN apk add rsync rclone build-base ttf-ubuntu-font-family libffi-dev zlib-dev \
libwebp-dev jpeg-dev harfbuzz-dev fribidi-dev freetype-dev \
cairo-dev musl-dev pango-dev gdk-pixbuf-dev && \
/usr/local/bin/python -m pip install --upgrade pip && \
pip install mkdocs-with-pdf && \
pip install mkdocs-bootswatch && \
pip install mkdocs-blog-plugin && \
pip install mkdocs-awesome-pages-plugin && \
pip install mkdocs-roamlinks-plugin
Вот теперь точно готово