Lemon Learning recommends this architecture only if it is mandated by your company's security policies.
On-Premise installation involves hosting the solution directly on the client's own servers. This setup allows Lemon Learning to be used within a corporate internal network (intranet), ensuring full compliance with the company's specific security constraints.
Intranet usage
Customization of usage rules
Installation costs
Support and updates managed by the client
Bi-annual update frequency
Limited features (specifically Analytics and AI)
Providing access to the instance from Lemon Learning’s offices helps facilitate support and updates.
The On-Premise distribution is installed using an archive containing an installation script.
Installation can be performed as a self-service by following the technical documentation, or by granting temporary remote access to a server to a Lemon Learning administrator. This instance must meet the minimum sizing requirements recommended by Lemon Learning, based on the number of users (see table below).
< 200 users : 8 gb RAM, 2-cores CPU, 80Gb storage
< 2 000 users : 16 gb RAM, 4-cores CPU, 80Gb storage
> 10 000 users : 32 gb RAM, 8-cores CPU, 80Gb storage
The environment recommended by Lemon Learning is Linux Debian 12/13, Ubuntu 24.04, or Oracle Linux 8.
If support for another Linux distribution is required, please inform your Lemon Learning point of contact.
The following components are required for the Lemon Learning installation:
Software
Docker: version > 20.10
Docker Compose: version > 1.29
Network
Ports 80 and 443 must be open.
DNS records configured for your domain.
Services
SMTP Server along with its credentials.
Certificates (PEM format):
TLS Certificate
Private Key
CA Certificate (Certificate Authority)
Required Skills
Familiarity with Docker and Docker Compose.
Lemon Learning maintains up-to-date technical documentation to enable clients to perform installations and version upgrades quickly and independently.
Lemon Learning remains at the client's disposal for any questions regarding installation, updates, or functional and technical support at the following address: https://support.lemonlearning.com/tickets-view/new
During an extension deployment with an on-premise installation, it is necessary to add two keys to your deployment. Several scenarios are possible:
The MSI package provided by your Solutions Engineer will already contain the necessary additional keys.
This deployment method is recommended for organizations that already deploy extensions via GPO and/or Intune and wish to minimize the risk of conflicts.
Lemon Learning can assist you in performing a deployment via GPO by providing a set of three registry keys for each of the browsers you wish to include. These keys are:
The [...\ExtensionInstallAllowlist] key, which authorizes the installation of the Player extension.
The [...\ExtensionInstallForcelist] key, which forces the installation of the Player extension.
The [...\3rdparty\extensions\[...]\policy] key, which will contain:
The string value configKey: your configuration key, retrievable from your on-premise back-office.
The string value domain: your domain for the Lemon Learning instance.
The string value statsUrl: the syntax is https://stats.domain.ext.
Lemon Learning can assist you in setting up a deployment via Intune. Two approaches are possible:
After receiving the MSI package, you need to generate an .intunewin file using the Microsoft Win32 Content Prep Tool, and then add the application to Intune from the Microsoft Endpoint Manager portal.
Once the custom registry keys are provided, you need to create a configuration profile, configure it, and add the OMA-URI entries corresponding to the keys. This profile can then be assigned to the relevant users or groups.
{
"configKey": {
"Value": "XXX"
},
"domain": {
"Value": "XXX"
},
"statsUrl": {
"Value": "XXX"
}
}
domain is the domain on which your Lemon Learning instance is hosted.
statsUrl uses the following syntax: https://stats.domain.ext.
<script type="text/javascript">
function LemonLearningReady(player) {
player
.set({
projectKey: '...',
namespace: '...',
backend: {
domain: "...",
statsUrl: "..."
},
user: {
name: '...',
email: '...',
profiles: [id profil ou 0],
tags: [{
category: "Pays",
values: ["variable permettant de récupérer la valeur Pays de l'utilisateur connecté"]
}, {
category: "Role",
values: ["variable permettant de récupérer la valeur Role de l'utilisateur connecté"]
}]
}
})
.start()
}
</script>
projectKey will be provided by your Solutions Engineer.
namespace allows you to textually identify the project to avoid conflicts between integrations.
backend:
domain is the domain on which your Lemon Learning instance is hosted.
statsUrl uses the following syntax: https://stats.domain.ext.
user:
name and email correspond to the variables for the user's name and email address within your tool.
profiles will be provided by your Solutions Engineer.
tags correspond to tags that can be sent to Lemon Learning to enable instructional differentiation.
During its initialization, Angular entirely replaces the content of the body. The integration snippet needs to be slightly modified to accommodate this situation:
<!DOCTYPE html>
<html>
<head>
<!-- HOST HTML HEAD HERE -->
<!-- LEMONLEARNING INCLUSION IN THE HTML HEAD -->
<link href="https://static.lemonlearning.com/player/bundle.css" rel="stylesheet" type="text/css" />
<script src="https://static.lemonlearning.com/player/bundle.js" async defer id="lemonlearning-player-embed"></script>
<!-- DAP CUSTOM BOOTSTRAP -->
<script type="text/javascript">
Promise.all([
new Promise((resolve) => {
//Legacy, the DAP needs LemonLearningReady as a global leak
window.LemonLearningReady = (player) => {
//Reuse the LemonLearningReady required global to store the player instance
LemonLearningReady.player = player;
resolve(1)
}
}),
//Wait for the custom LEMONLEARNING_HOST_READY event, triggered from angular
new Promise((resolve) => {
window.document.addEventListener('LEMONLEARNING_HOST_READY', (e) => {
//See https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail
resolve(e.detail)
}, false);
})
])
//As soon as LemonLearningReady is called and LEMONLEARNING_HOST_READY customevent is catched, start the player
.then((values) => {
if (LemonLearningReady.player) {
LemonLearningReady.player.set({
projectKey: '[PROJECT KEY]',
backend: {
domain: '...',
statsUrl: '...'
},
user: {
name: values[1].name,
email: values[1].email,
profiles: [0],
tags: [{
category: "Country",
values: [values[1].country]
}]
}
}).start()
}
});
</script>
</head>
<body>
<!-- ... -->
When the custom event LEMONLEARNING_HOST_READY is caught, the promise receives the user data via event.detail. We can then configure standard automatic authentication. The host site must dispatch a custom event:
//somewhere within the host codebase, when the app is ready
window.document.dispatchEvent(new CustomEvent('LEMONLEARNING_HOST_READY', {
detail: {
name: "John Doe",
email: "john.doe@gmail.com",
country: "fr"
}
}));
projectKey will be provided by your Solutions Engineer.
namespace allows you to textually identify the project to avoid conflicts between integrations.
backend:
domain is the domain on which your Lemon Learning instance is hosted.
statsUrl uses the following syntax: https://stats.domain.ext.
user:
name and email correspond to the variables for the user's name and email address within your tool.
profiles will be provided by your Solutions Engineer.
tags correspond to tags that can be sent to Lemon Learning to enable instructional differentiation.
<script type="text/javascript">
function LemonLearningReady(player) {
player.set({
backend: {
domain: '...',
statsUrl: '...'
},
namespace: '...',
companyKey: '...',
ssoId: '...'
}).start();
}
</script>
backend:
domain is the domain on which your Lemon Learning instance is hosted.
statsUrl uses the following syntax: https://stats.domain.ext.
namespace allows you to textually identify the project to avoid conflicts between integrations.
companyKey will be provided by your Solutions Engineer.
ssoId will be provided by your Solutions Engineer.
<script type="text/javascript">
function LemonLearningReady(player) {
player.set({
backend: {
domain: '...',
statsUrl: '...'
},
projectKey: '...',
namespace: '...',
user: player.userKey('...')
}).start()
}
</script>
backend:
domain is the domain on which your Lemon Learning instance is hosted.
statsUrl uses the following syntax: https://stats.domain.ext.
projectKey will be provided by your Solutions Engineer.
namespace allows you to textually identify the project to avoid conflicts between integrations.
player.userKey will be provided by your Solutions Engineer.