161 lines
5.2 KiB
Markdown
161 lines
5.2 KiB
Markdown
|
---
|
|||
|
title: "GitRepo"
|
|||
|
date: 2023-01-12T20:22:00+03:00
|
|||
|
tags: ["it", "жизнь", "убежище параноика"]
|
|||
|
---
|
|||
|
|
|||
|
# GitRepo.ru
|
|||
|
|
|||
|
Сегодня серьезно переделал свой хостинг [репозиториев кода](https://gitrepo.ru/):
|
|||
|
|
|||
|
* Переехал на большой арендованный сервак
|
|||
|
* Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose
|
|||
|
* Gitea заменил на её форк [Forgejo](https://forgejo.org/)
|
|||
|
* Впилил CI/CD на основе [Woodpecker CI](https://woodpecker-ci.org/)
|
|||
|
|
|||
|
Приглашаю пользоваться заместо бездуховного западного github: [https://gitrepo.ru/](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 use gitrepo # Все последующие docker команды выполняются на удаленном сервере
|
|||
|
|
|||
|
docker use default # Возвращаюсь в локальный контекст
|
|||
|
```
|
|||
|
|
|||
|
## Оставшиеся проблемы
|
|||
|
|
|||
|
Сейчас так получается, что Caddyfile должен лежать на удаленном сервере, т.к. часть конфига
|
|||
|
|
|||
|
```yml
|
|||
|
volumes:
|
|||
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
|||
|
```
|
|||
|
|
|||
|
выполняется в контексте именно удаленного сервера, а значит при его апдейте на локальном серваке приходится делать SCP этого файла на сервак. Такое себе.
|
|||
|
|
|||
|
Как это решить - есть интересная идея, но это уже в другой раз.
|