MusareNode
Based off of the original Musare, which utilized Meteor.
MusareNode now uses NodeJS, Express, VueJS and websockets - among other technologies. We have also implemented the ability to host Musare in Docker Containers.
The master branch is available at musare.com You can also find the staging branch at musare.dev
Our Stack
- NodeJS
- MongoDB
- Redis
- Nginx (not required)
- VueJS
Frontend
The frontend is a vue-cli generated, vue-loader single page app, that's served over Nginx or Express. The Nginx server not only serves the frontend, but can also serve as a load balancer for requests going to the backend.
Backend
The backend is a scalable NodeJS / Redis / MongoDB app. User sessions are stored in a central Redis server. All data is stored in a central MongoDB server. The Redis and MongoDB servers are replicated to several secondary nodes, which can become the primary node if the current primary node goes down.
We currently only utilize 1 backend, 1 MongoDB server and 1 Redis server running for production, though it is relatively easy to expand.
Getting Started & Configuration
-
git clone https://github.com/Musare/MusareNode.git
-
cd MusareNode
-
cp backend/config/template.json backend/config/default.json
Property Description mode
Should be either development
orproduction
. No more explanation needed.migration
Should be set to true if you need to update DB documents to a newer version after an update. Should be false at all other times. secret
Whatever you want - used by express's session module. domain
Should be the url where the site will be accessible from, usually http://localhost
for non-Docker.serverDomain
Should be the url where the backend will be accessible from, usually http://localhost/backend
for docker orhttp://localhost:8080
for non-Docker.serverPort
Should be the port where the backend will listen on, should always be 8080
for Docker, and is recommended for non-Docker.registrationDisabled
If set to true, users can't register accounts. apis.youtube.key
Can be obtained by setting up a YouTube API Key. You need to use the YouTube Data API v3, and create an API key. apis.recaptcha.secret
Can be obtained by setting up a ReCaptcha Site (v3). apis.recaptcha.enabled
Keep at false to keep disabled. apis.github
Can be obtained by setting up a GitHub OAuth Application. You need to fill in some values to create the OAuth application. The homepage is the homepage of frontend. The authorization callback url is the backend url with /auth/github/authorize/callback
added at the end. For examplehttp://localhost/backend/auth/github/authorize/callback
.apis.discogs
Can be obtained by setting up a Discogs application, or you can disable it. smtp
Can be obtained by setting up an SMTP server, using a provider such as Mailgun, or you can disable it. redis.url
Should be left alone for Docker, and changed to redis://localhost:6379/0
for non-Docker.redis.password
Should be the Redis password you either put in your startRedis.cmd
file for Windows, or.env
for docker.mongo.url
Needs to have the proper password for the MongoDB musare user, and for non-Docker you need to replace @musare:27017
with@localhost:27017
.cookie.domain
Should be the ip or address you use to access the site, without protocols (http/https), so for example localhost
.cookie.secure
Should be true
for SSL connections, andfalse
for normal http connections.skipConfigVersionCheck
Skips checking if the config version is outdated or not. Should almost always be set to false. skipDbDocumentsVersionCheck
Skips checking if there are any DB documents outdated or not. Should almost always be set to false. configVersion
Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion. -
cp frontend/build/config/template.json frontend/build/config/default.json
Property Description apiDomain
Should be the url where the backend will be accessible from, usually http://localhost/backend
for docker orhttp://localhost:8080
for non-Docker.websocketsDomain
Should be the same as the apiDomain
, except using thews://
protocol instead ofhttp://
and with/ws
at the end.frontendDomain
Should be the url where the frontend will be accessible from, usually http://localhost
for docker orhttp://localhost:80
for non-Docker.frontendPort
Should be the port where the frontend will be accessible from, should always be port 81
for Docker, and is recommended to be port80
for non-Docker.recaptcha.key
Can be obtained by setting up a ReCaptcha Site (v3). recaptcha.enabled
Keep at false to keep disabled. cookie.domain
Should be the ip or address you use to access the site, without protocols (http/https), so for example localhost
.cookie.secure
Should be true
for SSL connections, andfalse
for normal http connections.siteSettings.logo
Path to the logo image, by default it is /assets/wordmark.png
.siteSettings.siteName
Should be the name of the site. siteSettings.github
URL of GitHub repository, defaults to https://github.com/Musare/MusareNode
.skipConfigVersionCheck
Skips checking if the config version is outdated or not. Should almost always be set to false. configVersion
Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion. -
Simply
cp .env.example .env
to setup your environment variables.
Installation
After initial configuration, there are two different options to use for your local development environment.
We highly recommend using Docker - both for stability and speed of setup. We also use Docker on our production servers.
Docker
-
Configure the
.env
file to match your settings inbackend/config/default.json
.Property Description Ports Will be how you access the services on your machine, or what ports you will need to specify in your nginx files when using proxy_pass. COMPOSE_PROJECT_NAME
Should be a unique name for this installation, especially if you have multiple instances of Musare on the same machine. FRONTEND_MODE
Should be either dev
orprod
(self-explanatory).MONGO_ROOT_PASSWORD
Password of the root/admin user of MongoDB MONGO_USER_USERNAME
Password for the "musare" user (what the backend uses) of MongoDB -
Install Docker for Desktop
-
Build the backend and frontend Docker images (from the root folder)
docker-compose build
-
Start the MongoDB database (in detached mode), which will generate the correct MongoDB users based on the
.env
file.docker-compose up -d mongo
-
If you want to use linting extensions in IDEs, then you must attach the IDE to the docker containers. This is entirely possible with VS Code.
Standard Setup
Installation
-
Install NodeJS
-
Install nodemon globally
npm install -g nodemon
-
Install node-gyp globally (first check out https://github.com/nodejs/node-gyp#installation)
npm install -g node-gyp
.
-
-
Install webpack globally
npm install -g webpack
Setting up MongoDB
-
In the root directory, create a folder called
.database
-
Create a file called
startMongo.cmd
in the root directory with the contents:"C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe" --dbpath "D:\Programming\HTML\MusareNode\.database"
Make sure to adjust your paths accordingly.
-
Set up the MongoDB database itself
-
Start the database by executing the script
startMongo.cmd
you just made -
Connect to Mongo from a command prompt
mongo admin
-
Create an admin user
db.createUser({user: 'admin', pwd: 'PASSWORD_HERE', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]})
-
Connect to the Musare database
use musare
-
Create the "musare" user
db.createUser({user: 'musare', pwd: 'OTHER_PASSWORD_HERE', roles: [{role: 'readWrite', db: 'musare'}]})
-
Exit
exit
-
Add the authentication
In
startMongo.cmd
add--auth
at the end of the first line
-
Setting up Redis
-
In the folder where you installed Redis, edit the
redis.windows.conf
file-
In there, look for the property
notify-keyspace-events
. -
Make sure that property is uncommented and has the value
Ex
.It should look like
notify-keyspace-events Ex
when done.
-
-
Create a file called
startRedis.cmd
in the main folder with the contents:"D:\Redis\redis-server.exe" "D:\Redis\redis.windows.conf" "--requirepass" "PASSWORD"
And again, make sure that the paths lead to the proper config and executable. Replace
PASSWORD
with your Redis password.
Everyday usage
Docker
-
Start the MongoDB database in the background.
docker-compose up -d mongo
-
Start redis and the mongo client in the background, as we usually don't need to monitor these for errors.
docker-compose up -d mongoclient redis
-
Start the backend and frontend in the foreground, so we can watch for errors during development.
docker-compose up backend frontend
-
You should now be able to begin development!
The backend is auto reloaded when you make changes and the frontend is auto compiled and live reloaded by webpack when you make changes.
You should be able to access Musare in your local browser at
http://localhost:8080/
.
Standard Setup
Automatic
- If you are on Windows you can run
windows-start.cmd
or just double click thewindows-start.cmd
file and all servers will automatically start up.
Manual
-
Run
startRedis.cmd
andstartMongo.cmd
to start Redis and Mongo. -
Execute
cd frontend && npm dev
andcd backend && npm dev
separately.
Extra
Below is a list of helpful tips / solutions we've collected while developing MusareNode.
Fixing the "couldn't connect to docker daemon" error
Some people have had issues while trying to execute the docker-compose
command.
To fix this, you will have to run docker-machine env default
.
This command will print various variables.
At the bottom, it will say something similar to @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
.
Run this command in your shell. You will have to do this command for every shell you want to run docker-compose
in (every session).
Calling Toasts
You can create Toast notifications using our custom package, toasters
, using the following code:
import Toast from "toasters";
new Toast({ content: "Hi!", persistant: true });
Set user role
When setting up you will need to grant yourself the admin role, using the following commands:
docker-compose exec mongo mongo admin
use musare
db.auth("MUSAREDBUSER","MUSAREDBPASSWORD")
db.users.update({username: "USERNAME"}, {$set: {role: "admin"}})
OR use the Linux script:
tools/linux/makeUserAdmin.sh YOUR_MUSARE_USERNAME YOUR_MONGO_MUSARE_PASSWORD
Contact
Get in touch with us via email at core@musare.com or join our Discord Guild.