Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Мониторинг и логирование
monitoring

Мониторинг и логирование

Интеграция с Prometheus и Grafana, настройка алертов, централизованное логирование (ELK Stack), метрики производительности.

Мониторинг и логирование

Интеграция с Prometheus и Grafana, настройка алертов, централизованное логирование (ELK Stack), метрики производительности

#Мотивация

Вы развёртываете Gitea для команды. Всё работает, но что будет через месяц? Через полгода? Как узнать о проблемах до того, как пользователи начнут жаловаться?

Мониторинг отвечает на вопросы:

  • Сколько пользователей активно?
  • Какая нагрузка на сервер?
  • Сколько места осталось на диске?
  • Сколько времени занимают операции?

Логирование помогает:

  • Расследовать инциденты безопасности
  • Отлаживать проблемы
  • Соответствовать требованиям комплаенса (152-ФЗ, GDPR)

Эта тема — о построении полной системы observability для Gitea.

#Архитектура мониторинга

┌─────────────────────────────────────────────────────────────────────┐
│                        Gitea Server                                 │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐  │
│  │   Application   │  │   PostgreSQL    │  │   Git Repositories  │  │
│  │     Metrics     │  │     Metrics     │  │        I/O          │  │
│  │   /metrics      │  │   pg_stat_*     │  │   disk usage        │  │
│  └────────┬────────┘  └────────┬────────┘  └──────────┬──────────┘  │
│           │                    │                       │             │
└───────────┼────────────────────┼───────────────────────┼─────────────┘
            │                    │                       │
            ↓                    ↓                       ↓
┌─────────────────────────────────────────────────────────────────────┐
│                         Prometheus                                  │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │  Сбор метрик каждые 15 секунд, хранение до 90 дней           │  │
│  └──────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘
            │
            ↓
┌─────────────────────────────────────────────────────────────────────┐
│                          Grafana                                    │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │  Дашборды: обзор, репозитории, пользователи, CI/CD           │  │
│  └──────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘
            │
            ↓
┌─────────────────────────────────────────────────────────────────────┐
│                      Alertmanager                                   │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │  Алерты в Telegram, Slack, Email, PagerDuty                  │  │
│  └──────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘

#Включение метрик в Gitea

#Настройка app.ini

[metrics] ENABLED = true ; Интервал сбора метрик (секунды) INTERVAL = 60 ; Токен для доступа к /metrics (опционально) ; TOKEN = your_metrics_token [log] MODE = console, file LEVEL = info [log.file] LEVEL = info FILE_NAME = gitea.log MAX_SIZE_SHIFT = 28 DAILY_ROTATE = true MAX_DAYS = 30

#Проверка доступности метрик

# Без аутентификации (если не настроен токен) curl http://git.company.ru:3000/metrics # С токеном curl -H "Authorization: Bearer your_metrics_token" \ http://git.company.ru:3000/metrics

Пример вывода:

# HELP go_gitea_repo_count Number of repositories
# TYPE go_gitea_repo_count gauge
go_gitea_repo_count 142

# HELP go_gitea_user_count Number of users
# TYPE go_gitea_user_count gauge
go_gitea_user_count 47

# HELP go_gitea_action_count_total Total number of actions
# TYPE go_gitea_action_count_total counter
go_gitea_action_count_total{type="create"} 523
go_gitea_action_count_total{type="push"} 1847

#Развёртывание Prometheus

#docker-compose.monitoring.yml

version: '3.8' services: prometheus: image: prom/prometheus:v2.48.0 container_name: prometheus restart: unless-stopped ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=90d' - '--web.enable-lifecycle' networks: - monitoring-net grafana: image: grafana/grafana:10.2.0 container_name: grafana restart: unless-stopped ports: - "3001:3000" volumes: - ./grafana-data:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=secure_password_2026 - GF_INSTALL_PLUGINS=grafana-piechart-panel depends_on: - prometheus networks: - monitoring-net alertmanager: image: prom/alertmanager:v0.26.0 container_name: alertmanager restart: unless-stopped ports: - "9093:9093" volumes: - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml - ./alertmanager-data:/alertmanager command: - '--config.file=/etc/alertmanager/alertmanager.yml' - '--storage.path=/alertmanager' networks: - monitoring-net node-exporter: image: prom/node-exporter:v1.7.0 container_name: node-exporter restart: unless-stopped ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs' - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)' networks: - monitoring-net networks: monitoring-net: driver: bridge

#prometheus.yml

global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 rule_files: - "alerts.yml" scrape_configs: # Prometheus self-monitoring - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # Gitea metrics - job_name: 'gitea' static_configs: - targets: ['gitea:3000'] metrics_path: '/metrics' # Node exporter (системные метрики) - job_name: 'node-exporter' static_configs: - targets: ['node-exporter:9100'] # PostgreSQL exporter (опционально) - job_name: 'postgres' static_configs: - targets: ['postgres-exporter:9187']

