morph.io: A scraping platform
- A Heroku for Scrapers
- All code and collaboration through GitHub
- Simple API to grab data
- Schedule scrapers or run manually
- Process isolation via Docker
- Trivial to move scraper code and data from ScraperWiki Classic
- Email alerts for broken scrapers
Ruby 2.3.1, Docker, MySQL, SQLite 3, Redis, mitmproxy. (See below for more details about installing Docker)
Development is supported on Linux and Mac OS X.
- openaustralia/morph - Main application
- openaustralia/morph-cli - Command-line morph.io tool
- openaustralia/scraperwiki-python - Fork of scraperwiki/scraperwiki-python updated to use morph.io naming conventions
- openaustralia/scraperwiki-ruby - Fork of scraperwiki/scraperwiki-ruby updated to use morph.io naming conventions
- openaustralia/buildstep - Base image for running scrapers in containers
Just follow the instructions on the Docker site.
Your user account should be able to manipulate Docker (just add your user to the
On Mac OS X
Install Docker for Mac.
Starting up Elasticsearch
Morph needs Elasticsearch to run. We've made things easier for development by using docker to run Elasticsearch.
To Install Morph
bundle install cp config/database.yml.example config/database.yml cp env-example .env
config/database.yml with your database settings
Create an application on GitHub so that morph.io can talk to GitHub. Fill in the following values
- Application name: Morph (dev)
- Homepage URL: http://127.0.0.1:3000
- Authorization callback URL: http://127.0.0.1:3000/users/auth/github/callback
- Application description: You can leave this blank
Note the use of 127.0.0.1 rather than localhost. Use this or it won't work.
.env file, fill in the Client ID and Client Secret details provided by GitHub for the application you've just created.
Now setup the databases:
bundle exec dotenv rake db:setup
Now you can start the server
bundle exec dotenv foreman start
and point your browser at http://127.0.0.1:3000
To get started, log in with GitHub. There is a simple admin interface accessible at http://127.0.0.1:3000/admin. To access this, run the following to give your account admin rights:
bundle exec rake app:promote_to_admin
If you're running guard (see above) the tests will also automatically run when you change a file.
By default, RSpec will skip tests that have been tagged as being slow. To change this behaviour, add the following to your
By default, RSpec will run certain tests against a running Docker server. These tests are quite slow, but not have been tagged as slow. To stop Rspec from running these tests, add the following to your
We use Guard and Livereload so that whenever you edit a view in development the web page gets automatically reloaded. It's a massive time saver when you're doing design or lots of work in the view. To make it work run
bundle exec guard
Guard will also run tests when needed. Some tests do integration tests against a running docker server. These particular tests are very slow. If you want to disable them,
DONT_RUN_DOCKER_TESTS=1 bundle exec guard
Mail in development
By default in development mails are sent to Mailcatcher. To install
gem install mailcatcher
Deploying to production
This section will not be relevant to most people. It will however be relevant if you're deploying to a production server.
We're using Ansible Vault to encrypt certain files, like the private key for the SSL certificate.
To make this work you will need to put the password in a
~/.infrastructure_ansible_vault_pass.txt. This is the same password as used in the openaustralia/infrastructure GitHub repository.
Production devops development
Install the hostsupdater plugin:
vagrant plugin install vagrant-hostsupdater
vagrant up local. This will build and provision a box that looks and acts like production at
Once the box is created and provisioned, deploy the application to your Vagrant box:
cap local deploy
Now visit https://dev.morph.io/
Production provisioning and deployment
To deploy morph.io to production, normally you'll just want to deploy using Capistrano:
cap production deploy
When you've changed the Ansible playbooks to modify the infrastructure you'll want to run:
ansible-playbook --user=root --inventory-file=provisioning/hosts provisioning/playbook.yml
We're using Let's Encrypt for SSL certificates. It's not 100% automated. On a completely fresh install (with a new domain) as root:
certbot --nginx certonly -m firstname.lastname@example.org --agree-tos
It should show something like this:
Which names would you like to activate HTTPS for? ------------------------------------------------------------------------------- 1: morph.io 2: api.morph.io 3: faye.morph.io 4: help.morph.io
Leave your answer your blank which will install the certificate for all of them
Installing certificates for local vagrant build
sudo certbot certonly --manual -d dev.morph.io --preferred-challenges dns -d api.dev.morph.io -d faye.dev.morph.io -d help.dev.morph.io
How to contribute
If you find what looks like a bug:
- Check the GitHub issue tracker to see if anyone else has reported issue.
- If you don't see anything, create an issue with information on how to reproduce it.
If you want to contribute an enhancement or a fix:
- Fork the project on GitHub.
- Make your changes with tests.
- Commit the changes without making changes to any files that aren't related to your enhancement or fix.
- Send a pull request.
We maintain a list of issues that are easy fixes. Fixing one of these is a great way to get started while you get familiar with the codebase.
Copyright & License
Copyright OpenAustralia Foundation Limited. Licensed under the Affero GPL. See LICENSE file for more details.