Skip to content

Tutorials

NodeBB guides, how-to's and general tips and tricks

82 Topics 599 Posts
  • 0 Votes
    6 Posts
    2k Views
    barisB

    @faizanzahid Yes

  • sticky sidebar widgets

    7
    5 Votes
    7 Posts
    3k Views
    F

    @fais3000 if they add this in core, it would be cool.

  • This topic is deleted!

    1
    0 Votes
    1 Posts
    13 Views
  • 1 Votes
    1 Posts
    1k Views
    R

    I want to run 2 different websites in the same vps. 1st is wordpress and 2nd is nodebb. I am a newbie here. Can anyone please guide me with a detailed tutorial?

  • How to recover from a broken plugin

    2
    0 Votes
    2 Posts
    2k Views
    julianJ

    To expand on this, you can reset more than plugins!

    ./nodebb reset -t restores the Persona theme. You can specify a theme name to switch to that theme.

  • 4 Votes
    1 Posts
    1k Views
    julianJ

    As part of the creation of the Tenor GIF plugin, I needed to add a button to the composer toolbar:

    gif button in composer

    Normally, this is fairly straightforward. filter:composer.formatting is called, and caught with this listener:

    plugin.registerFormatting = function (payload, callback) { payload.options.push({ name: 'gif', className: 'fa fa-tenor-gif', title: 'Insert GIF' }); callback(null, payload); };

    The className denotes a class name (of course), and if you use fa and and corresponding fa-* class, you can select from hundreds of possible icons. Unfortunately for me, there was no "gif" icon, nor one for Tenor GIF.

    So I had to set out to make my own. To do this, you'll see that above, I set the class fa-tenor-gif. This maps to nothing, since the icon doesn't exist. However, it does provide a nice easy way to find and style the button itself.

    Then in my stylesheet, I simply added this styling to create my button via CSS pseudo-elements:

    .fa-tenor-gif::before { content: 'GIF'; font-size: 1rem; font-family: sans; background: #333; color: #fff; padding: 0.25rem 0.5rem; border-radius: 0.5em; position: relative; top: -0.2rem; }

    I wanted to go for a "badge-like" icon, since the text "GIF" fairly easily indicates what its purpose is for, hence the dark background, light text, and slight border radius.

    If you wanted to do something else, like replace the icon with a picture of your own, then you might want to look into using background-image, but that is outside of the scope of this tutorial 😄

  • 1 Votes
    1 Posts
    1k Views
    barisB

    This is a simple widget tutorial to turn a topic into a twitter timeline. The end result will look like this.

    0_1510068225857_81b76a4a-720a-47d4-b7b0-b9e671e52dd8-image.png

    First create a topic that will be the home of the twitter widget and record its topic id.

    Now go to /admin/extend/widgets and place a html widget on topic.tpl/header. The standard twitter timeline widget code only works on cold loads so we have to modify it for NodeBB. You can generate the twitter widget at https://twitter.com/settings/widgets, after you copy that code you have to replace the <script> block with the one provided below.

    <script> !function(d,s,id){ var js,p=/^http:/.test(d.location)?'http':'https'; var el = d.getElementById(id); if (el) { el.parentNode.removeChild(el); } if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + "://platform.twitter.com/widgets.js"; var fjs = d.getElementsByTagName(s)[0]; fjs.parentNode.insertBefore(js,fjs); } }(document,"script","twitter-wjs"); </script>

    Here is the full widget code for NodeBB's twitter timeline. You can copy paste it into your HTML widget and replace every <topic_id> with your own topic id.

    <style> .page-topic-<topic_id> .topic { display: none; } .page-topic .twitter-timeline { display: none !important; width: 100% !important; height: 800px !important; } .page-topic-<topic_id> .twitter-timeline { display: block !important; } </style> <a class="twitter-timeline" href="https://twitter.com/NodeBB" data-widget-id="433016924318883841">Tweets by @NodeBB</a> <script> !function(d,s,id){ var js,p=/^http:/.test(d.location)?'http':'https'; var el = d.getElementById(id); if (el) { el.parentNode.removeChild(el); } if (!d.getElementById(id)) { js = d.createElement(s); js.id = id; js.src = p + "://platform.twitter.com/widgets.js"; var fjs = d.getElementsByTagName(s)[0]; fjs.parentNode.insertBefore(js,fjs); } }(document,"script","twitter-wjs"); </script>

    Once you have the widget, you can customize it with data attributes, for more info you can read https://dev.twitter.com/web/embedded-timelines

  • High performance stack

    14
    11 Votes
    14 Posts
    9k Views
    A

    @master-antonio sorry if I read this after such a long time. But why not? Lets see how well Markdown can be used for docs.

  • How to Install NodeBB on Plesk v12.5.30

    5
    4 Votes
    5 Posts
    5k Views
    ross03R

    Thank for sharing 😄

  • 0 Votes
    1 Posts
    2k Views
    B

    I have nginx proxying to nodebb, from a /forum/ location.

    I wanted to serve up static contents with nginx - the example here - https://docs.nodebb.org/en/latest/scaling/#use-a-proxy-server-to-serve-static-assets assumes you have the forum running off the root. If running from a subfolder, it can be simplified to this (the public folder is tried first, followed by the proxy if no file exists).

    Here's my config using nginx to serve up the static content (just the locations/configs for nodebb included, I have a wordpress site running of the htdocs root)

    upstream io_nodes { ip_hash; server 127.0.0.1:4567; # upstream nodebb servers here } server { listen 443 default_server ssl; listen [::]:443 default_server ssl; server_name your.site; root /webroot/of/site; index index.html index.php; location /forum { alias /path/to/nodebb/public; try_files $uri @nodebb; } location @nodebb { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_redirect off; # Socket.IO Support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://io_nodes; } }
  • 0 Votes
    3 Posts
    2k Views
    julianJ

    Nice tutorial! Good to know iptables can be used to forward ports like this.

    I do believe NodeBB can be configured to terminate SSL certificates, but it hasn't been done in awhile because we much prefer nginx 😄

  • 3 Votes
    6 Posts
    5k Views
    T

    Bringing an old thread to life again, sorry!

    I'd also love some help with the instructions for running this in a Docker image. It would make life a bit easier for deploying this in DigitalOcean.

  • 0 Votes
    6 Posts
    4k Views
    C

    It's just what I needed. Thanks

  • NodeBB - Getting ads working

    17
    7 Votes
    17 Posts
    10k Views
    JenklerJ

    Focus on this thread!
    https://community.nodebb.org/topic/9638/nodebb-and-ads-a-never-ending-story-part-2

  • Video tutorials: ideas?

    3
    7 Votes
    3 Posts
    3k Views
    julianJ

    @absurdsmash I think that's a bit out of the scope of what @jay wants done 😄

  • Extend invite token validity

    1
    0 Votes
    1 Posts
    1k Views
    C

    Hi,

    How extend this 24H invite token validity ?

    Thank you 🙂

  • Running nodebb with plesk [tips]

    1
    3 Votes
    1 Posts
    2k Views
    kenthuiK

    Hi everybody,

    My server have install Plesk, because I want run somethings on my server.

    I install nodebb by command line, and ready to run at localhost:4567

    Pls follow with image to config nodebb on plesk.

    Install htaccess to nginx

    0_1468850536240_1.jpg

    Add package

    0_1468850572040_2.jpg

    Select Apache & nginx Settings

    0_1468850619741_3.jpg

    Copy, paste and enjoy

    0_1468850668048_4.jpg

    Done

  • Creating a registration interstitial

    1
    2 Votes
    1 Posts
    2k Views
    julianJ
    What is a registration interstitial?

    When a user registers for a new account, they may be presented with an intermediate step (or "intersitial") before the registration is completed. Alternatively, the interstitial can be invoked after registration.

    You may use this opportunity to obtain additional information about the user for your plugin.

    In this tutorial, we'll be updating the Facebook SSO plugin to capture user emails upon registration.

    The filter:register.interstitial hook

    The hook filter:register.interstitial is fired whenever a user registers for a new account. It is also fired if the user session contains a registration object, and in processing the interstitial page itself.

    The hook signature is {data, callback}, and data contains the following:

    userData (Object) The registration data collected so far interstitials (Array) A collection of interstitial objects, which you can append to if necessary. An interstitial object is: template (String) A template served by your plugin that will be included into the interstitial page data (Object) When rendering the above template, any data needed can go here callback (Function [userData, formData, callback]) When the interstitial page is completed, this callback method will be executed, with the form data included in the second parameter

    In the case of Facebook SSO, we want to capture user email addresses because Facebook may not provide the correct email to us (or at all). By looking at the code, we can see that if the email is not present, we create a fake email ending with @facebook.com.

    Step 1: Invoking the interstitial

    Upon completion of SSO registration, we save uid and fbid into req.session.registration. Once this object is set in the user session, NodeBB will automatically forward the user to the registration interstitial:

    // Require collection of email req.session.registration = req.session.registration || {}; req.session.registration.uid = user.uid; req.session.registration.fbid = profile.id; Step 2: filter:register.interstitial listener

    Now, we will create a new listener to the filter:register.interstitial hook, and have it add an interstitial if the email ends with @facebook.com:

    Facebook.prepareInterstitial = function(data, callback) { // Only execute if: // - uid and fbid are set in session // - email ends with "@facebook.com" if (data.userData.hasOwnProperty('uid') && data.userData.hasOwnProperty('fbid')) { user.getUserField(data.userData.uid, 'email', function(err, email) { if (email.endsWith('@facebook.com')) { data.interstitials.push({ template: 'partials/sso-facebook/email.tpl', data: {}, callback: Facebook.storeAdditionalData }); } callback(null, data); }); } else { callback(null, data); } };

    To note, when registering the interstitial (data.interstitials.push...), we define the template as partials/sso-facebook/email.tpl. This tempate is defined in the plugin itself.

    Secondly, the callback calls Facebook.storeAdditionalData. That method is also defined by the Facebook SSO plugin, and handles updating the user email as passed in via the interstitial page.

  • How To: NodeBB Forum Monitoring

    5
    2 Votes
    5 Posts
    5k Views
    R

    @Bri you've convinced me to look at Datadog again. I like the idea of having a history of the system statistics.

    I will keep my post updated if I feel I've found additional resources that may be beneficial to others.

    Thank you.

  • 7 Votes
    1 Posts
    4k Views
    R
    Create & Manage a NodeBB Test/Dev Environment Table of Contents Summary Caveats Webserver Nginx NodeBB PRD -> DEV Adjustments to DEV Upgrading DEV NodeBB Delete DEV Fresh NodeBB with PRD database Summary

    The old saying goes

    Laws are like sausages, it is better not to see them being made.

    Managing NodeBB isn't as bad as that but there could be a bit of a challenge the first few times that you attempt to upgrade your software or install a new feature. Especially on your production system! So what can you do?

    Make a sausage factory of course! In our case the factory is a test/development environment to practice your upgrades or test a new plugin or CSS change. You do not necessarily need to spend additional money on a test/dev server, although you could. You can spin up a copy of your production system right on your production system. This is not very difficult due in part to how well NodeBB, and Node.js, were created.

    Caveats

    For disclosure I am not a developer of NodeBB or any of the supporting applications. These notes are just that, a collection of my notes as I was experimenting and learning. I do have twenty-four years of IT experience, mostly Unix (SunOS, Solaris, AIX, BSD, Linux) which includes twenty-four years of bad habits and ugly kludges. I do hope that in those years I have picked up a few gems and learned a few good traits. I will try to pass along only the best but please do accept the ugly as they come.

    My NodeBB forum runs on a Linux (CentOS) server. I utilize Redis as my NodeBB database and use Nginx as my web server. This document, unless noted otherwise, will reference that environment.

    I am making the assumption that you have a production NodeBB server that is fully operational and you wish to create a dev/test copy of it on the same server.

    And finally, The risk is yours. I do not take responsibility for harm to your system. Please evaluate all of my suggestions as you deem necessary.

    Webserver Nginx

    This addition should only need to be made once. After it is in place you should be able to create and delete dev NodeBB environments from your production without needing to adjust your Nginx configuration.

    You will need to make a new server block in your Nginx domain configuration file. Most likely located in /etc/nginx/sites-available/yourforumdomain.com.conf. This new server block will have the specifics for your dev NodeBB. For example you may create an entry like:

    server { listen 443 ssl; server_name dev.yourforumdomain.com; [...]

    In your location / { location block you will need a proxy_pass entry that directs to the port that your dev NodeBB will listen on:

    location / { [...] proxy_pass http://127.0.0.1:4568; [...]

    Once you have your Nginx configuration adjusted appropriately do not forget to restart it. sudo systemctl restart nginx.

    NodeBB PRD -> DEV

    For my examples the production NodeBB is running under the /opt/nodebb/ directory path and we will be creating a copy into /opt/devNodebb/

    Let's make a copy of production into dev. This can be done "live" without needing to shutdown your production forum.

    mkdir /opt/devNodebb (cd /opt/nodebb; tar cf - .) | (cd /opt/devNodebb; tar xvf -)

    If NodeBB was running when you made the copy you'll need to remove the pidfile. A pidfile typically contains the process id information of the running program. This is useful so that commands such as ./nodebb stop know which program to kill. The pidfile you copied over relates to the process id of your production NodeBB. You don't want to be killing that process when you try to startup your dev NodeBB.

    rm /opt/devNodebb/pidfile

    Since you made a copy of production you have all production information. If you attempted to start your dev NodeBB now you would have problems. You must edit your config.json file and tell it that you want a new instance of NodeBB.

    vi /opt/devNodebb/config.json

    Change your url, port and database entries. For the URL make it the dev domain that you configured your Nginx to listen for. For the port and database numbers I just incremented by one from production.

    "url": "https://dev.yourforumdomain.com", "port": "4568", [...] "database": "1"

    No you aren't ready to start up your dev NodeBB just yet. There isn't a database behind it.

    Let's make a copy of the production Redis database for dev to use. I use redis-copy which is not part of the redis database distribution. I downloaded and built my copy from this Github repository redis-copy.

    The following command makes a copy of the Redis database number 0 (production) to database number 1 (your dev/test). Database number 1 is the database we told the devNodebb config.json file above to use.

    redis-copy localhost/0 localhost/1

    Now we may startup the dev NodeBB instance.

    cd /opt/devNodebb ./nodebb start Adjustments to DEV

    Once your dev forum is running you should make a few administrative adjustments to it. These are not necessarily critical but they will help you to keep track of which system you are working on and may reduce notifications to your users, etc. Keep in mind that you cloned your production system which includes the users. If you do not want them logging into your dev system you should limit their exposure to it.

    You may want to adjust the site and browser title's to reflect a dev forum

    ACP > Settings > General > Site Title > DEV YourForumName ACP > Settings > General > Browser Title > DEV YourForumName

    Disable email subscriptions

    ACP > Settings > Email > Email Subscriptions > Disable subscriber notification emails

    Disable plugins that may cause confusion, such as Google Analytics

    ACP > Extend > Plugins > nodebb-plugin-google-analytics > Deactivate

    There may be other plugins that you wish to disable. Experimenting will lead you to adjust this list appropriately.

    There you have it. You now have a test/dev environment based off of your production system. Changes you make now will only be done in test/dev and your users will happily continue to use the production system until the time comes that you shutdown production to re-play changes or enhancements that you tested in dev.

    Upgrading DEV NodeBB

    So you went through all of the above steps and now you have, well, just a copy of production. Not really useful as it stands but now you have a platform to test upgrading without fear of damaging production.

    Let's upgrade! If you'd like to bring your dev NodeBB up to the current general release of NodeBB the following steps should be adequate.

    Stop your dev NodeBB

    cd /opt/devNodebb ./nodebb stop

    Tell Git to get the newest release information. This sets up NodeBB such that when you issue the upgrade command it will pull down all of the new or changed files as necessary.

    cd /opt/devNodebb git fetch git checkout v1.x.x git merge origin/v1.x.x

    Issue the NodeBB upgrade command

    cd /opt/devNodebb ./nodebb upgrade

    Watch for upgrade errors. Note that any customizations or changes you have made to your theme's CSS may have been undone by a new feature or bug fix. That is why we have this test/dev environment, so you can test and look for problems.

    If the upgrade appears to have worked without errors start up dev NodeBB and then switch into the logging mode so that you may watch the behavior of the system. Pressing ctrl-c will exit the logging mode.

    cd /opt/devNodebb ./nodebb start ./nodebb log Delete DEV

    What if there were problems with your upgrade or you'd like to start this process over with a fresh copy of production? That is not a big problem. A few commands will delete your test/dev environment and then you can start the copy process over again.

    Stop your dev NodeBB

    cd /opt/devNodebb ./nodebb stop

    Let's remove the test/dev software directory tree

    rm -rf /opt/devNodebb

    Delete the test/dev Redis database. This is probably the most dangerous command in this document. Please double check that the database number provided is the one for your test/dev environment and NOT the one for your production environment.

    redis-cli -n 1 flushdb

    And there you have it, test/dev is gone. You may now redo the PRD -> DEV or Fresh NodeBB with PRD database steps if you so desire.

    Fresh NodeBB with PRD database

    There may be times that you want to have a factory fresh NodeBB installation with your database content. You would end up with users, setttings, content, etc., but not files that you may have edited over time or plugins that you installed.

    Run the Delete DEV section to be sure you have no remnants of a previous test/dev environment. Then proceed.

    Tell Git to get the software and where to put it.

    git clone -b v1.x.x https://github.com/NodeBB/NodeBB /opt/devNodebb

    Copy your production config.json file and then edit it as you would have if you were doing the PRD -> DEV section

    cp /opt/nodebb/config.json /opt/devNodebb/config.json vi /opt/devNodebb/config.json

    Change your url, port and database entries.

    "url": "https://dev.yourforumdomain.com", "port": "4568", [...] "database": "1"

    Copy over your Redis database

    redis-copy localhost/0 localhost/1

    Since the config.json has been created and contains the information that the NodeBB setup process would have asked for we can just run the NodeBB upgrade command (as opposed to the setup command). Bypassing the questions about which database to use, etc. Before you run the NodeBB upgrade you have to actually install the NodeBB software. This process was not necessary when we copied PRD to DEV earlier as it was done when you did your initial production NodeBB installation and was brought over in the tar copy process.

    cd /opt/devNodebb npm install ./nodebb upgrade

    Now start it up!

    cd /opt/devNodebb ./nodebb start

    And there you have it. You now have a clean installation of NodeBB with your database content. As noted in the PRD -> DEV section you may wish to make adjustments to your dev forum so that you can easily identify which one you are working in. Ie., change the site and browser title names, etc.

    Contact me https://community.nodebb.org/user/rod Revision 1.2, 2016-APR-08 @645.beats