#alerts.yml (правила алертов)

groups: - name: gitea-alerts rules: # Gitea недоступна - alert: GiteaDown expr: up{job="gitea"} == 0 for: 1m labels: severity: critical annotations: summary: "Gitea server is down" description: "Gitea instance {{ $labels.instance }} has been down for more than 1 minute." # Высокая нагрузка CPU - alert: HighCPUUsage expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 5m labels: severity: warning annotations: summary: "High CPU usage detected" description: "CPU usage is above 80% on {{ $labels.instance }}" # Мало места на диске - alert: LowDiskSpace expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 20 for: 10m labels: severity: warning annotations: summary: "Low disk space warning" description: "Disk space is below 20% on {{ $labels.instance }}" # Критически мало места - alert: CriticalDiskSpace expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10 for: 5m labels: severity: critical annotations: summary: "Critical disk space" description: "Disk space is below 10% on {{ $labels.instance }}" # Много ошибок 5xx - alert: HighErrorRate expr: rate(gitea_http_response_status_count{code=~"5.."}[5m]) > 0.1 for: 5m labels: severity: warning annotations: summary: "High HTTP 5xx error rate" description: "Error rate is {{ $value }} errors per second" # Долгое время ответа - alert: SlowResponseTime expr: histogram_quantile(0.95, rate(gitea_http_request_duration_seconds_bucket[5m])) > 2 for: 10m labels: severity: warning annotations: summary: "Slow response time" description: "95th percentile response time is {{ $value }} seconds"

#Настройка Grafana

#Добавление источника данных

  1. Войдите в Grafana: http://your-server:3001
  2. Connections → Data sources → Add data source
  3. Выберите Prometheus
  4. URL: http://prometheus:9090
  5. Save & test

#Импорт дашбордов

Готовые дашборды для Gitea:

  1. Gitea Official Dashboard (ID: 16789)

    • Метрики репозиториев, пользователей, организаций
    • HTTP запросы, время ответа
    • Actions статистика
  2. Node Exporter Full (ID: 1860)

    • CPU, память, диск, сеть
    • Системные метрики сервера

Импорт:

  1. Dashboards → Import
  2. Введите ID дашборда или загрузите JSON
  3. Выберите источник данных (Prometheus)
  4. Import

#Кастомный дашборд для Gitea

{ "dashboard": { "title": "Gitea Overview", "panels": [ { "title": "Repository Count", "type": "stat", "targets": [ { "expr": "go_gitea_repo_count" } ] }, { "title": "User Count", "type": "stat", "targets": [ { "expr": "go_gitea_user_count" } ] }, { "title": "HTTP Request Rate", "type": "graph", "targets": [ { "expr": "rate(gitea_http_request_duration_seconds_count[5m])" } ] }, { "title": "Error Rate (5xx)", "type": "graph", "targets": [ { "expr": "rate(gitea_http_response_status_count{code=~\"5..\"}[5m])" } ] } ] } }

#Alertmanager: настройка уведомлений

#alertmanager.yml

global: resolve_timeout: 5m # Telegram telegram_api_url: "https://api.telegram.org" # SMTP для email smtp_smarthost: 'smtp.company.ru:587' smtp_from: 'alertmanager@company.ru' smtp_auth_username: 'alertmanager@company.ru' smtp_auth_password: 'smtp_password' route: group_by: ['alertname', 'severity'] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: 'default-receiver' routes: - match: severity: critical receiver: 'telegram-critical' continue: true - match: severity: warning receiver: 'email-warnings' receivers: - name: 'default-receiver' webhook_configs: - url: 'http://localhost:5001/webhook' - name: 'telegram-critical' telegram_configs: - bot_token: 'YOUR_BOT_TOKEN' chat_id: '-1001234567890' message: | 🚨 *Critical Alert* Alert: {{ .GroupLabels.alertname }} Severity: {{ .GroupLabels.severity }} Summary: {{ .CommonAnnotations.summary }} Description: {{ .CommonAnnotations.description }} Time: {{ .StartsAt.Format "2006-01-02 15:04:05" }} - name: 'email-warnings' email_configs: - to: 'devops@company.ru' subject: '[WARNING] {{ .GroupLabels.alertname }}' body: | {{ range .Alerts }} Alert: {{ .Labels.alertname }} Severity: {{ .Labels.severity }} Summary: {{ .Annotations.summary }} Description: {{ .Annotations.description }} {{ end }} inhibit_rules: # Если critical, не отправлять warning для того же алерта - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'instance']

