Skip to content

Technical Support

Need help with installing or configuring NodeBB? Look here.

4.7k Topics 26.2k Posts

Subcategories


  • User documentation for NodeBB

    44 Topics
    44 Posts
    Jay MoonahJ

    One of the first important things to do after setting up NodeBB is to set up an emailer plugin. While NodeBB does include a local emailer, if your forum is particularly active we recommend using an third-party emailer such as SendGrid which provides better deliverability for sites that send a high volume of email. Setting up SendGrid in NodeBB is very easy.

    Open the administrative dashboard using the 'gear' icon on your forum. Open the Extend > Plugins menu, and select the Find Plugins tab. Use the search on the right. Type 'SendGrid' and the plugin should appear -- select Install when you see it. From Installed tab on the Plugins menu, search again for 'SendGrid' and select Activate. Activating the plugin will require a restart of your forum. To restart, select the Dashboard menu and press the Restart button to the right. After NodeBB restarts, the SendGrid plugin will be active.

    After you restart, there should be a item called Emailer (SendGrid) under the Plugins menu -- if you don't see this right away, try refreshing your browser.

    Sign up to SendGrid

    Go to the SendGrid website, open the pricing page and scroll to the bottom. Click on the link and create your free account. Once you've confirmed your SendGrid account via email, you should be able to login to the SendGrid website. On the left side of your SendGrid dashboard, open Settings and click on API Keys. Click the button in the top right to create a new key. Make sure that the key has Full Access for Send Mail and Alerts.  When you are done, the new key to your clipboard.

    Now, return to the SendGrid menu on your NodeBB admin panel. Paste the API key into the field, and save your changes. Now go back to the Dashboard to restart your forum one more time.

    SendGrid should now be working for your forum.

    YouTube Setting up SendGrid mailer for NodeBB

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

    82 Topics
    599 Posts
    barisB

    Quick start plugin has an example on how to add a new api route https://github.com/NodeBB/nodebb-plugin-quickstart/blob/master/library.js#L40-L76.

    The hooks that are fired client side are for client side code in plugins. If you want to pass data from the client to the server you have two options.

    Create an api route like in quick start plugin Create a new socket event listener on the server side and use socket.emit() client side. Example here
  • 25 Topics
    196 Posts
    phenomlabP

    @baris updated to 3.7.2 and now just waiting for the plugin to be updated.

  • my forum got hacked today

    13
    1 Votes
    13 Posts
    6k Views
    C

    Yep Sorry guys, finally figured it out.

    They decrypted my password through the Xsplit db leak and managed to login to my account.

    Time to look at that 2FA plugin !...

    Thanks again and apologies for the panic

  • 0 Votes
    6 Posts
    3k Views
    C

    @julian thanks. So this is the only way to do this? If so, I'll just do a jQuery append as you say.

  • CallBack URL [Change]

    2
    0 Votes
    2 Posts
    3k Views
    P

    @YaBoiLewis update the url property in your config.json to your community's URL

  • 0 Votes
    2 Posts
    1k Views
    T

    I found my problem and solution. I made a custom theme based off persona and was using an old version of chats.js. I updated the chats.js file in my theme folder and the problem disappeared.

  • automatically generate thumbnail

    2
    0 Votes
    2 Posts
    824 Views
    P

    @charles no

  • upgrading from v1.0.1-auto.0 to v1.0.1

    3
    0 Votes
    3 Posts
    1k Views
    ljhardyL

    Did that successfully. Upgrade seemed to go ok, then received these errors trying to start nodebb, it's like the upgrade script didn't work: ( Can I reinstall the latest version of nodebb, and have it keep my setup, users, posts etc., or does a clean install initialize Mongodb?)

    Starting NodeBB
    "./nodebb stop" to stop the NodeBB server
    "./nodebb log" to view server output
    "./nodebb restart" to restart NodeBB

    ljhardy@firehole:~/www/nodebb/nodebb$ ./nodebb log

    Type Ctrl-C to exit

    Clustering enabled: Spinning up 1 process(es).

    27/3 10:24 [20828] - info: Time: Sun Mar 27 2016 10:24:35 GMT-0500 (CDT)
    27/3 10:24 [20828] - info: Initializing NodeBB v1.0.2
    27/3 10:24 [20828] - warn: You have no mongo password setup!
    27/3 10:24 [20828] - info: [database] Checking database indices.
    [outdated] html-to-text installed v1.5.0, package.json requires 2.0.0
    27/3 10:24 [20828] - warn: One or more of NodeBB's dependent packages are out-of-date. Please run the following command to update them:
    27/3 10:24 [20828] - warn: ./nodebb upgrade
    [cluster] Child Process (20828) has exited (code: 0, signal: null)

  • Error when accessing group

    1
    0 Votes
    1 Posts
    681 Views
    lullerhausL

    When i try to access /groups/administrators (group is set visible), i get following error:

    /groups/administrators Not Found You seem to have stumbled upon a page that does not exist. Return to the home page.

    Here's query from database: http://paste.kde.org/pyoyy68xj/1hvqu0

    Any ideas how to fix this?

  • Testing ground is broken on mobile

    1
    1 Votes
    1 Posts
    590 Views
    E

    I cant enter testing ground forum. It breaks mobile safari. Tested on both i got 🐼
    Others subforums works ok

  • easy nodebb upgrade process

    Solved
    30
    0 Votes
    30 Posts
    12k Views
    Charly86C

    @charles
    Perfect, thanks 😉

  • This topic is deleted!

    1
    0 Votes
    1 Posts
    2 Views
  • adding and using library

    7
    1 Votes
    7 Posts
    2k Views
    C

    @yariplus said:

    As far as uploading the library, everything in the /public directory is exposed on the website root. So, you can generally put the library anywhere in there.

    This is what I was looking for! Thanks!

    As for loading a js file at the end right before the closing body, which file should I place the script tag?

  • Load slackin badge in widget

    1
    0 Votes
    1 Posts
    924 Views
    P

    Link Preview Image GitHub - rauchg/slackin: Public Slack organizations made easy

    Public Slack organizations made easy. Contribute to rauchg/slackin development by creating an account on GitHub.

    favicon

    GitHub (github.com)

    I'm trying to add the badge it adds to a widget, but it doesn't load/can't find the script tag. Currently I'm using this:

    <script async defer src="https://slack.yourdomain.com/slackin.js"></script>

    Content of slackin.js

    (function(){ // give up and resort to `target=_blank` // if we're not modern enough if (!document.body.getBoundingClientRect || !document.body.querySelectorAll || !window.postMessage) { return; } // search for a script tag pointing to slackin.js function search(){ var replaced = 0; var scripts = document.querySelectorAll('script'); var script; for (var i = 0; i < scripts.length; i++) { script = scripts[i]; if (!script.src) continue; if (/\/slackin\.js(\?.*)?$/.test(script.src)) { // replace script with iframe replace(script); // we abort the search for subsequent // slackin.js executions to exhaust // the queue return true; } } } var LARGE; // boolean for large/small mode, from query param // replace the script tag with an iframe function replace(script){ var parent = script.parentNode; if (!parent) return; LARGE = /\?large/.test(script.src); var iframe = document.createElement('iframe'); var iframePath = '/iframe' + (LARGE ? '?large' : ''); iframe.src = script.src.replace(/\/slackin\.js.*/, iframePath); iframe.style.borderWidth = 0; iframe.className = '__slackin'; // a decent aproximation that we adjust later // once we have the knowledge of the actual // numbers of users, based on a user count // of 3 digits by 3 digits iframe.style.width = (LARGE ? 190 : 140) + 'px'; // height depends on target size iframe.style.height = (LARGE ? 30 : 20) + 'px'; // hidden by default to avoid flicker iframe.style.visibility = 'hidden'; parent.insertBefore(iframe, script); parent.removeChild(script); // setup iframe RPC iframe.onload = function(){ setup(iframe); }; } // setup an "RPC" channel between iframe and us function setup(iframe){ var id = Math.random() * (1 << 24) | 0; iframe.contentWindow.postMessage('slackin:' + id, '*'); window.addEventListener('message', function(e){ if (typeof e.data !== 'string') return; // show dialog upon click if ('slackin-click:' + id === e.data) { showDialog(iframe); } // update width var wp = 'slackin-width:' + id + ':'; if (wp === e.data.substr(0, wp.length)) { var width = e.data.substr(wp.length); iframe.style.width = width + 'px'; // ensure it's shown (since first time hidden) iframe.style.visibility = 'visible'; } // redirect to URL var redir = 'slackin-redirect:' + id + ':'; if (redir === e.data.substr(0, redir.length)) { location.href = e.data.substr(redir.length); } }); } // show the dialog around the iframe // by, yes, creating a new iframe var showing = false; function showDialog(iframe){ if (showing) return; showing = true; if (LARGE) { unitSize = '14px'; arrowHeight = 13; } else { unitSize = '10px'; arrowHeight = 9; } // container div var div = document.createElement('div'); div.className = '__slackin'; div.style.fontSize = unitSize; div.style.border = '.1em solid #D6D6D6'; div.style.padding = '0'; div.style.margin = '0'; div.style.lineHeight = '0'; div.style.backgroundColor = '#FAFAFA'; div.style.width = '25em'; div.style.height = '15.5em'; div.style.position = 'absolute'; div.style.left = '-10000px'; div.style.top = '-10000px'; div.style.borderRadius = '.4em'; div.style.padding = '.4em'; div.style.boxSizing = 'content-box'; // new iframe var ni = document.createElement('iframe'); ni.className = '__slackin'; ni.style.width = '25em'; ni.style.height = '15.5em'; ni.style.borderWidth = 0; ni.src = iframe.src.replace('iframe', 'iframe/dialog'); ni.onload = function(){ setup(ni); window.addEventListener('scroll', dposition); window.addEventListener('resize', dposition); position(); }; // arrows var a1 = document.createElement('div'); var a2 = document.createElement('div'); [a1, a2].forEach(function(a){ a.style.border = 'solid transparent'; a.style.pointerEvents = 'none'; a.style.width = '0'; a.style.height = '0'; a.style.margin = '0'; a.style.padding = '0'; a.style.position = 'absolute'; a.style.display = 'inline'; }); a1.style.borderColor = 'rgba(214, 214, 214, 0)'; a2.style.borderColor = 'rgba(250, 250, 250, 0)'; a1.style.borderWidth = '.7em'; a1.style.marginLeft = '-.65em'; a2.style.borderWidth = '.6em'; a2.style.marginLeft = '-.6em'; // append div.appendChild(a1); div.appendChild(a2); div.appendChild(ni); document.body.appendChild(div); function position(){ [div, a1, a2].forEach(function(el){ el.style.left = ''; el.style.right = ''; el.style.bottom = ''; el.style.top = ''; }); var divPos = div.getBoundingClientRect(); var iframePos = iframe.getBoundingClientRect(); var divHeight = divPos.height + arrowHeight; var st = document.body.scrollTop; var sl = document.body.scrollLeft; var iw = window.innerWidth; var ih = window.innerHeight; var iframeTop = iframePos.top + st; var iframeLeft = iframePos.left + sl; // position vertically / arrows if (st + iframePos.bottom + divHeight > st + ih) { div.style.top = (iframeTop - divHeight) + 'px'; a1.style.top = a2.style.top = '100%'; a1.style.borderBottomColor = 'rgba(214, 214, 214, 0)'; a2.style.borderBottomColor = 'rgba(250, 250, 250, 0)'; a1.style.borderTopColor = '#d6d6d6'; a2.style.borderTopColor = '#fafafa'; } else { div.style.top = (iframeTop + iframePos.height + arrowHeight) + 'px'; a1.style.bottom = a2.style.bottom = '100%'; a1.style.borderTopColor = 'rgba(214, 214, 214, 0)'; a2.style.borderTopColor = 'rgba(250, 250, 250, 0)'; a1.style.borderBottomColor = '#d6d6d6'; a2.style.borderBottomColor = '#fafafa'; } // position horizontally var left = iframePos.left + Math.round(iframePos.width / 2) - Math.round(divPos.width / 2); if (left < sl) left = sl; if (left + divPos.width > sl + iw) { left = sl + iw - divPos.width; } div.style.left = left + 'px'; a1.style.left = a2.style.left = (iframeLeft - left + Math.round(iframePos.width / 2)) + 'px'; } // debounced positionining var timer; function dposition(){ clearTimeout(timer); timer = setTimeout(position, 100); } function hide(){ showing = false; window.removeEventListener('scroll', dposition); window.removeEventListener('resize', dposition); document.body.removeChild(div); document.documentElement.removeEventListener('click', click, true); } function click(ev){ if ('__slackin' != ev.target.className) { hide(); } } document.documentElement.addEventListener('click', click, true); } var found = search(); if (!found) setTimeout(search, 5000); })();

    If anyone here could help me getting this to work in a widget, I would be really thankful!
    Thanks.

  • Add icon to Font Awesome?

    3
    0 Votes
    3 Posts
    2k Views
    Danny McWilliamsD

    @ThingBreaker said:

    Here are steps on customizing Font Awesome. Mayhaps these will help.
    https://github.com/FortAwesome/Font-Awesome/wiki/Customize-Font-Awesome

    Thank you, I'll have a look. Would any updates of the forum affect Font-Awesome in future? Ideally, adding the icon in a way which wouldn't require updating the icons each time would be the best way forward.

  • Issues with post displaying html sometimes.

    16
    0 Votes
    16 Posts
    4k Views
    JenklerJ

    Yes, it works fine in v1.0.2 🙂

  • 0 Votes
    6 Posts
    3k Views
    B

    However, this is NO longer an issue with NodeBB 1.x since it's not using connect-mongo 1.x
    https://github.com/NodeBB/NodeBB/blob/0823cd94331a99b5c6ae5c696cd30215295f3a4c/package.json#L25

    it was an issue with 0.9.2.
    https://github.com/NodeBB/NodeBB/blob/v0.9.2/src/install.js#L16

  • Installing NodeBB on Ubuntu

    12
    0 Votes
    12 Posts
    6k Views
    Y

    Hi,

    As much as I'd like to say this was helpful, it wasn't. The most help I got was from the guy who told me how to open the folder.

    With that being said, I am nowhere near. The main cause of this is probably me and I blame myself for that. I will be now hoping to get an Ubuntu Server from HostingItAll, and they will be helping me set up NodeBB!

    Thanks for all that you guys could do.

    Lewis

  • Pushbullet

    4
    1 Votes
    4 Posts
    1k Views
    ?

    @MagicVish just run the command he wrote, while you are in your NodeBB directory in SSH.

  • 0 Votes
    1 Posts
    1k Views
    SamuraisS

    hi, Folks

    Could anyone take a look at my problem ?

    Link Preview Image Can not login with login form and response as "Forbidden" · Issue #4461 · NodeBB/NodeBB

    Description setup NodeBB v1.0.0, commit id a402e29 nodebb/config.json { "url": "http://rockq.austack.com", "bind_address": "115.28.145.154", "port": 4567, "secret": "3c8c4c84-600f-48xxxx", "database": "mongo", "mongo": { "host": "115.28....

    favicon

    GitHub (github.com)

    I get stuck with the login and I want to use nodebb as a community BBS.

    I am appreciated if someone can help.

    Cheers.
    Hain

  • Schema changes 0.9.2 to 0.9.3 ?

    1
    0 Votes
    1 Posts
    662 Views
    C

    I have a local dev environment running 0.9.2 and another install running 0.9.3. Is it possible to just overwrite the DB on the 0.9.3 install or were there schema changes between these versions?

  • error: appears to be a git repo or submodule

    11
    0 Votes
    11 Posts
    7k Views
    frissdiegurkeF

    I don't see any problems there thought. Except for the bad value for main, it is supposed to be a javascript file; But since other NodeBB themes share this bad value it should not break anything. o_O

    After a quick search with the search engine of my choice I've found this stackoverflow question with a similar issue. There doesn't seem to be a solution but moving your repo out of node_modules and either symlink (by hand; as the answer describes) or npm link it.