2017-10-22 20:00:29 +00:00
|
|
|
# Baby Buddy
|
|
|
|
|
2017-10-22 22:24:52 +00:00
|
|
|
[![Build Status](https://travis-ci.org/cdubz/babybuddy.svg?branch=master)](https://travis-ci.org/cdubz/babybuddy)
|
|
|
|
[![Coverage Status](https://coveralls.io/repos/github/cdubz/babybuddy/badge.svg?branch=master)](https://coveralls.io/github/cdubz/babybuddy?branch=master)
|
2017-10-23 08:25:31 +00:00
|
|
|
[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause)
|
2017-11-21 21:41:40 +00:00
|
|
|
[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/babybuddy/Lobby)
|
2017-10-22 22:24:52 +00:00
|
|
|
|
2017-10-22 21:08:16 +00:00
|
|
|
A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, and
|
2017-10-24 00:33:28 +00:00
|
|
|
tummy time to learn about and predict baby's needs without (*as much*) guess
|
2017-10-23 14:38:52 +00:00
|
|
|
work.
|
|
|
|
|
2017-10-28 03:20:52 +00:00
|
|
|
![Baby Buddy desktop view](screenshot.png)
|
|
|
|
|
|
|
|
![Baby Buddy mobile views](screenshot_mobile.png)
|
2017-10-22 20:00:29 +00:00
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
**Table of Contents**
|
|
|
|
|
|
|
|
- [Demo](#demo)
|
|
|
|
- [Deployment](#deployment)
|
2017-11-16 19:24:27 +00:00
|
|
|
- [AWS Elastic Beanstalk](#aws-elastic-beanstalk)
|
2017-11-24 19:39:20 +00:00
|
|
|
- [Docker](#docker)
|
2017-11-15 18:08:13 +00:00
|
|
|
- [Nanobox](#nanobox)
|
2017-11-16 19:24:27 +00:00
|
|
|
- [Heroku](#heroku)
|
2017-11-20 16:12:09 +00:00
|
|
|
- [Manual](#manual)
|
2017-11-15 18:08:13 +00:00
|
|
|
- [Development](#development)
|
|
|
|
- [Installation](#installation)
|
|
|
|
- [Fake data](#fake-data)
|
|
|
|
- [Testing](#testing)
|
|
|
|
|
2017-10-23 09:25:56 +00:00
|
|
|
## Demo
|
|
|
|
|
2017-10-23 14:38:52 +00:00
|
|
|
A [demo of Baby Buddy](https://babybuddy.herokuapp.com) is available on Heroku.
|
|
|
|
The demo instance resets every hour. Login credentials are:
|
|
|
|
|
|
|
|
- Username: `admin`
|
|
|
|
- Password: `admin`
|
2017-10-23 09:25:56 +00:00
|
|
|
|
2017-10-24 00:33:28 +00:00
|
|
|
## Deployment
|
|
|
|
|
|
|
|
**:warning: Baby Buddy is still in early development and does not yet have a
|
|
|
|
stable production deployment flow. :warning:**
|
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
The default user name and password for Baby Buddy is `admin`/`admin`. For any
|
|
|
|
deployment, **log in and change the default password immediately**.
|
|
|
|
|
2017-11-16 19:24:27 +00:00
|
|
|
### AWS Elastic Beanstalk
|
2017-10-24 00:33:28 +00:00
|
|
|
|
2017-11-16 19:24:27 +00:00
|
|
|
A basic [Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/)
|
2017-11-20 16:12:09 +00:00
|
|
|
configuration is provided in `.ebextensions/babybuddy.config`. The steps
|
2017-11-16 19:24:27 +00:00
|
|
|
below are a rough guide to deployment. See [Working with Python](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-apps.html)
|
|
|
|
for detailed information.
|
2017-10-24 00:33:28 +00:00
|
|
|
|
2017-11-16 19:24:27 +00:00
|
|
|
1. Clone/download the Baby Buddy repo
|
2017-11-15 18:08:13 +00:00
|
|
|
|
2017-11-16 19:24:27 +00:00
|
|
|
git clone https://github.com/cdubz/babybuddy.git
|
|
|
|
|
|
|
|
1. Enter the cloned/downloaded directory
|
|
|
|
|
|
|
|
cd babybuddy
|
|
|
|
|
2017-11-20 16:12:09 +00:00
|
|
|
1. Change the `SECRET_KEY` value to something random in `.ebextensions/babybuddy.config`
|
2017-11-16 19:24:27 +00:00
|
|
|
|
|
|
|
1. [Create an IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) in AWS with EB, EC2, RDS and S3 privileges.
|
|
|
|
|
|
|
|
1. Initialize the Elastic Bean application (using the IAM user from the previous step)
|
|
|
|
|
|
|
|
eb init
|
|
|
|
|
|
|
|
1. Create/deploy the environment! :rocket:
|
|
|
|
|
|
|
|
eb create -db -db.engine postgres
|
|
|
|
|
|
|
|
The create command will also do an initial deployment. Run `eb deploy` to
|
|
|
|
redeploy the app (e.g. if there are errors or settings are changed).
|
2017-11-15 18:08:13 +00:00
|
|
|
|
2017-11-24 19:39:20 +00:00
|
|
|
### Docker
|
|
|
|
|
|
|
|
A Docker deploy requires [Docker](http://docker.com/) and
|
|
|
|
[Docker Compose](https://docs.docker.com/compose/overview/) to create two
|
|
|
|
containers - one for the database and one for the application.
|
|
|
|
|
|
|
|
1. Copy the `docker.env.example` to `docker.env` and set the `ALLOWED_HOSTS` and
|
|
|
|
`SECRET_KEY` variables within
|
|
|
|
|
|
|
|
cp docker.env.example docker.env
|
|
|
|
editor docker.env
|
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
1. Build/run the application
|
2017-11-24 19:39:20 +00:00
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
docker-compose up -d
|
2017-11-24 19:39:20 +00:00
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
1. Initialize the database *(first run/after updates)*
|
2017-11-24 19:39:20 +00:00
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
docker-compose exec app python manage.py migrate
|
2017-11-24 19:39:20 +00:00
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
1. Initialize static assets *(first run/after updates)*
|
2017-11-24 19:39:20 +00:00
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
docker-compose exec app python manage.py collectstatic
|
2017-11-24 19:39:20 +00:00
|
|
|
|
|
|
|
The app should now be locally available at
|
|
|
|
[http://127.0.0.1:8000](http://127.0.0.1:8000). See
|
|
|
|
[Get Started, Part 6: Deploy your app](https://docs.docker.com/get-started/part6/)
|
|
|
|
for detailed information about how to deployment methods with Docker.
|
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
### Nanobox
|
|
|
|
|
|
|
|
An example [Nanobox](https://nanobox.io/) configuration, `boxfile.yml`, is
|
|
|
|
provided with Baby Buddy. The steps below are a rough guide to deployment. See
|
|
|
|
[Create and Deploy a Custom Django App](https://guides.nanobox.io/python/django/)
|
|
|
|
for detailed information about Nanobox's deployment and configuration process.
|
|
|
|
|
|
|
|
1. Clone/download the Baby Buddy repo
|
|
|
|
|
|
|
|
git clone https://github.com/cdubz/babybuddy.git
|
|
|
|
|
|
|
|
1. Enter the cloned/downloaded directory
|
|
|
|
|
|
|
|
cd babybuddy
|
|
|
|
|
2017-11-26 19:02:57 +00:00
|
|
|
1. Add the `SECRET_KEY` and `DJANGO_SETTINGS_MODULE` environment variables
|
2017-11-15 18:08:13 +00:00
|
|
|
|
|
|
|
nanobox evar add DJANGO_SETTINGS_MODULE=babybuddy.settings.nanobox
|
|
|
|
nanobox evar add SECRET_KEY=<CHANGE TO SOMETHING RANDOM>
|
|
|
|
|
|
|
|
1. Deploy! :rocket:
|
|
|
|
|
|
|
|
nanobox deploy
|
2017-10-24 00:33:28 +00:00
|
|
|
|
2017-11-16 19:24:27 +00:00
|
|
|
### Heroku
|
|
|
|
|
|
|
|
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
|
|
|
|
|
|
|
|
For manual deployments to Heroku without using the deploy button, make sure to
|
|
|
|
create two settings before pushing using `heroku config:set`:
|
|
|
|
|
|
|
|
heroku config:set DJANGO_SETTINGS_MODULE=babybuddy.settings.heroku
|
|
|
|
heroku config:set SECRET_KEY=<CHANGE TO SOMETHING RANDOM>
|
2017-11-20 16:12:09 +00:00
|
|
|
|
|
|
|
### Manual
|
|
|
|
|
|
|
|
There are a number of ways to deploy Baby Buddy manually to any server/VPS.
|
|
|
|
The application can run fine in low memory (below 1GB) situations, however a
|
|
|
|
32-bit operating system is recommended in such cases. This is primarily
|
|
|
|
because the build process can be memory intensive and cause excessive memory
|
|
|
|
usage on 64-bit systems. If all fails, assets can be built on a local machine
|
|
|
|
and then uploaded to a server.
|
|
|
|
|
|
|
|
#### Requirements
|
|
|
|
|
|
|
|
- Python 2.7+, pip, pipenv
|
|
|
|
- Web server ([nginx](http://nginx.org/), [Apache](http://httpd.apache.org/), etc.)
|
|
|
|
- Application server ([uwsgi](http://projects.unbit.it/uwsgi), [gunicorn](http://gunicorn.org/), etc.)
|
|
|
|
- Database ([sqlite](https://sqlite.org/), [Postgres](https://www.postgresql.org/), [MySQL](https://www.mysql.com/), etc.)
|
|
|
|
- NodeJS 8.x and NPM 5.x (for building assets)
|
|
|
|
- Gulp (for building assets)
|
|
|
|
|
|
|
|
#### Example deployment
|
|
|
|
|
|
|
|
*This example assumes a 512MB VPS instance with Ubuntu 16.04 **x32**.* It uses
|
|
|
|
Python 3.x, nginx, uwsgi and sqlite and should be sufficient for a few users
|
|
|
|
(e.g. two parents and 1+ child).
|
|
|
|
|
|
|
|
1. Install Python 3.x, pip, nginx and uwsgi
|
|
|
|
|
|
|
|
sudo apt-get install python3 python3-pip nginx uwsgi uwsgi-plugin-python3
|
|
|
|
|
|
|
|
1. Install pipenv
|
|
|
|
|
|
|
|
sudo -H pip install pipenv
|
|
|
|
|
|
|
|
1. Install NodeJS, NPM and Gulp
|
|
|
|
|
|
|
|
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
|
|
|
sudo apt-get install nodejs
|
|
|
|
sudo npm install -g gulp-cli
|
|
|
|
|
|
|
|
1. Set up directories and files
|
|
|
|
|
|
|
|
sudo mkdir /var/www/babybuddy
|
|
|
|
sudo chown user:user /var/www/babybuddy
|
|
|
|
mkdir -p /var/www/babybuddy/data/media
|
|
|
|
sudo chown -R www-data:www-data /var/www/babybuddy/data
|
|
|
|
git clone https://github.com/cdubz/babybuddy.git /var/www/babybuddy/public
|
|
|
|
|
|
|
|
1. Move in to the application folder
|
|
|
|
|
|
|
|
cd /var/www/babybuddy/public
|
|
|
|
|
|
|
|
1. Initiate the Python environment
|
|
|
|
|
|
|
|
pipenv --three --dev
|
|
|
|
|
|
|
|
1. Build static assets
|
|
|
|
|
|
|
|
npm install
|
|
|
|
gulp build
|
|
|
|
|
|
|
|
1. Create a production settings file and set the ``SECRET_KEY`` and ``ALLOWED_HOSTS`` values
|
|
|
|
|
|
|
|
cp babybuddy/settings/production.example.py babybuddy/settings/production.py
|
|
|
|
editor babybuddy/settings/production.py
|
|
|
|
|
|
|
|
1. Initiate the application
|
|
|
|
|
|
|
|
export DJANGO_SETTINGS_MODULE=babybuddy.settings.production
|
|
|
|
gulp collectstatic
|
|
|
|
gulp migrate
|
|
|
|
|
|
|
|
1. Set appropriate permissions on the database and data folder
|
|
|
|
|
|
|
|
sudo chown www-data:www-data /var/www/babybuddy/data/db.sqlite3
|
|
|
|
sudo chmod 640 /var/www/babybuddy/data/db.sqlite3
|
|
|
|
sudo chmod 750 /var/www/babybuddy/data
|
|
|
|
|
|
|
|
1. Create and configure the uwsgi app
|
|
|
|
|
|
|
|
sudo editor /etc/uwsgi/apps-available/babybuddy.ini
|
|
|
|
sudo ln -s /etc/uwsgi/apps-available/babybuddy.ini /etc/uwsgi/apps-enabled/babybuddy.ini
|
|
|
|
sudo service uwsgi restart
|
|
|
|
|
|
|
|
Example config:
|
|
|
|
|
|
|
|
[uwsgi]
|
|
|
|
plugins = python3
|
|
|
|
project = babybuddy
|
|
|
|
base_dir = /var/www/babybuddy
|
|
|
|
|
|
|
|
virtualenv = /home/user/.local/share/virtualenvs/babybuddy-XXXXXXXX
|
|
|
|
chdir = %(base_dir)/babybuddy
|
|
|
|
module = %(project).wsgi:application
|
|
|
|
env = DJANGO_SETTINGS_MODULE=%(project).settings.production
|
|
|
|
master = True
|
|
|
|
vacuum = True
|
|
|
|
|
|
|
|
See the [uWSGI documentation](http://uwsgi-docs.readthedocs.io/en/latest/)
|
|
|
|
for more advanced configuration details.
|
|
|
|
|
|
|
|
*Note: Find the location of the pipenv virtual environment with the command
|
|
|
|
``pipenv --venv``.*
|
|
|
|
|
|
|
|
1. Create and configure the nginx server
|
|
|
|
|
|
|
|
sudo vim /etc/nginx/sites-available/babybuddy
|
|
|
|
sudo ln -s /etc/nginx/sites-available/babybuddy /etc/nginx/sites-enabled/babybuddy
|
|
|
|
sudo service nginx restart
|
|
|
|
|
|
|
|
Example config:
|
|
|
|
|
|
|
|
upstream babybuddy {
|
|
|
|
server unix:///var/run/uwsgi/app/babybuddy/socket;
|
|
|
|
}
|
|
|
|
|
|
|
|
server {
|
|
|
|
listen 80;
|
|
|
|
server_name babybuddy.example.com;
|
|
|
|
|
|
|
|
location / {
|
|
|
|
uwsgi_pass babybuddy;
|
|
|
|
include uwsgi_params;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
See the [nginx documentation](https://nginx.org/en/docs/) for more advanced
|
|
|
|
configuration details.
|
|
|
|
|
|
|
|
1. That's it (hopefully)! :tada:
|
2017-11-16 19:24:27 +00:00
|
|
|
|
2017-10-23 08:25:31 +00:00
|
|
|
## Development
|
|
|
|
|
|
|
|
### Installation
|
2017-10-22 20:00:29 +00:00
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
pip install pipenv
|
|
|
|
pipenv install --dev
|
|
|
|
npm install -g gulp-cli
|
|
|
|
npm install
|
|
|
|
gulp migrate
|
|
|
|
gulp
|
2017-10-22 20:00:29 +00:00
|
|
|
|
2017-10-22 20:50:47 +00:00
|
|
|
Open [http://127.0.0.1:8000](http://127.0.0.1:8000) and log in with the default
|
2017-10-23 14:38:52 +00:00
|
|
|
user name and password (`admin`/`admin`).
|
2017-10-22 20:50:47 +00:00
|
|
|
|
2017-10-22 20:00:29 +00:00
|
|
|
### Fake data
|
|
|
|
|
2017-10-26 16:26:09 +00:00
|
|
|
Add some fake data to the database with the following command:
|
2017-10-22 20:00:29 +00:00
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
gulp fake
|
2017-10-24 00:33:28 +00:00
|
|
|
|
2017-10-26 16:26:09 +00:00
|
|
|
By default, ``fake`` creates one child and 31 days of random data. Use the
|
|
|
|
``--children`` and ``--days`` flags to change the default values, e.g.
|
|
|
|
``gulp fake --children 5 --days 7`` to generate five fake children and seven
|
|
|
|
days of data for each.
|
|
|
|
|
2017-10-24 00:33:28 +00:00
|
|
|
### Testing
|
|
|
|
|
|
|
|
:exclamation: Tests require static files to be collected, it may be necessary
|
|
|
|
to execute ``gulp build && gulp collectstatic`` before tests (if static files
|
|
|
|
have changed).
|
|
|
|
|
2017-11-15 18:08:13 +00:00
|
|
|
gulp test
|