2024-03-12 19:02:13 +08:00
# Monkeytype Self Hosting
<!-- TOC ignore:true -->
## Table of contents
<!-- TOC -->
- [Monkeytype Self Hosting ](#monkeytype-self-hosting )
- [Table of contents ](#table-of-contents )
- [Prerequisites ](#prerequisites )
- [Quickstart ](#quickstart )
- [Account System ](#account-system )
- [Setup Firebase ](#setup-firebase )
- [Update backend configuration ](#update-backend-configuration )
- [Setup Recaptcha ](#setup-recaptcha )
- [Enable daily leaderboards ](#enable-daily-leaderboards )
- [Configuration files ](#configuration-files )
- [env file ](#env-file )
- [serviceAccountKey.json ](#serviceaccountkeyjson )
- [backend-configuration.json ](#backend-configurationjson )
<!-- /TOC -->
## Prerequisites
- you need `docker` and `docker-compose-plugin` installed. Follow the [docker documentation ](https://docs.docker.com/compose/install/ ) on how to do this.
## Quickstart
- create a new directory, e.g. `monkeytype` and open it.
- download the [docker-compose.yml ](https://github.com/monkeytypegame/monkeytype/tree/master/docker/docker-compose.yml )
- create an `.env` file, you can copy the content from the [example.env ](https://github.com/monkeytypegame/monkeytype/tree/master/docker/example.env ).
- download the [backend-configuration.json ](https://github.com/monkeytypegame/monkeytype/tree/master/docker/backend-configuration.json )
- run `docker compose up -d`
2024-06-03 18:14:18 +08:00
- after the command exits successfully you can access [http://localhost:8080 ](http://localhost:8080 )
2024-03-12 19:02:13 +08:00
## Account System
User signup/login is disabled by default. To allow users to signup you'll need to setup a Firebase project.
2024-04-02 17:54:57 +08:00
Stop the running docker containers using `docker compose down` before making any changes.
2024-03-12 19:02:13 +08:00
### Setup Firebase
- create a [Firebase ](https://firebase.google.com/ ) account
- create a [new Firebase project ](https://console.firebase.google.com/u/0/ ).
- name "monkeytype"
- uncheck "enable google analytics"
- enable authentication
- open the [firebase console ](https://console.firebase.google.com/ ) 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`
2024-04-02 17:54:57 +08:00
- update the `docker-compose.yml` file and uncomment the first volume from the `monkeytype-backend` container
```yaml
#uncomment to enable the account system, check the SELF_HOSTING.md file
- type: bind
source: ./serviceAccountKey.json
2024-07-22 21:08:11 +08:00
target: /app/backend/src/credentials/serviceAccountKey.json
2024-04-02 17:54:57 +08:00
read_only: true
```
2024-03-12 19:02:13 +08:00
- update the `.env` file
- open the [firebase console ](https://console.firebase.google.com/ ) and open your project
- open the project settings by clicking the `⚙` icon on the sidebar and `Project settings`
2024-06-03 18:14:18 +08:00
- if there is no app in your project create a new web-app `</>`
2024-03-12 19:02:13 +08:00
- 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:
```
2024-05-13 18:26:46 +08:00
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
2024-03-12 19:02:13 +08:00
```
### Update backend configuration
- update the `backend-configuration.json` file and add/modify
```json
{
"users": {
"signUp": true,
"profiles": {
"enabled": true
}
}
}
```
### Setup Recaptcha
- [create ](https://www.google.com/recaptcha/admin/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
```json
{
"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 ](https://github.com/monkeytypegame/monkeytype/tree/master/docker/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 `data` into the `backend-configuration.json` file.
Example output from `http://localhost:5005/configuration` :
```json
{
"message": "Configuration retrieved",
"data":
{
"maintenance": false,
"results": {},
....
}
}
```
Example content from `backend-configuration.json` :
```
{
"maintenance": false,
"results": {},
....
}
```
2024-06-03 18:14:18 +08:00
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.
2024-03-12 19:02:13 +08:00
2024-05-28 16:32:23 +08:00
> [!NOTE]
> The configuration is applied on container startup only. You have to restart the container for your changes to become active.