Documentation
About
Install
Configuration
Use

Simple Directory

Configuration

Variables

Simple Directory supports quite a large number of parameters that are documented below. We try as much as possible to define sensible default values, still some parameters will almost always need to be overridden, these parameters have IMPORTANT in their descriptions.

Parameters can be overridden by directly modifying the files, but the recommanded way is to use environment variables.

Key in the configuration fileEnvironment variableDescriptionDefault value
portPORT8080
publicUrlPUBLIC_URLIMPORTANT. The URL where the service will be exposed. For example https://koumoul.com/simple-directoryhttp://localhost:8080
kidJWT_KIDsimple-directory
sessionDomainSESSION_DOMAINnull
jwtDurations.initialTokenJWT_DURATION_INITIAL15m
jwtDurations.exchangedTokenJWT_DURATION_EXCHANGED30d
jwtDurations.invitationTokenJWT_DURATION_INVIT10d
adminsADMINSIMPORTANT. The list of email addresses of the administrators of this service.["admin@test.com"]
adminsOrgADMINS_ORGnull
roles.defaultsROLES_DEFAULTS["admin","user"]
roles.editableROLES_EDITABLEfalse
contactCONTACTIMPORTANT. The email address of contact for users of the service.contact@test.com
homePageHOME_PAGEnull
secret.publicPUBLIC_KEYIMPORTANT. The key to the public RSA signing key. See the install doc of the service../security/simple-directory.key.pub
secret.privatePRIVATE_KEYIMPORTANT. The key to the private RSA signing key. See the install doc of the service../security/simple-directory.key
storage.typeSTORAGE_TYPEIMPORTANT. The type of storage for persisting users and organizations.
The default type "file" is read-only and suited for development/test or to use data exported from another system.
The type "mongo" depends on accessing a MongoDB instance, it is the approriate choice for most production deployments.
mongo
storage.file.usersSTORAGE_FILE_USERSOnly for storage.type=file. The path to the JSON file containing users definitions./data/users.json
storage.file.organizationsSTORAGE_FILE_ORGSOnly for storage.type=file. The path to the JSON file containing organizations definitions./data/organizations.json
storage.mongo.urlSTORAGE_MONGO_URLOnly for storage.type=mongo. The full connection string for mongo database.mongodb://mongo:27017/simple-directory-production
analyticsANALYTICSJSON for configuring analytics, matches with the "modules" section of the lib vue-multianalytics{}
webhooks.identitiesIDENTITIES_WEBHOOKS[]
theme.logoTHEME_LOGOThe URL to replace Simple Directory's default logo.null
theme.darkTHEME_DARKSwitch the whole apparence of pages to a dark style.
Note that the default colors are mote adapted to a light style, if you switch to dark you will have to modify them.
false
theme.colors.primaryTHEME_PRIMARY#1E88E5
theme.colors.secondaryTHEME_SECONDARY#42A5F5
theme.colors.accentTHEME_ACCENT#FF9800
theme.colors.errorTHEME_ERRORFF5252
theme.colors.infoTHEME_INFO#2196F3
theme.colors.successTHEME_SUCCESS#4CAF50
theme.colors.warningTHEME_WARNING#E91E63
theme.cssUrlTHEME_CSS_URLLink to a stylesheet to complement the branding variables.
WARNING: the HTML structure can change from one version to another. Maintaining an external stylesheet is going to create extra work for you on upgrades.
null
theme.cssTextTHEME_CSS_TEXTRaw css content to complement the branding variables.
WARNING: the HTML structure can change from one version to another. Maintaining an external stylesheet is going to create extra work for you on upgrades.
i18n.localesI18N_LOCALES["fr","en"]
mails.transportMAILS_TRANSPORTIMPORTANT. A JSON object of configuration for the email transport compatible with the library nodemailer.{"port":1025,"ignoreTLS":true,"default":"localhost"}
mails.fromMAILS_FROM'IMPORTANT. The address to use as sender for emails sent by the service.no-reply@test.com
maildev.urlMAILDEV_URLhttp://localhost:1080
maildev.activeMAILDEV_ACTIVEfalse
maildev.smtpMAILDEV_SMTP1025
maildev.webMAILDEV_WEB1080
quotas.defaultMaxCreatedOrgsDEFAULT_MAX_CREATED_ORGS-1
quotas.defaultMaxNbMembersDEFAULT_MAX_NB_MEMBERS0
listEntitiesModeLIST_ENTITIES_MODEUsed to restrict in a global manner access to the lists of users and organizations.
Can be 'anonymous', 'authenticated' or 'admin'.
authenticated
onlyCreateInvitedONLY_CREATE_INVITEDIf true users can not be created at first email sent. They must be invited in an organization.false
defaultLoginRedirectDEFAULT_LOGIN_REDIRECTDefault redirection after login. If not specified user will go to his profile page.null
invitationRedirectINVITATION_REDIRECTnull
secretKeys.sendMailsSECRET_SENDMAILSnull
secretKeys.limitsSECRET_LIMITSnull
listenWhenReadyLISTEN_WHEN_READYfalse
noUINO_UIfalse
tosUrlTOS_URLIMPORTANT. The URL toward you terms of services. If this parameter is empty or does not link toward a proper Web page you risk not satisfying your obligations toward your users.null
manageDepartmentsMANAGE_DEPARTMENTSfalse
manageDepartmentLabelMANAGE_DEPARTMENT_LABELfalse
passwordlessPASSWORDLESStrue
authRateLimit.attemptsAUTHRATELIMIT_ATTEMPTS5
authRateLimit.durationAUTHRATELIMIT_DURATION60
oauth.providersOAUTH_PROVIDERS[]
oauth.github.idOAUTH_GITHUB_ID
oauth.github.secretOAUTH_GITHUB_SECRET
oauth.facebook.idOAUTH_FACEBOOK_ID
oauth.facebook.secretOAUTH_FACEBOOK_SECRET
oauth.google.idOAUTH_GOOGLE_ID
oauth.google.secretOAUTH_GOOGLE_SECRET
oauth.linkedin.idOAUTH_LINKEDIN_ID
oauth.linkedin.secretOAUTH_LINKEDIN_SECRET

