Setup Guide
This guide explains how to set up Artemis in your development environment or a demo production environment. For production setups, you would need to additionally consider topics discussed in the Administration Setup.
Running Artemis consists of two main steps:
- Set up the development environment (see Development Environment Setup).
- Set up Artemis (see Set up Artemis), which includes setting up optional but recommended features such as programming exercises. The installation guide provides two options for programming exercises, including version control and build system setup.
Artemis is based on JHipster, combining:
- Spring Boot (Java 25) for the application server.
- Angular 21 (TypeScript) for the web application that serves the user interface.
To get an overview of the technology stack, visit the JHipster Technology Stack and refer to other tutorials on the JHipster homepage.
Development Environment Setup
Before installing Artemis, install and configure the following dependencies:
Required Dependencies
-
Java JDK 25 Download and install Java (e.g., from Oracle JDK)
-
Database Server Artemis uses Hibernate for database interactions and Liquibase for schema migrations. You can either use MySQL or PostgreSQL as the database server. See Database Setup for details.
-
Node.js (LTS ≥ 24.7.0 < 25) Download from Node.js. Required for compiling and running the Angular client.
-
npm (≥ 11.5.1) Installed automatically with Node.js but can be updated separately.
-
Graphviz (Optional, but Recommended for Production Setups) Install from Graphviz to enable graph generation in exercise descriptions.
Missing Graphviz in production may cause rendering errors for exercise descriptions.
IDE Setup
We recommend using IntelliJ IDEA Ultimate for development. Refer to JHipster's guide on configuring an IDE: JHipster IDE Setup.
The Community Edition of IntelliJ IDEA lacks Spring Boot support. See the comparison matrix for details.
Set up Artemis
Once the development environment is set up, the next step is to configure the Artemis server. This includes optional features such as programming exercises, which require a version control and build system.
Start by following the Database Setup guide, then proceed with Server Setup and Client Setup.
Database Setup
Artemis supports MySQL and PostgreSQL databases. The required Artemis schema is created or updated automatically when the server application starts.
MySQL Setup
You can set up a MySQL database for Artemis using one of the following methods:
1. Using Docker (Recommended)
The easiest way to set up a MySQL database for development is by using Docker. Run the following command to start a MySQL database using the provided Docker Compose file:
docker compose -f docker/mysql.yml up
This method simplifies setup and management, making it ideal for development environments.
2. Using a Local MySQL Installation
If you prefer to install MySQL locally, download and install the MySQL Community Server (9.2.x) from the official MySQL website.
When running a local MySQL server, ensure the following settings for character encoding and collation:
- character-set:
utf8mb4 - collation:
utf8mb4_unicode_ci
These settings can be configured using a my.cnf file located in /etc:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = TRUE
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Ensure that MySQL loads this configuration file when starting the server. For more details, refer to the official MySQL documentation: MySQL Option Files.
Users for MySQL
For the development environment, the default MySQL user is root with an empty password.
(In case you want to use a different password, make sure to change the value in application-local.yml (spring > datasource > password) and in liquibase.gradle (within the 'liquibaseCommand' as argument password)).
Set empty root password for MySQL 9
If you have problems connecting to the MySQL 9 database using an empty root password, you can try the following command to reset the root password to an empty password:
mysql -u root --execute "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY ''";
Empty root passwords should only be used in a development environment. The root password for a production environment must never be empty.
PostgreSQL Setup
No special PostgreSQL settings are required.
You can either use your package manager's version, or set it up using a container.
An example Docker Compose setup based on the official container image is provided in docker/postgres.yml.
When setting up the Artemis server, the following values need to be added/updated in the server configuration (see setup steps below) to connect to PostgreSQL instead of MySQL:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/Artemis?ssl=false
username: Artemis
jpa:
database: POSTGRESQL
This example assumes that you use the mentioned Docker Compose file on your localhost, leading to a database called Artemis that runs on port 5432 and where no password is necessary. You might have to update spring.datasource.url if you use another configuration and set the password in spring.datasource.password.
Server Setup
First-time deployment checklist:
Before starting the Artemis server for the first time:
- Database: Ensure a database is running. See Database Setup for instructions.
- Configuration: Create
application-local.ymlinsrc/main/resources/config(see Configuration Setup below). - Deployment: We recommend deploying Artemis (Server, LocalVC & LocalCI) for local development.
To start the Artemis application server from the development environment, first import the project into IntelliJ IDEA. Make sure to install the Spring Boot plugins for IntelliJ IDEA, this will make it easier to run the server.
As an alternative, you may consider running the entire Artemis application using the Helios application. See Setup with Helios for more details.
Before starting the application, update the required configuration settings.
Configuration Setup
Configuration settings are stored in application-artemis.yml (located in src/main/resources/config).
However, do not modify this file directly, as it may lead to accidental commits of sensitive information.
Instead, follow these best practices:
-
Create a custom configuration file
- In
src/main/resources/config, create a new file namedapplication-local.yml. - This file is used to override settings in application.yml for local development environments. It is configured to be ignored by Git to ensure that local configurations are not committed.
- In
-
Customize configuration settings
- If you want to change application properties, you should do that in
application-local.yml. - If needed, you can modify values such as database credentials, authentication and application settings.
- If you want to change application properties, you should do that in
-
Activate the correct profile
- When running Artemis, ensure the
localprofile is selected in the run configurations. - For additional custom configurations, create
application-<name>.ymland activate the<name>profile.
- When running Artemis, ensure the
Common Configuration Options
For development purposes, these settings are preconfigured, and no action is necessary in this step. You only need to modify them if your specific work or production environments require changes.
artemis:
repo-clone-path: ./repos/
legal-path: ./legal/
repo-download-clone-path: ./repos-download/
bcrypt-salt-rounds: 11 # The number of salt rounds for bcrypt password hashing.
# Lower values improve speed but reduce security.
# Use the bcrypt benchmark tool to determine an optimal value: https://github.com/ls1intum/bcrypt-Benchmark
user-management:
use-external: true # enables ldap authentication
password-reset:
links:
en: '<link>'
de: '<link>'
ldap:
url: <url>
user-dn: <user-dn>
password: <password>
base: <base>
allowed-username-pattern: '^([a-z]{2}\d{2}[a-z]{3})$' # example for a TUM identifier, e.g. ab12cde
git:
name: Artemis
email: artemis@in.tum.de
athena:
# If you want to use Athena, refer to the dedicated configuration section. Under Administration Guide, Setup of Extension Services.
If you use a password for authentication, update it in gradle/liquibase.gradle.
Version Control & Continuous Integration Setup
If you are setting up programming exercises, additional configuration is required for the version control and build system. Refer to one of the following guides based on your preferred setup:
- Integrated Code Lifecycle Setup (Recommended)
- LocalVC + Jenkins Setup
Run the server via a run configuration in IntelliJ
The project comes with some pre-configured run / debug configurations that are stored in the .idea directory.
When you import the project into IntelliJ the run configurations will also be imported.
The recommended way is to run the server and the client separately. This provides fast rebuilds of the server and hot module replacement in the client.
- Artemis (Client): Will execute
npm installandnpm run start. The client will be available at http://localhost:9000/ with hot module replacement enabled (also see Client Setup). - Artemis (Server, LocalVC & LocalCI): The server will be started separated from the client with the profiles
dev,artemis,localci,localvc,scheduling,buildagent,core,ldap,local. - Artemis (Server, LocalVC & Jenkins): The server will be started separated from the client with the profiles
dev,jenkins,localvc,artemis,scheduling,core,local. - Artemis (Server, LocalVC & LocalCI, Athena): The server will be started separated from the client with the profiles
dev,localci,localvc,artemis,scheduling,athena,buildagent,core,local. - Artemis (Server, LocalVC & LocalCI, Iris): The server will be started separated from the client with the profiles
dev,localci,localvc,artemis,scheduling,iris,buildagent,core,local. - Artemis (Server, LocalVC & LocalCI, Theia): The server will be started separated from the client with the profiles
theia,dev,localci,localvc,artemis,scheduling,buildagent,core,ldap,local. - Artemis (BuildAgent): The server will be started separated from the client with the profiles
buildagent,local. This configuration is used to run the build agent for the local CI. This configuration is rarely needed for development. - Artemis (Server, Prod, LocalCI): The server will be started separated from the client with the profiles
prod,core,ldap,localvc,localci,scheduling,local. This configuration is used for production-like testing.
Deprecated Options
- Artemis (Server): The server will be started separated from the client. The startup time decreases significantly.
- Artemis (Server & Client): Will start the server and the client. The client will be available at http://localhost:8080/ with hot module replacement disabled.
Run the server via Docker
This method provides a fast way to start Artemis for demonstration purposes. It is not recommended for development, as it does not support code modifications or debugging.
Artemis provides a Docker image named ghcr.io/ls1intum/artemis:<TAG/VERSION>:
- The current develop branch is available under the tag
develop. - The latest stable release can be retrieved using the tag
latest. - Specific releases, such as
7.10.8, can be accessed withghcr.io/ls1intum/artemis:7.10.8. - Branches tied to a pull request can be obtained using
PR-<PR NUMBER>.
Dockerfile
You can find the latest Artemis Dockerfile at docker/artemis/Dockerfile.
-
The Dockerfile has multiple stages: A builder stage, building the
.warfile, an optional external_builder stage to import a pre-built.warfile, a war_file stage to choose between the builder stages via build argument and a runtime stage with minimal dependencies just for running artemis. -
The Dockerfile defines three Docker volumes (at the specified paths inside the container):
-
/opt/artemis/config:
This can be used to store additional configurations of Artemis in YAML files. The usage is optional, and we recommend using the environment files for overriding your custom configurations instead of using
src/main/resources/application-local.ymlas such an additional configuration file. The other configurations likesrc/main/resources/application.yml, ... are built into the.warfile and therefore are not needed in this directory.ℹ️Instead of mounting this config directory, you can also use environment variables for the configuration as defined by the Spring relaxed binding. You can either place those environment variables directly in the
environmentsection, or create a .env-file. When starting an Artemis container directly with the Docker-CLI, an .env-file can also be given via the--env-fileoption. To ease the transition of an existing set of YAML configuration files into the environment variable style, a helper script can be used. -
/opt/artemis/data:
This directory should be used for any data (e.g., local clone of repositories). This is preconfigured in the
dockerJava Spring profile (which sets the following values:artemis.repo-clone-path,artemis.repo-download-clone-path,artemis.course-archives-path,artemis.submission-export-pathartemis.legal-path, andartemis.file-upload-path). -
/opt/artemis/public/content:
This directory will be used for branding. You can specify a favicon here.
-
-
The Dockerfile assumes that the mounted volumes are located on a file system with the following locale settings (see #4439 for more details):
- LC_ALL
en_US.UTF-8 - LANG
en_US.UTF-8 - LANGUAGE
en_US.UTF-8
- LC_ALL
ARM64 Image builds might run out of memory if not provided with enough memory and/or swap space. On an Apple M1 we had to set the Docker Desktop memory limit to 12GB or more.
Debugging with Docker
The Docker containers have the possibility to enable Java Remote Debugging via Java environment variables.
Java Remote Debugging lets you use your preferred debugger connected to port 5005.
For IntelliJ, you can use the Remote Java Debugging for Docker profile shipped in the git repository.
With the following Java environment variable, you can configure the Remote Java Debugging inside a container:
_JAVA_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
This is already pre-set in the Docker Compose Artemis-Dev-MySQL Setup.
For issues at the startup, you might have to suspend the java command until a Debugger is connected.
This is possible by setting suspend=y.
Run the server with Spring Boot and Spring profiles
The Artemis server should startup by running the main class de.tum.cit.aet.artemis.ArtemisApp using Spring Boot.
Artemis uses Spring profiles to segregate parts of the application configuration and make it only available in certain environments. For development purposes, the following program arguments can be used to enable the dev profile and the profiles for Jenkins and LocalVC:
--spring.profiles.active=dev,jenkins,localvc,artemis,scheduling
If you use IntelliJ (Community or Ultimate) you can set the active profiles by:
- Choosing
Run | Edit Configurations... - Going to the
Configuration Tab - Expanding the
Environmentsection to revealVM Optionsand setting them to-Dspring.profiles.active=dev,jenkins,localvc,artemis,scheduling
Set Spring profiles with IntelliJ Ultimate
If you use IntelliJ Ultimate, add the following entry to the section Active Profiles (within Spring Boot) in the server run configuration:
dev,jenkins,localvc,artemis,scheduling
Run the server with the command line (Gradle wrapper)
If you want to run the application via the command line instead, make sure to pass the active profiles to the gradlew command like this:
./gradlew bootRun --args='--spring.profiles.active=dev,jenkins,localvc,artemis,scheduling'
Hyperion (Optional)
Hyperion provides AI-assisted exercise creation features via Spring AI. No external Edutelligence service is required, only a LLM provider such as OpenAI or Azure OpenAI.
For local development with LM Studio (no cloud API keys required), see the Spring AI Development Guide.
For production setup, see Hyperion Service in the Administration Guide for instructions on enabling the module in production and configuring LLM credentials.
Client Setup
You need to install Node and npm on your local machine.
Using IntelliJ
If you are using IntelliJ you can use the pre-configured Artemis (Client) run configuration that will be delivered with this repository:
- Choose
Run | Edit Configurations... - Select the
Artemis (Client)configuration from thenpm section - Now you can run the configuration in the upper right corner of IntelliJ
Using the command line
You should be able to run the following command to install development tools and dependencies. You will only need to run this command when dependencies change in package.json.
npm install
To start the client application in the browser, use the following command:
npm run start
This compiles TypeScript code to JavaScript code, starts the live reloading feature (i.e. whenever you change a TypeScript file and save, the client is automatically reloaded with the new code) and will start the client application in your browser on http://localhost:9000.
If you have configured application-artemis.yml correctly, then you should be able to login with your TUM Online account.
In case you encounter any problems regarding JavaScript heap memory leaks when executing npm run start or any other scripts from package.json, you can adjust a memory limit parameter (node-options=--max-old-space-size=6144) which is set by default in the project-wide .npmrc file. If you still face the issue, you can try to set a lower/higher value than 6144 MB. Recommended values are 3072 (3GB), 4096 (4GB), 5120 (5GB), 6144 (6GB), 7168 (7GB), and 8192 (8GB). You can override the project-wide .npmrc file by using a per-user config file (~/.npmrc). Make sure to not commit changes in the project-wide .npmrc unless the Github build also needs these settings.
For more information, review Working with Angular. For further instructions on how to develop with JHipster, have a look at Using JHipster in development.
Integrated Code Lifecycle Setup
This section describes how to set up a programming exercise environment based on the Integrated Code Lifecycle, which includes a local Version Control system and a local Continuous Integration system. These two systems are integrated into the Artemis server application, and thus, the setup is greatly simplified compared to the external options. This also reduces system requirements as you do not have to run any systems in addition to the Artemis server.
If you are setting Artemis up for the first time, these are the steps you should follow:
- Install and run Docker: https://docs.docker.com/get-docker (required for processing and testing student submissions)
- Start the database: Database Setup (ignore if previously done, you should either have a database running locally or in a container)
- Configure Artemis
- (optional) Configure Build Management
- Start Artemis
- Test the Setup
You can see the configuration in the following video:
Configure Artemis for Integrated Code Lifecycle
Create a file src/main/resources/config/application-local.yml with the following content:
artemis:
user-management:
use-external: false # set to true if you want to use ldap as external user management system. For development, this should be false for easy setup.
version-control:
url: http://localhost:8080
# order and supported authentication mechanisms:
repository-authentication-mechanisms: password,token,ssh
continuous-integration:
# Only necessary on ARM-based systems, the default is amd64 for Intel/AMD systems
# ARM-based systems include Apple M-series, Raspberry Pi, etc.
image-architecture: arm64
# Only necessary on Windows:
docker-connection-uri: tcp://localhost:2375
eureka:
client:
register-with-eureka: false
fetch-registry: false
The values configured here are sufficient for a basic Artemis setup that allows for running programming exercises with Integrated Code Lifecycle.
The repository-authentication-mechanisms field configures the repository authentication mechanisms (password, token, or SSH).
If you are running Artemis on Windows, you also need to add a property artemis.continuous-integration.docker-connection-uri with the value tcp://localhost:2375 as shown above.
If you are running Artemis inside of a docker container, use tcp://host.docker.internal:2375 instead.
Make sure that Artemis can access docker by activating the "Expose daemon on tcp://localhost:2375 without TLS" option under Settings > General in Docker Desktop.
When you start Artemis for the first time, it will automatically create an admin user called "artemis_admin". You can then use that admin user to create further users in Artemis' internal user management system.
Configure Build Management
This step is optional for development purposes.
The Local CI subsystem of the Integrated Code Lifecycle is used to automatically build and test student submissions.
By default, the number of concurrent builds that can be executed is determined by the number of available CPU cores.
You can manually determine this number by adding the following property to the src/main/resources/config/application-local.yml file:
artemis:
continuous-integration:
specify-concurrent-builds: true
# The number of concurrent builds that can be executed
concurrent-build-size: 2
# More options can be found in application-localci.yml and application-buildagent.yml
More options can be found in src/main/resources/config/application-localci.yml and src/main/resources/config/application-buildagent.yml.
Start Artemis with Integrated Code Lifecycle
For the development environment, you can start Artemis with the following additional profiles: localci, localvc and buildagent.
It is important to consider the correct order of the profiles, as the core profile needs to overwrite the buildagent profile, e.g.:
--spring.profiles.active=dev,localci,localvc,artemis,scheduling,buildagent,core,local
All of these profiles are enabled by default when using the Artemis (Server, LocalVC & LocalCI) run configuration in IntelliJ.
Please read Run the server via a run configuration in IntelliJ for more details.
Test the Integrated Code Lifecycle Setup
You can now test the setup:
To create a course with registered users, you can use the scripts from supporting_scripts/course-setup-quickstart.
- Create a course and a programming exercise.
- Log in as a student registered for that course and participate in the programming exercise, either from the online editor or by cloning the repository and pushing from your local environment.
- Make sure that the result of your submission is displayed in the Artemis UI.
- Users can access their repositories via HTTPS and SSH. For SSH to work, you must first configure SSH.
For unauthorized access, your Git client will display the respective error message:
Setup with Docker Compose
You can also use Docker Compose to set up Integrated Code Lifecycle. Using the following command, you can start the Artemis and MySQL containers:
docker compose -f docker/artemis-dev-local-vc-local-ci-mysql.yml up
Unix systems: When running the Artemis container on a Unix system, you will have to give the user running the container permission to access the Docker socket by adding them to the docker group. You can do this by changing the value of services.artemis-app.group_add in the docker/artemis-dev-local-vc-local-ci-mysql.yml file to the group ID of the docker group on your system. You can find the group ID by running getent group docker | cut -d: -f3. The default value is 999.
Windows: If you want to run the Docker containers locally on Windows, you will have to change the value for the Docker connection URI. You can add ARTEMIS_CONTINUOUSINTEGRATION_DOCKERCONNECTIONURI="tcp://host.docker.internal:2375" to the environment file, found in docker/artemis/config/dev-local-vc-local-ci.env. This overwrites the default value unix:///var/run/docker.sock for this property defined in src/main/resources/config/application-docker.yml.
Podman as Docker alternative
Podman offers a container runtime that is API-compatible with Docker. Rather than having a system-wide socket that runs with administrative permissions, Podman allows creating containers with only user permissions. In single-user setups this might not be as relevant, but offers additional security in a production environment where the Artemis CI has to execute untrusted student code.
Podman is supported on a best-effort basis. We are relying on the API compatibility to provide support but are not actively testing against Podman on a test system or in continuous integration. If you notice any issues, feel free to open an issue or pull request so that we can try to fix them.
These setup steps are mostly focused on Linux systems. On Mac and Windows, both Docker and Podman run the containers in a small virtual machine anyway. Therefore, there is little technical benefit relevant to Artemis for choosing one over the other in local development setups. If in doubt, we recommend using Docker, since that solution is most likely to be tested by Artemis developers.
Linux setup
Podman itself should be available via your regular package manager.
After the installation, you have to ensure that your user is allowed to create containers.
This is managed by the files /etc/subuid and /etc/subgid.
Ensure both files contain a line starting with your username.
If not, you can generate the relevant lines by executing the following command:
#! /usr/bin/env sh
printf "%s:%d:65536\n" "$USER" "$(( $(id -u) * 65536 ))" | tee -a /etc/subuid /etc/subgid
After that, enable the Podman user socket that provides the API for the container management:
systemctl --user enable --now podman.socket
Configure the connection to this socket in Artemis by replacing ${UID} with your actual user id (id -u):
artemis:
continuous-integration:
docker-connection-uri: "unix:///run/user/${UID}/podman/podman.sock"
# alternatively, if you use the `DOCKER_HOST` environment variable already
# to tell other tools to use the Podman socket instead of the Docker one:
# docker-connection-uri: "${DOCKER_HOST}"
Windows or Mac setup
Podman offers a desktop application similar to Docker Desktop and CLI tools for Windows, macOS, and Linux. As with Docker, to run containers on Windows or macOS, the runtime has to start a small virtual Linux machine that then actually runs the containers. You can probably connect to this VM similarly as described in the regular setup steps above (additional Podman documentation).
If you try out Podman on a Windows or Mac system and have additional setup tips, feel free to submit a pull request to extend this documentation section.
Common Setup Problems
General Setup Problems
- Restarting IntelliJ with invalidated caches (File > Invalidate Caches...) might resolve the current issue.
- When facing issues with deep dependencies and changes were made to the
package.jsonfile, executingnpm install --forcemight resolve the issue. - When encountering a compilation error due to
invalid source releasemake sure that you have set the Java version properly at 3 places:- File > Project Structure > Project Settings > Project > Project SDK
- File > Project Structure > Project Settings > Project > Project Language Level
- File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM
Database
- One typical problem in the development setup is that an exception occurs during the database initialization. Artemis uses Liquibase to automatically upgrade the database scheme after the data model has changed. This ensures that the changes can also be applied to the production server. In case you encounter errors with Liquibase checksum values:
- Run the following command in your terminal / command line:
./gradlew liquibaseClearChecksums - You can manually adjust the checksum for a breaking changelog:
UPDATE `DATABASECHANGELOG` SET `MD5SUM` = NULL WHERE `ID` = '<changelogId>'
- Run the following command in your terminal / command line:
Client
- If you are using a machine with limited RAM (e.g. ~8 GB RAM) you might have issues starting the Artemis Client. You can resolve this by following the description in Using the command line.
Production Setup and Extension Services
Production Setup
A production setup of these core services might need further adaptation to ensure security. For details on securing your production environment, see the Administration Setup.
Extension Services
Artemis allows extension with several additional services, such as:
- Mobile notifications via Hermes
- Automatic feedback generation using large language models (e.g., Iris/Athena)
- And more...
The setup for these additional services is described as part of the Extension Service Setup.
Setup with Helios
Helios is an application that provides a well-designed UI for deploying various services the AET is building using GitHub Actions. You can use Helios to deploy an Artemis test server without needing to set up the server and client manually.
This is particularly useful for:
- Quick deployment of test environments
- Deploying Artemis without local development setup
- Testing pull request branches in isolated environments
For detailed instructions on setting up Artemis with Helios, refer to the official Helios User Guide.
If the above link is unavailable, go to the Helios documentation homepage and navigate to User Guide → Helios User Guide.
Additional Setup Guides
For more advanced setup scenarios and development tools, see the following guides:
- Jenkins and LocalVC Setup - Alternative CI/CD setup using Jenkins with LocalVC
- Aeolus Setup - Custom build plans for Jenkins and Integrated Code Lifecycle
- OpenAPI and API-driven Development - Working with OpenAPI specifications
- Docker Compose Setup - Alternative Docker Compose-based deployment
- Docker Debugging - Debugging Artemis in Docker containers
- Local Database Tests - Running database tests locally