GitRepo.ru
Сегодня серьезно переделал свой хостинг репозиториев кода:
- Переехал на большой арендованный сервак
- Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose
- Gitea заменил на её форк Forgejo
- Впилил CI/CD на основе Woodpecker CI
Приглашаю пользоваться заместо бездуховного западного github: https://gitrepo.ru/
Сервер физически находится в датацентре в Москве у весьма годного провайдера Selectel.
Тем более, время сейчас неспокойное и неизвестно когда github станет недоступен для РФ, а GitRepo — он вот тут, в нашей стране.
Немного про устройство
Расскажу немного как я организовал себе Ops сервиса.
У меня на руках docker-compose.yml
который полностью описывает всю
конфигурацию сервака, примерно так:
1version: "3"
2services:
3 caddy:
4 image: caddy:2.6.2-alpine
5 container_name: gateway
6 restart: unless-stopped
7 ports:
8 - "80:80"
9 - "443:443"
10 - "443:443/udp"
11 volumes:
12 - ./Caddyfile:/etc/caddy/Caddyfile
13 - caddy_data:/data
14 - caddy_config:/config
15 networks:
16 - gateway
17 git:
18 image: codeberg.org/forgejo/forgejo:1.18.0-1
19 container_name: git
20 environment:
21 - USER_UID=1000
22 - USER_GID=1000
23 - TZ=Europe/Moscow
24 - USER=git
25 - GITEA__database__DB_TYPE=postgres
26 - GITEA__database__HOST=db:5432
27 - GITEA__database__NAME=${PG_NAME}
28 - GITEA__database__USER=${PG_USER}
29 - GITEA__database__PASSWD=${PG_PASS}
30 restart: always
31 networks:
32 - gitea
33 - gateway
34 volumes:
35 - /home/git/.ssh/:/data/git/.ssh
36 - forgejo:/data
37 - /etc/timezone:/etc/timezone:ro
38 - /etc/localtime:/etc/localtime:ro
39 ports:
40 - "127.0.0.1:2222:22"
41 depends_on:
42 db:
43 condition: service_healthy
44 db:
45 image: postgres:13
46 restart: always
47 environment:
48 - POSTGRES_USER=${PG_USER}
49 - POSTGRES_PASSWORD=${PG_PASS}
50 - POSTGRES_DB=${PG_NAME}
51 healthcheck:
52 test: /usr/bin/pg_isready
53 interval: 5s
54 timeout: 10s
55 retries: 120
56 networks:
57 - gitea
58 volumes:
59 - postgres:/var/lib/postgresql/data
60 woodpecker-server:
61 image: woodpeckerci/woodpecker-server:latest
62 volumes:
63 - woodpecker-server-data:/var/lib/woodpecker/
64 environment:
65 - WOODPECKER_OPEN=true
66 - WOODPECKER_GITEA=true
67 - WOODPECKER_GITEA_URL=https://gitrepo.ru
68 - WOODPECKER_GITEA_CLIENT=${GITEA_CLIENT}
69 - WOODPECKER_GITEA_SECRET=${GITEA_SECRET}
70 - WOODPECKER_HOST=https://ci.gitrepo.ru
71 - WOODPECKER_ADMIN=neonxp
72 - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
73 networks:
74 - gitea
75 - gateway
76 depends_on:
77 - git
78 woodpecker-agent:
79 image: woodpeckerci/woodpecker-agent:latest
80 command: agent
81 restart: always
82 depends_on:
83 - woodpecker-server
84 volumes:
85 - /var/run/docker.sock:/var/run/docker.sock
86 environment:
87 - WOODPECKER_SERVER=woodpecker-server:9000
88 - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
89 networks:
90 - gitea
91volumes:
92 woodpecker-server-data:
93 caddy_data:
94 caddy_config:
95 forgejo:
96 postgres:
97networks:
98 gateway:
99 gitea:
100 external: false
101
а рядом лежит .env
файлик с значениями переменных ${...}
.
Запускаю деплой я с локального компьютера, предварительно добавив удаленный сервер в контекст докера:
# Создаю новый контекст для удаленного сервера
docker context create gitrepo --docker "host=ssh://gitrepo.ru"
# Все последующие docker команды выполняются на удаленном сервере
docker use gitrepo
# Возвращаюсь в локальный контекст
docker use default
Оставшиеся проблемы
Сейчас так получается, что Caddyfile должен лежать на удаленном сервере, т.к. часть конфига
1 volumes:
2 - ./Caddyfile:/etc/caddy/Caddyfile
выполняется в контексте именно удаленного сервера, а значит при его апдейте на локальном серваке приходится делать SCP этого файла на сервак. Такое себе.
Как это решить — есть интересная идея, но это уже в другой раз.