Сегодня серьезно переделал свой хостинг репозиториев кода:

  • Переехал на большой арендованный сервак
  • Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose
  • Gitea заменил на её форк Forgejo
  • Впилил CI/CD на основе Woodpecker CI

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

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

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

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

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

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

  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
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 файлик с значениями переменных ${...}.

Запускаю деплой я с локального компьютера, предварительно добавив удаленный сервер в контекст докера:

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

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

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

1
2
volumes:
    - ./Caddyfile:/etc/caddy/Caddyfile

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

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