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.