Skip to content

Commit 2a55a97

Browse files
author
anton.voskresensky
committed
Initial commit
0 parents  commit 2a55a97

37 files changed

+4364
-0
lines changed

.github/workflows/docker.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: Docker Image
2+
3+
on:
4+
push:
5+
tags:
6+
- '**'
7+
8+
jobs:
9+
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Docker meta
17+
id: meta
18+
uses: docker/metadata-action@v5
19+
with:
20+
images: ghcr.io/${{ github.repository }}
21+
tags: |
22+
type=schedule
23+
type=ref,event=branch
24+
type=ref,event=pr
25+
type=semver,pattern={{version}}
26+
type=semver,pattern={{major}}.{{minor}}
27+
type=semver,pattern={{major}}
28+
type=sha
29+
30+
- name: Set up Docker Buildx
31+
id: buildx
32+
uses: docker/setup-buildx-action@v3
33+
34+
- name: Login to Github Packages
35+
uses: docker/login-action@v3
36+
with:
37+
registry: ghcr.io
38+
username: ${{ github.repository_owner }}
39+
password: ${{ secrets.GITHUB_TOKEN }}
40+
41+
- name: Set build date
42+
run: echo "BUILD_DATE=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV
43+
44+
- name: Build and push
45+
uses: docker/build-push-action@v5
46+
with:
47+
context: .
48+
build-args: |
49+
versionflags=-X 'github.com/flant/osctl/pkg/util.Version=${{ github.ref_name }}' -X 'github.com/flant/osctl/pkg/util.Revision=${{ github.sha }}' -X 'github.com/flant/osctl/pkg/util.Branch=${{ github.ref_name }}' -X 'github.com/flant/osctl/pkg/util.BuildUser=${{ github.actor }}' -X 'github.com/flant/osctl/pkg/util.BuildDate=${{ env.BUILD_DATE }}'
50+
push: ${{ github.event_name != 'pull_request' }}
51+
tags: ${{ steps.meta.outputs.tags }}
52+
labels: ${{ steps.meta.outputs.labels }}

