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
    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.

  • npm Warnings since a long time

    2
    0 Votes
    2 Posts
    407 Views
    julianJ

    @0xA4B16 you can ignore those warnings, or you can install the packages they recommend by running npm i <package name>

  • Can't upload logo

    27
    0 Votes
    27 Posts
    3k Views
    SandeepS

    @julian please let me know if you still think its sharp issue, since it is installed fine.

  • Link existing MySQL Database to NodeBB

    5
    0 Votes
    5 Posts
    642 Views
    S

    Short of using OAuth2, you could write your own app component to tie NodeBB into MySQL. One of the issues is that MySQL is a generic database so the format of your authentication easily won't match in some obvious way, so needs a customer connectors no matter what. Just adding another DB source for authentication would not solve your problem. It would have to be something that connects to your database and has the ability to understand your schema and has the ability to store all necessary additional schema changes there.

  • Dark theme, disablw

    4
    0 Votes
    4 Posts
    412 Views
    M

    I confirm now that with updated version works fine 🙂
    Thanks for the fast fix.

  • Can't register new users

    Solved
    7
    0 Votes
    7 Posts
    1k Views
    S

    Tried this on mine, but no luck. Same issue. Verified that the fix made it in.

  • Meta Description Tag Missing in 1.13.1

    6
    0 Votes
    6 Posts
    475 Views
    barisB

    This should be in 1.13.2 and up.

  • Re asign content of former user to a new user?

    4
    1 Votes
    4 Posts
    505 Views
    N

    @baris thank you

  • After npm install: theme folder was deleted

    2
    0 Votes
    2 Posts
    267 Views
    julianJ

    @pasib -- sorry to hear about that! Yes, npm or yarn will sometimes clobber anything inside node_modules/. Never do anything in that directory as it is considered transient!

    Look into npm link or yarn link, and develop your theme elsewhere. Then you can use those tools to "link" the theme into the node_modules/ folder, and it will be safe from deletion. Sometimes the link itself will be deleted, but that is trivial to put back in.

  • 0 Votes
    3 Posts
    375 Views
    B

    Are you sure it's the start that's not finishing and not your automation?

    This may not work but could be worth looking into.

    cd /home/nestor/nodebb ./nodebb stop ./nodebb start exit 0
  • Assign own translation

    Solved
    4
    0 Votes
    4 Posts
    723 Views
    PitaJP

    @pasib glad you found the issue

  • "Doubled URL" after login success

    8
    0 Votes
    8 Posts
    1k Views
    M

    Just for you guys troubleshooting this problem, if you are using https, then the address needs to be https in the config.json too.

  • Private Reply to Post in thread?

    3
    0 Votes
    3 Posts
    351 Views
    E

    Category Notification is even better than what i tried to do, thanks for that. I know there is the Chat function but i was imagining something like a "Reply with PM" function in the Reply dropdown, guess that does not exist or is there a plugin for that as well?

  • Get users Link for header menu

    Solved
    3
    0 Votes
    3 Posts
    302 Views
    dogsD

    @PitaJ Thank you!

    Note:

    If I use /me it doesn't work - /me/doesn't work as well. It does not point to the own user profile.

    Only a reference to a sub-page as mentioned by @PitaJ works.
    /me/bookmarks works and points to the own bookmarks. 👍

  • XMAPP

    5
    1 Votes
    5 Posts
    457 Views
    S

    @levy318 said in XMAPP:

    Is it possible to install NodeBB site on XAMPP?

    No, but not because it is Apache. XMAPP is a platform for PHP and Perl. NodeBB is written in NodeJS. No language can run on another like that. XMAPP can only run Perl or PHP applications. NodeBB will work with Apache, but makes no sense. It'll run on Windows, but that makes no sense either - slow and licensing problems.

    Bottom line, there is no situation where this question should come up.

    That said, can NodeBB run on Windows? Of course, no problem. You just install it there. It's a terrible idea, but it will absolutely work. XMAPP is completely unnecessary. Just don't install XMAPP or just completely ignore it and don't start it up, and you'll be fine.

  • 0 Votes
    17 Posts
    1k Views
    Avan SardarA

    @julian

    You got it.

  • 0 Votes
    9 Posts
    631 Views
    tecyT

    👍 👍 👍 👍 👍
    ⭐ 🌟 ⭐ 🌟 ⭐

    😃

  • Handle is not a member of V8

    1
    0 Votes
    1 Posts
    1k Views
    Long LyL

    I tried to setup nodebb locally but encounter these issues:

    '''
    info sharp Detected globally-installed libvips v8.7.4
    info sharp Building from source via node-gyp
    make: Entering directory '/home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/node_modules/sharp/build'
    TOUCH Release/obj.target/libvips-cpp.stamp
    CXX(target) Release/obj.target/sharp/src/common.o
    In file included from ../src/common.cc:27:
    ../src/common.h:78:20: error: ‘Handle’ is not a member of ‘v8’
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~
    ../src/common.h:78:37: error: expected primary-expression before ‘>’ token
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^
    ../src/common.h:78:39: error: ‘obj’ was not declared in this scope
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^~~
    ../src/common.h:78:56: error: expected primary-expression before ‘attr’
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~
    ../src/common.h:78:60: error: expression list treated as compound expression in initializer [-fpermissive]
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^
    ../src/common.h:79:29: error: ‘Handle’ is not a member of ‘v8’
    79 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~
    ../src/common.h:79:46: error: expected primary-expression before ‘>’ token
    79 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr);
    | ^
    ../src/common.h:79:48: error: ‘obj’ was not declared in this scope
    79 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr);
    | ^~~
    ../src/common.h:79:65: error: expected primary-expression before ‘attr’
    79 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~
    ../src/common.h:80:38: error: ‘Handle’ is not a member of ‘v8’
    80 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~
    ../src/common.h:80:55: error: expected primary-expression before ‘>’ token
    80 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr);
    | ^
    ../src/common.h:80:57: error: ‘obj’ was not declared in this scope
    80 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr);
    | ^~~
    ../src/common.h:80:74: error: expected primary-expression before ‘attr’
    80 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr);
    | ^~~~
    ../src/common.h:81:48: error: ‘Handle’ is not a member of ‘v8’
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.h:81:65: error: expected primary-expression before ‘>’ token
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^
    ../src/common.h:81:67: error: ‘obj’ was not declared in this scope
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^~~
    ../src/common.h:81:84: error: expected primary-expression before ‘attr’
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~
    ../src/common.h:81:37: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.h:81:89: error: expected ‘;’ before ‘{’ token
    81 | template<typename T> v8::Local<T> AttrAs(v8::Handlev8::Object obj, std::string attr) {
    | ^~
    | ;
    ../src/common.h:84:37: error: ‘Handle’ is not a member of ‘v8’
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.h:84:54: error: expected primary-expression before ‘>’ token
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^
    ../src/common.h:84:56: error: ‘obj’ was not declared in this scope
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~~
    ../src/common.h:84:73: error: expected primary-expression before ‘attr’
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~
    ../src/common.h:84:26: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.h:84:78: error: expected ‘;’ before ‘{’ token
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~
    | ;
    ../src/common.h:87:37: error: ‘Handle’ is not a member of ‘v8’
    87 | template<typename T> T AttrTo(v8::Handlev8::Object obj, int attr) {
    | ^~~~~~
    ../src/common.h:87:54: error: expected primary-expression before ‘>’ token
    87 | template<typename T> T AttrTo(v8::Handlev8::Object obj, int attr) {
    | ^
    ../src/common.h:87:56: error: ‘obj’ was not declared in this scope
    87 | template<typename T> T AttrTo(v8::Handlev8::Object obj, int attr) {
    | ^~~
    ../src/common.h:87:61: error: expected primary-expression before ‘int’
    87 | template<typename T> T AttrTo(v8::Handlev8::Object obj, int attr) {
    | ^~~
    ../src/common.h:84:26: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
    84 | template<typename T> T AttrTo(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.h:87:70: error: expected ‘;’ before ‘{’ token
    87 | template<typename T> T AttrTo(v8::Handlev8::Object obj, int attr) {
    | ^~
    | ;
    ../src/common.h:93:9: error: ‘Handle’ is not a member of ‘v8’
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^~~~~~
    ../src/common.h:93:26: error: expected primary-expression before ‘>’ token
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^
    ../src/common.h:93:28: error: ‘input’ was not declared in this scope
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^~~~~
    ../src/common.h:93:70: error: expected primary-expression before ‘&’ token
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^
    ../src/common.h:93:71: error: ‘buffersToPersist’ was not declared in this scope
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^~~~~~~~~~~~~~~~
    ../src/common.h:93:87: error: expression list treated as compound expression in initializer [-fpermissive]
    93 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist);
    | ^
    ../src/common.cc:34:8: error: redefinition of ‘bool sharp::HasAttr’
    34 | bool HasAttr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~~
    In file included from ../src/common.cc:27:
    ../src/common.h:78:8: note: ‘bool sharp::HasAttr’ previously defined here
    78 | bool HasAttr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~~
    ../src/common.cc:34:20: error: ‘Handle’ is not a member of ‘v8’
    34 | bool HasAttr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.cc:34:37: error: expected primary-expression before ‘>’ token
    34 | bool HasAttr(v8::Handlev8::Object obj, std::string attr) {
    | ^
    ../src/common.cc:34:39: error: ‘obj’ was not declared in this scope
    34 | bool HasAttr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~
    ../src/common.cc:34:56: error: expected primary-expression before ‘attr’
    34 | bool HasAttr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~
    ../src/common.cc:37:15: error: redefinition of ‘std::string sharp::AttrAsStr’
    37 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~~~~
    In file included from ../src/common.cc:27:
    ../src/common.h:79:15: note: ‘std::string sharp::AttrAsStr’ previously declared here
    79 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~~~~
    ../src/common.cc:37:29: error: ‘Handle’ is not a member of ‘v8’
    37 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.cc:37:46: error: expected primary-expression before ‘>’ token
    37 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr) {
    | ^
    ../src/common.cc:37:48: error: ‘obj’ was not declared in this scope
    37 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~
    ../src/common.cc:37:65: error: expected primary-expression before ‘attr’
    37 | std::string AttrAsStr(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~
    ../src/common.cc:40:23: error: redefinition of ‘std::vector<double> sharp::AttrAsRgba’
    40 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~~~~~
    In file included from ../src/common.cc:27:
    ../src/common.h:80:23: note: ‘std::vector<double> sharp::AttrAsRgba’ previously declared here
    80 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr);
    | ^~~~~~~~~~
    ../src/common.cc:40:38: error: ‘Handle’ is not a member of ‘v8’
    40 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~~~
    ../src/common.cc:40:55: error: expected primary-expression before ‘>’ token
    40 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr) {
    | ^
    ../src/common.cc:40:57: error: ‘obj’ was not declared in this scope
    40 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr) {
    | ^~~
    ../src/common.cc:40:74: error: expected primary-expression before ‘attr’
    40 | std::vector<double> AttrAsRgba(v8::Handlev8::Object obj, std::string attr) {
    | ^~~~
    ../src/common.cc:50:20: error: redefinition of ‘sharp::InputDescriptor* sharp::CreateInputDescriptor’
    50 | InputDescriptor* CreateInputDescriptor(
    | ^~~~~~~~~~~~~~~~~~~~~
    In file included from ../src/common.cc:27:
    ../src/common.h:92:20: note: ‘sharp::InputDescriptor* sharp::CreateInputDescriptor’ previously defined here
    92 | InputDescriptor* CreateInputDescriptor(
    | ^~~~~~~~~~~~~~~~~~~~~
    ../src/common.cc:51:9: error: ‘Handle’ is not a member of ‘v8’
    51 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist
    | ^~~~~~
    ../src/common.cc:51:26: error: expected primary-expression before ‘>’ token
    51 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist
    | ^
    ../src/common.cc:51:28: error: ‘input’ was not declared in this scope
    51 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist
    | ^~~~~
    ../src/common.cc:51:70: error: expected primary-expression before ‘&’ token
    51 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist
    | ^
    ../src/common.cc:51:71: error: ‘buffersToPersist’ was not declared in this scope
    51 | v8::Handlev8::Object input, std::vector<v8::Localv8::Object> &buffersToPersist
    | ^~~~~~~~~~~~~~~~
    make: *** [sharp.target.mk:184: Release/obj.target/sharp/src/common.o] Error 1
    make: Leaving directory '/home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/node_modules/sharp/build'
    gyp ERR! build error
    gyp ERR! stack Error: make failed with exit code: 2
    gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
    gyp ERR! stack at ChildProcess.emit (events.js:321:20)
    gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
    gyp ERR! System Linux 5.3.0-29-generic
    gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
    gyp ERR! cwd /home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/node_modules/sharp
    gyp ERR! node -v v13.7.0
    gyp ERR! node-gyp -v v5.0.5
    gyp ERR! not ok
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! [email protected] install: (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
    npm ERR! Exit status 1
    npm ERR!
    npm ERR! Failed at the [email protected] install script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR! /home/jordanly/.npm/_logs/2020-02-05T08_20_16_954Z-debug.log
    Error installing dependencies!
    message: Command failed: npm install --production
    stdout: null
    stderr: null
    /home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/src/cli/package-install.js:54
    throw e;
    ^

    Error: Command failed: npm install --production
    at checkExecSyncError (child_process.js:611:11)
    at Object.execSync (child_process.js:647:15)
    at Object.installAll (/home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/src/cli/package-install.js:45:9)
    at Object.<anonymous> (/home/jordanly/JordanLy/My Folder/Sydney-Study/Personal project/nodebb/src/cli/index.js:60:18)
    at Module._compile (internal/modules/cjs/loader.js:1151:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)
    at Module.load (internal/modules/cjs/loader.js:1000:32)
    at Function.Module._load (internal/modules/cjs/loader.js:899:14)
    at Module.require (internal/modules/cjs/loader.js:1040:19)
    at require (internal/modules/cjs/helpers.js:72:18) {
    status: 1,
    signal: null,
    output: [ null, null, null ],
    pid: 7526,
    stdout: null,
    stderr: null
    }
    '''
    Then after installation, I try to start it, here's the command line result

    ./nodebb start

    Starting NodeBB
    "./nodebb stop" to stop the NodeBB server
    "./nodebb log" to view server output
    "./nodebb help" for more commands

    Lastly, I have tried to find where the forum is running (port 4567, forum.examle.com, etc.) but no luck. Please help me, I followed the installation guide here https://docs.nodebb.org/installing/os/ubuntu/#installing-mongodb

  • Cannot upload any image

    4
    0 Votes
    4 Posts
    556 Views
    PitaJP

    Are there any errors in the server log?

  • Rules or welcome topic

    2
    0 Votes
    2 Posts
    264 Views
    barisB

    You can create a topic and put everything you want there and then use /admin/settings/notifications and set the welcome notification link to the url of the topic. This will send a notification to new users that will take them to this topic.

  • Help with Upgrade to v1.13.x

    7
    0 Votes
    7 Posts
    622 Views
    M

    @PitaJ said in Help with Upgrade to v1.13.x:

    @Michael-Pfaff yeah I'd check git status before doing anything and run reset if there are changes

    Much appreciated @PitaJ!