3

I am using the canvas package for Node.js.

It works fine on my computer, but it does not work when I upload it to my Heroku server. By "works fine", I mean that the canvas package correctly installed with npm install canvas and the Node.js application works as expected.

However, when I try and upload it to Heroku and it tries to build the canvas package, I get the error:

$ git push heroku master
Counting objects: 4304, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4028/4028), done.
Writing objects: 100% (4304/4304), 3.57 MiB | 606.00 KiB/s, done.
Total 4304 (delta 737), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Using set buildpack heroku/nodejs
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote:        NPM_CONFIG_LOGLEVEL=error

remote:        NPM_CONFIG_PRODUCTION=true
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:
remote: -----> Installing binaries
remote:        engines.node (package.json):  5.6.0
remote:        engines.npm (package.json):   3.7.2
remote:
remote:        Downloading and installing node 5.6.0...
remote:        Downloading and installing npm 3.7.2 (replacing version 3.6.0)...
remote:
remote: -----> Restoring cache
remote:        Skipping cache restore (new runtime signature)
remote:
remote: -----> Building dependencies
remote:        Prebuild detected (node_modules already exists)
remote:        Rebuilding any native modules
remote:
remote:        > canvas@1.3.10 install /tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas
remote:        > node-gyp rebuild
remote:
remote:        make: Entering directory `/tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas/build'
remote:        SOLINK_MODULE(target) Release/obj.target/canvas-postbuild.node
remote:        COPY Release/canvas-postbuild.node
remote:        CXX(target) Release/obj.target/canvas/src/Canvas.o
remote:        CXX(target) Release/obj.target/canvas/src/CanvasGradient.o
remote:        CXX(target) Release/obj.target/canvas/src/CanvasPattern.o
remote:        In file included from ../src/CanvasPattern.cc:9:0:
remote:        ../src/Image.h:19:21: fatal error: gif_lib.h: No such file or directory
remote:        #include <gif_lib.h>
remote:        ^
remote:        compilation terminated.

remote:        make: *** [Release/obj.target/canvas/src/CanvasPattern.o] Error 1
remote:        make: Leaving directory `/tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas/build'
remote:        gyp ERR! build error
remote:        gyp ERR! stack Error: `make` failed with exit code: 2
remote:        gyp ERR! stack     at ChildProcess.onExit (/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/lib/node_modules/npm/node_module
s/node-gyp/lib/build.js:276:23)
remote:        gyp ERR! stack     at emitTwo (events.js:100:13)
remote:        gyp ERR! stack     at ChildProcess.emit (events.js:185:7)
remote:        gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
remote:        gyp ERR! System Linux 3.13.0-71-generic
remote:        gyp ERR! command "/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/bin/node" "/tmp/build_565c08c270a791191b278953392f5493/.h
eroku/node/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
remote:        gyp ERR! cwd /tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas
remote:        gyp ERR! node -v v5.6.0
remote:        gyp ERR! node-gyp -v v3.2.1
remote:        gyp ERR! not ok
remote:
remote:        npm ERR! Linux 3.13.0-71-generic
remote:        npm ERR! argv "/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/bin/node" "/tmp/build_565c08c270a791191b278953392f5493/.hero
ku/node/bin/npm" "rebuild"
remote:        npm ERR! node v5.6.0
remote:        npm ERR! npm  v3.7.2
remote:        npm ERR! code ELIFECYCLE
remote:        npm ERR! canvas@1.3.10 install: `node-gyp rebuild`
remote:        npm ERR! Exit status 1
remote:        npm ERR!
remote:        npm ERR! Failed at the canvas@1.3.10 install script 'node-gyp rebuild'.
remote:        npm ERR! Make sure you have the latest version of node.js and npm installed.
remote:        npm ERR! If you do, this is most likely a problem with the canvas package,
remote:        npm ERR! not with npm itself.
remote:        npm ERR! Tell the author that this fails on your system:
remote:        npm ERR!     node-gyp rebuild

remote:        npm ERR! You can get information on how to open an issue for this project with:
remote:        npm ERR!     npm bugs canvas
remote:        npm ERR! Or if that isn't available, you can get their info via:
remote:        npm ERR!     npm owner ls canvas
remote:        npm ERR! There is likely additional logging output above.
remote:
remote:        npm ERR! Please include the following file with any support request:
remote:        npm ERR!     /tmp/build_565c08c270a791191b278953392f5493/npm-debug.log
remote:
remote: -----> Build failed
remote:
remote:        We're sorry this build is failing! You can troubleshoot common issues here:
remote:        https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote:        Some possible problems:
remote:
remote:        - node_modules checked into source control
remote:        https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git

remote:
remote:        Love,
remote:        Heroku
remote:
remote:
remote:  !     Push rejected, failed to compile Node.js app
remote:
remote: Verifying deploy...
remote:
remote: !       Push rejected to colladraw.
remote:
To https://git.heroku.com/colladraw.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/colladraw.git'

The error is specifically in these lines:

In file included from ../src/CanvasPattern.cc:9:0:
remote:        ../src/Image.h:19:21: fatal error: gif_lib.h: No such file or directory
remote:        #include <gif_lib.h>

remote:        ^
remote:        compilation terminated.

These problems do not exist on my system, however. I fiddled around with solutions from other questions regarding this issue, such as this question and this question. The problem is that both of these are for the local machines, and they do not get pushed to the server, and therefore I could not fix the problem on Heroku.

Possible Solution 1

It looks as though Heroku is trying to re-build all of the packages on its own according to these lines:

remote: -----> Building dependencies
remote:        Prebuild detected (node_modules already exists)
remote:        Rebuilding any native modules

I would guess that if it doesn't re-build node_modules and just uses the one from my computer (that is working), then it would also work on the server. Is there any way to stop it from automatically re-building?

Possible Solution 2

Heroku allows you to run one-off dynos, such as heroku run bash. This opens a bash client connected to the server.

I was thinking that maybe I could perform the solutions from the other questions regarding this issue directly on the Heroku server. However, they are very restrictive and do not allow sudo access nor apt-get install. Is there any way to circumvent this?

Feel free to provide additional ideas. Thanks for any solutions.

Community
  • 1
  • 1
Jonathan Lam
  • 16,831
  • 17
  • 68
  • 94

1 Answers1

4

node-canvas depends on Cairo, a graphics library written in C. Cairo must be installed on whatever server you are trying to deploy to.

If you want to deploy to Heroku, you'll likely have to use a custom build pack. There is example documentation for how to do that here: https://github.com/Automattic/node-canvas/wiki/Installation-on-Heroku

mikefrey
  • 4,653
  • 3
  • 29
  • 40
  • Exactly what I needed. I didn't see this article. Thanks! – Jonathan Lam Feb 12 '16 at 16:25
  • Recommendation: do not use the multipack repository in that Node-Canvas wiki page. You can use the official Heroku multipack instead: `https://github.com/heroku/heroku-buildpack-multi.git`. See instructions here: https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-multi#buildpack-instructions – taseenb Jul 30 '16 at 16:06
  • I'm getting this `gzip: stdin: not in gzip format` after add cairo buildpack – Pablo Feb 16 '21 at 14:31