.github/workflows/go.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Go
2+
3+
on:
4+
push:
5+
tags:
6+
- '**'
7+
8+
jobs:
9+
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Set up Go
17+
uses: actions/setup-go@v5
18+
with:
19+
go-version: 1.25
20+
21+
- name: Build
22+
run: |
23+
versionflags="-X 'github.com/flant/osctl/pkg/util.Version=$GITHUB_REF_NAME' -X 'github.com/flant/osctl/pkg/util.Revision=$GITHUB_SHA' -X 'github.com/flant/osctl/pkg/util.Branch=$GITHUB_REF_NAME' -X 'github.com/flant/osctl/pkg/util.BuildUser=$GITHUB_ACTOR' -X 'github.com/flant/osctl/pkg/util.BuildDate=$(date +%Y%m%d%H%M)'"
24+
for GOOS in linux; do
25+
for GOARCH in amd64 arm64; do
26+
export GOOS GOARCH
27+
CGO_ENABLED=0 go build -v -a -tags netgo -ldflags="-extldflags '-static' -s -w $versionflags" -o build/osctl-${GOOS}-${GOARCH} cmd/main.go
28+
done
29+
done
30+
cd build; sha256sum * > sha256sums.txt
31+
32+
- name: Release
33+
uses: softprops/action-gh-release@v1
34+
with:
35+
generate_release_notes: true
36+
token: ${{ secrets.GITHUB_TOKEN }}
37+
files: |
38+
build/*

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
build/
2+
main
3+
osctl
4+
5+
# Test certificates
6+
test-certs/

ARCHITECTURE.md

Lines changed: 245 additions & 0 deletions
Large diffs are not rendered by default.

Dockerfile

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
FROM golang:1.25-bookworm as builder
2+
3+
ARG versionflags
4+
5+
WORKDIR /app
6+
7+
COPY go.mod go.sum ./
8+
RUN go mod download
9+
10+
COPY . .
11+
12+
RUN CGO_ENABLED=0 go build -v -a -tags netgo -ldflags="-extldflags '-static' -s -w $versionflags" -o osctl cmd/main.go
13+
14+
FROM debian:bookworm-slim
15+
16+
ENV DEBIAN_FRONTEND=noninteractive
17+
18+
RUN apt-get update && apt-get install -y --no-install-recommends \
19+
ca-certificates \
20+
curl \
21+
wget \
22+
dnsutils \
23+
iputils-ping \
24+
vim \
25+
nano \
26+
jq \
27+
lsof \
28+
net-tools \
29+
procps \
30+
tzdata \
31+
traceroute \
32+
mtr-tiny \
33+
&& rm -rf /var/lib/apt/lists/*
34+
35+
COPY --from=builder /app/osctl /usr/local/bin/osctl
36+
37+
RUN chmod +x /usr/local/bin/osctl
38+
39+
CMD ["/usr/local/bin/osctl"]

ENVIRONMENT_VARIABLES_AND_FLAGS.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Переменные окружения и флаги
2+
3+
Этот документ описывает переменные окружения и флаги для osctl.
4+
5+
## Порядок приоритета
6+
7+
Конфигурация загружается в следующем порядке:
8+
1. **Флаги командной строки**
9+
2. **Переменные окружения**
10+
3. **Общий конфиг файл** (`config.yaml`)
11+
4. **Файл конфигурации индексов** (`osctlindicesconfig.yaml`) - для команд snapshot, indicesdelete, snapshotdelete, snapshotchecker
12+
5. **Значения по умолчанию** (наименьший приоритет)
13+
14+
## Общие флаги
15+
16+
Эти флаги доступны для всех команд:
17+
18+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
19+
|------|---------------------|----------|--------------|
20+
| `--config` | `OSCTL_CONFIG` | Путь к файлу конфигурации | `config.yaml` |
21+
| `--os-url` | `OPENSEARCH_URL` | URL OpenSearch | `https://opendistro:9200` |
22+
| `--os-recoverer-url` | `OPENSEARCH_RECOVERER_URL` | URL OpenSearch Recoverer | `https://opendistro-recoverer:9200` |
23+
| `--cert-file` | `OPENSEARCH_CERT_FILE` | Путь к сертификату | `/etc/ssl/certs/admin-crt.pem` |
24+
| `--key-file` | `OPENSEARCH_KEY_FILE` | Путь к приватному ключу | `/etc/ssl/certs/admin-key.pem` |
25+
| `--ca-file` | `OPENSEARCH_CA_FILE` | Путь к CA | `/etc/ssl/certs/elk-root-ca.pem` |
26+
| `--timeout` | `OPENSEARCH_TIMEOUT` | Таймаут запросов | `300s` |
27+
| `--retry-attempts` | `OPENSEARCH_RETRY_ATTEMPTS` | Количество повторных попыток для запросов в апи | `3` |
28+
| `--date-format` | `OPENSEARCH_DATE_FORMAT` | Формат даты в названиях индексов и снапшотов | `%Y.%m.%d` |
29+
| `--recoverer-date-format` | `RECOVERER_DATE_FORMAT` | Формат даты для индексов у Recoverer | `%d-%m-%Y` |
30+
| `--madison-url` | `MADISON_URL` | URL API Madison | `https://madison.flant.com/api/events/custom/` |
31+
| `--madison-key` | `MADISON_KEY` | Ключ API Madison | (пусто) |
32+
| `--madison-project` | `MADISON_PROJECT` | Название проекта в Madison | (пусто) |
33+
| `--osd-url` | `OPENSEARCH_DASHBOARDS_URL` | URL OpenSearch Dashboards | (пусто) |
34+
| `--osctl-indices-config` | `OSCTL_INDICES_CONFIG` | Путь к конфигу индексов - для snapshot, indicesdelete, snapshotdelete, snapshotchecker | `osctlindicesconfig.yaml` |
35+
| `--dry-run` | `DRY_RUN` | Показать что будет сделано без выполнения | `false` |
36+
| `--snap-repo` | `SNAPSHOT_REPOSITORY` | Название репо для снапшотов | (пусто) |
37+
38+
## Флаги команд
39+
40+
### `coldstorage`
41+
42+
Перемещает индексы на узлы cold, если они старше N дней.
43+
44+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
45+
|------|---------------------|----------|--------------|
46+
| `--cold-attribute` | `COLD_ATTRIBUTE` | Атрибут узлов для cold | (пусто) |
47+
| `--hot-count` | `HOT_COUNT` | Количество дней, которые нужно держать индексы в hot | `3` |
48+
49+
**Ключи в конфиг файле:**
50+
- `cold_attribute`
51+
- `hot_count`
52+
53+
### `retention`
54+
55+
Удаляет старые индексы при превышении порога использования диска.
56+
57+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
58+
|------|---------------------|----------|--------------|
59+
| `--retention-threshold` | `RETENTION_THRESHOLD` | Порог использования диска в процентах | `75` |
60+
61+
**Ключи в конфиг файле:**
62+
- `retention-threshold`
63+
64+
### `dereplicator`
65+
66+
Уменьшает количество реплик до 0 для индексов старше указанного количества дней.
67+
68+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
69+
|------|---------------------|----------|--------------|
70+
| `--dereplicator-days-count` | `DEREPLICATOR_DAYS` | Какое количество дней держать индексы с репликами | `2` |
71+
| `--dereplicator-use-snapshot` | `DEREPLICATOR_USE_SNAPSHOT` | Проверять снапшоты перед уменьшением реплик | `false` |
72+
73+
**Ключи в конфиг файле:**
74+
- `dereplicator_days_count`
75+
- `dereplicator_use_snapshot`
76+
77+
### `extracteddelete`
78+
79+
Удаляет extracted индексы, которые больше не нужны.
80+
81+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
82+
|------|---------------------|----------|--------------|
83+
| `--days` | `EXTRACTED_DAYS` | Какое количество дней держать extracted индексы | `7` |
84+
| `--extracted-pattern` | `EXTRACTED_PATTERN` | Префикс для extracted индексов | `extracted_` |
85+
| `--opensearch_recoverer_url` | `OPENSEARCH_RECOVERER_URL` | Url рековерера | `https://opendistro-recoverer:9200` |
86+
| `--recoverer_date_format` | `RECOVERER_DATE_FORMAT` | Формат даты у extracted индексов | `%d-%m-%Y` |
87+
88+
**Ключи в конфиг файле:**
89+
- `opensearch_recoverer_url`
90+
- `extracted_pattern`
91+
- `extracted_days`
92+
- `recoverer_date_format`
93+
94+
### `snapshot`, `snapshot-manual`
95+
96+
Создает снапшоты индексов.
97+
98+
**Специальные флаги для snapshot-manual:**
99+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
100+
|------|---------------------|----------|--------------|
101+
| `--snapshot-manual-kind` | `SNAPSHOT_KIND` | Тип паттерна: prefix или regex | `prefix` |
102+
| `--snapshot-manual-value` | `SNAPSHOT_VALUE` | Значение паттерна | (пусто) |
103+
| `--snapshot-manual-name` | `SNAPSHOT_NAME` | Имя снапшота (обязательно для regex) | (пусто) |
104+
| `--snapshot-manual-system` | `SNAPSHOT_SYSTEM` | Флаг системного индекса (получает индексы с точкой, независимо от даты) | `false` |
105+
| `--snapshot-manual-days-count` | `SNAPSHOT_DAYS_COUNT` | Какое количество дней держать индекс | `7` |
106+
| `--snapshot-manual-count-s3` | `SNAPSHOT_COUNT_S3` | Какое количество дней хранить снапшот в S3 | `14` |
107+

README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# osctl - Инструмент управления жизненным циклом индексов и снапшотов OpenSearch
2+
3+
По-умолчанию предполагается использование `config.yaml` в котором описаны параметры запуска, а также указание конкретной команды, которая будет выполнять действие. Для некоторых действий также требуется файлик osctlindicesconfig.yaml ( пример в config-example) с описанием паттернов индексов и числом дней хранения.
4+
5+
```bash
6+
osctl snapshot
7+
8+
osctl snapshot-manual --snapshot-manual-kind=prefix --snapshot-manual-value=prod --snapshot-manual-days-count=14
9+
10+
osctl retention --retention-threshold=75 --snap-repo=s3-backup
11+
osctl dereplicator --dereplicator-days-count=7 --dereplicator-use-snapshot
12+
13+
osctl extracteddelete --days=7
14+
osctl coldstorage --hot-count=7 --cold-attribute=cold
15+
```
16+
17+
## Команды
18+
19+
| Команда | Назначение |
20+
|---------|------------|
21+
| `snapshot` | Создание снапшотов согласно конфигурации |
22+
| `snapshotdelete` | Удаление снапшотов согласно конфигурации |
23+
| `indicesdelete` | Удаление индексов согласно конфигурации |
24+
| `snapshotchecker` | Нахождение отсутствующих снапшотов |
25+
| `snapshot-manual` | Создание снапшотов по флагам |
26+
| `retention` | Удаление индексов со снапшотами при превышении некоторого порога |
27+
| `dereplicator` | Уменьшение числа реплик |
28+
| `coldstorage` | Миграция в холодное хранилище |
29+
| `extracteddelete` | Удаление extracted индексов |
30+
| `danglingchecker` | Проверка dangling индексов |
31+
32+
## Конфигурация
33+
34+
### Единая конфигурация (`config.yaml`)
35+
36+
Пример в `config.yaml`
37+
38+
### Конфигурация индексов (`osctlindicesconfig.yaml`)
39+
40+
Пример в `osctlindicesconfig.yaml`
41+
42+
## Приоритет конфигурации
43+
44+
1. **Флаги командной строки** (наивысший приоритет)
45+
2. **Переменные окружения**
46+
3. **Единый конфиг** (`config.yaml`)
47+
4. **Значения по умолчанию** (наименьший приоритет)
48+
49+
## 📚 Документация
50+
51+
- **[ENVIRONMENT_VARIABLES_AND_FLAGS.md](ENVIRONMENT_VARIABLES_AND_FLAGS.md)** - Полный справочник по всем флагам и переменным окружения
52+
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - Подробные алгоритмы и архитектура системы
53+
- **Встроенная справка**: `osctl [команда] --help`

cmd/main.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"osctl/commands"
8+
)
9+
10+
var (
11+
vBuild string
12+
)
13+
14+
func main() {
15+
if err := commands.Execute(); err != nil {
16+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
17+
os.Exit(1)
18+
}
19+
}

0 commit comments

Comments
 (0)