monkeytype/docs/SELF_HOSTING.md
Christian Fehmer f80dde4c89
chore(self hosting): run selfhosted backend in prod mode (@fehmer) (#6326)
Co-authored-by: Miodec <jack@monkeytype.com>
2025-03-03 17:43:08 +01:00

5.9 KiB

Monkeytype Self Hosting

Table of contents

Prerequisites

  • you need docker and docker-compose-plugin installed. Follow the docker documentation on how to do this.

Quickstart

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/Password and save
  • generate service account

    • open the project settings by clicking the icon on the sidebar and Project settings
    • go to Service accounts
    • click Generate new private key. This will download a .json file.
    • store the .json file as serviceAccountKey.json
    • update the docker-compose.yml file and uncomment the first volume from the monkeytype-backend container
        #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
      
  • update the .env file

    • open the firebase console and open your project
    • open the project settings by clicking the icon on the sidebar and Project settings
    • if there is no app in your project create a new web-app </>
      • nickname monkeytype
      • uncheck set up firebase hosting
      • click Register app
    • select your app and select Config for SDK 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 .env file 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.json file 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 .env file with the site key from the previous step
    RECAPTCHA_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 time or words
  • mode2 can be 15,30,60 or 120 if you picked mode=time or 10,25,50 or 100 if you picked mode=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. Check the default configuration for possible values.

Note

The configuration is applied on container startup only. You have to restart the container for your changes to become active.