Локальное облако и Git-сервер на Docker с HTTPS¶
Эта архитектура использует Nginx Proxy Manager как единую точку входа. Он принимает трафик на стандартных портах 80 и 443, сопоставляет локальные домены cloud.internal и git.internal с нужными контейнерами и шифрует трафик с помощью самоподписанного SSL-сертификата.
Структура каталогов проекта¶
Перед началом работы создайте структуру папок на вашем сервере (например, в /opt/mycloud):
/opt/mycloud/
├── docker-compose.yml
├── db/ # Данные базы данных MariaDB
├── nextcloud/ # Системные файлы Nextcloud
├── data/ # Пользовательские файлы Nextcloud
├── gitea/ # Данные Git-сервера
├── runner-data/ # Конфигурация CI/CD раннера
└── proxy_data/ # Конфигурация Nginx прокси
└── custom_ssl/ # Хранилище SSL-сертификатов
Шаг 1. Конфигурация docker-compose.yml¶
Создайте файл /opt/mycloud/docker-compose.yml со следующим содержимым:
networks:
nextcloud_gitea_net:
driver: bridge
services:
# 1. Единый обратный прокси-сервер (Nginx)
proxy:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: always
networks:
- nextcloud_gitea_net
ports:
- '80:80' # Стандартный HTTP порт
- '443:443' # Стандартный HTTPS порт
- '8443:443' # Изолированный HTTPS порт для домашнего WebDAV Windows
- '81:81' # Веб-панель управления прокси
volumes:
- ./proxy_data:/data
- ./proxy_letsencrypt:/etc/letsencrypt
# 2. Общая база данных (MariaDB)
db:
image: mariadb:10.6
container_name: nextcloud-db
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
networks:
- nextcloud_gitea_net
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud_password
# 3. Кэширование для Nextcloud (Redis)
redis:
image: redis:alpine
container_name: nextcloud-redis
restart: always
networks:
- nextcloud_gitea_net
# 4. Веб-приложение Nextcloud
app:
image: nextcloud:latest
container_name: nextcloud-app
expose:
- "80"
depends_on:
- db
- redis
restart: always
networks:
- nextcloud_gitea_net
volumes:
- ./nextcloud:/var/www/html
- ./data:/var/www/html/data
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud_password
- REDIS_HOST=redis
- TRUSTED_PROXIES=proxy
- OVERWRITEHOST=cloud.internal:8443
- OVERWRITEPROTOCOL=https
# 5. Git-сервер Gitea
gitea:
image: gitea/gitea:1.26.1
container_name: gitea
restart: always
depends_on:
- db
networks:
- nextcloud_gitea_net
expose:
- "3000"
ports:
- "222:22" # Порт для SSH-доступа к репозиториям
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea_password
# 6. CI/CD Конвейер (Gitea Actions)
act-runner:
image: gitea/act_runner:latest
container_name: gitea-runner
restart: always
depends_on:
- gitea
- proxy
networks:
- nextcloud_gitea_net
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./runner-data:/data
- ./proxy_data/custom_ssl/local.crt:/etc/ssl/certs/local.crt:ro
extra_hosts:
- "git.internal:host-gateway"
environment:
- GITEA_INSTANCE_URL=https://git.internal
- GITEA_RUNNER_REGISTRATION_TOKEN=ВАШ_ТОКЕН_ИЗ_АДМИНКИ_GITEA
- GITEA_RUNNER_NAME=home-runner
- GITEA_RUNNER_INSECURE_SKIP_VERIFY=true
Запустите базовую инфраструктуру (без раннера, так как токена пока нет):
Шаг 2. Генерация мультидоменного SSL-сертификата¶
Для локальной сети выпускается самоподписанный сертификат сроком на 10 лет (3650 дней). Он будет защищать сразу два домена благодаря альтернативным именам (SAN).
Выполните в терминале сервера:
mkdir -p ./proxy_data/custom_ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout ./proxy_data/custom_ssl/local.key \
-out ./proxy_data/custom_ssl/local.crt \
-subj "/CN=cloud.internal" \
-addext "subjectAltName = DNS:cloud.internal, DNS:git.internal"
Шаг 3. Настройка Nginx Proxy Manager через веб-панель¶
- Откройте браузер и перейдите на страницу управления прокси:
http://<IP_СЕРВЕРА>:81 - Войдите с дефолтными данными:
admin@example.com/changeme. Заполните профиль администратора и установите новый постоянный пароль. - Импорт SSL:
- Перейдите во вкладку SSL Certificates → Add SSL Certificate → Custom.
- Назовите его
Local-SSL. - Откройте файлы
local.keyиlocal.crtна сервере через командуcatи скопируйте их текстовое содержимое в соответствующие поля веб-интерфейса. Нажмите Save. - Проксирование Nextcloud:
- Вкладка Hosts → Proxy Hosts → Add Proxy Host.
- Domain Names:
cloud.internal - Scheme:
http, Forward Host:nextcloud-app, Port:80 - Включите Websockets Support.
- На вкладке SSL: выберите
Local-SSL, включите Force SSL и HTTP/2 Support. Нажмите Save. - Проксирование Gitea:
- Добавьте еще один Proxy Host.
- Domain Names:
git.internal - Scheme:
http, Forward Host:gitea, Port:3000 - На вкладке SSL: выберите
Local-SSL, включите Force SSL и HTTP/2 Support. Нажмите Save.
Шаг 4. Конфигурация локальных доменов внутри приложений¶
Приложения запущены за прокси-сервером, им необходимо явно разрешить принимать запросы по новым именам.
- Для Nextcloud: Добавьте домен в список доверенных:
- Для Gitea: Откройте конфигурационный файл
./gitea/gitea/conf/app.iniи в секции[server]отредактируйте параметры: Перезапустите Gitea для применения параметров:
Шаг 5. Настройка рабочих мест (Клиенты Windows)¶
Чтобы компьютеры в домашней сети имели доступ к серверам по доменным именам и доверяли SSL-сертификату, выполните настройку на целевом ПК с Windows.
1. Сопоставление имен (Файл hosts)¶
Запустите Блокнот от имени администратора, откройте файл C:\Windows\System32\drivers\etc\hosts и добавьте в самый конец строку:
2. Принудительный импорт SSL-сертификата¶
Скопируйте файл local.crt с сервера на ПК с Windows. Откройте PowerShell от имени администратора в папке с файлом и выполните команду:
Шаг 6. Запуск CI/CD конвейера (Gitea Actions)¶
- Зайдите в браузер на
https://git.internal. - Перейдите в правый верхний угол: Панель управления (Site Administration) → Раннеры (Runners) → Создать раннер (Create new runner).
- Скопируйте сгенерированный токен авторизации.
- Откройте
docker-compose.ymlна сервере и вставьте этот токен в переменнуюGITEA_RUNNER_REGISTRATION_TOKENконтейнераact-runner. - Запустите раннер:
- Убедитесь в успешном запуске, проверив логи: В админке Gitea статус раннера сменится на зеленый (активный).
Шаг 7. Подключение сетевого диска WebDAV без конфликтов¶
Если на вашем ПК используется рабочий WebDAV на стандартном порту 443, домашнее облако необходимо монтировать на выделенный порт 8443 (мы пробросили его на Шаге 1). Это разграничит сессии авторизации в Windows.
- Зайдите в Nextcloud через браузер:
https://cloud.internal:8443. - Откройте Личные настройки → Безопасность → в самом низу введите имя «Windows-PC» и нажмите Создать новый пароль приложения. Скопируйте временный токен.
- Откройте командную строку Windows (
cmd) и выполните команду монтирования диска на буквуY:: (Примечание: порт:8443добавлен в URL явно, чтобы избежать конфликта с корпоративным WebDAV на 443 порту).