[[https://cdn.rawgit.com/maidstone-hackspace/administration/2ede7cb1/images/hackspace-banner.png]]

* Maidstone Hackspace website
[[https://pyup.io/repos/github/maidstone-hackspace/maidstone-hackspace-website/][https://pyup.io/repos/github/maidstone-hackspace/maidstone-hackspace-website/shield.svg]]

Repository for the maidstone hackspace website, feel free to fork this site for your own Hackspace.
** Social
Test site sharing links / cards with twitter and facebook
https://cards-dev.twitter.com/validator
https://developers.facebook.com/tools/debug/
** Requirements
Before getting started make sure you have git, docker and docker-compose installed on your machine.
The simplest way to setup this site is to use docker-compose so please install that from this site 
https://docs.docker.com/engine/installation/ 
and make sure the quick start guide works 
https://docs.docker.com/machine/get-started/ 
then you can use the commands below to test and make changes.

** Setup
Steps to get the site running for the first time

*** First clone the project
To get started checkout the project to your machine, with the command below.

#+BEGIN_SRC sh
git clone https://github.com/maidstone-hackspace/maidstone-hackspace-website.git
#+END_SRC

*** Then build your containers to install the sites requirements
Once checked out build your containers locally you only need to do this when first start or if requirements change.

#+BEGIN_SRC sh
docker-compose -f local.yml build
#+END_SRC

*** Next start your new containers containing a database and django

#+BEGIN_SRC sh
docker-compose -f local.yml up
#+END_SRC

Once it's running, there's a few commands to run the first time before you can use it.

*** Run migrations to setup the database
To run django commands just prefix them with =docker-compose -f local.yml run django=
#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py migrate
#+END_SRC

*** Download static content
#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py collectstatic
#+END_SRC

*** Find the website address
Every time you start the website with the =docker-compose -f local.yml up= command the IPAddress of the website could change.
To find it you can run =docker ps=, but you may find the following command more handy.
#+BEGIN_SRC sh
docker ps -q | xargs docker inspect --format="{{printf \"%.40s\" .Name}} @ {{printf \"%.20s\" .Config.Image}} @ http://{{if ne \"\" .NetworkSettings.IPAddress}}{{ printf \"%.22s\" .NetworkSettings.IPAddress}}{{else}}{{range .NetworkSettings.Networks}}{{printf \"%.22s\" .IPAddress}}{{end}}{{end}} @ {{printf \"%.10s\" .State.Status}}" | column -t -s@ -c 80
#+END_SRC
This should return something like this:
#+BEGIN_SRC sh
/maidstonehackspacewebsite_nginx_1          olymk2/nginx            http://172.18.0.12    running
/maidstonehackspacewebsite_celerybeat_1     maidstonehackspacewe    http://172.18.0.10    running
/maidstonehackspacewebsite_celeryworker_    maidstonehackspacewe    http://172.18.0.11    running
/maidstonehackspacewebsite_django_1         maidstonehackspacewe    http://172.18.0.9     running
/maidstonehackspacewebsite_django_bjoren    maidstonehackspacewe    http://172.18.0.8     running
/maidstonehackspacewebsite_django_gunico    maidstonehackspacewe    http://172.18.0.7     running
/maidstonehackspacewebsite_postgres_1       maidstonehackspacewe    http://172.18.0.6     running
/maidstonehackspacewebsite_bucket_1         minio/minio             http://172.18.0.5     running
/maidstonehackspacewebsite_directory_1      osixia/openldap:1.2.    http://172.18.0.4     running
/maidstonehackspacewebsite_mailhog_1        mailhog/mailhog         http://172.18.0.3     running
/maidstonehackspacewebsite_redis_1          redis:latest            http://172.18.0.2     running
#+END_SRC
Look for the =nginx= line, in this instance the IPAddress is 172.18.0.12.
This IPAddress will be used in the rest of the examples below, you will need to substitue with your IPAddress.

At this point the website should be up and running and you should be able to access it by going to the nginx IPAddress, e.g.,
http://172.18.0.12/

*** Create the admin user.
Once created you can login at http://172.18.0.12/trustee
#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py createsuperuser
#+END_SRC

*** Generate dummy data
#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py generate_test_data
#+END_SRC
** Migrations / Managing default data
If you want to export some data you entered into the admin area you can use =dumpdata= and =loaddata= to export and import.

#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py dumpdata feeds > mhackspace/feeds/fixtures/defaults.json
docker-compose -f local.yml run --rm django python manage.py loaddata mhackspace/feeds/fixtures/defaults.json
#+END_SRC

** Django Commands

#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py list_subscriptions
#+END_SRC

*** Render image variations, if you change the images sizes this will be needed
#+BEGIN_SRC sh
docker-compose -f local.yml run --rm django python manage.py rendervariations 'blog.Post.image' --replace
#+END_SRC
** Api
#+BEGIN_SRC python
import requests 

url = 'http://127.0.0.1:8180/api/v1/rfidAuth/'
data = {
  'rfid': '4996',
  'device': '7bff6053-77ef-4250-ac11-8a119fd05a0e'
}

# client = RequestsClient()
response = requests.post(
    'http://127.0.0.1:8180/api/v1/rfidAuth/',
    data={'rfid': '238e', 'device': 'e8f27231-8093-4477-8906-e5ae1b12dbd6'})
#requests.get(url)
return response.status_code

#+END_SRC

#+RESULTS:
: 200
** Server 
Example service setup for website under docker, nginx in a container forwarding traffic to uwsgi.
*** nginx web server
#+BEGIN_SRC bash
docker volume create --name=sockets
docker run --name=nginx -d \
    -v /etc/nginx/sites-enabled/:/etc/nginx/sites-enabled/ \
    -v /etc/letsencrypt/:/etc/letsencrypt/ \
    -v /var/www/:/var/www/ \
    -v sockets:/data/sockets -p 80:80 -p 443:443 olymk2/nginx 
#+END_SRC
*** letsencrypt cert setup
Setup / create new certs
#+BEGIN_SRC bash
letsencrypt certonly --renew --webroot -w /var/www/.well-known -d stage.maidstone-hackspace.org.uk
letsencrypt certonly --webroot -w /var/www/.well-known -d stage.maidstone-hackspace.org.uk
#+END_SRC

Automation of renewal process
create a file called =/etc/cron.monthly/letsencrypt-renew.sh= and make it executable with chmod +x, then place your above commands in the file like in the example below. 
#+BEGIN_SRC bash
#!/bin/bash
letsencrypt certonly --webroot --renew-by-default --agree-tos -w /var/www/.well-known -d stage.maidstone-hackspace.org.uk
#+END_SRC

*** Postgres tips
Connect to the database inside container to run sql commands.
#+BEGIN_SRC bash
docker-compose -fstage.yml run --rm postgres psql -U postgres
#+END_SRC

*** Backups
Create a backup file with today's date
#+BEGIN_SRC bash
    docker exec -t {CONTAINER_NAME} pg_dump -Fp -c -U postgresuser > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql
    docker exec {CONTAINER_NAME} bash -lc 'pg_dump --format custom vmdb_production' > dump_`date +%d-%m-%Y"_"%H_%M_%S`.pgdata
#+END_SRC

Import previously made backup
#+BEGIN_SRC bash
docker exec -i -u {USER} {CONTAINER_NAME}  pg_restore --verbose --no-acl --no-owner --clean --role=postgres -Upostgres --dbname={DATABASE_USER} < dump_31-01-2018_13_09_24.pgdata
  docker exec -i -u {USER} {CONTAINER_NAME} pg_restore -C --clean -d {DATABASE_USER} < dump_31-01-2018_13_09_24.pgdata
  cat dump_27-01-2018_14_26_09.sql | docker exec -i {CONTAINER_ID} psql -U postgres
#+END_SRC

letsencrypt config
#+BEGIN_SRC bash
  letsencrypt certonly --renew --webroot -w /var/www/.well-known -d maidstone-hackspace.org.uk -d maidstone-hackspace.org.uk -d www.maidstone-hackspace.org.uk
#+END_SRC


CMD ["nginx", "-g", "daemon off;"]
sudo chmod -R a+rX static/

#+BEGIN_SRC emacs-lisp
(let ((default-directory "/docker:hackdev_django_1:/app"))
  (python-shell-make-comint "python manage.py shell" "Python" 'show))
#+END_SRC
** Test

#+BEGIN_SRC emacs-lisp
(setq python-shell-interpreter "/docker:hackdev_django_1:/usr/local/bin/python")
(setq python-environment-directory "/docker:hackdev_django_1:/")
#+END_SRC

#+RESULTS:
: /docker:hackdev_django_1:/

