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

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