Skip to content

Technical Support

Need help with installing or configuring NodeBB? Look here.

4.7k Topics 26.1k 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
    597 Posts
    phenomlabP

    @frontendjulien Always happy to help.

  • 25 Topics
    196 Posts
    phenomlabP

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

  • BG issue

    14
    1 Votes
    14 Posts
    6k Views
    Gaurav Grv RobinsonG

    @yariplus WOW! You're the man. It seems to be working fine.

  • Problems installing

    7
    0 Votes
    7 Posts
    3k Views
    xAzX

    @pichalite Yes, I see..

  • What theme is this?

    Moved
    3
    0 Votes
    3 Posts
    3k Views
    xAzX

    @yariplus Thanks! ❤

  • Chat ... name is typing ...

    2
    0 Votes
    2 Posts
    1k Views
    nhl.plN

    I think it was remove because of this:
    https://community.nodebb.org/topic/7880/what-happened-with-the-users-viewing-a-topic-feature

  • Is a 1GB DO droplet good enough?

    11
    0 Votes
    11 Posts
    4k Views
    ?

    @Gaurav-Grv-Robinson ever thought about clearing it manually by dropping unused tables?

    If you want feel free to PM me and I will take a look at it. But lets discuss this in the Chat as it is unrelated to the actual topic 😉

  • Problems after upgrading NodeBB to 1.0.2

    3
    0 Votes
    3 Posts
    2k Views
    Boris DragosaniB

    Thank you!

  • Is there a way to bulk purge deleted posts?

    7
    1 Votes
    7 Posts
    2k Views
    barisB

    @codecowboy https://github.com/NodeBB/NodeBB/issues/4396

    On lavender and vanilla themes it used to be a checkbox.

  • Can't install pewter theme

    8
    0 Votes
    8 Posts
    3k Views
    A

    @Nicolas Ok

  • 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
    818 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
    676 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
    583 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
    920 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.