Internationalization

All messages in Simple Directory are externalized and internationalized.

To add a language you can add a file in this directory either by overwriting the Docker image or submitting a pull request.

To change some values you can set environment variables when running the service. The table below contains the supported keys. Warning: we try to keep the keys as stables as possible, but still some modification may occur between 2 versions of Simple Directory. If you overwrite some values, you should check it again after each upgrade.

Key in I18N fileEnvironment variableValue
common.idI18N_en_common_id
Identifier
common.nextI18N_en_common_next
Next
common.nameI18N_en_common_name
Name
common.homeI18N_en_common_home
Home
common.saveI18N_en_common_save
Save
common.roleI18N_en_common_role
Role
common.userI18N_en_common_user
User
common.backI18N_en_common_back
Back
common.emailI18N_en_common_email
Email
common.loginI18N_en_common_login
login
common.usersI18N_en_common_users
Users
common.logoutI18N_en_common_logout
logout
common.rejectI18N_en_common_reject
Reject
common.acceptI18N_en_common_accept
Accept
common.avatarI18N_en_common_avatar
Avatar
common.searchI18N_en_common_search
Search
common.asAdminI18N_en_common_asAdmin
Log as this user
common.membersI18N_en_common_members
Members
common.logLinkI18N_en_common_logLink
login / sign up
common.validateI18N_en_common_validate
Validate
common.passwordI18N_en_common_password
Password
common.birthdayI18N_en_common_birthday
Birthday
common.loggedAtI18N_en_common_loggedAt
Logged at
common.lastNameI18N_en_common_lastName
Family name
common.editTitleI18N_en_common_editTitle
Edit {name}
common.firstNameI18N_en_common_firstName
First name
common.createdAtI18N_en_common_createdAt
Created on
common.updatedAtI18N_en_common_updatedAt
Updated on
common.confirmOkI18N_en_common_confirmOk
Ok
common.autoAdminI18N_en_common_autoAdmin
Automatically add me as admin
common.dashboardI18N_en_common_dashboard
Dashboard
common.myAccountI18N_en_common_myAccount
My account
common.departmentI18N_en_common_department
Department
common.delAsAdminI18N_en_common_delAsAdmin
Get back to your normal session
common.checkInboxI18N_en_common_checkInbox
Check your mail box
common.missingInfoI18N_en_common_missingInfo
Missing info
common.departmentsI18N_en_common_departments
Departments
common.spamWarningI18N_en_common_spamWarning
If you didn't receive an email, check if it was classified as spam in your mail box.
common.invitationsI18N_en_common_invitations
Invitations
common.descriptionI18N_en_common_description
Description
common.organizationI18N_en_common_organization
Organization
common.nbCreatedOrgsI18N_en_common_nbCreatedOrgs
Number of organizations created :
common.organizationsI18N_en_common_organizations
Organizations
common.createdPhraseI18N_en_common_createdPhrase
Created by {name} on {date}
common.documentationI18N_en_common_documentation
Documentation
common.confirmCancelI18N_en_common_confirmCancel
Cancel
common.administrationI18N_en_common_administration
Administration
common.maxCreatedOrgsI18N_en_common_maxCreatedOrgs
Max number of created organizations
common.modificationOkI18N_en_common_modificationOk
Your modification was saved.
common.confirmDeleteMsgI18N_en_common_confirmDeleteMsg
Do you really want to delete this resource ? Data will not be recoverable.
common.activateAdminModeI18N_en_common_activateAdminMode
Activate admin mode
common.confirmDeleteTitleI18N_en_common_confirmDeleteTitle
Delete {name}
common.createOrganizationI18N_en_common_createOrganization
Create organization
common.deactivateAdminModeI18N_en_common_deactivateAdminMode
Deactivate admin mode
root.titleI18N_en_root_title
Simple Directory
root.descriptionI18N_en_root_description
Easy users and organizations management for modern Web-oriented architectures.
errors.badEmailI18N_en_errors_badEmail
Email address is empty or malformed.
errors.userUnknownI18N_en_errors_userUnknown
Unknown user.
errors.orgaUnknownI18N_en_errors_orgaUnknown
Unknown organization.
errors.unknownRoleI18N_en_errors_unknownRole
Role {role} is unknown.
errors.invalidTokenI18N_en_errors_invalidToken
The token is not valid. Maybe it is expired.
errors.rateLimitAuthI18N_en_errors_rateLimitAuth
Too many attemps in a short interval. Please wait before trying again.
errors.noPasswordlessI18N_en_errors_noPasswordless
Passordless authentication is not accepted by this service.
errors.badCredentialsI18N_en_errors_badCredentials
Email address or password invalid.
errors.maxCreatedOrgsI18N_en_errors_maxCreatedOrgs
The user cannot create more organizations. Limit attained.
errors.permissionDeniedI18N_en_errors_permissionDenied
Insufficient permissions.
errors.malformedPasswordI18N_en_errors_malformedPassword
The password should be at least 8 characters long and contain at least one number and one uppercase character.
errors.invitationConflictI18N_en_errors_invitationConflict
This user is already member of the organization.
errors.serviceUnavailableI18N_en_errors_serviceUnavailable
Service unavailable because of maintenance.
errors.nonEmptyOrganizationI18N_en_errors_nonEmptyOrganization
You must remove other members from this organization
mails.login.textI18N_en_mails_login_text
An identification request was made from {host}. To confirm copy the URL below in the address bar of your Web browser. This URL is valid for 15 minutes.

