Перейти к содержанию

▍Как размещен мой сайт

Так как мой сайт генерируется с помощью MkDocs, т.е. по итогу мы получаем сборник статических файлов, которые в свою очередь мы можем разместить на разных платформах, например, на страницах GitHub, Amazon S3 и т.д.

В моём случае разместим на практически "бесплатном" объектном хранилище в Selectel.

Создание S3 хранилища

Заходим в панель управления в разел Объектное хранилище ⟶ Хранилище.

Selectel S3 Mkdocs

Нажимаем Создать контейнер. Указываем имя, например, daffin. Главное в качестве типа контейнера выбрать Публичный и класс хранения - Стандартное хранение.

Selectel S3 Mkdocs

Переходим в раздел Пользователи и нажимаем на кнопку Создать пользователя. Указываем префикс, в моём случае это _s3, задаём пароль и ставим галочку напротив пункта Использовать эти данные для доступа по протоколу S3

Selectel S3 Mkdocs

Возвращаемся в раздел Хранилище и нажимаем на созданый ранее контейнер, в моём случае это daffin, и переходим на вкладку Настройки контейнера. В подразделе Управление доступом указываем созданного пользователя и выбираем Чтение и запись

Selectel S3 Mkdocs

Указываем данные как на скрине

Selectel S3 Mkdocs

И добавляем наши домены

Selectel S3 Mkdocs

Загрузка файлов

Для загрузки файлов воспользуемся утилитой rclone. Можно выполнить интерактивную настройку подключения через команду:

rclone config
или просто создать конфиг:

nano ~/.config/rclone/rclone.conf
[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

Rclone config

Теперь чтобы загрузить файлы в хранилище выполним команду

rclone copy /путь/до/сайта/daffin.ru/ selectel_s3:daffin

где selectel_s3 - это имя из первой строки конфига rclone.conf [selectel_s3], daffin - это имя контейнера.

Вывести список загруженных файлов:

rclone ls selectel_s3:daffin

Rclone ls

Настройка SSL

В качестве простого решения настройки SSL будет подключение домена к Cloudflare. Главное чтобы записи в графе Proxy status значились как Proxied

Cloudflare DNS

Если необходимо настроить 301 редирект с поддомена www на основной домен, то это можно сделать в разделе Page Rules как на скрине:

Cloudflare Redirect

Готово!

CI/CD Pipeline

Для автоматизации сборки и загрузки сайта в S3 хранилище

nano .gitlab-ci.yml
stages:
  - build
  - test
  - check
  - 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'

# Чекер внутренних и внешних ссылок, чтобы избежать битых ссылок с 404 ошибкой. Где https://dev.example.ru тестовая версия, по которой чекер будет проходиться и проверять статусы ответов.
 linkchecker:
   stage: check
   tags: [mkdocs]
   image:
     name: ghcr.io/linkchecker/linkchecker:latest
     entrypoint: [""]
   script:
     - 'linkchecker --verbose https://dev.example.ru'

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

nano 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

Сборка и деплой

Gitlab-ci pipeline

Результат чекера URL ссылок:

Gitlab-ci linkchecker

Вот теперь точно готово 😎

К началу