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