Skip to content

Technical Support

Need help with installing or configuring NodeBB? Look here.

4.8k Topics 26.7k 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. [image: youtubelogo.png] Setting up SendGrid mailer for NodeBB
  • NodeBB guides, how-to's and general tips and tricks

    83 Topics
    601 Posts
    Z
    not sure the plugin worked for firefox. saw a-z in the sort icon. when i used it, i expected the topics in the category would be sorted a-z. they werent
  • 25 Topics
    201 Posts
    eeeeeE
    I think you answered my point, by agreeing there are issues. I didn't even attempt to deploy nodebb, I had problems with much smaller projects! Nextjs routing was going through a change of design at the time, so perhaps that is less confusing now, but there were multiple other headaches. I would get build errors and issues with package management.
  • 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
    7k 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
  • Where is the markup in Appearance ->Custom Header rendered?

    Moved
    6
    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
  • Error when opening chat room from the 'chats' page

    2
    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
    881 Views
    P
    @charles no
  • upgrading from v1.0.1-auto.0 to v1.0.1

    3
    0 Votes
    3 Posts
    2k 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
    733 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
    633 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
    13k 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
    971 Views
    P
    https://github.com/rauchg/slackin 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