{link}

If you encounter a problem with your account or if you didn't submit this identification request to {host}, feel free to contact us at {contact}.
      
mails.login.htmlMsgI18N_en_mails_login_htmlMsg
An identification request was made from <a href="{origin}">{host}</a>. To confirm click on the button below. This link is valid for 15 minutes.
mails.login.subjectI18N_en_mails_login_subject
Identification on {host}
mails.login.htmlButtonI18N_en_mails_login_htmlButton
Connect to {host}
mails.login.htmlCaptionI18N_en_mails_login_htmlCaption
If you encounter a problem with your account or if you didn't submit this identification request to <a href="{origin}">{host}</a>, feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
mails.login.htmlAlternativeLinkI18N_en_mails_login_htmlAlternativeLink
If the button doesn't work, you can copy/paste this link in the address bar of your browser:
mails.action.textI18N_en_mails_action_text
An action requiring confirmation by email was triggered on this address. To confirm this action you can copy the URL below in your browers. Ths URL is valid for 15 minutes.

{link}

If you encounter a problem with your account or if you find this message suspicious feel free to contact us at {contact}.
      
mails.action.htmlMsgI18N_en_mails_action_htmlMsg
An action requiring confirmation by email was triggered on this address. To confirm this action click on the button below. The link is valid for 15 minutes.
      
mails.action.subjectI18N_en_mails_action_subject
Accomplish an action on your account {host}
mails.action.htmlButtonI18N_en_mails_action_htmlButton
Confirm
mails.action.htmlCaptionI18N_en_mails_action_htmlCaption
If you encounter a problem with your account or if you find this message suspicious feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
mails.action.htmlAlternativeLinkI18N_en_mails_action_htmlAlternativeLink
If the button doesn't work, you can copy/paste this link in the address bar of your browser:
mails.conflict.textI18N_en_mails_conflict_text
An account creation request was made from {host}, but it was rejected as this email address is already associated to an account.