#Централизованное логирование с ELK Stack

#Архитектура

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Gitea     │ →  │  Filebeat   │ →  │  Logstash   │
│   logs      │    │  (агент)    │    │  (обработка)│
└─────────────┘    └─────────────┘    └──────┬──────┘
                                             │
                                             ↓
                                    ┌─────────────┐
                                    │Elasticsearch│
                                    │  (хранение) │
                                    └──────┬──────┘
                                           │
                                           ↓
                                    ┌─────────────┐
                                    │   Kibana    │
                                    │ (визуализ.) │
                                    └─────────────┘

#docker-compose.elk.yml

version: '3.8' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: elasticsearch restart: unless-stopped environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms2g -Xmx2g" volumes: - ./elasticsearch-data:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - elk-net logstash: image: docker.elastic.co/logstash/logstash:8.11.0 container_name: logstash restart: unless-stopped volumes: - ./logstash/pipeline:/usr/share/logstash/pipeline - ./logstash/config:/usr/share/logstash/config ports: - "5044:5044" depends_on: - elasticsearch networks: - elk-net kibana: image: docker.elastic.co/kibana/kibana:8.11.0 container_name: kibana restart: unless-stopped environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" depends_on: - elasticsearch networks: - elk-net filebeat: image: docker.elastic.co/beats/filebeat:8.11.0 container_name: filebeat restart: unless-stopped user: root volumes: - ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro - /opt/gitea/logs:/var/log/gitea:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro depends_on: - logstash networks: - elk-net networks: elk-net: driver: bridge

#filebeat.yml

filebeat.inputs: - type: log enabled: true paths: - /var/log/gitea/*.log fields: service: gitea fields_under_root: true - type: docker enabled: true containers: paths: - /var/lib/docker/containers/*/*.log processors: - add_docker_metadata: host: "unix:///var/run/docker.sock" output.logstash: hosts: ["logstash:5044"] logging.level: info logging.to_files: true logging.files: path: /var/log/filebeat name: filebeat.log keepfiles: 7 permissions: 0644

#logstash/pipeline/logstash.conf

input {
  beats {
    port => 5044
  }
}

filter {
  if [service] == "gitea" {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:log_message}" }
    }
    
    date {
      match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
      target => "@timestamp"
    }
    
    if "audit" in [path] {
      mutate {
        add_field => { "log_type" => "audit" }
      }
    }
  }
  
  if [docker] {
    mutate {
      add_field => { "log_type" => "docker" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "gitea-logs-%{+YYYY.MM.dd}"
  }
  
  # Debug вывод
  stdout { codec => rubydebug }
}

#Kibana: создание index pattern

  1. Откройте Kibana: http://your-server:5601
  2. Stack Management → Index Patterns
  3. Create index pattern
  4. Pattern: gitea-logs-*
  5. Time field: @timestamp
  6. Create

#Поиск в логах

Примеры запросов в Kibana:

# Все логи уровня ERROR
level: ERROR

# Аудит логины
log_type: audit AND action: login

# Ошибки за последний час
@timestamp > now-1h AND level: ERROR

# Действия конкретного пользователя
user: admin

# Доступ к конкретному репозиторию
repo: backend-api

#Дашборды и визуализации

#Ключевые метрики для отслеживания

МетрикаОписаниеПорог алерта
UptimeДоступность Gitea< 99.5%
Response Time (p95)95-й перцентиль времени ответа> 2 сек
Error Rate (5xx)Процент ошибок 5xx> 1%
Disk UsageИспользование диска> 80%
Memory UsageИспользование памяти> 90%
Active UsersАктивные пользователи за часМониторинг тренда
Git OperationsКоличество git-операцийМониторинг тренда
Actions QueueОчередь CI/CD задач> 10 задач

#Рекомендуемые дашборды

  1. Gitea Health (основной)

    • Uptime, response time, error rate
    • CPU, memory, disk usage
    • Активные пользователи
  2. Repository Metrics

    • Количество репозиториев
    • Размер репозиториев
    • Топ активных репозиториев
  3. CI/CD Dashboard

    • Количество workflow запусков
    • Время выполнения
    • Success/failure rate
  4. Security Audit

    • Неудачные логины
    • Действия администраторов
    • Изменения прав доступа

#Резюме

  • Prometheus собирает метрики с Gitea через /metrics
  • Grafana визуализирует метрики на дашбордах
  • Alertmanager отправляет уведомления в Telegram, Email, Slack
  • ELK Stack обеспечивает централизованное логирование и поиск
  • Ключевые метрики: uptime, response time, error rate, disk usage

Следующий шаг: LDAP/SSO аутентификация и управление доступом

Далее: LDAP/SSO аутентификация и управление доступом