{"id":50661916,"url":"https://github.com/qwental/gitea-high-availability-stand","last_synced_at":"2026-06-08T03:04:20.056Z","repository":{"id":356991583,"uuid":"1217089629","full_name":"Qwental/Gitea-High-Availability-Stand","owner":"Qwental","description":"GitOps Gitea High-Availability Stand","archived":false,"fork":false,"pushed_at":"2026-06-06T10:30:53.000Z","size":17898,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T12:14:40.113Z","etag":null,"topics":["alertmanager","ansible","docker","gitea","grafana","haproxy","high-availability","keepalived","loki","postgresql","prometheus"],"latest_commit_sha":null,"homepage":"","language":"Jinja","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Qwental.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T14:33:04.000Z","updated_at":"2026-06-06T10:30:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Qwental/Gitea-High-Availability-Stand","commit_stats":null,"previous_names":["qwental/gitea-high-availability-stand"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Qwental/Gitea-High-Availability-Stand","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwental%2FGitea-High-Availability-Stand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwental%2FGitea-High-Availability-Stand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwental%2FGitea-High-Availability-Stand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwental%2FGitea-High-Availability-Stand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Qwental","download_url":"https://codeload.github.com/Qwental/Gitea-High-Availability-Stand/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwental%2FGitea-High-Availability-Stand/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34046005,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alertmanager","ansible","docker","gitea","grafana","haproxy","high-availability","keepalived","loki","postgresql","prometheus"],"created_at":"2026-06-08T03:04:19.362Z","updated_at":"2026-06-08T03:04:20.048Z","avatar_url":"https://github.com/Qwental.png","language":"Jinja","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GitOps Gitea High-Availability Stand\n\nРепозиторий для автоматического развертывания отказоустойчивого Gitea.\n\n\n**[Демонстрация отказоустойчивости и Observability](\u003c/docs/demo.md\u003e)**\n\n[Пример условия тестового задания](\u003c/docs/Пример условия тестового задания.md\u003e)\n\n## 1. Архитектура системы\n![Архитектура кластера](/docs/images/Архитектура.png)\n\nСистема представляет собой многоуровневый кластер:\n* **Proxy Layer:** HAProxy + Keepalived для балансировки HTTP/SSH\n* **App Layer:** Несколько нод Gitea.\n* **Database Layer:** PostgreSQL (Master-Replica) + repmgr + Keepalived.\n* **Storage Layer:** NFS Ganesha + Keepalived для общих репозиториев.\n* **Слой мониторинга:** Prometheus, Loki, Grafana, Alertmanager.\n* **Слой бэкапов:** Restic Server + Agents.\n\n## 2 Как запустить?\n\n## 2.1 Подготовка инфраструктуры\nнастройте `.env` по примеру `.env.example`\n```bash\n    cd infrastructure/docker\n    docker-compose up -d\n ```\n## 2.2 Настройка переменных Ansible\n\nПеременные окружения все находятся в `infrastructure/ansible/group_vars/`.\n\nесть `vault.yml.example` в котором описано какие секреты должны быть помещены в `infrastructure/ansible/group_vars/vault.yml` , можно просто скопировать и вставить если не важны алерты на почту\n\n### 2.3 Шифрование секретов(опционально)\nДля работы необходимо создать файл с паролем для Vault (например, `.vault_pass`) и зашифровать конфиденциальные данные:\n```bash\n    # Отредактируйте файлы и сохраните\n    ansible-vault encrypt infrastructure/ansible/group_vars/all/vault.yml\n    ansible-vault encrypt infrastructure/ansible/group_vars/backup/vault.yml\n```\n\n### 2.4 Основные переменные и настройки подключения\n\nНастройки среды в инвентаре (`infrastructure/ansible/inventory.ini`)\nВ блоке `[all:vars]` задаются параметры доступа и архитектура хоста\n`target_arch`: Укажите `arm64` или `amd64` \n\n\n##  2.5. Развертывание через ansible\nЖелательно включить впнчик с иностранным сервером =)\nЗапуск полной цепочки установки всех ролей: \n\nможно без впна:\n```bash\nansible-playbook -i inventory.ini deploy.yml --vault-password-file .vault_pass --skip-tags monitoring\n```\n\nОбязательно с впном(зеркала яндекса почему-то не работают, поэтому только так)\n```bash\nansible-playbook -i inventory.ini deploy.yml --vault-password-file .vault_pass --tags monitoring\n```\n\n\n```bash\ncd infrastructure/ansible\nansible-playbook -i inventory.ini deploy.yml --vault-password-file .vault_pass\n\n```\n\n##  2.6. Проверка работоспособности\n\nТопология доступа к web-интерфейсам зависит от хостовой ОС. Docker Desktop (macOS/Windows) не маршрутизирует внутренние IP-адреса контейнеров на хост, поэтому используется `localhost` с проброшенными портами. В Linux доступна прямая маршрутизация.\n\n**Доступ для macOS / Windows (Port Mapping):**\n* **Gitea:** `http://localhost:3000` (проксируется через `gitea-proxy-01`) или `http://localhost:3002` (через `gitea-proxy-02`).\n* **Grafana:** `http://localhost:3001`.\n* **Prometheus:** `http://localhost:9090`.\n\n**Доступ для Linux (Native Bridge Routing):**\n* **Gitea:** `http://172.20.0.20:3000` (обращение напрямую к VIP-адресу кластера балансировщиков).\n* **Grafana:** `http://172.20.0.50:3000` (обращение напрямую к IP-адресу узла мониторинга).\n* **Prometheus:** `http://172.20.0.50:9090`.\n\n* **Статус кластера БД:** \n```bash\n  docker exec -it db-node-01 su - postgres -c \"repmgr cluster show\"\n```\n\n\n---\n\n**Автор:** Бугренков Владимир\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwental%2Fgitea-high-availability-stand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqwental%2Fgitea-high-availability-stand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwental%2Fgitea-high-availability-stand/lists"}