Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docker dev setup #25

Merged
merged 14 commits into from Apr 4, 2016
5 changes: 4 additions & 1 deletion .gitignore
Expand Up @@ -2,7 +2,10 @@ db.sqlite3
pypolo/local_settings.py
data.json
db.sqlite3-journal
docker/env
docker-compose.yml
static/*
.DS_Store
*.pyc
static/*
*.log
*.swp
18 changes: 18 additions & 0 deletions Dockerfile
@@ -0,0 +1,18 @@
FROM python:2.7

RUN apt-get update && apt-get install -y \
gcc \
gettext \
mysql-client libmysqlclient-dev \
postgresql-client libpq-dev \
sqlite3 \
libblas-dev \
liblapack-dev \
libatlas-base-dev \
gfortran \
cron \
--no-install-recommends && rm -rf /var/lib/apt/lists/*

COPY requirements.txt /requirements.txt
RUN pip install --no-cache-dir -r /requirements.txt

21 changes: 21 additions & 0 deletions docker-compose.yml.example
@@ -0,0 +1,21 @@
version: '2'
services:
db:
image: postgres
env_file: docker/env
volumes:
- 'db-data:/var/lib/postgresql/data'
web:
image: t0mk/pytrader-dev
build: ./
command: /root/pytrader/docker/wait-and-run.sh db
ports:
- "8000:8000"
depends_on:
- db
env_file: docker/env
volumes:
- './:/root/pytrader'
volumes:
db-data:

9 changes: 9 additions & 0 deletions docker/create_admin.py
@@ -0,0 +1,9 @@
#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pypolo.settings")
from django.contrib.auth.models import User

username = os.environ.get("PYTRADER_USER", 'trader')
password = os.environ.get("PYTRADER_PASSWORD", 'trader')
if not User.objects.filter(username=username).exists():
User.objects.create_superuser(username, '', password)
6 changes: 6 additions & 0 deletions docker/env.example
@@ -0,0 +1,6 @@
POSTGRES_USER=trader
POSTGRES_PASSWORD=trader
POSTGRES_DB=trader

POLONIEX_API_KEY=
POLONIEX_API_SECRET=
19 changes: 19 additions & 0 deletions docker/supervisord.conf
@@ -0,0 +1,19 @@
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)

[program:django]
command = ./manage.py runserver 0.0.0.0:8000
directory = /root/pytrader

[program:cron]
command = /usr/sbin/cron -f
stdout_logfile = /%(program_name)s.log
stderr_logfile = /%(program_name)s.log
autorestart = true
24 changes: 24 additions & 0 deletions docker/wait-and-run.sh
@@ -0,0 +1,24 @@
#!/bin/bash

set -e

host="$1"
export PGPASSWORD=$POSTGRES_PASSWORD
until psql -h "$host" -U $POSTGRES_USER -c '\l'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done

>&2 echo "Postgres is up - doing Django magic"
cd /root/pytrader

# http://stackoverflow.com/questions/23564529/chartit-is-not-a-valid-tag-librarydjango
sed -i 's/from django.utils import simplejson/import simplejson/' /usr/local/lib/python2.7/site-packages/chartit/templatetags/chartit.py
./manage.py syncdb --noinput
# For some reason I can't make it run from the subdir. I dont know Django too
# well.
cp ./docker/create_admin.py ./
./create_admin.py
./manage.py migrate --noinput
crontab /root/pytrader/scripts/crontab.txt
exec supervisord -n -c /root/pytrader/docker/supervisord.conf
22 changes: 22 additions & 0 deletions pypolo/local_settings.py.example
@@ -0,0 +1,22 @@
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MAKE_TRADES = False

API_KEY = os.environ['POLONIEX_API_KEY']
API_SECRET = os.environ['POLONIEX_API_SECRET']

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['POSTGRES_DB'],
'USER': os.environ['POSTGRES_USER'],
'PASSWORD': os.environ['POSTGRES_PASSWORD'],
'HOST': 'db',
'PORT': '',
'ATOMIC_REQUESTS': True,
},
}

DEBUG_APPS = []
31 changes: 30 additions & 1 deletion readme.md
Expand Up @@ -224,8 +224,37 @@ Once enough `Price` objects are stored in the database, you'll be able to begin

See the next document, [How to trade with pytrader](https://github.com/owocki/pytrader/blob/master/howto_trade.md).

## Docker dev setup

<!-- Google Analytics -->
Work with docker 1.10.3 and docker-compose 1.6.2

- initalize your environment:

```
cp docker-compose.yml.example docker-compose.yml
cp docker/env.example docker/env
cp pypolo/local_settings.py.example pypolo/local_settings.py
```

1. Add your POLONIEX_API_KEY and POLONIEX_API_SECRET to docker/env (its gitignored, dont worry)
2. Build Docker image (compiling stuff for scipy and numpy takes time): `docker-compose build` or pull the images from Docker Hub: `docker-compose pull`
4. Run the containers: `docker-compose up`
5. Get shell: `docker exec -it pytrader_web_1 /bin/bash`
6. Place sql seed in this repo dir as `prices.psql`
7. in Django container

```
cd /root/pytrader
export PGPASSWORD=$POSTGRES_PASSWORD
psql -h db -U trader trader < prices.psql
```
wait for the psql load to end

8. restart setup: (in the host): `docker-compose kill && docker-compose up -d`
9. Visit http://localhost:8000/admin and log in as `trader:trader`


<!-- Google Analytics -->
<img src='https://ga-beacon.appspot.com/UA-1014419-15/owocki/pytrader' style='width:1px; height:1px;' >


2 changes: 2 additions & 0 deletions requirements.txt
@@ -1,4 +1,5 @@
django==1.8.2
numpy==1.7.1
scipy==0.13.3
matplotlib==1.3.1
PyBrain==0.3
Expand All @@ -7,3 +8,4 @@ django-chartit==0.1
simplejson==3.8.2
Cython==0.23.5
sklearn==0.0
supervisor==3.2.3