From 2ddbf409b52803d05b1c0301ac90d9d6b1a7f95a Mon Sep 17 00:00:00 2001 From: Liosha Date: Sun, 26 Apr 2026 20:37:10 +0300 Subject: [PATCH] add hetzner server infrastructure files --- Hetzner.md | 8 +- INFRASTRUCTURE.md | 53 +++++++++++ hetzner/caddy/docker-compose.yml | 93 +++++++++++++++++++ hetzner/caddy/prometheus.yml | 11 +++ hetzner/gitea/docker-compose.yml | 53 +++++++++++ hetzner/jambotron-infra/docker-compose.yml | 37 ++++++++ hetzner/portainer/docker-compose.yml | 24 +++++ .../environments/environment.development.ts | 2 +- .../src/environments/environment.prod.ts | 3 +- 9 files changed, 279 insertions(+), 5 deletions(-) create mode 100644 INFRASTRUCTURE.md create mode 100644 hetzner/caddy/docker-compose.yml create mode 100644 hetzner/caddy/prometheus.yml create mode 100644 hetzner/gitea/docker-compose.yml create mode 100644 hetzner/jambotron-infra/docker-compose.yml create mode 100644 hetzner/portainer/docker-compose.yml diff --git a/Hetzner.md b/Hetzner.md index a2d8539..c781132 100644 --- a/Hetzner.md +++ b/Hetzner.md @@ -17,7 +17,7 @@ Port Login a8cae8001@smtp-brevo.com - +------------ Сервис,Адрес,Роль в созидании Caddy,jambotron.com,Вратарь и защитник (SSL) @@ -29,4 +29,8 @@ Gitea,gitea.jambotron.com,Твоя «память» (хранилище кода --------- portainer user:admin -password:Z*N3p8&iI,a70"ER45GT9}fBAu2/^Q)C \ No newline at end of file +password:Z*N3p8&iI,a70"ER45GT9}fBAu2/^Q)C + + + +jambo_secret_pass \ No newline at end of file diff --git a/INFRASTRUCTURE.md b/INFRASTRUCTURE.md new file mode 100644 index 0000000..b229075 --- /dev/null +++ b/INFRASTRUCTURE.md @@ -0,0 +1,53 @@ +# 🚀 Техническая документация: Инфраструктура Jambotron + +## 🏗️ Общая архитектура +* **Сервер**: Hetzner (Helsinki) [cite: 1, 3] +* **IP**: 89.167.99.58 [cite: 1] +* **ОС**: Ubuntu [cite: 1, 3] +* **Локальная сеть Docker**: `jambotron-net` (External) [cite: 3, 5, 6, 7] + +--- + +## 📦 Реестр контейнеров и доступов + +| Контейнер | Образ | Внешний URL | Логин / Email | Пароль (Secret) | +| :--- | :--- | :--- | :--- | :--- | +| **caddy** | `lucaslorentz/caddy-docker-proxy:latest` [cite: 3] | — | — | — | +| **jambotron-app** | `jambotron-prod:latest` [cite: 2, 3] | `jambotron.com` [cite: 1, 3] | — | — | +| **jambo-postgres** | `postgres:15-alpine` [cite: 3, 6] | — | `jambotron_admin` [cite: 6] | `jambo_secret_pass` [cite: 6] | +| **jambo-pgadmin** | `dpage/pgadmin4` [cite: 3, 6] | `pgadmin.jambotron.com` [cite: 6] | `admin@jambotron.com` [cite: 6] | `your_secure_password` [cite: 6] | +| **gitea** | `gitea/gitea:latest` [cite: 3, 5] | `gitea.jambotron.com` [cite: 5] | `Liosha84` [cite: 1] | — | +| **db** (Gitea DB) | `postgres:15-alpine` [cite: 3, 5] | — | `gitea` [cite: 5] | `gitea_db_pass` [cite: 5] | +| **gitea-runner** | `gitea/act_runner:latest` [cite: 3, 5] | — | — | `ULMDH7Defx...` (Token) [cite: 5] | +| **portainer** | `portainer/portainer-ce:latest` [cite: 3, 7] | `manage.jambotron.com` [cite: 7] | `admin` [cite: 3] | — | +| **grafana** | `grafana/grafana:latest` [cite: 3] | `jambotron.com/monitor/` [cite: 3] | `admin` [cite: 3] | `monitorPWD` [cite: 3] | +| **prometheus** | `prom/prometheus:latest` [cite: 3] | — | — | — | +| **cadvisor** | `gcr.io/cadvisor/cadvisor:latest` [cite: 3] | — | — | — | +| **node-exporter** | `prom/node-exporter:latest` [cite: 3] | — | — | — | + +--- + +## 🌐 Детальная конфигурация сети и томов + +1. **Маршрутизация (Caddy)**: + * Caddy работает как `docker-proxy`, автоматически подхватывая лейблы других контейнеров через `docker.sock` [cite: 3]. + * Для Grafana настроен путь `/monitor/` с `GF_SERVER_SERVE_FROM_SUB_PATH=true` [cite: 3]. + * Portainer доступен через `manage.jambotron.com` на внутреннем порту `9000` [cite: 7]. + +2. **Хранение данных (Volumes)**: + * **База приложения**: Использует именованный том `jambo_db_data` [cite: 6]. + * **Gitea**: Данные хранятся в `./data`, база — в `./db_data` [cite: 5]. + * **Мониторинг**: Используются тома `caddy_data`, `prometheus_data`, `grafana_data` [cite: 3]. + * **Portainer**: Данные в томе `portainer_data` [cite: 7]. + +3. **Интеграция CI/CD**: + * `gitea-runner` подключен к `docker.sock` для управления контейнерами во время сборки [cite: 5]. + * Используется экземпляр `https://gitea.jambotron.com` [cite: 5]. + +--- + +## 🛠️ Стек технологий +* **Backend**: Spring Boot 3.5 [cite: 1] +* **Frontend**: Angular 17 [cite: 1] +* **Proxy**: Caddy с Docker Proxy Ingress [cite: 3] +* **Monitoring**: Prometheus + Grafana [cite: 3, 4] diff --git a/hetzner/caddy/docker-compose.yml b/hetzner/caddy/docker-compose.yml new file mode 100644 index 0000000..03144d5 --- /dev/null +++ b/hetzner/caddy/docker-compose.yml @@ -0,0 +1,93 @@ +services: + # --- ЯДРО: Caddy с авто-лейблами --- + caddy: + image: lucaslorentz/caddy-docker-proxy:latest + container_name: caddy + ports: + - 80:80 + - 443:443 + environment: + - CADDY_INGRESS_NETWORKS=jambotron-net + networks: + - jambotron-net + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - caddy_data:/data + restart: always + + # --- МОНИТОРИНГ: Prometheus --- + prometheus: + image: prom/prometheus:latest + container_name: prometheus + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro + - prometheus_data:/prometheus + networks: + - jambotron-net + restart: always + + # --- МОНИТОРИНГ: Grafana --- + grafana: + image: grafana/grafana:latest + container_name: grafana + networks: + - jambotron-net + environment: + - GF_SECURITY_ADMIN_PASSWORD=monitorPWD + - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/monitor/ + - GF_SERVER_SERVE_FROM_SUB_PATH=true + labels: + caddy: jambotron.com + caddy.handle: /monitor/* + caddy.handle.reverse_proxy: "{{upstreams 3000}}" + volumes: + - grafana_data:/var/lib/grafana + restart: always + + # --- ДАТЧИКИ --- + node-exporter: + image: prom/node-exporter:latest + container_name: node-exporter + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - '--path.procfs=/host/proc' + - '--path.sysfs=/host/sys' + networks: + - jambotron-net + restart: always + + cadvisor: + image: gcr.io/cadvisor/cadvisor:latest + container_name: cadvisor + volumes: + - /:/rootfs:ro + - /var/run:/var/run:ro + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + - /dev/disk/:/dev/disk:ro + networks: + - jambotron-net + restart: always + + # --- ТЕСТОВЫЙ ПОДДОМЕН (Wildcard DNS должен быть включен) --- + test-app1: + image: traefik/whoami + container_name: test-app1 + networks: + - jambotron-net + labels: + caddy: test-app1.jambotron.com + caddy.reverse_proxy: "{{upstreams 80}}" + restart: always + +networks: + jambotron-net: + name: jambotron-net + +volumes: + caddy_data: + prometheus_data: + grafana_data: \ No newline at end of file diff --git a/hetzner/caddy/prometheus.yml b/hetzner/caddy/prometheus.yml new file mode 100644 index 0000000..37b91f9 --- /dev/null +++ b/hetzner/caddy/prometheus.yml @@ -0,0 +1,11 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'node' + static_configs: + - targets: ['node-exporter:9100'] + + - job_name: 'cadvisor' + static_configs: + - targets: ['cadvisor:8080'] \ No newline at end of file diff --git a/hetzner/gitea/docker-compose.yml b/hetzner/gitea/docker-compose.yml new file mode 100644 index 0000000..17ce965 --- /dev/null +++ b/hetzner/gitea/docker-compose.yml @@ -0,0 +1,53 @@ +services: + server: + image: gitea/gitea:latest + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=postgres + - GITEA__database__HOST=db:5432 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea_db_pass # Смени на свой + restart: always + networks: + - jambotron-net + volumes: + - ./data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + labels: + caddy: gitea.jambotron.com + caddy.reverse_proxy: "{{upstreams 3000}}" + depends_on: + - db + + db: + image: postgres:15-alpine + restart: always + environment: + - POSTGRES_USER=gitea + - POSTGRES_PASSWORD=gitea_db_pass # Должен совпадать с паролем выше + - POSTGRES_DB=gitea + networks: + - jambotron-net + volumes: + - ./db_data:/var/lib/postgresql/data + runner: + image: gitea/act_runner:latest + container_name: gitea-runner + restart: always + environment: + - GITEA_INSTANCE_URL=https://gitea.jambotron.com + - GITEA_RUNNER_REGISTRATION_TOKEN=ULMDH7DefxH0aafni90ud8My1EMtyi0ocz49MU0u + - GITEA_RUNNER_NAME=helsinki-runner + - GITEA_RUNNER_LABELS=ubuntu-latest:docker://catthehacker/ubuntu:act-latest + volumes: + - ./runner_data:/data + - /var/run/docker.sock:/var/run/docker.sock # Критически важно для управления контейнерами + networks: + - jambotron-net +networks: + jambotron-net: + external: true diff --git a/hetzner/jambotron-infra/docker-compose.yml b/hetzner/jambotron-infra/docker-compose.yml new file mode 100644 index 0000000..05621e7 --- /dev/null +++ b/hetzner/jambotron-infra/docker-compose.yml @@ -0,0 +1,37 @@ +version: '3.8' + +services: + # Сервер базы данных + jambotron-db-server: + image: postgres:15-alpine + container_name: jambo-postgres + restart: always + environment: + - POSTGRES_DB=jambotron_prod + - POSTGRES_USER=jambotron_admin + - POSTGRES_PASSWORD=jambo_secret_pass + volumes: + - jambo_db_data:/var/lib/postgresql/data + networks: + - jambotron-net + + # Панель управления базой + jambo-pgadmin: + image: dpage/pgadmin4 + container_name: jambo-pgadmin + restart: always + environment: + - PGADMIN_DEFAULT_EMAIL=admin@jambotron.com + - PGADMIN_DEFAULT_PASSWORD=your_secure_password + networks: + - jambotron-net + labels: + - "caddy=pgadmin.jambotron.com" + - "caddy.reverse_proxy={{upstreams 80}}" + +networks: + jambotron-net: + external: true # Указываем, что сеть уже создана (в ней же живет Caddy и Gitea) + +volumes: + jambo_db_data: diff --git a/hetzner/portainer/docker-compose.yml b/hetzner/portainer/docker-compose.yml new file mode 100644 index 0000000..f4155b3 --- /dev/null +++ b/hetzner/portainer/docker-compose.yml @@ -0,0 +1,24 @@ +services: + portainer: + image: portainer/portainer-ce:latest + container_name: portainer + restart: always + security_opt: + - no-new-privileges:true + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - portainer_data:/data + networks: + - jambotron-net + labels: + # Меняем на отдельный поддомен + caddy: manage.jambotron.com + caddy.reverse_proxy: "{{upstreams 9000}}" + +networks: + jambotron-net: + external: true + +volumes: + portainer_data: \ No newline at end of file diff --git a/jambotron-ui/src/environments/environment.development.ts b/jambotron-ui/src/environments/environment.development.ts index 2c5c033..9a731d4 100644 --- a/jambotron-ui/src/environments/environment.development.ts +++ b/jambotron-ui/src/environments/environment.development.ts @@ -4,5 +4,5 @@ export const environment = { fromWeb: false, production: false, host_name: 'http://localhost', - title: 'JAMBOTRON.RUN.PLACE (dev)' + title: 'JAMBOTRON.COM (dev)' }; diff --git a/jambotron-ui/src/environments/environment.prod.ts b/jambotron-ui/src/environments/environment.prod.ts index 8eca147..64700ba 100644 --- a/jambotron-ui/src/environments/environment.prod.ts +++ b/jambotron-ui/src/environments/environment.prod.ts @@ -3,7 +3,6 @@ export const environment = { port: 8081, production: true, fromWeb: true, - //host_name: 'https://jambotron.run.place', host_name:'https://jambotron.com', - title: 'JAMBOTRON.RUN.PLACE' + title: 'JAMBOTRON.COM' };