This is meant as a way for subreddits to provide transparency in their moderation.
If you're a moderator and want to enable Mod Logs for your subreddit, take a look at the Moderator Instructions file.
Moderator logs are fetched from the reddit API and stored in a Mongo database. The reddit API only provides logs for the past 120 days and doesn't provide a lot of flexibility in terms of filtering those logs, so we store them ourselves.
You'll need:
- Node 7+
- MongoDB
- Redis
Run yarn install
to install the JS dependencies.
Mongo is used to store the moderator logs that we fetch. Redis is used to queue the log fetching and report processing.
Run ./run-dev
. You can pass any valid docker-compose up
arguments to that script, e.g. ./run-dev -d nginx
. Make sure the appropriate environment variables are set.
Add the following lines to your hosts file:
127.0.0.1 modlogs.local
127.0.0.1 login.modlogs.local
Then you'll be able to access the UI at https://modlogs.local:4241. The server will be running in watch-mode, and UI hot reload will work.
yarn ui:build
and yarn server:build
to build, then <env vars> yarn server:run
to run.
Or just run docker-compose -f docker/docker-compose.yml up
.
The app is also dockerized for ease of deployment. There are a few docker images:
web
: runs the API server and serves the UI. be sure to provide the correct env vars (see below)worker
: queues and processes logs, reports, etc. also needs env varsmongo
: runs the mongo databaselogin
: a small OAuth microservice from login-withnginx
: frontend for theweb
andlogin
servicesredis
: runs the redis server for the worker queue
Make sure to pass the appropriate environment variables into the docker containers when they're run.
variable | default | required by | note |
---|---|---|---|
PORT |
4245 |
web |
the port that the server will listen on |
APP_ID |
worker |
the app ID given by reddit for API access | |
APP_SECRET |
worker |
the app secret given by reddit for API access | |
REDDIT_USER |
worker |
the reddit username to authenticate with | |
REDDIT_PASSWORD |
worker |
the reddit password to authenticate with | |
USER_AGENT |
worker |
the user agent to send with reddit API calls | |
MONGODB_URI |
mongodb://localhost:modlogs |
web , worker |
the URI of your mongo server |
REDIS_URL |
redis://localhost |
worker |
the URI of your redis server |
ANALYTICS_KEY |
web (during ui:build command only) |
the google analytics key | |
LW_SESSION_SECRET |
login |
https://github.com/lipp/login-with#mandatory-environment-variables | |
LW_JWT_SECRET |
login |
https://github.com/lipp/login-with#mandatory-environment-variables | |
LW_REDDIT_CLIENTID |
login |
https://github.com/lipp/login-with#reddit-specific-environment-variables | |
LW_REDDIT_CLIENTSECRET |
login |
https://github.com/lipp/login-with#reddit-specific-environment-variables | |
AWS_ACCESS_KEY_ID |
worker |
for AWS glacier backups | |
AWS_SECRET_ACCESS_KEY |
worker |
for AWS glacier backups | |
GLACIER_BACKUP_VAULT |
worker |
||
GLACIER_BACKUP_REGION |
worker |
||
NODE_ENV |
production |
web |
|
LOG_LEVEL |
info |
web , worker |
|
ENABLE_METRIC_REPORTING |
false |
worker |
if enabled, logs certain metrics (reddit API hits, reports, etc) to an internal mongo db. disabled by default |
Subreddit, log and report processing are queued. There are two components to this: producers and consumers.
The consumers should be run in a worker process which stays running continuously:
<env vars> node build/server/queue/consumers
This will ensure that any new queue items are processed.
The producers should be run periodically. There are currently three producers: one to fetch the list of subreddits, one for the logs and one for PMs which produce moderator reports:
<env vars> node -e "require('build/server/queue/producers/modlogs').run()"
<env vars> node -e "require('build/server/queue/producers/messages').run()"
<env vars> node -e "require('build/server/queue/producers/subreddits').run()"
The env vars marked as required by worker
are needed for both.
Tests are run using jest
.
To run the tests, run yarn test
for a single run or yarn test:watch
to run in watch mode. You can also pass additional options to jest by running yarn test -- --opt1 --opt2 [etc]
.
The tests rely on a running Mongo DB accessible at either mongodb://localhost:27017
or whatever the environment variable MONGODB_URI
is set to.