I recently setup a fresh VirtualBox Debian Linux system. Within that context, I then walked through the Heroku tutorial on Getting Started with Django on Heroku. I ran into a number of errors along the way. Most of them took a few minutes (or an hour) of surfing to find a solution. If you've found this page, perhaps you hit one of those same error messages, and so my solutions will save you a little time.
I'll follow the sections of the current Django on Heroku tutorial here and just add the errors and solutions I encountered.
There are a bunch of different Python installers out there: pip, distribute, setuptools, easy_install, etc. You'll need both pip and virtualenv... but virtualenv is listed specifically as a prereq at the start of the tutorial. According to the virtualenv page, the preferred way to get virtualenv is to use pip... but the best way to get pip is to use virtualenv. To resolve this, I decided to install pip globally... but pip requires distribute. Of course, the easiest way to get distribute is to use pip to install it (haha!)... but there is also this option where you use curl (or wget) to download an installation script. Once you have distribute, you can do something similar for pip.
It turns out the virtual environment needs a few things installed locally too...
Error: pg_config executable not found.
You need the
postgresql package installed. (Use
apt-get install postgresql to install it.)
Error: You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
Okay, so you also need the
postgresql-server-dev-9.1 package (currently).
In file included from psycopg/psycopgmodule.c:27:0: ./psycopg/psycopg.h:30:20: fatal error: Python.h: No such file or directory compilation terminated.
python-dev package too.
Hooray! At this point, I could get a Python app created in the virtualenv and run it. Things seemed downhill for me from here until...
heroku create gave me:
! Heroku client internal error. getaddrinfo: Name or service not known (SocketError)This error was coming from the excon gem.
heroku logingave me the same error. Turns out I had a DNS problem. I entered 188.8.131.52 (Google's public DNS server) into /etc/resolve.conf and tried it again. Worked.
git push heroku master lead to:
Permission denied (publickey). fatal: The remote end hung up unexpectedly
I needed to generate a public key with:
ssh-keygen -t rsa By default, this puts the key into ~/.ssh/id_rsa.pub. You then need to register it with Heroku:
heroku keys:add ~/.ssh/id_rsa.pub
At this point, I could execute the basic Django app both locally (with
foreman start) and on Heroku.
Although my app wasn't actually using the database, I figured I'd better try syncing with it anyway...
I wanted to run it locally first, so I needed to setup a local postgreSQL database. (The tips on the assignment page were very helpful here.) Also, you need to be
postgre user in order to execute the
psql command that starts the PostgreSQL console. (It took me a while to even track that command down.) So:
root@tinkVr:~# su postgres postgres@tinkVr:/root$ psql could not change directory to "/root" psql (9.1.8) Type "help" for help. postgres=# CREATE USER django WITH CREATEDB PASSWORD 'djangoapp'; CREATE ROLE postgres=# CREATE DATABASE a17 OWNER django; CREATE DATABASE postgres=# \q
You'll probably want to change the lowercase details (user, password, and database names) to something else. Note that you do not need to update your Django project's settings.py with these details because dj_database_url will pull these from from the DATABASE_URL environment variable. (If you log into Heroku's web interface and check your database settings, you can see what these values will actually be in the Heroku environment.) However, to run locally, you do need to set this variable appropriately. In my case, this translates to:
typed at the command prompt.
At this point, I could successfully run
python manage.py syncdb locally. However,
heroku run python manage.py syncdb lead to a timeout. This happened even when just trying to open a simple shell on Heroku with
heroku run bash. Heroku does offer some troubeshooting on this. It turns out port 5000 was being blocked by my ISP (the wired network in the Computer Science department on campus). I switched to the public UH wireless and I was able to connect.
The rest of tutorial went smoothly for me. (pip installs gunicorn for you.) Hopefully it goes smoothly for you too!
Next up: Fleshing out the Django app to actually do something...