6.5 KiB
Monkeytype Self Hosting
Table of contents
Prerequisites
- you need
dockeranddocker-compose-plugininstalled. Follow the docker documentation on how to do this.
Quickstart
- create a new directory, e.g.
monkeytypeand open it. - download the docker-compose.yml
- create an
.envfile, you can copy the content from the example.env. - download the backend-configuration.json
- run
docker compose up -d - after the command exits successfully you can access http://localhost:8080
Account System
User signup/login is disabled by default. To allow users to signup you'll need to setup a Firebase project.
Stop the running docker containers using docker compose down before making any changes.
Setup Firebase
-
create a Firebase account
-
create a new Firebase project.
- name "monkeytype"
- uncheck "enable google analytics"
-
enable authentication
- open the firebase console and open your project
- go to
Authentication > Sign-in method - enable
Email/Passwordand save
-
generate service account
- open the project settings by clicking the
⚙icon on the sidebar andProject settings - go to
Service accounts - click
Generate new private key. This will download a.jsonfile. - store the
.jsonfile asserviceAccountKey.json - update the
docker-compose.ymlfile and uncomment the first volume from themonkeytype-backendcontainer#uncomment to enable the account system, check the SELF_HOSTING.md file - type: bind source: ./serviceAccountKey.json target: /app/backend/src/credentials/serviceAccountKey.json read_only: true
- open the project settings by clicking the
-
update the
.envfile- open the firebase console and open your project
- open the project settings by clicking the
⚙icon on the sidebar andProject settings - if there is no app in your project create a new web-app
</>- nickname
monkeytype - uncheck
set up firebase hosting - click
Register app
- nickname
- select your app and select
ConfigforSDK setup and configuration - it will display sth like this:
const firebaseConfig = { apiKey: "AAAAAAAA", authDomain: "monkeytype-00000.firebaseapp.com", projectId: "monkeytype-00000", storageBucket: "monkeytype-00000.appspot.com", messagingSenderId: "90000000000", appId: "1:90000000000:web:000000000000" }; - update the
.envfile with the values above:FIREBASE_APIKEY=AAAAAAAA FIREBASE_AUTHDOMAIN=monkeytype-00000.firebaseapp.com FIREBASE_PROJECTID=monkeytype-00000 FIREBASE_STORAGEBUCKET=monkeytype-00000.appspot.com FIREBASE_MESSAGINGSENDERID=90000000000 FIREBASE_APPID=1:90000000000:web:000000000000
Update backend configuration
- update the
backend-configuration.jsonfile and add/modify{ "users": { "signUp": true, "profiles": { "enabled": true } } }
Setup Recaptcha
- create a new recaptcha token
- label: monkeytype
- type: v2
- domain: the domain of the frontend
- update the
.envfile with the site key from the previous stepRECAPTCHA_SITE_KEY="your site key" RECAPTCHA_SECRET="your secret key"
Enable daily leaderboards
To enable daily leaderboards update the backend-configuration.json file and add/modify
{
"dailyLeaderboards": {
"enabled": true,
"maxResults": 250,
"leaderboardExpirationTimeInDays": 1,
"validModeRules": [
{
"language": "english",
"mode": "time",
"mode2": "15"
},
{
"language": "english",
"mode": "time",
"mode2": "60"
}
]
}
}
- language is one of the supported language
- mode can be
timeorwords - mode2 can be
15,30,60or120if you pickedmode=timeor10,25,50or100if you pickedmode=words.
Configuration files
env file
All settings are described in the example.env file.
serviceAccountKey.json
Contains your firebase config, only needed if you want to allow users to signup.
backend-configuration.json
Configuration of the backend.
If you don't want to update this file manually you can
- open the backend url in your browser, e.g.
http://localhost:5005/configure/ - adjust the settings and click
Save Changes - open the configuration in your browser, e.g.
http://localhost:5005/configuration - copy everything from
datainto thebackend-configuration.jsonfile.
Example output from http://localhost:5005/configuration:
{
"message": "Configuration retrieved",
"data":
{
"maintenance": false,
"results": {},
....
}
}
Example content from backend-configuration.json:
{
"maintenance": false,
"results": {},
....
}
If you have curl and jq installed you can also run curl -wO- http://localhost:5005/configuration | jq ".data" > backend-configuration.json to update the configuration file.
Note
The configuration is applied on container startup only. You have to restart the container for your changes to become active.