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
	
	 Bengt Giger
						Bengt Giger