summaryrefslogtreecommitdiff
path: root/content/posts/2023-01-12-gitrepo/index.md
blob: c10dd9dc361a09bb7f3deb8afd5d53829d36cb04 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
---
categories:
    - Мои проекты
date: "2023-01-12T20:22:00Z"
tags:
    - it
    - моё
title: GitRepo.ru
---

Сегодня серьезно переделал свой хостинг [репозиториев
кода](https://gitrepo.ru/):

- Переехал на большой арендованный сервак
- Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose
- Gitea заменил на её форк [Forgejo](https://forgejo.org/)
- Впилил CI/CD на основе [Woodpecker CI](https://woodpecker-ci.org/)

Приглашаю пользоваться заместо бездуховного западного github:
<https://gitrepo.ru/>

Сервер физически находится в датацентре в Москве у весьма годного провайдера
Selectel.

Тем более, время сейчас неспокойное и неизвестно когда github станет недоступен
для РФ, а GitRepo — он вот тут, в нашей стране.

# Немного про устройство

Расскажу немного как я организовал себе Ops сервиса.

У меня на руках `docker-compose.yml` который полностью описывает всю
конфигурацию сервака, примерно так:

```yml
version: "3"
services:
    caddy:
        image: caddy:2.6.2-alpine
        container_name: gateway
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
            - "443:443/udp"
        volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile
            - caddy_data:/data
            - caddy_config:/config
        networks:
            - gateway
    git:
        image: codeberg.org/forgejo/forgejo:1.18.0-1
        container_name: git
        environment:
            - USER_UID=1000
            - USER_GID=1000
            - TZ=Europe/Moscow
            - USER=git
            - GITEA__database__DB_TYPE=postgres
            - GITEA__database__HOST=db:5432
            - GITEA__database__NAME=${PG_NAME}
            - GITEA__database__USER=${PG_USER}
            - GITEA__database__PASSWD=${PG_PASS}
        restart: always
        networks:
            - gitea
            - gateway
        volumes:
            - /home/git/.ssh/:/data/git/.ssh
            - forgejo:/data
            - /etc/timezone:/etc/timezone:ro
            - /etc/localtime:/etc/localtime:ro
        ports:
            - "127.0.0.1:2222:22"
        depends_on:
            db:
                condition: service_healthy
    db:
        image: postgres:13
        restart: always
        environment:
            - POSTGRES_USER=${PG_USER}
            - POSTGRES_PASSWORD=${PG_PASS}
            - POSTGRES_DB=${PG_NAME}
        healthcheck:
            test: /usr/bin/pg_isready
            interval: 5s
            timeout: 10s
            retries: 120
        networks:
            - gitea
        volumes:
            - postgres:/var/lib/postgresql/data
    woodpecker-server:
        image: woodpeckerci/woodpecker-server:latest
        volumes:
            - woodpecker-server-data:/var/lib/woodpecker/
        environment:
            - WOODPECKER_OPEN=true
            - WOODPECKER_GITEA=true
            - WOODPECKER_GITEA_URL=https://gitrepo.ru
            - WOODPECKER_GITEA_CLIENT=${GITEA_CLIENT}
            - WOODPECKER_GITEA_SECRET=${GITEA_SECRET}
            - WOODPECKER_HOST=https://ci.gitrepo.ru
            - WOODPECKER_ADMIN=neonxp
            - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
        networks:
            - gitea
            - gateway
        depends_on:
            - git
    woodpecker-agent:
        image: woodpeckerci/woodpecker-agent:latest
        command: agent
        restart: always
        depends_on:
            - woodpecker-server
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            - WOODPECKER_SERVER=woodpecker-server:9000
            - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
        networks:
            - gitea
volumes:
    woodpecker-server-data:
    caddy_data:
    caddy_config:
    forgejo:
    postgres:
networks:
    gateway:
    gitea:
        external: false
```

а рядом лежит `.env` файлик с значениями переменных `${...}`.

Запускаю деплой я с локального компьютера, предварительно добавив удаленный
сервер в [контекст
докера](https://docs.docker.com/engine/context/working-with-contexts/):

```
# Создаю новый контекст для удаленного сервера
docker context create gitrepo --docker "host=ssh:/gitrepo.ru"
# Все последующие docker команды выполняются на удаленном сервере
docker use gitrepo
# Возвращаюсь в локальный контекст
docker use default
```

# Оставшиеся проблемы

Сейчас так получается, что Caddyfile должен лежать на удаленном сервере, т.к.
часть конфига

```yml
volumes:
    - ./Caddyfile:/etc/caddy/Caddyfile
```

выполняется в контексте именно удаленного сервера, а значит при его апдейте на
локальном серваке приходится делать SCP этого файла на сервак. Такое себе.

Как это решить — есть интересная идея, но это уже в другой раз.