Перейти к содержанию

Локальное облако и 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

Запустите базовую инфраструктуру (без раннера, так как токена пока нет):

docker compose up -d proxy db redis app gitea

Шаг 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 через веб-панель

  1. Откройте браузер и перейдите на страницу управления прокси: http://<IP_СЕРВЕРА>:81
  2. Войдите с дефолтными данными: admin@example.com / changeme. Заполните профиль администратора и установите новый постоянный пароль.
  3. Импорт SSL:
  4. Перейдите во вкладку SSL CertificatesAdd SSL CertificateCustom.
  5. Назовите его Local-SSL.
  6. Откройте файлы local.key и local.crt на сервере через команду cat и скопируйте их текстовое содержимое в соответствующие поля веб-интерфейса. Нажмите Save.
  7. Проксирование Nextcloud:
  8. Вкладка HostsProxy HostsAdd Proxy Host.
  9. Domain Names: cloud.internal
  10. Scheme: http, Forward Host: nextcloud-app, Port: 80
  11. Включите Websockets Support.
  12. На вкладке SSL: выберите Local-SSL, включите Force SSL и HTTP/2 Support. Нажмите Save.
  13. Проксирование Gitea:
  14. Добавьте еще один Proxy Host.
  15. Domain Names: git.internal
  16. Scheme: http, Forward Host: gitea, Port: 3000
  17. На вкладке SSL: выберите Local-SSL, включите Force SSL и HTTP/2 Support. Нажмите Save.

Шаг 4. Конфигурация локальных доменов внутри приложений

Приложения запущены за прокси-сервером, им необходимо явно разрешить принимать запросы по новым именам.

  1. Для Nextcloud: Добавьте домен в список доверенных:
    docker exec --user www-data nextcloud-app php occ config:system:set trusted_domains 2 --value="cloud.internal"
    
  2. Для Gitea: Откройте конфигурационный файл ./gitea/gitea/conf/app.ini и в секции [server] отредактируйте параметры:
    ROOT_URL = https://git.internal
    SSH_DOMAIN = git.internal
    
    Перезапустите Gitea для применения параметров:
    docker compose restart gitea
    

Шаг 5. Настройка рабочих мест (Клиенты Windows)

Чтобы компьютеры в домашней сети имели доступ к серверам по доменным именам и доверяли SSL-сертификату, выполните настройку на целевом ПК с Windows.

1. Сопоставление имен (Файл hosts)

Запустите Блокнот от имени администратора, откройте файл C:\Windows\System32\drivers\etc\hosts и добавьте в самый конец строку:

<IP_АДРЕС_ВАШЕГО_СЕРВЕРА>    cloud.internal git.internal

2. Принудительный импорт SSL-сертификата

Скопируйте файл local.crt с сервера на ПК с Windows. Откройте PowerShell от имени администратора в папке с файлом и выполните команду:

certutil -addstore -f "Root" local.crt
Это действие сделает сертификат доверенным на системном уровне. Браузеры перестанут показывать предупреждение «Небезопасно», а служба сетевых дисков Windows WebClient сможет безопасно передавать учетные данные.


Шаг 6. Запуск CI/CD конвейера (Gitea Actions)

  1. Зайдите в браузер на https://git.internal.
  2. Перейдите в правый верхний угол: Панель управления (Site Administration)Раннеры (Runners)Создать раннер (Create new runner).
  3. Скопируйте сгенерированный токен авторизации.
  4. Откройте docker-compose.yml на сервере и вставьте этот токен в переменную GITEA_RUNNER_REGISTRATION_TOKEN контейнера act-runner.
  5. Запустите раннер:
    docker compose up -d act-runner
    
  6. Убедитесь в успешном запуске, проверив логи:
    docker logs gitea-runner
    
    В админке Gitea статус раннера сменится на зеленый (активный).

Шаг 7. Подключение сетевого диска WebDAV без конфликтов

Если на вашем ПК используется рабочий WebDAV на стандартном порту 443, домашнее облако необходимо монтировать на выделенный порт 8443 (мы пробросили его на Шаге 1). Это разграничит сессии авторизации в Windows.

  1. Зайдите в Nextcloud через браузер: https://cloud.internal:8443.
  2. Откройте Личные настройкиБезопасность → в самом низу введите имя «Windows-PC» и нажмите Создать новый пароль приложения. Скопируйте временный токен.
  3. Откройте командную строку Windows (cmd) и выполните команду монтирования диска на букву Y::
    net use Y: https://cloud.internal:8443 /user:dessan ВАШ_ТОКЕН_ПРИЛОЖЕНИЯ /savecred
    
    (Примечание: порт :8443 добавлен в URL явно, чтобы избежать конфликта с корпоративным WebDAV на 443 порту).