Skip to content

Commit f8b7263

Browse files
author
anton.voskresensky
committed
Initial commit
0 parents  commit f8b7263

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+5914
-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: 250 additions & 0 deletions
Large diffs are not rendered by default.

Dockerfile

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
RUN mkdir -p /app/osctl
36+
37+
COPY --from=builder /app/osctl /app/osctl
38+
39+
RUN chmod +x /app/osctl
40+
41+
ENV PATH="/app:${PATH}"
42+
43+
CMD ["/app/osctl"]

ENVIRONMENT_VARIABLES_AND_FLAGS.md

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
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+
| `--action` | `OSCTL_ACTION` | Автоматически выполнить команду (snapshot, retention, dereplicator, etc.) | (пусто) |
21+
| `--config` | `OSCTL_CONFIG` | Путь к файлу конфигурации | `config.yaml` |
22+
| `--os-url` | `OPENSEARCH_URL` | URL OpenSearch | `https://opendistro:9200` |
23+
| `--os-recoverer-url` | `OPENSEARCH_RECOVERER_URL` | URL OpenSearch Recoverer | `https://opendistro-recoverer:9200` |
24+
| `--cert-file` | `OPENSEARCH_CERT_FILE` | Путь к сертификату | `/etc/ssl/certs/admin-crt.pem` |
25+
| `--key-file` | `OPENSEARCH_KEY_FILE` | Путь к приватному ключу | `/etc/ssl/certs/admin-key.pem` |
26+
| `--ca-file` | `OPENSEARCH_CA_FILE` | Путь к CA | `/etc/ssl/certs/elk-root-ca.pem` |
27+
| `--timeout` | `OPENSEARCH_TIMEOUT` | Таймаут запросов | `300s` |
28+
| `--retry-attempts` | `OPENSEARCH_RETRY_ATTEMPTS` | Количество повторных попыток для запросов в апи | `3` |
29+
| `--date-format` | `OPENSEARCH_DATE_FORMAT` | Формат даты в названиях индексов и снапшотов | `%Y.%m.%d` |
30+
| `--recoverer-date-format` | `RECOVERER_DATE_FORMAT` | Формат даты для индексов у Recoverer | `%d-%m-%Y` |
31+
| `--madison-url` | `MADISON_URL` | URL API Madison | `https://madison.flant.com/api/events/custom/` |
32+
| `--madison-key` | `MADISON_KEY` | Ключ API Madison | (пусто) |
33+
| `--madison-project` | `MADISON_PROJECT` | Название проекта в Madison | (пусто) |
34+
| `--osd-url` | `OPENSEARCH_DASHBOARDS_URL` | URL OpenSearch Dashboards | (пусто) |
35+
| `--osctl-indices-config` | `OSCTL_INDICES_CONFIG` | Путь к конфигу индексов - для snapshot, indicesdelete, snapshotdelete, snapshotchecker | `osctlindicesconfig.yaml` |
36+
| `--dry-run` | `DRY_RUN` | Показать что будет сделано без выполнения | `false` |
37+
| `--snap-repo` | `SNAPSHOT_REPOSITORY` | Название репо для снапшотов | (пусто) |
38+
39+
## Параметр action
40+
41+
Параметр `action` позволяет автоматически выполнить нужную команду без указания её в командной строке. Сделано для деплойментов и кронджоб в Kubernetes.
42+
43+
### Доступные значения action:
44+
- `snapshots`
45+
- `snapshot-manual`
46+
- `snapshotsdelete`
47+
- `snapshotschecker`
48+
- `indicesdelete`
49+
- `retention`
50+
- `dereplicator`
51+
- `coldstorage`
52+
- `extracteddelete`
53+
- `danglingchecker`
54+
- `sharding`
55+
- `indexpatterns`
56+
- `datasource`
57+
58+
### Примеры использования:
59+
60+
**В config.yaml:**
61+
```yaml
62+
action: "snapshot"
63+
opensearch_url: "https://opendistro:9200"
64+
# ...
65+
```
66+
67+
**Через переменную окружения:**
68+
```bash
69+
export OSCTL_ACTION=retention
70+
osctl
71+
```
72+
73+
**Через флаг:**
74+
```bash
75+
osctl --action=snapshot
76+
```
77+
78+
## Флаги команд
79+
80+
### `coldstorage`
81+
82+
Перемещает индексы на узлы cold, если они старше N дней.
83+
84+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
85+
|------|---------------------|----------|--------------|
86+
| `--cold-attribute` | `COLD_ATTRIBUTE` | Атрибут узлов для cold | (пусто) |
87+
| `--hot-count` | `HOT_COUNT` | Количество дней, которые нужно держать индексы в hot | `3` |
88+
89+
**Ключи в конфиг файле:**
90+
- `cold_attribute`
91+
- `hot_count`
92+
93+
### `retention`
94+
95+
Удаляет старые индексы при превышении порога использования диска.
96+
97+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
98+
|------|---------------------|----------|--------------|
99+
| `--retention-threshold` | `RETENTION_THRESHOLD` | Порог использования диска в процентах | `75` |
100+
101+
**Ключи в конфиг файле:**
102+
- `retention-threshold`
103+
104+
### `dereplicator`
105+
106+
Уменьшает количество реплик до 0 для индексов старше указанного количества дней.
107+
108+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
109+
|------|---------------------|----------|--------------|
110+
| `--dereplicator-days-count` | `DEREPLICATOR_DAYS` | Какое количество дней держать индексы с репликами | `2` |
111+
| `--dereplicator-use-snapshot` | `DEREPLICATOR_USE_SNAPSHOT` | Проверять снапшоты перед уменьшением реплик | `false` |
112+
113+
**Ключи в конфиг файле:**
114+
- `dereplicator_days_count`
115+
- `dereplicator_use_snapshot`
116+
117+
### `extracteddelete`
118+
119+
Удаляет extracted индексы, которые больше не нужны.
120+
121+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
122+
|------|---------------------|----------|--------------|
123+
| `--days` | `EXTRACTED_DAYS` | Какое количество дней держать extracted индексы | `7` |
124+
| `--extracted-pattern` | `EXTRACTED_PATTERN` | Префикс для extracted индексов | `extracted_` |
125+
| `--opensearch_recoverer_url` | `OPENSEARCH_RECOVERER_URL` | Url рековерера | `https://opendistro-recoverer:9200` |
126+
| `--recoverer_date_format` | `RECOVERER_DATE_FORMAT` | Формат даты у extracted индексов | `%d-%m-%Y` |
127+
128+
**Ключи в конфиг файле:**
129+
- `opensearch_recoverer_url`
130+
- `extracted_pattern`
131+
- `extracted_days`
132+
- `recoverer_date_format`
133+
134+
### `snapshots`, `snapshot-manual`
135+
136+
Создает снапшоты индексов.
137+
138+
**Специальные флаги для snapshot-manual:**
139+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
140+
|------|---------------------|----------|--------------|
141+
| `--snapshot-manual-kind` | `SNAPSHOT_KIND` | Тип паттерна: prefix или regex | `prefix` |
142+
| `--snapshot-manual-value` | `SNAPSHOT_VALUE` | Значение паттерна | (пусто) |
143+
| `--snapshot-manual-name` | `SNAPSHOT_NAME` | Имя снапшота (обязательно для regex) | (пусто) |
144+
| `--snapshot-manual-system` | `SNAPSHOT_SYSTEM` | Флаг системного индекса (получает индексы с точкой, независимо от даты) | `false` |
145+
146+
### `sharding`
147+
148+
Рассчитывает шардирование и создает/обновляет index template.
149+
150+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
151+
|------|---------------------|----------|--------------|
152+
| `--sharding-target-size-gib` | `SHARDING_TARGET_SIZE_GIB` | Целевой размер шарда (GiB, максимум 50) | `25` |
153+
| `--exclude-sharding` | `EXCLUDE_SHARDING` | Регекс для исключения паттернов | (пусто) |
154+
155+
**Ключи в конфиг файле:**
156+
- `sharding_target_size_gib`
157+
- `exclude_sharding`
158+
159+
### `indexpatterns`
160+
161+
Управляет index patterns в Kibana через OpenSearch API (индекс `.kibana`)
162+
163+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
164+
|------|---------------------|----------|--------------|
165+
| `--kibana-index-regex` | `KIBANA_INDEX_REGEX` | Регекс для построения паттернов | `^([\\w-]+)-([\\w-]*)(\\d{4}[\\.-]\\d{2}[\\.-]\\d{2}(?:[\\.-]\\d{2})*)$` |
166+
| `--kibana-multitenancy` | `KIBANA_MULTITENANCY` | Режим multitenancy | `false` |
167+
| `--kibana-tenants-config` | `KIBANA_TENANTS_CONFIG` | Путь к YAML с тенантами и index patterns | `osctltenants.yaml` |
168+
| `--recoverer-enabled` | `RECOVERER_ENABLED` | Создавать `extracted_*` с ссылкой на data-source | `false` |
169+
170+
Примечание: Список тенантов всегда берётся из `--kibana-tenants-config`.
171+
172+
**Ключи в конфиг файле:**
173+
- `kibana_index_regex`
174+
- `kibana_multitenancy`
175+
- `recoverer_enabled`
176+
177+
### `datasource`
178+
179+
Создает Kibana data-source в нужных тенантах и при multidomain синхронизирует секреты.
180+
181+
| Флаг | Переменная окружения | Описание | Значение по умолчанию |
182+
|------|---------------------|----------|--------------|
183+
| `--kibana-user` | `KIBANA_API_USER` | Пользователь API Kibana | (пусто) |
184+
| `--kibana-pass` | `KIBANA_API_PASS` | Пароль API Kibana | (пусто) |
185+
| `--datasource-name` | `DATA_SOURCE_NAME` | Название data-source | `recoverer` |
186+
| `--kube-namespace` | `KUBE_NAMESPACE` | Namespace для секретов | `infra-elklogs` |
187+
| `--kibana-multidomain-enabled` | `KIBANA_MULTIDOMAIN_ENABLED` | Управление секретом `multi-certs` и перезапуск Kibana если было обновление сертификатов | `false` |
188+
189+
В режиме multitenancy список тенантов берется из `--kibana-tenants-config` (`KIBANA_TENANTS_CONFIG`), файл обязателен.
190+
191+
Переменные окружения для multidomain:
192+
- `REMOTE_CRT`: конкатенированные base64 сертификаты, разделённые `|` (будут склеены и объединены с `recoverer-certs/ca.crt`, если есть)
193+

0 commit comments

Comments
 (0)