diff --git a/.gitignore b/.gitignore index ba74660..58cb931 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,9 @@ docs/_build/ # PyBuilder target/ + +# Vagrant +.vagrant + +# Virtualenv +.virtualenv diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..3a1e85c --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,24 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + config.vm.define "globalwishlist-backend" do |web| + web.vm.box = "ubuntu/trusty64" + + #web.vm.network "private_network", type: "dhcp" + web.vm.network "forwarded_port", guest: 22, host: 2201 + web.vm.network "forwarded_port", guest: 8000, host: 8080 + + web.vm.provider "virtualbox" do |vb| + vb.customize ["modifyvm", :id, "--memory", "512"] + end + + web.vm.provision "ansible" do |ansible| + ansible.limit = 'all' + ansible.playbook = "provision/playbook.yml" + ansible.inventory_path = "provision/hosts" + end + end +end diff --git a/amiibofindr/__init__.py b/amiibofindr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amiibofindr/apps/__init__.py b/amiibofindr/apps/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amiibofindr/settings/__init__.py b/amiibofindr/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amiibofindr/settings/base.py b/amiibofindr/settings/base.py new file mode 100644 index 0000000..f1ac696 --- /dev/null +++ b/amiibofindr/settings/base.py @@ -0,0 +1,102 @@ +""" +Django settings for amiibofindr project. + +Generated by 'django-admin startproject' using Django 1.8.2. + +For more information on this file, see +https://docs.djangoproject.com/en/1.8/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.8/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '0101010101' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.security.SecurityMiddleware', +) + +ROOT_URLCONF = 'amiibofindr.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'amiibofindr.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.8/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Internationalization +# https://docs.djangoproject.com/en/1.8/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.8/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/amiibofindr/settings/local.py b/amiibofindr/settings/local.py new file mode 100644 index 0000000..daa6828 --- /dev/null +++ b/amiibofindr/settings/local.py @@ -0,0 +1,4 @@ +# coding: utf-8 + +from __future__ import unicode_literals +from .base import * diff --git a/amiibofindr/urls.py b/amiibofindr/urls.py new file mode 100644 index 0000000..ceec3f1 --- /dev/null +++ b/amiibofindr/urls.py @@ -0,0 +1,21 @@ +"""amiibofindr URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.8/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Add an import: from blog import urls as blog_urls + 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) +""" +from django.conf.urls import include, url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', include(admin.site.urls)), +] diff --git a/amiibofindr/wsgi.py b/amiibofindr/wsgi.py new file mode 100644 index 0000000..c0daef3 --- /dev/null +++ b/amiibofindr/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for amiibofindr project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "amiibofindr.settings.local") + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..c77bf7b --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "amiibofindr.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/provision/defaults/main.yml b/provision/defaults/main.yml new file mode 100644 index 0000000..6703394 --- /dev/null +++ b/provision/defaults/main.yml @@ -0,0 +1,4 @@ +# PostgreSQL config +postgresql_version: 9.3 +postgresql_database_name: amiibofindr +postgresql_database_user: amiibofindr diff --git a/provision/host_vars/default b/provision/host_vars/default new file mode 100644 index 0000000..c8a9c20 --- /dev/null +++ b/provision/host_vars/default @@ -0,0 +1,4 @@ +--- +postgresql_version: 9.3 +postgresql_database_name: amiibofindr +postgresql_database_user: amiibofindr diff --git a/provision/hosts b/provision/hosts new file mode 100644 index 0000000..57fb589 --- /dev/null +++ b/provision/hosts @@ -0,0 +1,4 @@ +default ansible_ssh_host=127.0.0.1 ansible_ssh_user=vagrant ansible_ssh_port=2201 + +[localdev] +default diff --git a/provision/playbook.yml b/provision/playbook.yml new file mode 100644 index 0000000..e1e04cf --- /dev/null +++ b/provision/playbook.yml @@ -0,0 +1,19 @@ +--- +- name: Common Tasks + hosts: all + roles: + - system + - base + - python + - nodejs + - postgresql + +- name: LocalDev Tasks + hosts: localdev + roles: + - app_localdev + +- name: Production Tasks + hosts: production + roles: + - app_production diff --git a/provision/roles/app_localdev/tasks/aliases.yml b/provision/roles/app_localdev/tasks/aliases.yml new file mode 100644 index 0000000..a26e7eb --- /dev/null +++ b/provision/roles/app_localdev/tasks/aliases.yml @@ -0,0 +1,9 @@ +--- +- name: Ensure (runserver) alias + lineinfile: dest=~/.bash_profile state=present line='alias runserver="python /vagrant/manage.py runserver 0.0.0.0:8000"' +- name: Ensure (runserver_plus) alias + lineinfile: dest=~/.bash_profile state=present line='alias runserver_plus="python /vagrant/manage.py runserver_plus 0.0.0.0:8000"' +- name: Ensure (shell) alias + lineinfile: dest=~/.bash_profile state=present line='alias shell="python /vagrant/manage.py shell"' +- name: Ensure (shell_plus) alias + lineinfile: dest=~/.bash_profile state=present line='alias shell_plus="python /vagrant/manage.py shell_plus"' diff --git a/provision/roles/app_localdev/tasks/deploy.yml b/provision/roles/app_localdev/tasks/deploy.yml new file mode 100644 index 0000000..e988bd1 --- /dev/null +++ b/provision/roles/app_localdev/tasks/deploy.yml @@ -0,0 +1,15 @@ +--- +- name: Install requirements + pip: requirements=/vagrant/requirements/local.txt virtualenv=~/.virtualenv + sudo: yes + sudo_user: vagrant +# - name: Install nodejs requirements +# npm: path=/vagrant +# sudo: yes +# sudo_user: vagrant +- name: Ensure vagrant user have a .bash_profile + file: path=~/.bash_profile state=touch +- name: Ensure directory is changed on login + lineinfile: dest=~/.bash_profile state=present line='cd /vagrant' +- name: Ensure DJANGO_SETTINGS_MODULE environment variable + lineinfile: dest=~/.bash_profile state=present line='export DJANGO_SETTINGS_MODULE="local_settings"' diff --git a/provision/roles/app_localdev/tasks/main.yml b/provision/roles/app_localdev/tasks/main.yml new file mode 100644 index 0000000..e035b80 --- /dev/null +++ b/provision/roles/app_localdev/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- include: python.yml +- include: postgresql.yml +- include: deploy.yml +- include: aliases.yml diff --git a/provision/roles/app_localdev/tasks/postgresql.yml b/provision/roles/app_localdev/tasks/postgresql.yml new file mode 100644 index 0000000..991d89b --- /dev/null +++ b/provision/roles/app_localdev/tasks/postgresql.yml @@ -0,0 +1,16 @@ +--- +- name: Ensure vagrant as postgresql user + postgresql_user: name=vagrant role_attr_flags=SUPERUSER + sudo_user: postgres + sudo: true +- name: Ensure database is present + postgresql_db: name={{ postgresql_database_name }} owner=vagrant + sudo: true + sudo_user: postgres +- name: Ensure vagrant database user is created + postgresql_user: db={{ postgresql_database_name }} name=vagrant password=NULL priv=ALL state=present + sudo_user: postgres + sudo: true +- name: Ensure vagrant user can access + lineinfile: dest=/etc/postgresql/{{ postgresql_version }}/main/pg_hba.conf state=present line='local all postgres trust' + sudo: true diff --git a/provision/roles/app_localdev/tasks/python.yml b/provision/roles/app_localdev/tasks/python.yml new file mode 100644 index 0000000..a1977a4 --- /dev/null +++ b/provision/roles/app_localdev/tasks/python.yml @@ -0,0 +1,22 @@ +--- +# Check if virtualenv is created +- shell: if [ -e .virtualenv ]; then echo yes; else echo no; fi; + register: virtualenv_exists + always_run: True + sudo: true + sudo_user: vagrant +# Create virtualenv +- name: Ensure virtualenv is created + when: virtualenv_exists.stdout == 'no' + command: 'virtualenv .virtualenv' + sudo: true + sudo_user: vagrant +# Auto activate on ssh +- name: Ensure vagrant user have a .bash_profile + file: path=~/.bash_profile state=touch + sudo: true + sudo_user: vagrant +- name: Ensure virtualenv is enabled on login + lineinfile: dest=~/.bash_profile state=present line='. ~/.virtualenv/bin/activate' + sudo: true + sudo_user: vagrant diff --git a/provision/roles/app_production/tasks/main.yml b/provision/roles/app_production/tasks/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/provision/roles/base/handlers/main.yml b/provision/roles/base/handlers/main.yml new file mode 100644 index 0000000..e4dd5a1 --- /dev/null +++ b/provision/roles/base/handlers/main.yml @@ -0,0 +1 @@ +- include: ntp.yml diff --git a/provision/roles/base/handlers/ntp.yml b/provision/roles/base/handlers/ntp.yml new file mode 100644 index 0000000..0ca0444 --- /dev/null +++ b/provision/roles/base/handlers/ntp.yml @@ -0,0 +1,2 @@ +- name: restart ntp + service: name=ntp state=restarted diff --git a/provision/roles/base/tasks/main.yml b/provision/roles/base/tasks/main.yml new file mode 100644 index 0000000..51ac77f --- /dev/null +++ b/provision/roles/base/tasks/main.yml @@ -0,0 +1,2 @@ +--- +- include: ntp.yml diff --git a/provision/roles/base/tasks/ntp.yml b/provision/roles/base/tasks/ntp.yml new file mode 100644 index 0000000..8e55e0f --- /dev/null +++ b/provision/roles/base/tasks/ntp.yml @@ -0,0 +1,8 @@ +--- +- name: ensure ntpd is at the latest version + apt: pkg={{ item }} state=latest + sudo: true + with_items: + - ntp + notify: + - restart ntp diff --git a/provision/roles/nodejs/tasks/main.yml b/provision/roles/nodejs/tasks/main.yml new file mode 100644 index 0000000..697e602 --- /dev/null +++ b/provision/roles/nodejs/tasks/main.yml @@ -0,0 +1,3 @@ +--- +- include: nodejs.yml +- include: tools.yml diff --git a/provision/roles/nodejs/tasks/nodejs.yml b/provision/roles/nodejs/tasks/nodejs.yml new file mode 100644 index 0000000..05b87bb --- /dev/null +++ b/provision/roles/nodejs/tasks/nodejs.yml @@ -0,0 +1,11 @@ +--- +- name: Ensure nodejs is installed + apt: pkg={{ item }} state=latest + sudo: true + with_items: + - nodejs + - npm +- name: Ensure symlink node to nodejs + file: src=/usr/bin/nodejs dest=/usr/bin/node state=link + sudo: true + diff --git a/provision/roles/nodejs/tasks/tools.yml b/provision/roles/nodejs/tasks/tools.yml new file mode 100644 index 0000000..7137217 --- /dev/null +++ b/provision/roles/nodejs/tasks/tools.yml @@ -0,0 +1,7 @@ +--- +- name: Ensure nodejs tools are installed + npm: name={{ item }} global=yes + sudo: true + with_items: + - grunt-cli + - bower diff --git a/provision/roles/postgresql/defaults/main.yml b/provision/roles/postgresql/defaults/main.yml new file mode 100644 index 0000000..1dfeb98 --- /dev/null +++ b/provision/roles/postgresql/defaults/main.yml @@ -0,0 +1,3 @@ +postgresql_database_name: amiibofindr +postgresql_database_user: amiibofindr +postgresql_database_port: 5432 diff --git a/provision/roles/postgresql/handlers/main.yml b/provision/roles/postgresql/handlers/main.yml new file mode 100644 index 0000000..5bcaa75 --- /dev/null +++ b/provision/roles/postgresql/handlers/main.yml @@ -0,0 +1,2 @@ +--- +- include: postgresql.yml diff --git a/provision/roles/postgresql/handlers/postgresql.yml b/provision/roles/postgresql/handlers/postgresql.yml new file mode 100644 index 0000000..b9feed7 --- /dev/null +++ b/provision/roles/postgresql/handlers/postgresql.yml @@ -0,0 +1,4 @@ +--- +- name: start postgresql + service: name=postgresql state=started + sudo: yes diff --git a/provision/roles/postgresql/tasks/create_db.yml b/provision/roles/postgresql/tasks/create_db.yml new file mode 100644 index 0000000..e08002b --- /dev/null +++ b/provision/roles/postgresql/tasks/create_db.yml @@ -0,0 +1,7 @@ +--- +- name: Ensure database is created + postgresql_db: name={{ postgresql_database_name }} + encoding='UTF-8' + state=present + sudo_user: postgres + sudo: true diff --git a/provision/roles/postgresql/tasks/create_user.yml b/provision/roles/postgresql/tasks/create_user.yml new file mode 100644 index 0000000..79a63e7 --- /dev/null +++ b/provision/roles/postgresql/tasks/create_user.yml @@ -0,0 +1,9 @@ +--- +- name: Ensure the database user is present + postgresql_user: db={{ postgresql_database_name }} name={{ postgresql_database_user }} password=NULL priv=ALL state=present + sudo_user: postgres + sudo: true +- name: Ensure user dont have unnecesary privileges + postgresql_user: name={{ postgresql_database_user }} role_attr_flags=NOSUPERUSER,CREATEDB + sudo_user: postgres + sudo: true diff --git a/provision/roles/postgresql/tasks/libs.yml b/provision/roles/postgresql/tasks/libs.yml new file mode 100644 index 0000000..8516ea2 --- /dev/null +++ b/provision/roles/postgresql/tasks/libs.yml @@ -0,0 +1,6 @@ +- name: Install PostgreSQL libraries + apt: pkg=libpq-dev state=latest + sudo: true +- name: Install python psycopg2 library + apt: pkg=python-psycopg2 state=latest + sudo: true diff --git a/provision/roles/postgresql/tasks/main.yml b/provision/roles/postgresql/tasks/main.yml new file mode 100644 index 0000000..3f9b306 --- /dev/null +++ b/provision/roles/postgresql/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- include: libs.yml +- include: postgresql.yml +- include: create_db.yml +- include: create_user.yml diff --git a/provision/roles/postgresql/tasks/postgresql.yml b/provision/roles/postgresql/tasks/postgresql.yml new file mode 100644 index 0000000..dfc7c12 --- /dev/null +++ b/provision/roles/postgresql/tasks/postgresql.yml @@ -0,0 +1,10 @@ +--- +- name: Install PostgreSQL + apt: pkg={{ item }} state=latest + sudo: true + with_items: + - postgresql + - postgresql-client + - postgresql-contrib + notify: + - start postgresql diff --git a/provision/roles/production/tasks/main.yml b/provision/roles/production/tasks/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/provision/roles/python/tasks/libs.yml b/provision/roles/python/tasks/libs.yml new file mode 100644 index 0000000..eda84c1 --- /dev/null +++ b/provision/roles/python/tasks/libs.yml @@ -0,0 +1,7 @@ +--- +- name: Ensure scrapping libraries are installed + apt: pkg={{ item }} state=latest + sudo: true + with_items: + - libxml2-dev + - libxslt1-dev diff --git a/provision/roles/python/tasks/main.yml b/provision/roles/python/tasks/main.yml new file mode 100644 index 0000000..82de139 --- /dev/null +++ b/provision/roles/python/tasks/main.yml @@ -0,0 +1,4 @@ +--- +- include: libs.yml +- include: python.yml +- include: tools.yml diff --git a/provision/roles/python/tasks/python.yml b/provision/roles/python/tasks/python.yml new file mode 100644 index 0000000..6365010 --- /dev/null +++ b/provision/roles/python/tasks/python.yml @@ -0,0 +1,9 @@ +--- +- name: Install python + apt: pkg={{ item }} state=latest + with_items: + - python + - python-dev + - python-pip + - python-virtualenv + sudo: true diff --git a/provision/roles/python/tasks/tools.yml b/provision/roles/python/tasks/tools.yml new file mode 100644 index 0000000..392404c --- /dev/null +++ b/provision/roles/python/tasks/tools.yml @@ -0,0 +1,6 @@ +--- +- name: Ensure debug tools are installed + pip: name={{ item }} + sudo: true + with_items: + - ipdb diff --git a/provision/roles/system/tasks/main.yml b/provision/roles/system/tasks/main.yml new file mode 100644 index 0000000..bb57c92 --- /dev/null +++ b/provision/roles/system/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: Update and Upgrade + apt: update_cache=yes upgrade=dist + sudo: true + +- include: tools.yml diff --git a/provision/roles/system/tasks/tools.yml b/provision/roles/system/tasks/tools.yml new file mode 100644 index 0000000..f2d42ef --- /dev/null +++ b/provision/roles/system/tasks/tools.yml @@ -0,0 +1,5 @@ +--- +- name: Ensure locale is en_US.UTF-8 + lineinfile: dest=/etc/environment line=LANG=en_US.utf-8 + lineinfile: dest=/etc/environment line=LC_ALL=en_US.utf-8 + sudo: true diff --git a/provision/templates/hstore.sql b/provision/templates/hstore.sql new file mode 100644 index 0000000..847859f --- /dev/null +++ b/provision/templates/hstore.sql @@ -0,0 +1,11 @@ +CREATE EXTENSION hstore; + + CREATE OR REPLACE FUNCTION idx(anyarray, anyelement) + RETURNS int AS + $$ + SELECT i FROM ( + SELECT generate_series(array_lower($1,1),array_upper($1,1)) + ) g(i) + WHERE $1[i] = $2 + LIMIT 1; + $$ LANGUAGE sql IMMUTABLE; diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 0000000..7bce565 --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,18 @@ +# Base Django +Django==1.8.2 + +# Tasks +celery==3.1.18 +django-celery==3.1.16 + +# Utils +django-extensions==1.5.5 + +# Model versioning +django-reversion==1.8.7 + +# Admin +django-suit==0.2.13 + +# NoSQL +redis==2.10.3 diff --git a/requirements/local.txt b/requirements/local.txt new file mode 100644 index 0000000..a3e81b8 --- /dev/null +++ b/requirements/local.txt @@ -0,0 +1 @@ +-r base.txt