Added Dockerfiles from seb-server-setup; first CI attempt
This commit is contained in:
parent
4ac8f15dca
commit
5e146e5af9
62 changed files with 4938 additions and 0 deletions
33
.github/workflows/build_docker_images.yml
vendored
Normal file
33
.github/workflows/build_docker_images.yml
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
file: ./docker/demo/Dockerfile
|
||||||
|
push: true
|
||||||
|
tags: bengig/seb-server:latest
|
||||||
|
-
|
||||||
|
name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
1
docker/.gitignore
vendored
Normal file
1
docker/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/test/
|
46
docker/demo/Dockerfile
Normal file
46
docker/demo/Dockerfile
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR=${SEBSERVER_VERSION}
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV JMX_PORT="9090"
|
||||||
|
ENV SERVER_PWD=
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/seb-server-"${SEBSERVER_JAR}".jar /sebserver
|
||||||
|
|
||||||
|
ENTRYPOINT exec java \
|
||||||
|
-Dcom.sun.management.jmxremote \
|
||||||
|
-Dcom.sun.management.jmxremote.port=9090 \
|
||||||
|
-Dcom.sun.management.jmxremote.rmi.port=9090 \
|
||||||
|
-Djava.rmi.server.hostname=localhost \
|
||||||
|
-Dcom.sun.management.jmxremote.local.only=false \
|
||||||
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Dcom.sun.management.jmxremote.authenticate=false \
|
||||||
|
-jar seb-server-"${SEBSERVER_JAR}".jar \
|
||||||
|
--server.port="${SERVER_PORT}" \
|
||||||
|
--spring.profiles.active=ws,gui,demo \
|
||||||
|
--spring.config.location=file:/sebserver/config/,classpath:/config/ \
|
||||||
|
--sebserver.mariadb.password="${SERVER_PWD}" \
|
||||||
|
--sebserver.password="${SERVER_PWD}"
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT $JMX_PORT
|
77
docker/demo/config/application-demo.properties
Normal file
77
docker/demo/config/application-demo.properties
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=DEBUG
|
||||||
|
# Log file name and location
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a SEB Server Demo Configuration
|
||||||
|
|
||||||
|
### webservice initialization
|
||||||
|
sebserver.init.adminaccount.gen-on-init=false
|
||||||
|
sebserver.init.organisation.name=
|
||||||
|
sebserver.init.adminaccount.username=
|
||||||
|
|
||||||
|
# database
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
spring.flyway.enabled=true
|
||||||
|
spring.flyway.locations=classpath:config/sql/base,classpath:config/sql/demo
|
||||||
|
spring.flyway.cleanDisabled=false
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
sebserver.webservice.clean-db-on-startup=true
|
||||||
|
|
||||||
|
# webservice configuration
|
||||||
|
sebserver.webservice.distributed=false
|
||||||
|
sebserver.webservice.http.external.scheme=http
|
||||||
|
sebserver.webservice.http.external.servername=ralph.ethz.ch
|
||||||
|
sebserver.webservice.http.external.port=${server.port}
|
||||||
|
sebserver.webservice.http.redirect.gui=${sebserver.gui.entrypoint}
|
||||||
|
sebserver.webservice.api.admin.clientId=guiClient
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=-1
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=86400
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||||
|
sebserver.webservice.lms.address.alias=lms.mockup.com=ralph.ethz.ch,edx.devstack.lms=ralph.ethz.ch
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI service configuration
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=${server.address}
|
||||||
|
sebserver.gui.webservice.port=8080
|
||||||
|
sebserver.gui.webservice.apipath=/admin-api/v1
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=MM / dd / yyyy
|
||||||
|
sebserver.gui.date.displayformat.time=HH:mm
|
||||||
|
sebserver.gui.date.displayformat.timezone=|ZZ
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SebExamSettings.seb
|
||||||
|
#sebserver.gui.defaultLogo=classpath:/static/images/ethz_logo_white.png
|
10
docker/demo/config/mariadb/config.cnf
Normal file
10
docker/demo/config/mariadb/config.cnf
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 64M
|
||||||
|
max_connect_errors = 1000
|
144
docker/demo/config/messages_de.properties
Normal file
144
docker/demo/config/messages_de.properties
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
################################
|
||||||
|
# Overall
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.overall.version=SEB Server Version : {0}
|
||||||
|
sebserver.overall.imprint=
|
||||||
|
sebserver.overall.imprint.markup=
|
||||||
|
sebserver.overall.about=
|
||||||
|
sebserver.overall.about.markup=
|
||||||
|
sebserver.overall.help=Dokumentation
|
||||||
|
sebserver.overall.help.link=https://www.safeexambrowser.org/news_de.html
|
||||||
|
|
||||||
|
sebserver.overall.message.leave.without.save=You are leaving this page without saved changes!\nThe unsaved changes will be lost.\Are you sure to leave the page?
|
||||||
|
sebserver.overall.upload=Bitte Ausw\u00E4hlen
|
||||||
|
sebserver.overall.action.modify.cancel=Abbrechen
|
||||||
|
sebserver.overall.action.modify.cancel.confirm=Nicht gespeicherte Daten gehen verloren. Wirklich abbrechen?
|
||||||
|
sebserver.overall.action.filter=Filtern
|
||||||
|
sebserver.overall.action.filter.clear=Filter Zur\u00FCcksetzen
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Form validation and messages
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.form.validation.error.title=Validierung
|
||||||
|
sebserver.form.validation.error.message=Einige Daten fehlen oder sind nicht korrekt.
|
||||||
|
sebserver.form.validation.fieldError.size=Der Text muss mindestens {3} und kann h\u00F6chstens {4} Zeichen beinhalten
|
||||||
|
sebserver.form.validation.fieldError.name=Name is mandatory and must have a size between {3} and {4} character
|
||||||
|
sebserver.form.validation.fieldError.urlSuffix=URL Suffix must have a size between {3} and {4} character
|
||||||
|
sebserver.form.validation.fieldError.notNull=Dies ist ein Pflichtfeld
|
||||||
|
sebserver.form.validation.fieldError.username.notunique=Dieser Username ist schon in Gebrauch. Bitte w\u00E4hlen Sie einen anderen.
|
||||||
|
sebserver.form.validation.fieldError.password.wrong=Das (aktuelle) Passwort stimmt nicht
|
||||||
|
sebserver.form.validation.fieldError.password.mismatch=Passwort, neues Passwort und Best\u00E4tigung stimmen nicht \u00FCberein
|
||||||
|
sebserver.error.unexpected=Unerwarteter Fehler
|
||||||
|
sebserver.page.message=Information
|
||||||
|
sebserver.dialog.confirm.title=Best\u00E4tigung
|
||||||
|
|
||||||
|
sebserver.dialog.confirm.deactivation=Es gibt {0} weitere Objekte die zu diesem Objeckt geh\u00F6ren.<br/>Diese werden bei einer Deaktivierung ebenfalls deaktiviert.<br/><br/>Sollen alle deaktiviert weden?
|
||||||
|
sebserver.dialog.confirm.deactivation.noDependencies=Soll dieses Object wirklich deaktiviert werden?
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Login Page
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.login.username=Benutzer Name
|
||||||
|
sebserver.login.pwd=Passwort
|
||||||
|
sebserver.login.login=Anmelden
|
||||||
|
sebserver.login.failed.title=Anmelden Fehlgeschlagen
|
||||||
|
sebserver.login.failed.message=Zugang verweigert: Falscher Benutzer Name oder Passwort
|
||||||
|
sebserver.logout=Abmelden
|
||||||
|
sebserver.logout.success.message=Sie wurden erfolgreich abgemeldet
|
||||||
|
sebserver.login.password.change=Information
|
||||||
|
sebserver.login.password.change.success=Das Passwort wurde erfoglreich ge\u00E4ndert. Bitte melden Sie sich mit dem neuen Passwort an.
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Main Page
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.logout=Abmelden
|
||||||
|
sebserver.mainpage.maximize.tooltip=Maximieren
|
||||||
|
sebserver.mainpage.minimize.tooltip=Minimieren
|
||||||
|
sebserver.activitiespane.title=Aktivit\u00E4ten
|
||||||
|
sebserver.actionpane.title=Aktionen
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Institution
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.institution.list.title=Institutionen
|
||||||
|
sebserver.institution.list.column.name=Name
|
||||||
|
sebserver.institution.list.column.urlSuffix=URL Suffix
|
||||||
|
sebserver.institution.list.column.active=Aktiv
|
||||||
|
|
||||||
|
sebserver.institution.action.list=Institution
|
||||||
|
sebserver.institution.action.form=Institution
|
||||||
|
sebserver.institution.action.new=Neue Institution
|
||||||
|
sebserver.institution.action.list.view=Ausgew\u00E4hlte Ansehen
|
||||||
|
sebserver.institution.action.modify=Institution Editieren
|
||||||
|
sebserver.institution.action.list.modify=Ausgew\u00E4hlte Editieren
|
||||||
|
sebserver.institution.action.save=Institution Speichern
|
||||||
|
sebserver.institution.action.activate=Aktiv
|
||||||
|
sebserver.institution.action.deactivate=Aktiv
|
||||||
|
sebserver.institution.action.delete=Institution L\u00F6schen
|
||||||
|
|
||||||
|
|
||||||
|
sebserver.institution.info.pleaseSelect=Bitte zuerst eine Instiiution aus der List ausw\u00E4hlen.
|
||||||
|
sebserver.institution.form.title.new=Neue Institution
|
||||||
|
sebserver.institution.form.title=Institution : {0}
|
||||||
|
|
||||||
|
sebserver.institution.form.name=Name
|
||||||
|
sebserver.institution.form.urlSuffix=URL Suffix
|
||||||
|
sebserver.institution.form.logoImage=Logo Bild
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# User Account
|
||||||
|
################################
|
||||||
|
|
||||||
|
sebserver.useraccount.role.SEB_SERVER_ADMIN=SEB Server Administrator
|
||||||
|
sebserver.useraccount.role.INSTITUTIONAL_ADMIN=Institution Administrator
|
||||||
|
sebserver.useraccount.role.EXAM_ADMIN=Examen Administrator
|
||||||
|
sebserver.useraccount.role.EXAM_SUPPORTER=Examen Supporter
|
||||||
|
|
||||||
|
sebserver.useraccount.list.title=Benutzer Konto
|
||||||
|
sebserver.useraccount.list.column.name=Name
|
||||||
|
sebserver.useraccount.list.column.username=Benutzer Name
|
||||||
|
sebserver.useraccount.list.column.email=E-Mail
|
||||||
|
sebserver.useraccount.list.column.language=Sprache
|
||||||
|
sebserver.useraccount.list.column.active=Aktiv
|
||||||
|
|
||||||
|
sebserver.useraccount.action.list=Benutzer Konto
|
||||||
|
sebserver.useraccount.action.form=Benutzer Konto
|
||||||
|
sebserver.useraccount.action.new=Neues Benutzer Konto
|
||||||
|
sebserver.useraccount.action.view=Ausgew\u00E4hlter Ansehen
|
||||||
|
sebserver.useraccount.action.list.modify=Ausgew\u00E4hlter Editieren
|
||||||
|
sebserver.useraccount.action.modify=Editieren
|
||||||
|
sebserver.useraccount.action.save=Benutzer Konto Speichern
|
||||||
|
sebserver.useraccount.action.activate=Aktiv
|
||||||
|
sebserver.useraccount.action.deactivate=Aktiv
|
||||||
|
sebserver.useraccount.action.delete=Benutzer Konto L\u00F6schen
|
||||||
|
sebserver.useraccount.action.change.password=Passwort Ändern
|
||||||
|
sebserver.useraccount.action.change.password.save=Passwort Speichern
|
||||||
|
|
||||||
|
sebserver.useraccount.info.pleaseSelect=Bitte zuerst ein Benutzer Konto aus der List ausw\u00E4hlen.
|
||||||
|
|
||||||
|
sebserver.useraccount.form.title=Benutzer Konto : {0}
|
||||||
|
sebserver.useraccount.form.title.new=Neues Benutzer Konto
|
||||||
|
sebserver.useraccount.form.institution=Institution
|
||||||
|
sebserver.useraccount.form.name=Name
|
||||||
|
sebserver.useraccount.form.username=Benutzer Name
|
||||||
|
sebserver.useraccount.form.mail=E-Mail
|
||||||
|
sebserver.useraccount.form.language=Sprache
|
||||||
|
sebserver.useraccount.form.timezone=Zeit Zone
|
||||||
|
sebserver.useraccount.form.roles=Benutzer Rollen
|
||||||
|
sebserver.useraccount.form.password=Passwort
|
||||||
|
sebserver.useraccount.form.password.confirm=Passwort Best\u00E4tigen
|
||||||
|
|
||||||
|
sebserver.useraccount.form.pwchange.title=Passwort \u00C4ndern : {0}
|
||||||
|
sebserver.useraccount.form.password.old=Altes Passwort
|
||||||
|
sebserver.useraccount.form.password.new=Neues Passwort
|
||||||
|
sebserver.useraccount.form.password.new.confirm=Neues Password Best\u00E4tigen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
6
docker/demo/config/messages_en.properties
Normal file
6
docker/demo/config/messages_en.properties
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
sebserver.overall.about=About
|
||||||
|
sebserver.overall.about.markup=<span style='font-family: Arial, Helvetica,sans-serif;font-size: 25px;font-weight: normal;font-style: normal;color: rgb(31, 64, 122);'>SEB Server About</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 18px;font-weight: bold;font-style: normal;'>1. Installation.</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 14px;font-weight: normal;font-style: normal;'>This is a SEB Server demo setup, ideal for testing or demonstrations.</span>
|
||||||
|
sebserver.overall.help=Documentation
|
||||||
|
sebserver.overall.help.link=https://seb-server.readthedocs.io/en/latest/index.html
|
||||||
|
|
||||||
|
sebserver.monitoring.exam.connection.action.disable=Mark as Canceled
|
44
docker/demo/docker-compose.yml
Normal file
44
docker/demo/docker-compose.yml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: somePW
|
||||||
|
volumes:
|
||||||
|
- seb-server-mariadb-data:/var/lib/mysql
|
||||||
|
- ./config/mariadb:/etc/mysql/conf.d
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
networks:
|
||||||
|
- ralph
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
- SEBSERVER_VERSION=1.0-latest
|
||||||
|
container_name: seb-server
|
||||||
|
environment:
|
||||||
|
- SERVER_PORT=8080
|
||||||
|
- SERVER_PWD=somePW
|
||||||
|
volumes:
|
||||||
|
- ./config:/sebserver/config
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
- 9090:9090
|
||||||
|
networks:
|
||||||
|
- ralph
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
ralph:
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-mariadb-data:
|
||||||
|
seb-server-logs:
|
2
docker/prod/bundled/basic/config/jmx/jmxremote.access
Normal file
2
docker/prod/bundled/basic/config/jmx/jmxremote.access
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
admin readwrite
|
||||||
|
user readonly
|
0
docker/prod/bundled/basic/config/jmx/jmxremote.password
Normal file
0
docker/prod/bundled/basic/config/jmx/jmxremote.password
Normal file
15
docker/prod/bundled/basic/config/mariadb/config.cnf
Normal file
15
docker/prod/bundled/basic/config/mariadb/config.cnf
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 256M
|
||||||
|
max_connect_errors = 1000000
|
||||||
|
|
||||||
|
skip_external_locking
|
||||||
|
|
||||||
|
#memory
|
||||||
|
innodb_buffer_pool_size=2G
|
14
docker/prod/bundled/basic/config/nginx/app.conf
Normal file
14
docker/prod/bundled/basic/config/nginx/app.conf
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
charset utf-8;
|
||||||
|
access_log off;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://seb-server:8080;
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=INFO
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
logging.config=/sebserver/config/spring/logback-prod.xml
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a basic bundled productive setup
|
||||||
|
|
||||||
|
# webservice database server connection
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
|
||||||
|
# data source configuration
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
spring.datasource.hikari.connectionTimeout=30000
|
||||||
|
spring.datasource.hikari.idleTimeout=600000
|
||||||
|
spring.datasource.hikari.maxLifetime=1800000
|
||||||
|
|
||||||
|
### webservice networking
|
||||||
|
sebserver.webservice.distributed=false
|
||||||
|
sebserver.webservice.http.external.scheme=https
|
||||||
|
sebserver.webservice.http.external.servername=
|
||||||
|
sebserver.webservice.http.external.port=
|
||||||
|
sebserver.webservice.http.redirect.gui=/gui
|
||||||
|
sebserver.http.client.connect-timeout=150000
|
||||||
|
sebserver.http.client.connection-request-timeout=100000
|
||||||
|
sebserver.http.client.read-timeout=200000
|
||||||
|
|
||||||
|
# webservice API
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=25200
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.exam.event-handling-strategy=ASYNC_BATCH_STORE_STRATEGY
|
||||||
|
sebserver.webservice.api.exam.enable-indicator-cache=true
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||||
|
|
||||||
|
management.server.port=${server.port}
|
||||||
|
management.endpoints.web.base-path=/management
|
||||||
|
management.endpoints.web.exposure.include=logfile,loggers
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI configuration
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/spring/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=localhost
|
||||||
|
sebserver.gui.webservice.port=8080
|
||||||
|
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||||
|
sebserver.gui.webservice.poll-interval=1000
|
||||||
|
sebserver.gui.webservice.mock-lms-enabled=true
|
||||||
|
sebserver.gui.webservice.edx-lms-enabled=true
|
||||||
|
sebserver.gui.webservice.moodle-lms-enabled=false
|
||||||
|
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
27
docker/prod/bundled/basic/config/spring/logback-prod.xml
Normal file
27
docker/prod/bundled/basic/config/spring/logback-prod.xml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="false">
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>log/sebserver.log</file>
|
||||||
|
<append>true</append>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<springProfile name="prod">
|
||||||
|
|
||||||
|
<root level="WARN" additivity="true">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
1476
docker/prod/bundled/basic/config/spring/messages_en.properties
Normal file
1476
docker/prod/bundled/basic/config/spring/messages_en.properties
Normal file
File diff suppressed because it is too large
Load diff
84
docker/prod/bundled/basic/docker-compose.yml
Normal file
84
docker/prod/bundled/basic/docker-compose.yml
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
seb-server-setup:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: setup.Dockerfile
|
||||||
|
container_name: seb-server-setup
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/config
|
||||||
|
- ./config:/host/config
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secret
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/etc/mysql/conf.d
|
||||||
|
- seb-server-mariadb:/var/lib/mysql
|
||||||
|
- ./config/mariadb/config.cnf:/etc/mysql/conf.d/config.cnf
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebserver.Dockerfile
|
||||||
|
args:
|
||||||
|
- SEBSERVER_VERSION=1.0-latest
|
||||||
|
container_name: seb-server
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- MONITORING_MODE=false
|
||||||
|
# - JMX_PORT=9090
|
||||||
|
# Connect this port to host if you want to use JMX (MONITORING_MODE=true)
|
||||||
|
#ports:
|
||||||
|
# - 9090:9090
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
reverse-proxy:
|
||||||
|
image: "nginx:latest"
|
||||||
|
container_name: seb-server-proxy
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/etc/nginx/conf.d
|
||||||
|
ports:
|
||||||
|
- 80:80
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
name: seb-server-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
name: seb-server-config
|
||||||
|
seb-server-mariadb:
|
||||||
|
name: seb-server-mariadb
|
||||||
|
seb-server-logs:
|
||||||
|
name: seb-server-logs
|
59
docker/prod/bundled/basic/sebserver.Dockerfile
Normal file
59
docker/prod/bundled/basic/sebserver.Dockerfile
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV JMX_PORT=
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"${SEBSERVER_JAR}" /sebserver
|
||||||
|
|
||||||
|
CMD if [ "x${JMX_PORT}" = "x" ] ; \
|
||||||
|
then secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
else secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-Dcom.sun.management.jmxremote \
|
||||||
|
-Dcom.sun.management.jmxremote.port=${JMX_PORT} \
|
||||||
|
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT} \
|
||||||
|
-Djava.rmi.server.hostname=localhost \
|
||||||
|
-Dcom.sun.management.jmxremote.local.only=false \
|
||||||
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Dcom.sun.management.jmxremote.authenticate=true \
|
||||||
|
-Dcom.sun.management.jmxremote.password.file=/sebserver/config/jmx/jmxremote.password \
|
||||||
|
-Dcom.sun.management.jmxremote.access.file=/sebserver/config/jmx/jmxremote.access \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT $JMX_PORT
|
6
docker/prod/bundled/basic/setup.Dockerfile
Normal file
6
docker/prod/bundled/basic/setup.Dockerfile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
CMD cp -a /host/config/. /config/ \
|
||||||
|
&& secret=$(cat /config/secret) \
|
||||||
|
&& rm /host/config/secret \
|
||||||
|
&& sudo chmod 777 /host/config/secret
|
2
docker/prod/bundled/tls/config/jmx/jmxremote.access
Normal file
2
docker/prod/bundled/tls/config/jmx/jmxremote.access
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
admin readwrite
|
||||||
|
user readonly
|
0
docker/prod/bundled/tls/config/jmx/jmxremote.password
Normal file
0
docker/prod/bundled/tls/config/jmx/jmxremote.password
Normal file
16
docker/prod/bundled/tls/config/mariadb/config.cnf
Normal file
16
docker/prod/bundled/tls/config/mariadb/config.cnf
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 256M
|
||||||
|
max_connect_errors = 1000000
|
||||||
|
|
||||||
|
skip_external_locking
|
||||||
|
skip_name_resolve
|
||||||
|
|
||||||
|
#memory
|
||||||
|
innodb_buffer_pool_size=2G
|
30
docker/prod/bundled/tls/config/nginx/app.conf
Normal file
30
docker/prod/bundled/tls/config/nginx/app.conf
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
charset utf-8;
|
||||||
|
access_log off;
|
||||||
|
keepalive_timeout 70;
|
||||||
|
|
||||||
|
server_name localhost;
|
||||||
|
ssl_certificate /sebserver/config/certs/localhost.crt;
|
||||||
|
ssl_certificate_key /sebserver/config/certs/localhost.key;
|
||||||
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://seb-server:8080;
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
20
docker/prod/bundled/tls/config/nginx/certs/localhost.crt
Normal file
20
docker/prod/bundled/tls/config/nginx/certs/localhost.crt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDXDCCAkSgAwIBAgIJAJYb2nNBXHKCMA0GCSqGSIb3DQEBCwUAMEMxCzAJBgNV
|
||||||
|
BAYTAkNIMQ8wDQYDVQQIDAZadXJpY2gxDzANBgNVBAcMBlp1cmljaDESMBAGA1UE
|
||||||
|
AwwJbG9jYWxob3N0MB4XDTIwMDQzMDEzMDI0OVoXDTIxMDQzMDEzMDI0OVowQzEL
|
||||||
|
MAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0GA1UEBwwGWnVyaWNoMRIw
|
||||||
|
EAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
|
AQDLwuUqViIl8RtzQoYiZ6vHM49UlhgrD51sziO1PuDIfZo7R3M3NFuCmwsOlXoH
|
||||||
|
vHagcFFpplG3br/akbMCiIbZaWCJiNluZy+b1eFNHmPo8KvCFhRZfAUtKbzku2zL
|
||||||
|
53O7/oMBUbhJILXC5is832K0qswh/QEmndySTO8sb4IZ3EZV4krQ7UlDgbvRruvL
|
||||||
|
PrqEn25jiuhe5SnrkmI4rlaClvgOJ18qq+L4op90fd0W2V11WV9AJLk7boqVtCwT
|
||||||
|
ee++SpVxS1W5EsCiZwKVrmrxUXPpC+Q67MNO+GJzW1xivcnz6fpOjoCRisudRtEb
|
||||||
|
/GRO2jLVr3KvmyftJMk02d5xAgMBAAGjUzBRMB0GA1UdDgQWBBQQmfmkV++5QA0r
|
||||||
|
uP7xbegL02qLkTAfBgNVHSMEGDAWgBQQmfmkV++5QA0ruP7xbegL02qLkTAPBgNV
|
||||||
|
HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC5nt2yexZjt0yaociBiveF
|
||||||
|
Y1ePyT3QVdDEzaAzMHNJxPA0DcsaJdViv/K8Ri9a7aZgjI7tGR93rTUSs8EgxoYQ
|
||||||
|
ZUn6Av4xwTHIAoGbIS24pd6wljkehB6G4xGK4D8R51AHqHPwlV9pe/9FhqnIwagr
|
||||||
|
RMXJurEiKf1EiX/4ryrs5hFzSauUGEhnq7HTGRygK1boN0LNqLx5G4vLtYzOCDuN
|
||||||
|
GnshMJJvXkQe6Fre1rFnVoBtcbhoEqkp3LLr3eHSiAf7gy4iXjzhGCw/LX0pbEqr
|
||||||
|
B0Zt+ouuTfga0Pvj3MNEWyI+3CWqXldB/RvonZxWXUhh6ONU2qzRYenewI8gDfIZ
|
||||||
|
-----END CERTIFICATE-----
|
28
docker/prod/bundled/tls/config/nginx/certs/localhost.key
Normal file
28
docker/prod/bundled/tls/config/nginx/certs/localhost.key
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLwuUqViIl8Rtz
|
||||||
|
QoYiZ6vHM49UlhgrD51sziO1PuDIfZo7R3M3NFuCmwsOlXoHvHagcFFpplG3br/a
|
||||||
|
kbMCiIbZaWCJiNluZy+b1eFNHmPo8KvCFhRZfAUtKbzku2zL53O7/oMBUbhJILXC
|
||||||
|
5is832K0qswh/QEmndySTO8sb4IZ3EZV4krQ7UlDgbvRruvLPrqEn25jiuhe5Snr
|
||||||
|
kmI4rlaClvgOJ18qq+L4op90fd0W2V11WV9AJLk7boqVtCwTee++SpVxS1W5EsCi
|
||||||
|
ZwKVrmrxUXPpC+Q67MNO+GJzW1xivcnz6fpOjoCRisudRtEb/GRO2jLVr3Kvmyft
|
||||||
|
JMk02d5xAgMBAAECggEALXh7rXv1OORaTNlel5TtB5Ig/S5VjF56sgo6e7rhbLxi
|
||||||
|
y7HBK2OavEWfLQz8Y3eSPXFzKZF9EOM9GyiCeyE+fov+iBKq+vE59ZvAIHaUsynq
|
||||||
|
GnDU77c2bIKw7ZZJzCMFd8FvOL8k0eTjyu+UXIw5OboXvcn5FMYLr/ZNNWxY6y4P
|
||||||
|
33fR63HUAQOglxkvzqfCYcWqiBr3fowQcKfeVjSveeTMEHMDq/EWcq1+xmGRs037
|
||||||
|
cWfLw8A2Vo6lN4CSJvXMJXzNgd3uKG4EI+nTzrO7WaH6KpxIkGkD/u50J868tR+C
|
||||||
|
TmQnQIvMkjGSiulGHHZhQ3v8zEXzSU3ramxnBM9O8QKBgQDszx7Z5Cioc1RK4dKt
|
||||||
|
qLhvbQYXQC3XF0WWOjuG6NTxA/cKejQ9fpLzu0UnRYsUfsyiahtB+umGsWxO1yAp
|
||||||
|
aVf25CYp2lTTvP3EDo9wzOfp9NBqiKSkTTmYvp7i9idGU4Tg8gYUQcG9F63L1M3X
|
||||||
|
6Xb8ZWylJoypegz2CeDWIh+RXQKBgQDcRikZYaGKsMgCxRVyxeHOFbml4Fk0wH+C
|
||||||
|
YsrOHMV29Ck/8t/Ajy8+42TmnrmCFsTK4OVG9L87CF9TNxBU8WBAG2YqmiQbH49i
|
||||||
|
UEaxBSfcmOqgPFGy62EQadUTn4f+HbZJKPyaeMhnKJseIIWy2i+a0Q6+0GX+Gke6
|
||||||
|
Qe6FWkeMJQKBgQDJ8ZcNmVRS0ob/lLRlA4zE+ORIz6JH2sCs69v3oHZ3UjpJ5QzH
|
||||||
|
pDkNQJYod1WzlK5Nks7L5X1gL819Lldu+TbahJVG+7l7F6AQoZoRR6w+B1f0gbJl
|
||||||
|
qrWDXIuCYQf9IRwf+ETW4XymFJtRR5iCl8WwV43fCJDLthl3d9UUxuTEwQKBgQDb
|
||||||
|
dRNRdFHLqeE70TtTRA96kW6K8wAtbHQdZWwE+elKYGwQiFugr4c0sr0+f3j3QNQE
|
||||||
|
BRipHwK/P9IpSDz/RBTPCf06CKRcWY8zNiOYDjjusXNg/XewOI5WGfruOAz3goaw
|
||||||
|
USOKizeuf2g8Fc7eqD6xkgOM3HghN/GqgjGvroiF+QKBgQDQZRljdl/dTi5GijFb
|
||||||
|
FJwDGEhTpDYEBKb9AwWa5xP0u7JoqCv+0eP8/9eLmjzgawKTjtPHVMaeBmzMeW4O
|
||||||
|
E+x4114yQthVTs1e8TnoprkapEQNlvDGxJsYycJ4ADrrgOzA+HeddUj9GrWEfd8f
|
||||||
|
t7TrY/khzS4yDWvTFYG5wag+5Q==
|
||||||
|
-----END PRIVATE KEY-----
|
|
@ -0,0 +1,79 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=INFO
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
logging.config=/sebserver/config/spring/logback-prod.xml
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a basic bundled productive setup
|
||||||
|
|
||||||
|
# webservice database server connection
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
|
||||||
|
# data source configuration
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
spring.datasource.hikari.connectionTimeout=30000
|
||||||
|
spring.datasource.hikari.idleTimeout=600000
|
||||||
|
spring.datasource.hikari.maxLifetime=1800000
|
||||||
|
|
||||||
|
### webservice networking
|
||||||
|
sebserver.webservice.distributed=false
|
||||||
|
sebserver.webservice.http.external.scheme=https
|
||||||
|
sebserver.webservice.http.external.servername=
|
||||||
|
sebserver.webservice.http.external.port=
|
||||||
|
sebserver.webservice.http.redirect.gui=/gui
|
||||||
|
sebserver.http.client.connect-timeout=150000
|
||||||
|
sebserver.http.client.connection-request-timeout=100000
|
||||||
|
sebserver.http.client.read-timeout=200000
|
||||||
|
|
||||||
|
# webservice API
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=25200
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.exam.event-handling-strategy=ASYNC_BATCH_STORE_STRATEGY
|
||||||
|
sebserver.webservice.api.exam.enable-indicator-cache=true
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI configuration
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/spring/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=localhost
|
||||||
|
sebserver.gui.webservice.port=8080
|
||||||
|
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||||
|
sebserver.gui.webservice.poll-interval=1000
|
||||||
|
sebserver.gui.webservice.mock-lms-enabled=true
|
||||||
|
sebserver.gui.webservice.edx-lms-enabled=true
|
||||||
|
sebserver.gui.webservice.moodle-lms-enabled=false
|
||||||
|
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
27
docker/prod/bundled/tls/config/spring/logback-prod.xml
Normal file
27
docker/prod/bundled/tls/config/spring/logback-prod.xml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="false">
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>log/sebserver.log</file>
|
||||||
|
<append>true</append>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<springProfile name="prod">
|
||||||
|
|
||||||
|
<root level="WARN" additivity="true">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
1476
docker/prod/bundled/tls/config/spring/messages_en.properties
Normal file
1476
docker/prod/bundled/tls/config/spring/messages_en.properties
Normal file
File diff suppressed because it is too large
Load diff
83
docker/prod/bundled/tls/docker-compose.yml
Normal file
83
docker/prod/bundled/tls/docker-compose.yml
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
seb-server-setup:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: setup.Dockerfile
|
||||||
|
container_name: seb-server-setup
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/config
|
||||||
|
- ./config:/host/config
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secret
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/etc/mysql/conf.d
|
||||||
|
- seb-server-mariadb:/var/lib/mysql
|
||||||
|
- ./config/mariadb/config.cnf:/etc/mysql/conf.d/config.cnf
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebserver.Dockerfile
|
||||||
|
args:
|
||||||
|
- SEBSERVER_VERSION=1.0.0
|
||||||
|
container_name: seb-server
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- MONITORING_MODE=false
|
||||||
|
# - JMX_PORT=9090
|
||||||
|
# Connect this port to host if you want to use JMX (MONITORING_MODE=true)
|
||||||
|
#ports:
|
||||||
|
# - 9090:9090
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
reverse-proxy:
|
||||||
|
image: "nginx:latest"
|
||||||
|
container_name: seb-server-proxy
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/etc/nginx/conf.d
|
||||||
|
- ./config/nginx/certs:/sebserver/config/certs
|
||||||
|
ports:
|
||||||
|
- 443:443
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
name: seb-server-network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
name: seb-server-config
|
||||||
|
seb-server-mariadb:
|
||||||
|
name: seb-server-mariadb
|
||||||
|
seb-server-logs:
|
||||||
|
name: seb-server-logs
|
59
docker/prod/bundled/tls/sebserver.Dockerfile
Normal file
59
docker/prod/bundled/tls/sebserver.Dockerfile
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV JMX_PORT=
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"${SEBSERVER_JAR}" /sebserver
|
||||||
|
|
||||||
|
CMD if [ "x${JMX_PORT}" = "x" ] ; \
|
||||||
|
then secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
else secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-Dcom.sun.management.jmxremote \
|
||||||
|
-Dcom.sun.management.jmxremote.port=${JMX_PORT} \
|
||||||
|
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT} \
|
||||||
|
-Djava.rmi.server.hostname=localhost \
|
||||||
|
-Dcom.sun.management.jmxremote.local.only=false \
|
||||||
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Dcom.sun.management.jmxremote.authenticate=true \
|
||||||
|
-Dcom.sun.management.jmxremote.password.file=/sebserver/config/jmx/jmxremote.password \
|
||||||
|
-Dcom.sun.management.jmxremote.access.file=/sebserver/config/jmx/jmxremote.access \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT $JMX_PORT
|
6
docker/prod/bundled/tls/setup.Dockerfile
Normal file
6
docker/prod/bundled/tls/setup.Dockerfile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
CMD cp -a /host/config/. /config/ \
|
||||||
|
&& secret=$(cat /config/secret) \
|
||||||
|
&& rm /host/config/secret \
|
||||||
|
&& sudo chmod 777 /host/config/secret
|
2
docker/testing/basic/config/jmx/jmxremote.access
Normal file
2
docker/testing/basic/config/jmx/jmxremote.access
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
admin readwrite
|
||||||
|
user readonly
|
0
docker/testing/basic/config/jmx/jmxremote.password
Normal file
0
docker/testing/basic/config/jmx/jmxremote.password
Normal file
15
docker/testing/basic/config/mariadb/config.cnf
Normal file
15
docker/testing/basic/config/mariadb/config.cnf
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 256M
|
||||||
|
max_connect_errors = 1000000
|
||||||
|
|
||||||
|
skip_external_locking
|
||||||
|
|
||||||
|
#memory
|
||||||
|
innodb_buffer_pool_size=1G
|
14
docker/testing/basic/config/nginx/app.conf
Normal file
14
docker/testing/basic/config/nginx/app.conf
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
charset utf-8;
|
||||||
|
access_log off;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://seb-server:8080;
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ch=DEBUG
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a staging/testing setup with no encryption
|
||||||
|
|
||||||
|
# webservice database server connection
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
|
||||||
|
# data source configuration
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
spring.datasource.hikari.connectionTimeout=30000
|
||||||
|
spring.datasource.hikari.idleTimeout=600000
|
||||||
|
spring.datasource.hikari.maxLifetime=1800000
|
||||||
|
|
||||||
|
### webservice networking
|
||||||
|
sebserver.webservice.distributed=false
|
||||||
|
sebserver.webservice.http.external.scheme=http
|
||||||
|
sebserver.webservice.http.external.servername=
|
||||||
|
sebserver.webservice.http.external.port=
|
||||||
|
sebserver.webservice.http.redirect.gui=/gui
|
||||||
|
|
||||||
|
# webservice API
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=25200
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.exam.event-handling-strategy=ASYNC_BATCH_STORE_STRATEGY
|
||||||
|
sebserver.webservice.api.exam.enable-indicator-cache=true
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI configuration
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/spring/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=localhost
|
||||||
|
sebserver.gui.webservice.port=8080
|
||||||
|
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||||
|
sebserver.gui.webservice.poll-interval=1000
|
||||||
|
sebserver.gui.webservice.mock-lms-enabled=true
|
||||||
|
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
8
docker/testing/basic/config/spring/messages.properties
Normal file
8
docker/testing/basic/config/spring/messages.properties
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
sebserver.overall.imprint=
|
||||||
|
sebserver.overall.imprint.markup=
|
||||||
|
sebserver.overall.about=About
|
||||||
|
sebserver.overall.about.markup=<span style='font-family: Arial, Helvetica,sans-serif;font-size: 25px;font-weight: normal;font-style: normal;color: rgb(31, 64, 122);'>SEB Server About Example</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 18px;font-weight: bold;font-style: normal;'>1. This is an example of how an About-Page can look like.</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 14px;font-weight: normal;font-style: normal;'>By simply define the markup HTML content within the messages.propertie configuration of specified language</span>
|
||||||
|
sebserver.overall.help=Documentation
|
||||||
|
sebserver.overall.help.link=https://seb-server.readthedocs.io/en/latest/index.html
|
||||||
|
|
||||||
|
sebserver.monitoring.exam.connection.action.disable=Mark as Canceled
|
76
docker/testing/basic/docker-compose.yml
Normal file
76
docker/testing/basic/docker-compose.yml
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
seb-server-setup:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: setup.Dockerfile
|
||||||
|
container_name: seb-server-setup
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/config
|
||||||
|
- ./config:/host/config
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secret
|
||||||
|
# workaround: https://github.com/docker-library/mariadb/issues/262
|
||||||
|
# TODO this seems to be fixed now... try to remove and test
|
||||||
|
- MYSQL_INITDB_SKIP_TZINFO=1
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/etc/mysql/conf.d
|
||||||
|
- seb-server-mariadb:/var/lib/mysql
|
||||||
|
- ./config/mariadb/config.cnf:/etc/mysql/conf.d/config.cnf
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebserver.Dockerfile
|
||||||
|
args:
|
||||||
|
- SEBSERVER_VERSION=1.0-latest
|
||||||
|
container_name: seb-server
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
environment:
|
||||||
|
- JMX_PORT=9090
|
||||||
|
ports:
|
||||||
|
- 9090:9090
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
reverse-proxy:
|
||||||
|
image: "nginx:latest"
|
||||||
|
container_name: seb-server-proxy
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/etc/nginx/conf.d
|
||||||
|
ports:
|
||||||
|
- 80:80
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server"
|
||||||
|
- "seb-server-setup"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
seb-server-mariadb:
|
59
docker/testing/basic/sebserver.Dockerfile
Normal file
59
docker/testing/basic/sebserver.Dockerfile
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV JMX_PORT=
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"${SEBSERVER_JAR}" /sebserver
|
||||||
|
|
||||||
|
CMD if [ "x${JMX_PORT}" = "x" ] ; \
|
||||||
|
then secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
else secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-Dcom.sun.management.jmxremote \
|
||||||
|
-Dcom.sun.management.jmxremote.port=${JMX_PORT} \
|
||||||
|
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT} \
|
||||||
|
-Djava.rmi.server.hostname=localhost \
|
||||||
|
-Dcom.sun.management.jmxremote.local.only=false \
|
||||||
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Dcom.sun.management.jmxremote.authenticate=true \
|
||||||
|
-Dcom.sun.management.jmxremote.password.file=/sebserver/config/jmx/jmxremote.password \
|
||||||
|
-Dcom.sun.management.jmxremote.access.file=/sebserver/config/jmx/jmxremote.access \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,gui,prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT $JMX_PORT
|
6
docker/testing/basic/setup.Dockerfile
Normal file
6
docker/testing/basic/setup.Dockerfile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
CMD cp -a /host/config/. /config/ \
|
||||||
|
&& secret=$(cat /config/secret) \
|
||||||
|
&& rm /host/config/secret \
|
||||||
|
&& sudo chmod 777 /host/config/secret
|
26
docker/testing/distributed/db/docker-compose.yml
Normal file
26
docker/testing/distributed/db/docker-compose.yml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=somePW
|
||||||
|
# workaround: https://github.com/docker-library/mariadb/issues/262
|
||||||
|
# TODO this seems to be fixed now... try to remove and test
|
||||||
|
- MYSQL_INITDB_SKIP_TZINFO=1
|
||||||
|
volumes:
|
||||||
|
- mariadb-data:/var/lib/mysql
|
||||||
|
- ./mariadb:/etc/mysql/conf.d
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mariadb-data:
|
||||||
|
name: seb-server-data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
name: seb-server-network
|
10
docker/testing/distributed/db/mariadb/config.cnf
Normal file
10
docker/testing/distributed/db/mariadb/config.cnf
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 64M
|
||||||
|
max_connect_errors = 1000
|
|
@ -0,0 +1,44 @@
|
||||||
|
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=DEBUG
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
logging.config=/sebserver/config/spring/logback-prod.xml
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI configuration
|
||||||
|
sebserver.gui.http.external.scheme=TO-SET
|
||||||
|
sebserver.gui.http.external.servername=TO-SET
|
||||||
|
sebserver.gui.http.external.port=TO-SET
|
||||||
|
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/spring/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=seb-server-proxy
|
||||||
|
sebserver.gui.webservice.port=80
|
||||||
|
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||||
|
sebserver.gui.webservice.poll-interval=1000
|
||||||
|
sebserver.gui.webservice.mock-lms-enabled=true
|
||||||
|
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="false">
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>log/sebserver.log</file>
|
||||||
|
<append>true</append>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<springProfile name="prod">
|
||||||
|
|
||||||
|
<root level="DEBUG" additivity="true">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
|
@ -0,0 +1,8 @@
|
||||||
|
sebserver.overall.imprint=
|
||||||
|
sebserver.overall.imprint.markup=
|
||||||
|
sebserver.overall.about=About
|
||||||
|
sebserver.overall.about.markup=<span style='font-family: Arial, Helvetica,sans-serif;font-size: 25px;font-weight: normal;font-style: normal;color: rgb(31, 64, 122);'>SEB Server About Example</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 18px;font-weight: bold;font-style: normal;'>1. This is an example of how an About-Page can look like.</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 14px;font-weight: normal;font-style: normal;'>By simply define the markup HTML content within the messages.propertie configuration of specified language</span>
|
||||||
|
sebserver.overall.help=Documentation
|
||||||
|
sebserver.overall.help.link=https://seb-server.readthedocs.io/en/latest/index.html
|
||||||
|
|
||||||
|
sebserver.monitoring.exam.connection.action.disable=Mark as Canceled
|
36
docker/testing/distributed/guiservice/docker-compose.yml
Normal file
36
docker/testing/distributed/guiservice/docker-compose.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
seb-guiservice:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebguiservice.Dockerfile
|
||||||
|
args:
|
||||||
|
- GIT_TAG=development
|
||||||
|
- SEBSERVER_VERSION=1.0.1
|
||||||
|
container_name: seb-guiservice
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- SECRET=somePW
|
||||||
|
ports:
|
||||||
|
- 80:8080
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
seb-server-logs:
|
||||||
|
name: seb-guiservice-logs
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
name: seb-server-network
|
|
@ -0,0 +1,37 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV SECRET=somePW
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"${SEBSERVER_JAR}" /sebserver
|
||||||
|
|
||||||
|
CMD exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=gui,prod,prod-gui \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.password="${SECRET}" ;
|
||||||
|
|
||||||
|
EXPOSE 8080
|
21
docker/testing/distributed/webservice/config/nginx/app.conf
Normal file
21
docker/testing/distributed/webservice/config/nginx/app.conf
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
upstream backend {
|
||||||
|
ip_hash;
|
||||||
|
server seb-webservice1:8080;
|
||||||
|
server seb-webservice2:8080;
|
||||||
|
server seb-webservice3:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
charset utf-8;
|
||||||
|
access_log off;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://backend;
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=DEBUG
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
logging.config=/sebserver/config/spring/logback-prod.xml
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a basic single-webservice productive setup
|
||||||
|
|
||||||
|
# webservice database server connection
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
|
||||||
|
# data source configuration
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
spring.datasource.hikari.connectionTimeout=30000
|
||||||
|
spring.datasource.hikari.idleTimeout=600000
|
||||||
|
spring.datasource.hikari.maxLifetime=1800000
|
||||||
|
|
||||||
|
### webservice networking
|
||||||
|
sebserver.webservice.distributed=true
|
||||||
|
sebserver.webservice.http.external.scheme=http
|
||||||
|
sebserver.webservice.http.external.servername=localhost
|
||||||
|
sebserver.webservice.http.external.port=8080
|
||||||
|
sebserver.webservice.http.redirect.gui=/gui
|
||||||
|
|
||||||
|
# webservice API
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=25200
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.exam.event-handling-strategy=ASYNC_BATCH_STORE_STRATEGY
|
||||||
|
sebserver.webservice.api.exam.enable-indicator-cache=true
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="false">
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>log/sebserver.log</file>
|
||||||
|
<append>true</append>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread]:[%logger] %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<springProfile name="prod">
|
||||||
|
|
||||||
|
<root level="DEBUG" additivity="true">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
93
docker/testing/distributed/webservice/docker-compose.yml
Normal file
93
docker/testing/distributed/webservice/docker-compose.yml
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
seb-webservice1:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebwebservice.Dockerfile
|
||||||
|
args:
|
||||||
|
- GIT_TAG=development
|
||||||
|
- SEBSERVER_VERSION=1.0.1
|
||||||
|
container_name: seb-webservice1
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- SECRET=somePW
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-webservice2:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebwebservice.Dockerfile
|
||||||
|
args:
|
||||||
|
- GIT_TAG=development
|
||||||
|
- SEBSERVER_VERSION=1.0.1
|
||||||
|
container_name: seb-webservice2
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- SECRET=somePW
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-webservice3:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebwebservice.Dockerfile
|
||||||
|
args:
|
||||||
|
- GIT_TAG=development
|
||||||
|
- SEBSERVER_VERSION=1.0.1
|
||||||
|
container_name: seb-webservice3
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- SECRET=somePW
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
mode: "non-blocking"
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
reverse-proxy:
|
||||||
|
image: "nginx:latest"
|
||||||
|
container_name: seb-server-proxy
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/etc/nginx/conf.d
|
||||||
|
ports:
|
||||||
|
- 8081:80
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
seb-server-logs:
|
||||||
|
name: seb-webservice-logs
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
name: seb-server-network
|
|
@ -0,0 +1,38 @@
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests -Dbuild-version="${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV SECRET=somePW
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"${SEBSERVER_JAR}" /sebserver
|
||||||
|
|
||||||
|
CMD exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=ws,prod,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.mariadb.password="${SECRET}" \
|
||||||
|
--sebserver.password="${SECRET}" ;
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT
|
2
docker/testing/tls/config/jmx/jmxremote.access
Normal file
2
docker/testing/tls/config/jmx/jmxremote.access
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
admin readwrite
|
||||||
|
user readonly
|
0
docker/testing/tls/config/jmx/jmxremote.password
Normal file
0
docker/testing/tls/config/jmx/jmxremote.password
Normal file
16
docker/testing/tls/config/mariadb/config.cnf
Normal file
16
docker/testing/tls/config/mariadb/config.cnf
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[mysqld]
|
||||||
|
# Disabling symbolic-links is recommended to prevent assorted security risks
|
||||||
|
symbolic-links=0
|
||||||
|
|
||||||
|
# network
|
||||||
|
connect_timeout = 61
|
||||||
|
wait_timeout = 28800
|
||||||
|
max_connections = 100000
|
||||||
|
max_allowed_packet = 256M
|
||||||
|
max_connect_errors = 1000000
|
||||||
|
|
||||||
|
skip_external_locking
|
||||||
|
skip_name_resolve
|
||||||
|
|
||||||
|
#memory
|
||||||
|
innodb_buffer_pool_size=2G
|
25
docker/testing/tls/config/nginx/app.conf
Normal file
25
docker/testing/tls/config/nginx/app.conf
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
charset utf-8;
|
||||||
|
access_log off;
|
||||||
|
keepalive_timeout 70;
|
||||||
|
|
||||||
|
server_name localhost;
|
||||||
|
ssl_certificate /sebserver/config/certs/localhost.crt;
|
||||||
|
ssl_certificate_key /sebserver/config/certs/localhost.key;
|
||||||
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://seb-server:8080;
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
20
docker/testing/tls/config/nginx/certs/localhost.crt
Normal file
20
docker/testing/tls/config/nginx/certs/localhost.crt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDXDCCAkSgAwIBAgIJAJYb2nNBXHKCMA0GCSqGSIb3DQEBCwUAMEMxCzAJBgNV
|
||||||
|
BAYTAkNIMQ8wDQYDVQQIDAZadXJpY2gxDzANBgNVBAcMBlp1cmljaDESMBAGA1UE
|
||||||
|
AwwJbG9jYWxob3N0MB4XDTIwMDQzMDEzMDI0OVoXDTIxMDQzMDEzMDI0OVowQzEL
|
||||||
|
MAkGA1UEBhMCQ0gxDzANBgNVBAgMBlp1cmljaDEPMA0GA1UEBwwGWnVyaWNoMRIw
|
||||||
|
EAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
|
AQDLwuUqViIl8RtzQoYiZ6vHM49UlhgrD51sziO1PuDIfZo7R3M3NFuCmwsOlXoH
|
||||||
|
vHagcFFpplG3br/akbMCiIbZaWCJiNluZy+b1eFNHmPo8KvCFhRZfAUtKbzku2zL
|
||||||
|
53O7/oMBUbhJILXC5is832K0qswh/QEmndySTO8sb4IZ3EZV4krQ7UlDgbvRruvL
|
||||||
|
PrqEn25jiuhe5SnrkmI4rlaClvgOJ18qq+L4op90fd0W2V11WV9AJLk7boqVtCwT
|
||||||
|
ee++SpVxS1W5EsCiZwKVrmrxUXPpC+Q67MNO+GJzW1xivcnz6fpOjoCRisudRtEb
|
||||||
|
/GRO2jLVr3KvmyftJMk02d5xAgMBAAGjUzBRMB0GA1UdDgQWBBQQmfmkV++5QA0r
|
||||||
|
uP7xbegL02qLkTAfBgNVHSMEGDAWgBQQmfmkV++5QA0ruP7xbegL02qLkTAPBgNV
|
||||||
|
HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC5nt2yexZjt0yaociBiveF
|
||||||
|
Y1ePyT3QVdDEzaAzMHNJxPA0DcsaJdViv/K8Ri9a7aZgjI7tGR93rTUSs8EgxoYQ
|
||||||
|
ZUn6Av4xwTHIAoGbIS24pd6wljkehB6G4xGK4D8R51AHqHPwlV9pe/9FhqnIwagr
|
||||||
|
RMXJurEiKf1EiX/4ryrs5hFzSauUGEhnq7HTGRygK1boN0LNqLx5G4vLtYzOCDuN
|
||||||
|
GnshMJJvXkQe6Fre1rFnVoBtcbhoEqkp3LLr3eHSiAf7gy4iXjzhGCw/LX0pbEqr
|
||||||
|
B0Zt+ouuTfga0Pvj3MNEWyI+3CWqXldB/RvonZxWXUhh6ONU2qzRYenewI8gDfIZ
|
||||||
|
-----END CERTIFICATE-----
|
28
docker/testing/tls/config/nginx/certs/localhost.key
Normal file
28
docker/testing/tls/config/nginx/certs/localhost.key
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLwuUqViIl8Rtz
|
||||||
|
QoYiZ6vHM49UlhgrD51sziO1PuDIfZo7R3M3NFuCmwsOlXoHvHagcFFpplG3br/a
|
||||||
|
kbMCiIbZaWCJiNluZy+b1eFNHmPo8KvCFhRZfAUtKbzku2zL53O7/oMBUbhJILXC
|
||||||
|
5is832K0qswh/QEmndySTO8sb4IZ3EZV4krQ7UlDgbvRruvLPrqEn25jiuhe5Snr
|
||||||
|
kmI4rlaClvgOJ18qq+L4op90fd0W2V11WV9AJLk7boqVtCwTee++SpVxS1W5EsCi
|
||||||
|
ZwKVrmrxUXPpC+Q67MNO+GJzW1xivcnz6fpOjoCRisudRtEb/GRO2jLVr3Kvmyft
|
||||||
|
JMk02d5xAgMBAAECggEALXh7rXv1OORaTNlel5TtB5Ig/S5VjF56sgo6e7rhbLxi
|
||||||
|
y7HBK2OavEWfLQz8Y3eSPXFzKZF9EOM9GyiCeyE+fov+iBKq+vE59ZvAIHaUsynq
|
||||||
|
GnDU77c2bIKw7ZZJzCMFd8FvOL8k0eTjyu+UXIw5OboXvcn5FMYLr/ZNNWxY6y4P
|
||||||
|
33fR63HUAQOglxkvzqfCYcWqiBr3fowQcKfeVjSveeTMEHMDq/EWcq1+xmGRs037
|
||||||
|
cWfLw8A2Vo6lN4CSJvXMJXzNgd3uKG4EI+nTzrO7WaH6KpxIkGkD/u50J868tR+C
|
||||||
|
TmQnQIvMkjGSiulGHHZhQ3v8zEXzSU3ramxnBM9O8QKBgQDszx7Z5Cioc1RK4dKt
|
||||||
|
qLhvbQYXQC3XF0WWOjuG6NTxA/cKejQ9fpLzu0UnRYsUfsyiahtB+umGsWxO1yAp
|
||||||
|
aVf25CYp2lTTvP3EDo9wzOfp9NBqiKSkTTmYvp7i9idGU4Tg8gYUQcG9F63L1M3X
|
||||||
|
6Xb8ZWylJoypegz2CeDWIh+RXQKBgQDcRikZYaGKsMgCxRVyxeHOFbml4Fk0wH+C
|
||||||
|
YsrOHMV29Ck/8t/Ajy8+42TmnrmCFsTK4OVG9L87CF9TNxBU8WBAG2YqmiQbH49i
|
||||||
|
UEaxBSfcmOqgPFGy62EQadUTn4f+HbZJKPyaeMhnKJseIIWy2i+a0Q6+0GX+Gke6
|
||||||
|
Qe6FWkeMJQKBgQDJ8ZcNmVRS0ob/lLRlA4zE+ORIz6JH2sCs69v3oHZ3UjpJ5QzH
|
||||||
|
pDkNQJYod1WzlK5Nks7L5X1gL819Lldu+TbahJVG+7l7F6AQoZoRR6w+B1f0gbJl
|
||||||
|
qrWDXIuCYQf9IRwf+ETW4XymFJtRR5iCl8WwV43fCJDLthl3d9UUxuTEwQKBgQDb
|
||||||
|
dRNRdFHLqeE70TtTRA96kW6K8wAtbHQdZWwE+elKYGwQiFugr4c0sr0+f3j3QNQE
|
||||||
|
BRipHwK/P9IpSDz/RBTPCf06CKRcWY8zNiOYDjjusXNg/XewOI5WGfruOAz3goaw
|
||||||
|
USOKizeuf2g8Fc7eqD6xkgOM3HghN/GqgjGvroiF+QKBgQDQZRljdl/dTi5GijFb
|
||||||
|
FJwDGEhTpDYEBKb9AwWa5xP0u7JoqCv+0eP8/9eLmjzgawKTjtPHVMaeBmzMeW4O
|
||||||
|
E+x4114yQthVTs1e8TnoprkapEQNlvDGxJsYycJ4ADrrgOzA+HeddUj9GrWEfd8f
|
||||||
|
t7TrY/khzS4yDWvTFYG5wag+5Q==
|
||||||
|
-----END PRIVATE KEY-----
|
73
docker/testing/tls/config/spring/application-prod.properties
Normal file
73
docker/testing/tls/config/spring/application-prod.properties
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
##########################################################
|
||||||
|
### Global Server Settings
|
||||||
|
|
||||||
|
# Server address (set for docker internal)
|
||||||
|
server.address=0.0.0.0
|
||||||
|
# Server http port
|
||||||
|
server.port=8080
|
||||||
|
# The servlet context path
|
||||||
|
server.servlet.context-path=/
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# Default logging level in the form "logging.level" + namespace=LEVEL
|
||||||
|
logging.level.ROOT=WARN
|
||||||
|
logging.level.ch=INFO
|
||||||
|
logging.file=/sebserver/log/sebserver.log
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server Webservice configuration
|
||||||
|
|
||||||
|
sebserver.test.property=This is a basic bundled productive setup
|
||||||
|
|
||||||
|
# webservice database server connection
|
||||||
|
datastore.mariadb.server.address=seb-server-mariadb
|
||||||
|
datastore.mariadb.server.port=3306
|
||||||
|
|
||||||
|
# data source configuration
|
||||||
|
spring.datasource.hikari.initializationFailTimeout=30000
|
||||||
|
spring.datasource.hikari.connectionTimeout=30000
|
||||||
|
spring.datasource.hikari.idleTimeout=600000
|
||||||
|
spring.datasource.hikari.maxLifetime=1800000
|
||||||
|
|
||||||
|
### webservice networking
|
||||||
|
sebserver.webservice.distributed=false
|
||||||
|
sebserver.webservice.http.external.scheme=http
|
||||||
|
sebserver.webservice.http.external.servername=
|
||||||
|
sebserver.webservice.http.external.port=
|
||||||
|
sebserver.webservice.http.redirect.gui=/gui
|
||||||
|
|
||||||
|
# webservice API
|
||||||
|
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||||
|
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.admin.refreshTokenValiditySeconds=25200
|
||||||
|
sebserver.webservice.api.exam.config.init.permittedProcesses=config/initialPermittedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.config.init.prohibitedProcesses=config/initialProhibitedProcesses.xml
|
||||||
|
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||||
|
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||||
|
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||||
|
sebserver.webservice.api.exam.accessTokenValiditySeconds=3600
|
||||||
|
sebserver.webservice.api.exam.event-handling-strategy=ASYNC_BATCH_STORE_STRATEGY
|
||||||
|
sebserver.webservice.api.exam.enable-indicator-cache=true
|
||||||
|
sebserver.webservice.api.pagination.maxPageSize=500
|
||||||
|
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||||
|
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
### SEB Server GUI configuration
|
||||||
|
sebserver.gui.external.messages=file:/sebserver/config/spring/messages
|
||||||
|
sebserver.gui.multilingual=false
|
||||||
|
sebserver.gui.supported.languages=en
|
||||||
|
sebserver.gui.theme=css/sebserver.css
|
||||||
|
sebserver.gui.list.page.size=20
|
||||||
|
sebserver.gui.date.displayformat=de
|
||||||
|
|
||||||
|
sebserver.gui.entrypoint=/gui
|
||||||
|
sebserver.gui.webservice.protocol=http
|
||||||
|
sebserver.gui.webservice.address=localhost
|
||||||
|
sebserver.gui.webservice.port=8080
|
||||||
|
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||||
|
sebserver.gui.webservice.poll-interval=1000
|
||||||
|
sebserver.gui.webservice.mock-lms-enabled=true
|
||||||
|
|
||||||
|
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||||
|
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
6
docker/testing/tls/config/spring/messages_en.properties
Normal file
6
docker/testing/tls/config/spring/messages_en.properties
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
sebserver.overall.imprint=
|
||||||
|
sebserver.overall.imprint.markup=
|
||||||
|
sebserver.overall.about=About
|
||||||
|
sebserver.overall.about.markup=<span style='font-family: Arial, Helvetica,sans-serif;font-size: 25px;font-weight: normal;font-style: normal;color: rgb(31, 64, 122);'>SEB Server About Example</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 18px;font-weight: bold;font-style: normal;'>1. This is an example of how an About-Page can look like.</span><br/><br/><span style='font-family: Arial, Helvetica,sans-serif;font-size: 14px;font-weight: normal;font-style: normal;'>By simply define the markup HTML content within the messages.propertie configuration of specified language</span>
|
||||||
|
sebserver.overall.help=Documentation
|
||||||
|
sebserver.overall.help.link=https://seb-server.readthedocs.io/en/latest/index.html
|
74
docker/testing/tls/docker-compose.yml
Normal file
74
docker/testing/tls/docker-compose.yml
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
seb-server-setup:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: setup.Dockerfile
|
||||||
|
container_name: seb-server-setup
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/config
|
||||||
|
- ./config:/host/config
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: "mariadb/server:10.3"
|
||||||
|
container_name: seb-server-mariadb
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secret
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/etc/mysql/conf.d
|
||||||
|
- seb-server-mariadb:/var/lib/mysql
|
||||||
|
- ./config/mariadb/config.cnf:/etc/mysql/conf.d/config.cnf
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seb-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: sebserver.Dockerfile
|
||||||
|
args:
|
||||||
|
- SEBSERVER_VERSION=1.0-latest
|
||||||
|
container_name: seb-server
|
||||||
|
volumes:
|
||||||
|
- seb-server-config:/sebserver/config
|
||||||
|
- ./config/spring:/sebserver/config/spring
|
||||||
|
- seb-server-logs:/sebserver/log
|
||||||
|
environment:
|
||||||
|
- JMX_PORT=9090
|
||||||
|
ports:
|
||||||
|
- 9090:9090
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "200k"
|
||||||
|
max-file: "10"
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server-setup"
|
||||||
|
|
||||||
|
reverse-proxy:
|
||||||
|
image: "nginx:latest"
|
||||||
|
container_name: seb-server-proxy
|
||||||
|
volumes:
|
||||||
|
- ./config/nginx:/etc/nginx/conf.d
|
||||||
|
- ./config/nginx/certs:/sebserver/config/certs
|
||||||
|
ports:
|
||||||
|
- 443:443
|
||||||
|
networks:
|
||||||
|
- seb-server-network
|
||||||
|
depends_on:
|
||||||
|
- "mariadb"
|
||||||
|
- "seb-server"
|
||||||
|
- "seb-server-setup"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seb-server-network:
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
seb-server-config:
|
||||||
|
seb-server-mariadb:
|
||||||
|
seb-server-logs:
|
61
docker/testing/tls/sebserver.Dockerfile
Normal file
61
docker/testing/tls/sebserver.Dockerfile
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# Clone git repository form specified tag
|
||||||
|
FROM alpine/git
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ARG GIT_TAG="v${SEBSERVER_VERSION}"
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
RUN if [ "x${GIT_TAG}" = "x" ] ; \
|
||||||
|
then git clone --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; \
|
||||||
|
else git clone -b "$GIT_TAG" --depth 1 https://github.com/SafeExamBrowser/seb-server.git ; fi
|
||||||
|
|
||||||
|
# Build with maven (skip tests)
|
||||||
|
FROM maven:latest
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=0 /sebserver/seb-server /sebserver
|
||||||
|
RUN mvn clean install -DskipTests
|
||||||
|
|
||||||
|
FROM openjdk:11-jre-stretch
|
||||||
|
|
||||||
|
ARG SEBSERVER_VERSION
|
||||||
|
ENV SEBSERVER_JAR="seb-server-${SEBSERVER_VERSION}.jar"
|
||||||
|
ENV SERVER_PORT="8080"
|
||||||
|
ENV JMX_PORT=
|
||||||
|
|
||||||
|
WORKDIR /sebserver
|
||||||
|
COPY --from=1 /sebserver/target/"$SEBSERVER_JAR" /sebserver
|
||||||
|
|
||||||
|
CMD if [ "x${JMX_PORT}" = "x" ] ; \
|
||||||
|
then secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
else secret=$(cat /sebserver/config/secret) && exec java \
|
||||||
|
-Xms64M \
|
||||||
|
-Xmx1G \
|
||||||
|
-Dcom.sun.management.jmxremote \
|
||||||
|
-Dcom.sun.management.jmxremote.port=${JMX_PORT} \
|
||||||
|
-Dcom.sun.management.jmxremote.rmi.port=${JMX_PORT} \
|
||||||
|
-Djava.rmi.server.hostname=localhost \
|
||||||
|
-Dcom.sun.management.jmxremote.local.only=false \
|
||||||
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Dcom.sun.management.jmxremote.authenticate=true \
|
||||||
|
-Dcom.sun.management.jmxremote.password.file=/sebserver/config/jmx/jmxremote.password \
|
||||||
|
-Dcom.sun.management.jmxremote.access.file=/sebserver/config/jmx/jmxremote.access \
|
||||||
|
-jar "${SEBSERVER_JAR}" \
|
||||||
|
--spring.profiles.active=prod,prod-gui,prod-ws \
|
||||||
|
--spring.config.location=file:/sebserver/config/spring/,classpath:/config/ \
|
||||||
|
--sebserver.certs.password="${secret}" \
|
||||||
|
--sebserver.mariadb.password="${secret}" \
|
||||||
|
--sebserver.password="${secret}" ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
EXPOSE $SERVER_PORT $JMX_PORT
|
7
docker/testing/tls/setup.Dockerfile
Normal file
7
docker/testing/tls/setup.Dockerfile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
CMD cp -a /host/config/. /config/ \
|
||||||
|
&& secret=$(cat /config/secret) \
|
||||||
|
&& rm /host/config/secret \
|
||||||
|
&& printf "monitorRoleUser ${secret}\ncontrolRoleUser ${secret}" > /config/jmxremote.password \
|
||||||
|
&& chmod 700 /config/jmxremote.password
|
Loading…
Add table
Reference in a new issue