From 2bdb9fde2e7e7b3a18a2e7f6f744a9f7c1239e4f Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Sun, 15 Oct 2023 18:54:30 +0700 Subject: [PATCH] add storage class, del legacy --- README.md | 1 + assets/usr/local/sbin/backup.sh | 2 +- assets/usr/local/sbin/storage/.env | 1 + assets/usr/local/sbin/storage/s3.sh | 4 +- assets/usr/local/sbin/storage/s3.template | 1 + ci/build-image/.gitignore | 2 - ci/build-image/README.md | 207 ---------------------- ci/build-image/example/.gitlab-ci.yml | 24 --- ci/build-image/example/.gitlab-ci_2.yml | 21 --- ci/build-image/example/Dockerfile | 8 - ci/build-image/example/Makefile | 17 -- ci/build-image/example/VERSION | 1 - ci/build-image/example/init.sh | 3 - ci/build-image/sample.env | 16 -- 14 files changed, 7 insertions(+), 301 deletions(-) delete mode 100644 ci/build-image/.gitignore delete mode 100644 ci/build-image/README.md delete mode 100644 ci/build-image/example/.gitlab-ci.yml delete mode 100644 ci/build-image/example/.gitlab-ci_2.yml delete mode 100644 ci/build-image/example/Dockerfile delete mode 100644 ci/build-image/example/Makefile delete mode 100644 ci/build-image/example/VERSION delete mode 100644 ci/build-image/example/init.sh delete mode 100644 ci/build-image/sample.env diff --git a/README.md b/README.md index cf3b4b0..217f686 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ - DBTABLE - таблица (если не используется, как например в монге, ставим "1") - STORAGE_HOST - можно указать свое s3 хранилище вида `s3.domain.com` либо амазоновское - STORAGE_REGION - по умолчанию: us-west +- STORAGE_CLASS - STANDARD_IA (холодное) или STANDARD_IA (обычное) - STORAGE_PATH - путь, куда складывать архив вида `` - ACCOUNT_ID - логин в хранилище - APPLICATION_KEY - пароль в хранилище diff --git a/assets/usr/local/sbin/backup.sh b/assets/usr/local/sbin/backup.sh index df0a082..af8b7dc 100755 --- a/assets/usr/local/sbin/backup.sh +++ b/assets/usr/local/sbin/backup.sh @@ -2,7 +2,7 @@ source lib/lib.sh -ENVS=(PROJECT_NAME DBTYPE DBHOST DBUSER DBPASS DBTABLE STORAGE_HOST STORAGE_REGION STORAGE_PATH ACCOUNT_ID APPLICATION_KEY) +ENVS=(PROJECT_NAME DBTYPE DBHOST DBUSER DBPASS DBTABLE STORAGE_HOST STORAGE_PATH ACCOUNT_ID APPLICATION_KEY) for ENV in "${ENVS[@]}"; do if [[ -z "${!ENV+x}" ]]; then diff --git a/assets/usr/local/sbin/storage/.env b/assets/usr/local/sbin/storage/.env index b26ca21..78c88ed 100644 --- a/assets/usr/local/sbin/storage/.env +++ b/assets/usr/local/sbin/storage/.env @@ -3,3 +3,4 @@ S3_HOST_BASE=s3.amegaserver.com S3_REGION=ru-nsk S3_ACCOUNT_ID= S3_APPLICATION_KEY= +S3_STORAGE_CLASS= \ No newline at end of file diff --git a/assets/usr/local/sbin/storage/s3.sh b/assets/usr/local/sbin/storage/s3.sh index 5969dab..5feaeaa 100644 --- a/assets/usr/local/sbin/storage/s3.sh +++ b/assets/usr/local/sbin/storage/s3.sh @@ -4,6 +4,7 @@ S3_HOST_BASE=${STORAGE_HOST:-s3.amazonaws.com} S3_REGION=${STORAGE_REGION:-''} S3_REMOTE_DIR=${STORAGE_PATH#*/} S3_BUCKET=${STORAGE_PATH%%/*} +S3_STORAGE_CLASS=${STORAGE_CLASS:-STANDARD_IA} # Добавляем в конце '/' if [[ -n "${S3_REMOTE_DIR}" ]] && [[ ${S3_REMOTE_DIR} != */ ]]; then S3_REMOTE_DIR="${S3_REMOTE_DIR}/"; fi @@ -30,6 +31,7 @@ storage_login() { echo S3_HOST_BASE=${S3_HOST_BASE} >> .env echo S3_ACCOUNT_ID=${ACCOUNT_ID} >> .env echo S3_APPLICATION_KEY=${APPLICATION_KEY} >> .env + echo S3_STORAGE_CLASS=${S3_STORAGE_CLASS} >> .env mkdir -p /root/.config/rclone mo -s=.env -u /usr/local/sbin/storage/s3.template > ${config} @@ -44,6 +46,6 @@ storage_upload() { [ -z ${S3_CONNECTION} ] && storage_login log "Upload \"${ARCHIVE}\" \n\t as \"${S3_ARCHIVE}\" in \"${S3_BUCKET}\"" - rclone copy --progress --transfers=5 --update --s3-chunk-size=${CHUNK_SIZE:-100m} ${ARCHIVE} s3:/${S3_BUCKET}/${S3_ARCHIVE} + rclone copy --progress --transfers=5 --update --s3-chunk-size=${CHUNK_SIZE:-500m} ${ARCHIVE} s3:/${S3_BUCKET}/${S3_ARCHIVE} return $? } diff --git a/assets/usr/local/sbin/storage/s3.template b/assets/usr/local/sbin/storage/s3.template index e5db3e4..b5c4355 100644 --- a/assets/usr/local/sbin/storage/s3.template +++ b/assets/usr/local/sbin/storage/s3.template @@ -6,3 +6,4 @@ access_key_id = {{S3_ACCOUNT_ID}} secret_access_key = {{S3_APPLICATION_KEY}} region = {{S3_REGION}} endpoint = https://{{S3_HOST_BASE}} +storage_class = {{S3_STORAGE_CLASS}} \ No newline at end of file diff --git a/ci/build-image/.gitignore b/ci/build-image/.gitignore deleted file mode 100644 index 13d4ac5..0000000 --- a/ci/build-image/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.env -.idea/ \ No newline at end of file diff --git a/ci/build-image/README.md b/ci/build-image/README.md deleted file mode 100644 index dc4bd54..0000000 --- a/ci/build-image/README.md +++ /dev/null @@ -1,207 +0,0 @@ -Проект содержит скрипты которые обеспечивают сборку контейнера docker и загрузку его в docker registry. - -Состав: -* build.sh - скрипт сборки образа -* import.sh - скрипт загрузки образа в docker registry -* .env - конфигурационный файл для запуска сборки в ручном режиме - -#### Сборка контейнера -* Контейнер собирается с использованием Dockerfile либо файла, определяемого переменной `DOCKER_FILE`, из корня проекта. При этом в него передаются параметры: - * Контекст сборки может быть определен переменной `DOCKER_BUILD_CONTEXT`, по умолчанию `.` - * Для успешной сборки образа, контейнер, в котором происходит сборка (директива `image:` в `.gitlab-ci.yml` файле) должен иметь установленный bash и git. - Для этих целей можно использовать образ `docker.ds.mlmsoft.cloud/images/docker`. - * Имя базового образа, определяется переменной `DOCKER_BASEIMAGE` - (по умолчанию используется `ubuntu:18.04`) - * Установка переменной `DOCKER_NO_PULL_BASEIMAGE` в непустое значение позволяет не осуществлять принудительный `docker pull` базового образа - * Префикс собираемого локально образа задается переменной `DOCKER_IMAGE_PREFIX` - (по умолчанию `mlmsoft`) - * Версия базового образа определяется (в порядке приоритета) либо переменной `VERSION`, либо содержимым файла `VERSION` из корня проекта, если файл отсутствует, берется версия `latest` - * Maintainer контейнера определяется переменной `DOCKER_MAINTAINER` - (по умолчанию указывается email пользователя в gitlab или service@ds.mlmsoft.cloud при локальном запуске, если иное не указано в Dockerfile) - * Имя собираемого образа оперделяется переменной `DOCKER_IMAGE_NAME`. По умолчанию используется короткое имя проекта в Gitlab (${CI_PROJECT_PATH#*/}) - * Тег собираемого образа определяется переменной `DOCKER_IMAGE_TAG`. При отсутствии переменной берется переменная `${VERSION}` и тд - * Для передачи произвольных аргументов в Dockerfile можно использовать набор переменных DOCKER_ARG0...DOCKER_ARG9 (соблюдение нумерации не обязательно), в секции `before_script:` .gitlab-ci.yml: - - `export DOCKER_ARG1="VERSION=1.0.0"` - - Переменная VERSION будет доступна в Dockerfile через конструкцию `ARG VERSION` - - Альтернативно можно передевать аргументы в сборку как параметры сборочного скрипта в формате `ARG=value`. - -* Контейнер выкладывается в docker registry `docker.ds.mlmsoft.cloud`, полный путь к контейнеру: - - `docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}:${VERSION}` если имя образа совпадает с именем проекта, либо - `docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}/${IMAGE_NAME}:${VERSION}` если имя образа отлично от имени проекта - - где: - - `${CI_PROJECT_NAME}` полный путь проекта вида `<группа>/имя проекта>` или `<пользователь>/имя проекта>` - - `${VERSION}` это версия образа или `latest` в случае ее отсутствия. - -#### Версионность образа -Правила формирования версии образа: -* Версия образа берется из файла VERSION, который должен располагаться в корне проекта -* В случае отсутствия файла, берется версия `:latest` - -Правила определения версии базового образа (DOCKER_BASEIMAGE): -* Если в DOCKER_BASEIMAGE есть тег образа, в качестве DOCKER_BASEIMAGE берется значение переменной ${DOCKER_BASEIMAGE} без изменений -* Если в DOCKER_BASEIMAGE отсутствует тег образа, то берется ${DOCKER_BASEIMAGE}:${VERSION} - -Правила определения версии итогового образа: -* Образ тегируется как ${IMAGE}:${VERSION} -* В случае импорта в регистри, образ тегируется как `docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}:${VERSION}` -* В случае, если сборка происходит не из ветки master, образ принудительно тегируется по имени ветки, из которой производится сборка. - Если происходит сборка не из ветки master и переменная `DOCKER_IMAGE_TAG` не пустая, то образ тегируется как `$DOCKER_IMAGE_TAG_$BRANCH`. - Даннове поведение можно отменить установив переменную `DOCKER_NO_BRANCH_TAG` в непустое значение. - -Дополнительно возможно указать переменную `DOCKER_TAG_AS_LATEST`, которая отвечает за дополнительное тегирование образа тегом `latest` в регистри. - -#### Подключение скриптов к проекту -Проект предполагает использование через механизм gitlab submodules или клонирование скриптов при сборке проекта. Примеры файлов и команды находятся в каталоге example/. - -##### Подключение через механизм git submodules -Доступно два варианта использования: - а) Использование фиксированной версии сборщика - б) Использование последней доступной версии - -Для настройки необходимо: -1) Однократно выполнить в проекте команду - -`git submodule add -b master ../../infra/ci-build-image.git ci/build-image` - -2) В корне проекта разместить `Dockerfile` вида: -``` -ARG DOCKER_BASEIMAGE -FROM ${DOCKER_BASEIMAGE} - -ARG DOCKER_MAINTAINER -LABEL maintainer="${DOCKER_MAINTAINER}" - -# Uncomment if you use assets/ -#COPY assets/ / -``` -3) а) Для использования фиксированной версии в `.gitlab-ci.yml` проекта прописать переменную `GIT_SUBMODULE_STRATEGY=recursive` - б) Для использования последней доступной версии в `.gitlab-ci.yml` проекта прописать переменную `GIT_SUBMODULE_STRATEGY=none` - -4) Осуществить вызов сборки в `.gitlab-ci.yml`: -а) Вариант фиксированной версии: -``` -image: docker.ds.mlmsoft.cloud/images/docker - -variables: - DOCKER_BASEIMAGE: ubuntu:18.04 -# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/} -# DOCKER_IMAGE_TAG: latest - BUILD_SCRIPT: ci/build-image/build.sh - GIT_SUBMODULE_STRATEGY: recursive - -#before_script: -# - export DOCKER_ARG0="key=value" -# - export DOCKER_ARG1="key=value" - -stages: - - build - -build: - stage: build - script: - - chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}" - when: manual -``` - -б) Вариант последней доступной версии: -``` -image: docker.ds.mlmsoft.cloud/images/docker - -variables: - DOCKER_BASEIMAGE: ubuntu:18.04 -# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/} -# DOCKER_IMAGE_TAG: latest - BUILD_SCRIPT: ci/build-image/build.sh - GIT_SUBMODULE_STRATEGY: none - -#before_script: -# - export DOCKER_ARG0="key=value" -# - export DOCKER_ARG1="key=value" - -stages: - - build - -build: - stage: build - script: - - git submodule sync - - git submodule update --init --remote --force - - chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}" - when: manual -``` - -5) Обновление submodule осуществляется командой: - -`git submodule sync && git submodule update --init --remote` - -##### Клонирование скриптов при сборке проекта - -1) В корне проекта разместить `Dockerfile` вида: -``` -ARG DOCKER_BASEIMAGE -FROM ${DOCKER_BASEIMAGE} - -ARG DOCKER_MAINTAINER -LABEL maintainer="${DOCKER_MAINTAINER}" - -# Uncomment if you use assets/ -#COPY assets/ / -``` - -2) Осуществить вызов сборки в `.gitlab-ci.yml`: -``` -image: docker.ds.mlmsoft.cloud/images/docker - -variables: - DOCKER_BASEIMAGE: ubuntu:18.04 -# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/} -# DOCKER_IMAGE_TAG: latest - BUILD_SCRIPT: ci/build-image/build.sh - -#before_script: -# - export DOCKER_ARG0="key=value" -# - export DOCKER_ARG1="key=value" - -stages: - - build - -build: - stage: build - script: - - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ds.mlmsoft.cloud/infra/ci-build-image.git ${BUILD_SCRIPT%/*} - - chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}" - when: manual -``` - - -#### Ручной запуск -Возможен запуск сборки на локальной машине и выкладывание его в docker registry без внесения изменений в проект. Для этого рядом со сборочными скриптами в `/ci/build-images` должен находиться конфиг с именем `.env` (пример конфига см. в файле `sample.env`): -``` -# Your project target image name and tag -DOCKER_IMAGE_NAME=image -DOCKER_IMAGE_TAG=latest - -# Base image name and tag -DOCKER_BASEIMAGE=ubuntu:18.04 - -# Docker build context (leave it as is if not know that it is) -DOCKER_BUILD_CONTEXT=. -DOCKER_PROJECT=external/project -CI_COMMIT_REF_SLUG=master - -# Registry credentials (need only if docker registry upload required) -REGISTRY_USER=%YOUR_GITLAB_USERNAME% -REGISTRY_PASSWORD=%YOUR_GITLAB_PASSWORD% -REGISTRY_URL=docker.ds.mlmsoft.cloud -``` - -Запуск сборки из каталога проекта: `./ci/build-image/build.sh` - -При ручном запуске автоматическая загрузка в docker registry не происходит, необходимо использовать скрипт `import.sh`: - -`DOCKER_IMAGE=image ./import.sh` \ No newline at end of file diff --git a/ci/build-image/example/.gitlab-ci.yml b/ci/build-image/example/.gitlab-ci.yml deleted file mode 100644 index 5f664f0..0000000 --- a/ci/build-image/example/.gitlab-ci.yml +++ /dev/null @@ -1,24 +0,0 @@ -image: docker.ds.mlmsoft.cloud/images/docker - -variables: - DOCKER_BASEIMAGE: ubuntu:18.04 -# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/} -# DOCKER_IMAGE_TAG: latest - BUILD_SCRIPT: ci/build-image/build.sh -# GIT_SUBMODULE_STRATEGY: recursive - GIT_SUBMODULE_STRATEGY: none - -#before_script: -# - export DOCKER_ARG0="key=value" -# - export DOCKER_ARG1="key=value" - -stages: - - build - -build: - stage: build - script: - - git submodule sync - - git submodule update --init --remote --force - - chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}" - when: manual \ No newline at end of file diff --git a/ci/build-image/example/.gitlab-ci_2.yml b/ci/build-image/example/.gitlab-ci_2.yml deleted file mode 100644 index 1751448..0000000 --- a/ci/build-image/example/.gitlab-ci_2.yml +++ /dev/null @@ -1,21 +0,0 @@ -image: docker.ds.mlmsoft.cloud/images/docker - -variables: - DOCKER_BASEIMAGE: ubuntu:18.04 -# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/} -# DOCKER_IMAGE_TAG: latest - BUILD_SCRIPT: ci/build-image/build.sh - -#before_script: -# - export DOCKER_ARG0="key=value" -# - export DOCKER_ARG1="key=value" - -stages: - - build - -build: - stage: build - script: - - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ds.mlmsoft.cloud/infra/ci-build-image.git ${BUILD_SCRIPT%/*} - - chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}" - when: manual \ No newline at end of file diff --git a/ci/build-image/example/Dockerfile b/ci/build-image/example/Dockerfile deleted file mode 100644 index 9b55876..0000000 --- a/ci/build-image/example/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG DOCKER_BASEIMAGE -FROM ${DOCKER_BASEIMAGE} - -ARG DOCKER_MAINTAINER -LABEL maintainer="${DOCKER_MAINTAINER}" - -# Uncomment if you use assets/ -#COPY assets/ / \ No newline at end of file diff --git a/ci/build-image/example/Makefile b/ci/build-image/example/Makefile deleted file mode 100644 index 0f2a412..0000000 --- a/ci/build-image/example/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -image = image_name - -all: build - -clean: - @docker images -f "dangling=true" -q | docker ps -a -f "ancestor={}" -q | xargs --no-run-if-empty docker rm - @docker images -f "dangling=true" -q | xargs --no-run-if-empty docker rmi -f - - @docker ps --filter "ancestor=${image}" --format {{.ID}} | xargs --no-run-if-empty docker stop || true - @docker ps -a --filter "ancestor=${image}" --format {{.ID}} | xargs --no-run-if-empty docker rm || true - @docker images --filter "reference=${image}" --format {{.ID}} | xargs --no-run-if-empty docker rmi || true - -build: - @docker build --tag=${image} --no-cache . - -release: build - @docker build --tag=${image}:$(shell cat VERSION) . \ No newline at end of file diff --git a/ci/build-image/example/VERSION b/ci/build-image/example/VERSION deleted file mode 100644 index afaf360..0000000 --- a/ci/build-image/example/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 \ No newline at end of file diff --git a/ci/build-image/example/init.sh b/ci/build-image/example/init.sh deleted file mode 100644 index 095b92d..0000000 --- a/ci/build-image/example/init.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -git submodule add -b master ../../infra/ci-build-image.git ci/build-image \ No newline at end of file diff --git a/ci/build-image/sample.env b/ci/build-image/sample.env deleted file mode 100644 index 9513fcc..0000000 --- a/ci/build-image/sample.env +++ /dev/null @@ -1,16 +0,0 @@ -# Your project target image name and tag -DOCKER_IMAGE_NAME=image -DOCKER_IMAGE_TAG=latest - -# Base image name and tag -DOCKER_BASEIMAGE=ubuntu:18.04 - -# Docker build context (leave it as is if not know that it is) -DOCKER_BUILD_CONTEXT=. -DOCKER_PROJECT=external/project -CI_COMMIT_REF_SLUG=master - -# Registry credentials (need only if docker registry upload required) -REGISTRY_USER=%YOUR_GITLAB_USERNAME% -REGISTRY_PASSWORD=%YOUR_GITLAB_PASSWORD% -REGISTRY_URL=docker.ds.mlmsoft.cloud