GitRepo.ru

Пишу как про околоайти, так и просто что придёт в голову

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 этого файла на сервак. Такое себе.

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