PROJECT_ID := haitidata PRODUCTION_HOST := haitidata.com SHELL := /bin/bash DATABASE_NAME := gis DATABASE_GEONODE_NAME := geonode_data # ---------------------------------------------------------------------------- # P R O D U C T I O N C O M M A N D S # ---------------------------------------------------------------------------- upload-fixtures: # restore fixtures @docker-compose -p $(PROJECT_ID) run django /bin/bash -c "\ python manage.py loaddata /home/web/django_project/base/fixtures/base_region.json" fresh-web: build permissions web upload-fixtures # Use this for fresh build (it will restore with empty stable database) fresh-deploy: fresh-web @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "dropdb --if-exists $(DATABASE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "dropdb --if-exists $(DATABASE_GEONODE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "createdb -O docker -T template_postgis $(DATABASE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "createdb -O docker -T template_postgis geonode_data" geoserver: @echo @echo "------------------------------------------------------------------" @echo "Building geoserver" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) build geoserver @docker-compose -p $(PROJECT_ID) up -d geoserver @docker-compose -p $(PROJECT_ID) restart geoserver default: web run: build permissions web migrate collectstatic deploy: run @echo @echo "------------------------------------------------------------------" @echo "Bringing up fresh instance " @echo "You can access it on http://localhost:63300" @echo "------------------------------------------------------------------" build: @echo @echo "------------------------------------------------------------------" @echo "Building in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) build django web: @echo @echo "------------------------------------------------------------------" @echo "Running in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) up -d geonode @docker-compose -p $(PROJECT_ID) up -d django @docker-compose -p $(PROJECT_ID) up --no-recreate -d dbbackups @# Dont confuse this with the dbbackup make command below @# This one runs the postgis-backup cron container @# We add --no-recreate so that it does not destroy & recreate the db container permissions: # Probably we want something more granular here.... # Your sudo password will be needed to set the file permissions # on logs, media, static and pg dirs @if [ ! -d "logs" ]; then mkdir logs; fi @if [ ! -d "media" ]; then mkdir media; fi @if [ ! -d "static" ]; then mkdir static; fi @if [ ! -d "backups" ]; then mkdir backups; fi @if [ -d "logs" ]; then sudo chmod -R a+rwx logs; fi @if [ -d "media" ]; then sudo chmod -R a+rwx media; fi @if [ -d "static" ]; then sudo chmod -R a+rwx static; fi @if [ -d "backups" ]; then sudo chmod -R a+rwx backups; fi db: @echo @echo "------------------------------------------------------------------" @echo "Running db in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) up -d postgres dbrestore: @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "dropdb --if-exists $(DATABASE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "dropdb --if-exists $(DATABASE_GEONODE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "createdb -O docker -T template_postgis $(DATABASE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres su - postgres -c "createdb -O docker -T template_postgis $(DATABASE_GEONODE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres pg_restore /backups/latest-$(DATABASE_NAME).dmp | docker exec -i $(PROJECT_ID)-postgres su - postgres -c "psql $(DATABASE_NAME)" @docker exec -t -i $(PROJECT_ID)-postgres pg_restore /backups/latest-$(DATABASE_GEONODE_NAME).dmp | docker exec -i $(PROJECT_ID)-postgres su - postgres -c "psql $(DATABASE_GEONODE_NAME)" nginx: @echo @echo "------------------------------------------------------------------" @echo "Running nginx in production mode" @echo "Normally you should use this only for testing" @echo "In a production environment you will typically use nginx running" @echo "on the host rather if you have a multi-site host." @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) up -d nginx @echo "Site should now be available at http://localhost" migrate: @echo @echo "------------------------------------------------------------------" @echo "Running migrate static in production mode" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-django /bin/bash -c "\ python manage.py migrate" update-migrations: @echo @echo "------------------------------------------------------------------" @echo "Running update migrations in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) run django python manage.py makemigrations update-migrations-localization: @echo @echo "------------------------------------------------------------------" @echo "Running update migrations in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) run django bash -c "python manage.py makemigrations && python manage.py migrate" collectstatic: @echo @echo "------------------------------------------------------------------" @echo "Collecting static in production mode" @echo "------------------------------------------------------------------" #We need to run collect static in the same context as the running # django-ephemeral container it seems so I use docker exec here # no -it flag so we can run over remote shell @docker-compose -p $(PROJECT_ID) run django python manage.py collectstatic --noinput reload: @echo @echo "------------------------------------------------------------------" @echo "Reload django project in production mode" @echo "------------------------------------------------------------------" # no -it flag so we can run over remote shell @docker exec $(PROJECT_ID)-django uwsgi --reload /tmp/django.pid kill: @echo @echo "------------------------------------------------------------------" @echo "Killing in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) kill kill-django: @echo @echo "------------------------------------------------------------------" @echo "Killing in django production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) kill django rm: rm-only rm-only: kill @echo @echo "------------------------------------------------------------------" @echo "Removing production instance!!! " @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) rm logs: @echo @echo "------------------------------------------------------------------" @echo "Showing django logs in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) logs django dblogs: @echo @echo "------------------------------------------------------------------" @echo "Showing db logs in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) logs db shell: @echo @echo "------------------------------------------------------------------" @echo "Shelling in in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) run django /bin/bash superuser: @echo @echo "------------------------------------------------------------------" @echo "Creating a superuser in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) run django python manage.py createsuperuser reviewaccess: @echo @echo "------------------------------------------------------------------" @echo "Creating review permissions in production mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) run django python manage.py create_review_permissions dbbash: @echo @echo "------------------------------------------------------------------" @echo "Bashing in to production database" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-postgres /bin/bash dbsnapshot: @echo @echo "------------------------------------------------------------------" @echo "Grab a quick snapshot of the database and place in the host filesystem" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-postgres /bin/bash -c "PGPASSWORD=docker pg_dump -Fc -h localhost -U docker -f /tmp/$(PROJECT_ID)-snapshot.dmp $(DATABASE_NAME)" @docker cp $(PROJECT_ID)-postgres:/tmp/$(PROJECT_ID)-snapshot.dmp . @docker exec -t -i $(PROJECT_ID)-postgres /bin/bash -c "rm /tmp/$(PROJECT_ID)-snapshot.dmp" @ls -lahtr *.dmp dbschema: @echo @echo "------------------------------------------------------------------" @echo "Print the database schema to stdio" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-postgres /bin/bash -c "PGPASSWORD=docker pg_dump -s -h localhost -U docker $(DATABASE_NAME)" dbshell: @echo @echo "------------------------------------------------------------------" @echo "Shelling in in production database" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-postgres psql -U docker -h localhost $(DATABASE_NAME) dbshell-geonode-data: @echo @echo "------------------------------------------------------------------" @echo "Shelling in in production database" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-postgres psql -U docker -h localhost $(DATABASE_GEONODE_NAME) dbbackup: @echo @echo "------------------------------------------------------------------" @echo "Create `date +%d-%B-%Y`.dmp in production mode" @echo "Warning: backups/latest.dmp will be replaced with a symlink to " @echo "the new backup." @echo "------------------------------------------------------------------" @# - prefix causes command to continue even if it fails @# Explicitly don't use -it so we can call this make target over a remote ssh session @docker exec $(PROJECT_ID)-dbbackups /bin/bash -c "./backups.sh" sentry: @echo @echo "--------------------------" @echo "Running sentry production mode" @echo "--------------------------" @docker-compose -p $(PROJECT_ID) up -d sentry maillogs: @echo @echo "------------------------------------------------------------------" @echo "Showing smtp logs in production mode" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-smtp tail -f /var/log/mail.log mailerrorlogs: @echo @echo "------------------------------------------------------------------" @echo "Showing smtp error logs in production mode" @echo "------------------------------------------------------------------" @docker exec -t -i $(PROJECT_ID)-smtp tail -f /var/log/mail.err # ---------------------------------------------------------------------------- # DEVELOPMENT C O M M A N D S # --no-deps will attach to prod deps if running # after running you will have ssh and web ports open (see dockerfile for no's) # and you can set your pycharm to use the python in the container # Note that pycharm will copy in resources to the /root/ user folder # for pydevd etc. If they dont get copied, restart pycharm... # ---------------------------------------------------------------------------- devweb: db @echo @echo "------------------------------------------------------------------" @echo "Running in DEVELOPMENT mode" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) up --no-deps -d devweb build-devweb: db @echo @echo "------------------------------------------------------------------" @echo "Building devweb" @echo "------------------------------------------------------------------" @docker-compose -p $(PROJECT_ID) build devweb # --------------- help -------------------------------- help: @echo "* **build** - builds all required containers." @echo "* **build-devweb** - build the development container. See [development notes](README-dev.md)." @echo "* **collectstatic** - run the django collectstatic command." @echo "* **create-machine** ." @echo "* **db** - build and run the db container." @echo "* **dbbackup** - make a snapshot of the database, saving it to deployments/backups/YYYY/MM/project-DDMMYYYY.dmp. It also creates a symlink to backups/latest.dmp for the latest backup." @echo "* **dbbash** - open a bash shell inside the database container." @echo "* **dblogs** - view the database logs." @echo "* **dbrestore** - restore deployment/backups/latest.dmp over the active database. Will delete any existing data in your database and replace with the restore, so **use with caution**." @echo "* **dbschema** - dump the current db schema (without data) to stdio. Useful if you want to compare changes between instances." @echo "* **dbshell** - get a psql prompt into the db container. " @echo "* **dbsnapshot** - as above but makes the backup as deployment/snapshot.smp - replacing any pre-existing snapshot." @echo "* **dbsync** - use this from a development or offsite machine. It will rsync all database backups from deployment/backups to your offsite machine." @echo "* **default** ." @echo "* **deploy** ." @echo "* **devweb** - create an ssh container derived from django that can be used as a remote interpreter for PyCharm. See [development notes](README-dev.md)." @echo "* **enable-machine** - " @echo "* **kill** - kills all running containers. Does not remove them." @echo "* **logs** - view the logs of all running containers. Note that you can also view individual logs in the deployment/logs directory." @echo "* **mailerrorlogs** - View the error logs from the mail server." @echo "* **maillogs** - view the transaction logs from the mail server." @echo "* **mediasync** - use this from a development or offsite machine. It will rsync all media backups from deployment/media to your offsite machine." @echo "* **migrate** - run any pending migrations. " @echo "* **nginx** - builds and runs the nginx container." @echo "* **nginxlogs** - view just the nginx activity logs." @echo "* **permissions** - Update the permissions of shared volumes. Note this will destroy any existing permissions you have in place." @echo "* **reload** - reload the django process. Useful when you need django to pick up any changes you may have deployed." @echo "* **rm** - remove all containers." @echo "* **rm-only** - remove any containers without trying to kill them first. " @echo "* **run** - builds and runs the complete orchestrated set of containers." @echo "* **sentry** - **currently not working I think.** The idea is to spin up a sentry instance together with your app for fault reporting." @echo "* **shell** - open a bash shell in the django (where django runs) container." @echo "* **superuser** - create a django superuser account." @echo "* **update-migrations** - freshen all migration definitions to match the current code base." @echo "* **web** - same as **run** - runs the production site."