Feel free to contact us at {contact}.
      
mails.conflict.subjectI18N_en_mails_conflict_subject
Failure to create an account on {host}
mails.conflict.htmlMsgI18N_en_mails_conflict_htmlMsg
An account creation request was made from <a href="{origin}">{host}</a>, but it was rejected as this email address is already associated to an account.
mails.conflict.htmlCaptionI18N_en_mails_conflict_htmlCaption
Feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
mails.creation.textI18N_en_mails_creation_text
An account creation request was made from {host}. To activate the account you must copy the URL below in the address bar of your Web browser. This URL is valid for 15 minutes.

{link}

If you encounter a problem with your account or if you didn't submit this identification request to {host}, feel free to contact us at {contact}.
      
mails.creation.subjectI18N_en_mails_creation_subject
Welcome to {host}
mails.creation.htmlMsgI18N_en_mails_creation_htmlMsg
An account creation request was made from <a href="{origin}">{host}</a>. To activate the account you must click on the button below. This link is valid for 15 minutes.
mails.creation.htmlButtonI18N_en_mails_creation_htmlButton
Validate the account creation
mails.creation.htmlCaptionI18N_en_mails_creation_htmlCaption
If you encounter a problem with your account or if you didn't submit this identification request to <a href="{origin}">{host}</a>, feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
mails.creation.htmlAlternativeLinkI18N_en_mails_creation_htmlAlternativeLink
If the button doesn't work, you can copy/paste this link in the address bar of your browser:
mails.invitation.textI18N_en_mails_invitation_text
An administrator from the organization {organization} invited you to join. To accept this invitation copy the URL below in the address bar of your Web browser.
If you do not have an account yet it will be created automatically.

{link}

If you encounter a problem with your account or if you find this invitation suspicious feel free to contact us at {contact}.
      
mails.invitation.htmlMsgI18N_en_mails_invitation_htmlMsg
      An administrator from the organization {organization} invited you to join. To accept this invitation click on the button below.
      If you do not have an account yet it will be created automatically.
      
mails.invitation.subjectI18N_en_mails_invitation_subject
Join the organization {organization} on {host}
mails.invitation.htmlButtonI18N_en_mails_invitation_htmlButton
Accept the invitation
mails.invitation.htmlCaptionI18N_en_mails_invitation_htmlCaption
If you encounter a problem with your account or if you find this invitation suspicious feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
mails.invitation.htmlAlternativeLinkI18N_en_mails_invitation_htmlAlternativeLink
If the button doesn't work, you can copy/paste this link in the address bar of your browser:
mails.noCreation.textI18N_en_mails_noCreation_text
An identification request was made from {host}, but it was rejected as this email address is unknown.

Feel free to contact us at {contact}.
      
