blog/content/posts/2023-01-12-gitrepo/index.md

155 lines
No EOL
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

+++
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 этого файла на сервак. Такое себе.
Как это решить — есть интересная идея, но это уже в другой раз.