esoe 4 weeks ago
parent
commit
8ac7b9056b
  1. 20
      README.md
  2. 11
      base/docker-compose.yaml
  3. 45
      moodle/SETUP.md
  4. 20
      moodle/clear.ps1
  5. 1
      moodle/distro/moodle
  6. 26
      moodle/docker-compose.yaml
  7. 73
      moodle/dockerfile
  8. 13
      moodle/foreground-apache2.sh
  9. 5
      moodle/init.ps1
  10. 13
      moodle/install.ps1
  11. 27
      moodle/run.ps1

20
README.md

@ -9,6 +9,8 @@ source - api для работы с СУБД
storage - api для работы с файловой системой storage - api для работы с файловой системой
auth - авторизация пользователей (для администрирования или просмотра результатов) auth - авторизация пользователей (для администрирования или просмотра результатов)
log - консолидированная работа с логами сервисов log - консолидированная работа с логами сервисов
proxy - nginx, для ограничения доступа к сервисам извне
cron - обновление данных moodle
### целевые: ### целевые:
quiz - прохождение теста/опроса quiz - прохождение теста/опроса
@ -16,6 +18,7 @@ learn - просмотр контента
admin - администрирование платформы admin - администрирование платформы
results - предоставление результатов results - предоставление результатов
moodle - moodle -
nginx -
## тома ## тома
exam-base exam-base
@ -25,3 +28,20 @@ exam-storage
## сети ## сети
exam-net exam-net
# useful links
## пример развертывания мудл в контейнере (moodle-postgres-apache)
[sample](https://github.com/nicusX/dockerised-moodledev/blob/master/README.md)
# cron
[review](https://habr.com/ru/companies/redmadrobot/articles/305364/)
## nginx
[setup reverce proxy](https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/)
[nginx in foregroun mode](https://www.uptimia.com/questions/how-to-run-nginx-in-the-foreground-within-a-docker-container)
## postgres
[setup postgres](https://habr.com/ru/articles/578744/)
Копируем скрипты для инициализации дополнительной базы данных для мудла:
COPY init.sql /docker-entrypoint-initdb.d/

11
base/docker-compose.yaml

@ -1,4 +1,4 @@
# version: "3.7" version: "3.7"
services: services:
exam-base: exam-base:
build: build:
@ -14,14 +14,15 @@ services:
volumes: volumes:
- exam-base:${PGDATA} - exam-base:${PGDATA}
- exam-prebase:/var/lib/postgresql/data - exam-prebase:/var/lib/postgresql/data
- ./scripts/init-database.sh:/docker-entrypoint-initdb.d/init-database.sh
ports: ports:
- "5430:5432" - "5430:5432"
restart: unless-stopped restart: unless-stopped
volumes: volumes:
exam-base: exam-base:
external: true external: true
exam-prebase: exam-prebase:
external: true external: true
networks: networks:
default: default:
name: exam-net name: exam-net

45
moodle/SETUP.md

@ -1,18 +1,54 @@
# Развертывание платформы
.\clear.ps1
.\init.ps1
.\run.ps1
.\install.ps1
после выполнения этих скриптов платформа развернута и готова к эксплуатации и подключению к ней сторонних сервисов
# порядок развертывания контйнера moodle
1. поднять контейнер
- скопировать скрипты настройки контейнера в контейнер
- дать разрешение на запуск скриптов
- установить необходимое для работы moodle ПО
- скачать moodle (чтобы не качать каждый раз можно попробовать копировать репозиторий)
- настроить доступ к файлам moodle (/var/www/html)
- настроить apache2
- запустить apache2
2. инициировать moodle (install-moodle.ps1)
3.
# получение дистрибутива # получение дистрибутива
из ветки MOODLE_405_STABLE
git clone -b MOODLE_405_STABLE git://git.moodle.org/moodle.git git clone -b MOODLE_405_STABLE git://git.moodle.org/moodle.git
из ветки main (последняя версия)
git clone git://git.moodle.org/moodle.git
# postgres # postgres
настроен в отдельном контейнере сервер настроен в отдельном контейнере платформы:
нужна база moodle - нужна база moodle
нужен пользователь moodle - нужен пользователь moodle
Требуется доставить postgresql-client, для обращения контейнера к внешней базе:
```
user# sudo apt-get install postgresql-client
```
# PHP # PHP
``` ```
user# sudo apt-get install php-fpm php-curl php-gd php-xmlrpc php-intl php-xml php-zip php-mbstring php-soap php-pgsql user# sudo apt-get install php-fpm php-curl php-gd php-xmlrpc php-intl php-xml php-zip php-mbstring php-soap php-pgsql
``` ```
# apache2
настраивается в контейнере moodle
# nginx # nginx
настраивается как внешний proxi для платформы
берем контейнер докера с предустановленым nginx, берем контейнер докера с предустановленым nginx,
доставляем php, доставляем php,
@ -20,3 +56,6 @@ user# sudo apt-get install php-fpm php-curl php-gd php-xmlrpc php-intl php-xml p
копируем файлы преднастроек nginx, moodle копируем файлы преднастроек nginx, moodle
монтируем том moodledata монтируем том moodledata
даем соответствующие права директориям даем соответствующие права директориям
# moodle
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q package

20
moodle/clear.ps1

@ -0,0 +1,20 @@
$container_name = "moodle"
$image_name = "moodle"
$build_name = "moodle"
$code_location = "C:\Users\devuser\Documents\code\exam\moodle"
# тома
$moodle_data = "moodle-data"
$moodle_html = "moodle-html"
# Остановить и удалить существующий контейнер
docker stop $container_name
docker rm $container_name
# Удалить существующий образ
docker rmi $image_name
# удалить тома
docker volume rm $moodle_data
docker volume rm $moodle_html
docker builder prune --force

1
moodle/distro/moodle

@ -0,0 +1 @@
Subproject commit 149a4779030de22fbe21bd70d35e1eea017d9ed4

26
moodle/docker-compose.yaml

@ -0,0 +1,26 @@
version: "3.7"
services:
moodle:
build:
context: ../moodle
dockerfile: dockerfile
tty: true
image: moodle
container_name: moodle
volumes:
- moodle-data:/var/moodledata
- moodle-html:/var/www/html
ports:
- "90:80"
- "9443:443"
restart: unless-stopped
volumes:
moodle-data:
external: true
moodle-html:
external: true
networks:
default:
name: exam-net
external: true
driver: bridge

73
moodle/dockerfile

@ -0,0 +1,73 @@
ARG VERSION=latest
FROM ubuntu:${VERSION}
# Сведения о контейнере
LABEL author="esoe"
LABEL description="moodle image for exam"
LABEL version="1.0"
# VOLUME ["/var/moodledata", "/var/www/html"]
# EXPOSE 80 443
# Let the container know that there is no tty
# ENV DEBIAN_FRONTEND noninteractive
# This should be overridden on running moodle container
ENV MOODLE_URL http://moodle:80
# ENV MOODLE_URL http://192.168.99.100:8080
COPY ./foreground-apache2.sh /etc/apache2/foreground.sh
# обновление пакетов
RUN apt-get update -y
RUN apt-get -u upgrade -y
# установка пакетов, необходимых для развертывания и работы moodle
RUN apt-get install pwgen -y
RUN apt-get install curl -y
RUN apt-get install git -y
RUN apt-get install unzip -y
RUN apt-get install vim -y
RUN apt-get install wget -y
RUN apt-get install postgresql-client -y
RUN apt-get install software-properties-common -y
# установка php 8.1
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install php8.1 -y
RUN apt-get install libapache2-mod-php8.1 -y
RUN apt-get install php8.1-fpm php8.1-curl php8.1-gd php8.1-xmlrpc php8.1-intl php8.1-xml php8.1-zip php8.1-mbstring php8.1-soap php8.1-pgsql -y
## настройка php
RUN echo "max_input_vars=5000" >> /etc/php/8.1/cli/php.ini
# установка apache2
RUN apt-get install apache2 -y
## дописываем в конец apache2.conf новый параметр
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN echo "max_input_vars=5000" >> /etc/php/8.1/apache2/php.ini
# подготовка пакета moodle
RUN echo "содержимое /var/www/html:"
## проверка содержимого /var/www/html
RUN ls --recursive /var/www/html
## очистить директорию /var/www/html перед скачиванием moodle
RUN rm -rf /var/www/html/*
## клонировать moodle
# RUN git clone -b MOODLE_405_STABLE https://git.in.moodle.com/moodle/moodle.git /var/www/html
COPY ./distro/moodle /var/www/html
## устанавливаем владельцем директории пользователя www-data
RUN chown -R www-data:www-data /var/www/html
# Enable SSL, moodle requires it
## if using proxy, don't need actually secure connection
RUN a2enmod ssl && a2ensite default-ssl
# запуск apache2
## право на исполнение скрипта запуска apache2
RUN chmod +x /etc/apache2/foreground.sh
## запуск apache2
CMD ["bash","/etc/apache2/foreground.sh"]
# далее:
# в ручную запускаем скрипт инсталяции moodle .\install

13
moodle/foreground-apache2.sh

@ -0,0 +1,13 @@
#!/bin/bash
# скрипт, используемый контейнером для запуска apache2 в фоновом режиме
echo "placeholder" > /var/moodledata/placeholder
chown -R www-data:www-data /var/moodledata
chmod 777 /var/moodledata
read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap "kill -TERM -$pgrp; exit" EXIT TERM KILL SIGKILL SIGTERM SIGQUIT
source /etc/apache2/envvars
tail -F /var/log/apache2/* &
exec apachectl -D FOREGROUND

5
moodle/init.ps1

@ -0,0 +1,5 @@
# инициализация томов
docker volume create moodle-data
docker volume create moodle-html
# .\run.ps1

13
moodle/install.ps1

@ -0,0 +1,13 @@
#!/bin/pwsh
# Set up Moodle in container
$adminUser = "admin"
$adminPassword = "admin"
$siteName = "exam"
$siteShort = "exam"
$lang = "ru"
docker exec -it -u www-data moodle /usr/bin/php /var/www/html/admin/cli/install_database.php --agree-license --adminuser=$adminUser --adminpass=$adminPassword --fullname=$siteName --shortname=$siteShort --lang=$lang
Write-Host "Admin account: $adminUser/$adminPassword"

27
moodle/run.ps1

@ -0,0 +1,27 @@
# Переменные
$container_name = "moodle"
$image_name = "moodle"
$build_name = "moodle"
$code_location = "C:\Users\devuser\Documents\code\exam\moodle"
# Остановить и удалить существующий контейнер
docker stop $container_name
docker rm $container_name
# Удалить существующий образ
docker rmi $image_name
# Перейти в каталог с проектом
Set-Location $code_location
# Собрать jar с помощью Maven
# mvn clean package
# Запустить контейнер с помощью docker-compose
docker-compose up -d
# Пауза скрипта
# Pause
# Запуск скрипта инсталяции moodle
# .\install.ps1
Loading…
Cancel
Save