mails.noCreation.htmlMsgI18N_en_mails_noCreation_htmlMsg
An identification request was made from <a href="{origin}">{host}</a>, but it was rejected as this email address is unknown.
mails.noCreation.subjectI18N_en_mails_noCreation_subject
Failure to authenticate to {host}
mails.noCreation.htmlCaptionI18N_en_mails_noCreation_htmlCaption
Feel free to contact us at <a href="mailto:{contact}">{contact}</a>.
pages.login.oauthI18N_en_pages_login_oauth
Connect with:
pages.login.titleI18N_en_pages_login_title
Identify yourself
pages.login.tosMsgI18N_en_pages_login_tosMsg
Before creating an account please read <a href="{tosUrl}" target="_blank">our terms of services</a>.
pages.login.successI18N_en_pages_login_success
You will receive an email at the specified address. Please use the link in this email to conclude your identification.
pages.login.adminModeI18N_en_pages_login_adminMode
Confirm your identity to switch to admin mode.
pages.login.emailLabelI18N_en_pages_login_emailLabel
Your email address
pages.login.tosConfirmI18N_en_pages_login_tosConfirm
I confirm that I have read the terms of services for this site.
pages.login.newPasswordI18N_en_pages_login_newPassword
New password
pages.login.maildevLinkI18N_en_pages_login_maildevLink
Open the development mail box
pages.login.emailCaptionI18N_en_pages_login_emailCaption
Learn more about <a href="https://medium.com/@ninjudd/passwords-are-obsolete-9ed56d483eb">passwordless</a> authentication
pages.login.newPassword2I18N_en_pages_login_newPassword2
Confirm new password
pages.login.createUserMsg1I18N_en_pages_login_createUserMsg1
If you didn't already connect to our platform you must create an account.
pages.login.newPasswordMsgI18N_en_pages_login_newPasswordMsg
Type twice the new password.
pages.login.createUserMsg2I18N_en_pages_login_createUserMsg2
Create an account.
pages.login.changePasswordI18N_en_pages_login_changePassword
Renew the password.
pages.login.passwordlessMsg1I18N_en_pages_login_passwordlessMsg1
To login an email is sufficient.
pages.login.passwordlessMsg2I18N_en_pages_login_passwordlessMsg2
Send a login email.
pages.login.createUserConfirmI18N_en_pages_login_createUserConfirm
Create the account
pages.login.changePasswordSentI18N_en_pages_login_changePasswordSent
An email was sent to the address {email}. This email contains a link to change the password of your account.
pages.login.createUserConfirmedI18N_en_pages_login_createUserConfirmed
An email was sent to the address {email}. This email contains a link to validate the creation of your account.
pages.login.passwordlessConfirmedI18N_en_pages_login_passwordlessConfirmed
An email was sent to the address {email}. This email contains a link to connect to the platform.
pages.login.changePasswordTooltipI18N_en_pages_login_changePasswordTooltip
In case you forgot your password or if you need to change it, renew your password.
pages.avatar.prepareI18N_en_pages_avatar_prepare
Prepare the image
pages.invitation.titleI18N_en_pages_invitation_title
Invitation validated
pages.invitation.msgSameUserI18N_en_pages_invitation_msgSameUser
Your invitation to become member of an organization has been validated. You can visit <a href="{profileUrl}">your profile</a>.
pages.invitation.msgDifferentUserI18N_en_pages_invitation_msgDifferentUser
This invitation to become member of an organization has been validated. You can <a href="{loginUrl}">login with</a> the invited account.
pages.organization.nextI18N_en_pages_organization_next
Next
pages.organization.backI18N_en_pages_organization_back
Back
pages.organization.addMemberI18N_en_pages_organization_addMember
Invite a user to join this organization
pages.organization.editMemberI18N_en_pages_organization_editMember
Change the role of this user in the organization
pages.organization.inviteEmailI18N_en_pages_organization_inviteEmail
Email address of the user
pages.organization.deleteMemberI18N_en_pages_organization_deleteMember
Delete this user from the list of members
pages.organization.inviteSuccessI18N_en_pages_organization_inviteSuccess
An invitation was sent to the address {email}
pages.organization.disableInviteI18N_en_pages_organization_disableInvite
This organization already contains its maximum number of members.
pages.organization.memberConflictI18N_en_pages_organization_memberConflict
This user is already a member
pages.organization.deleteMemberSuccessI18N_en_pages_organization_deleteMemberSuccess
The user {name} was excluded from the organization
pages.organization.departmentIdInvalidI18N_en_pages_organization_departmentIdInvalid
Identifier should contain anly letters, numbers and spaces
pages.organization.confirmDeleteMemberMsgI18N_en_pages_organization_confirmDeleteMemberMsg
Do you really want to delete this user from the list of members of this organization ?
pages.organization.confirmEditMemberTitleI18N_en_pages_organization_confirmEditMemberTitle
Change {name}
pages.organization.confirmDeleteMemberTitleI18N_en_pages_organization_confirmDeleteMemberTitle
Exclude {name}
pages.admin.users.explainLimitI18N_en_pages_admin_users_explainLimit
Define a value to limit the number of organizations the user can create. -1 for an indeterminate value. Empty the field to fallback on the default value ({defaultMaxCreatedOrgs}).
pages.admin.users.createdOrgsLimitI18N_en_pages_admin_users_createdOrgsLimit
The users can create {defaultMaxCreatedOrgs} organization(s) by default.
pages.admin.users.noCreatedOrgsLimitI18N_en_pages_admin_users_noCreatedOrgsLimit
The users can create an indeterminate number of organizations.
pages.admin.organizations.membersI18N_en_pages_admin_organizations_members
member(s)
pages.admin.organizations.nbMembersI18N_en_pages_admin_organizations_nbMembers
maximum number of members (0 for no limit)
pages.admin.organizations.limitOrganizationTitleI18N_en_pages_admin_organizations_limitOrganizationTitle
Edit the limits of the organization

Powered by Simple Directory