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

Improve onboarding documentation #68

Open
buckyroberts opened this issue Feb 14, 2021 · 1 comment
Open

Improve onboarding documentation #68

buckyroberts opened this issue Feb 14, 2021 · 1 comment

Comments

@buckyroberts
Copy link
Collaborator

buckyroberts commented Feb 14, 2021

Usually, I make detailed step-by-step installation instructions where you do not need to think or have variations/ambiguity of how to setup (please, see an example below). It would be nice to have such instructions in our project (probably in a dedicated INSTALL.rst/md not to overcrowd the README).

README.rst

Local development environment
=============================

This section describes how to setup development environment for Linux Mint 18.3.

Initial setup
+++++++++++++

Once initial setup is done only corresponding `Update`_ section should be performed
to get the latest version for development.

#. Install PyCharm to use as IDE
#. Install prerequisites::

    apt update
    apt install git

#. [if you have not configured it globally] Configure git::

    git config user.name 'Firstname Lastname'
    git config user.email 'youremail@youremail_domain.com'

#. Install Docker according to https://docs.docker.com/install/linux/docker-ce/ubuntu/
   (known working: Docker version 19.03.2, build 6a30dfc)

#. Add your user to docker group::

    sudo usermod -aG docker $USER
    exit

#. Install Docker Compose according to https://docs.docker.com/compose/install/
   (known working: docker-compose version 1.24.1, build 4667896b)

#. Install prerequisites (
   as prescribed at https://github.com/pyenv/pyenv/wiki/Common-build-problems )::

    apt update
    apt install make build-essential libssl-dev zlib1g-dev libbz2-dev \
                libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
                libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

#. Install and configure `pyenv` according to https://github.com/pyenv/pyenv#basic-github-checkout
#. Install Python 3.8.5::

    pyenv install 3.8.5

#. Install `pip`::

    # Ensure you are in `nda-server` repo root directory
    pip install pip==20.3.1

#. Install Poetry (known working version: 1.1.4)::

    pip install 'poetry>=1.1.4'

#. Configure Poetry to use $HOME/.virtualenvs::

    poetry config virtualenvs.path $HOME/.virtualenvs

#. Create virtualenv with Poetry::

    poetry shell

#. Install pip::

    pip install pip==20.3.1

#. Run dependencies with Docker Compose (in a separate terminal)::

    make dev-dependencies-up

#. Create local configuration file::

    mkdir local
    cat << EOF > ./local/settings.py
    DEBUG = True

    DATABASES['default']['NAME'] = 'postgres'
    DATABASES['default']['USER'] = 'postgres'
    DATABASES['default']['PASSWORD'] = 'postgres'
    DATABASES['default']['HOST'] = '127.0.0.1'

    CELERY_BROKER_URL = 'amqp://localhost:5672'

    SECRET_KEY = 'rydt2lf(cooe_w)b6tzw)7_8q+3g5o*^5(h7dac9@^k))zd2!j'

    MIDDLEWARE += ('nda_server.core.middleware.LoggingMiddleware',)
    LOGGING['root']['level'] = 'DEBUG'
    LOGGING['loggers']['nda_server']['level'] = 'DEBUG'
    LOGGING['handlers']['console']['level'] = 'DEBUG'
    EOF

    cp ./local/settings.py ./local/settings.unittests.py

#. Continue to `Update`_ section

#. Create superuser::

    make dev-create-superuser

Update
++++++

#. Activate shell::

    poetry shell

#. Update dependencies::

    poetry install

#. Run migrations::

    make dev-migrate

#. Install pre-commit::

    pre-commit install

Run
+++

#. Run dependencies with Docker Compose (in a dedicated terminal)::

    make dev-dependencies-up

#. Run Django server (in a dedicated terminal)::

    make dev-run-server

#. Run Celery (in a dedicated terminal)::

    make dev-run-celery

#. Run Celery Beat (in a dedicated terminal)::

    make dev-run-celery-beat

Development hints
+++++++++++++++++

#. Run unittests::

    make test

#. Lint the code base::

    make lint

Development, staging or production environment on Heroku
========================================================

The instruction is given for a development environment. For other environments replace
"nda-server-dev" with "nda-server-staging" or "nda-server-prod".

Initial setup
+++++++++++++

#. Create pipeline named "nda-server"
#. Create Heroku application::

    heroku apps:create --team=nda --addons=heroku-postgresql:hobby-basic,cloudamqp,papertrail,bucketeer,sentry --region=us --ssh-git nda-server-dev
    heroku pipelines:add --app nda-server-dev nda-server

#. Add Poetry buildpack::

    heroku buildpacks:clear --app nda-server-dev
    heroku buildpacks:add --app nda-server-dev https://github.com/moneymeets/python-poetry-buildpack.git
    heroku buildpacks:add --app nda-server-dev heroku/python

#. Add environment variables::

    heroku config:set --app nda-server-dev POETRY_VERSION=1.1.4
    heroku config:set --app nda-server-dev NDA_SERVER_ON_HEROKU=true
    heroku config:set --app nda-server-dev NDA_SERVER_SECRET_KEY=$(dd if=/dev/urandom bs=500 count=1 2> /dev/null | tr -dc 'a-zA-Z0-9' | head -c50)
    heroku config:set --app nda-server-dev NDA_SERVER_SENDGRID_API_KEY=<replace with SendGrid API key>
    heroku config:set --app nda-server-dev NDA_SERVER_OPEN_FDA_API_KEY=<replace with openFDA API key>
    heroku config:set --app nda-server-dev NDA_SERVER_SENDGRID_PASSWORD_RESET_EMAIL_TEMPLATE_ID=<replace with template id>
    heroku config:set --app nda-server-dev NDA_SERVER_SENDGRID_WELCOME_EMAIL_TEMPLATE_ID=<replace with template id>

#. Configure CORS::

    # For development environment
    heroku config:set --app nda-server-dev NDA_SERVER_CORS_ALLOW_ALL_ORIGINS=true

    # For production
    heroku config:set --app nda-server-prod NDA_SERVER_CORS_ALLOWED_ORIGINS='["https://app.nda.com", "https://nda-web-prod.herokuapp.com"]'

#. Add `HEROKU_SLUG_COMMIT` environment variable ::

    heroku labs:enable runtime-dyno-metadata --app nda-server-dev

#. (for development/staging environment: nda-server-dev) Navigate to "Deploy" tab:

    #. Open "nda" team: https://dashboard.heroku.com/teams/nda/apps
    #. Click "nda-server-dev" to open https://dashboard.heroku.com/apps/nda-server-dev
    #. Open "Deploy" tab

#. (for development/staging environment: nda-server-dev) Connect github repository for deployment:

    #. Choose "GitHub" "Deployment method" ( https://dashboard.heroku.com/apps/nda-server-dev/deploy/github )
    #. Connect https://github.com/nda/nda-server repository

#. (for development/staging environment: nda-server-dev) Enable automatic deploys:

    #. Set "Automatic deploys" -> "Choose a branch to deploy" = "master"
    #. Click "Automatic deploys" -> "Enable Automatic Deploys"

#. (for development/staging environment: nda-server-dev) Deploy "master" branch manually for the first time:

    #. "Manual deploy" -> choose "master" branch
    #. Click "Deploy Branch"

#. (for production: nda-server-prod) Promote nda-server-dev to nda-server-prod

#. Create superuser::

    heroku run --app nda-server-dev python -m nda_server.manage createsuperuser

#. Configure custom domain ( https://devcenter.heroku.com/articles/custom-domains ) and
   enable Automated Certificate Management
   ( https://devcenter.heroku.com/articles/automated-certificate-management )

#. Configure Django Sites framework to point to frontend domain name.

Update
++++++

#. (for production: nda-server-prod) Promote nda-server-dev to nda-server-prod

Makefile

.PHONY: dev-run-server
dev-run-server:
	poetry run python -m nda_server.manage runserver 127.0.0.1:8001

.PHONY: dev-run-celery
dev-run-celery:
	poetry run celery -A nda_server.project worker --loglevel=debug

.PHONY: dev-run-celery-beat
dev-run-celery-beat:
# TODO(dmu) MEDIUM: Should we have `--pidfile=`?
# TODO(dmu) MEDIUM: Do we need Celery beat at all?
	poetry run celery -A nda_server.project beat --loglevel=debug --pidfile=

.PHONY: dev-migrate
dev-migrate:
	poetry run python -m nda_server.manage migrate

.PHONY: dev-dbshell
dev-dbshell:
	poetry run python -m nda_server.manage dbshell

.PHONY: dev-create-superuser
dev-create-superuser:
	poetry run python -m nda_server.manage createsuperuser

.PHONY: dev-dependencies-up
dev-dependencies-up:
	docker-compose up

.PHONY: test
test:
	poetry run pytest -v

.PHONY: lint
lint:
	poetry run pre-commit run --all-files
@DucPhamTV
Copy link
Contributor

This would be great. Following README instructions isn't enough to make it work. After installing dependencies, such as gcc, upgrade pip-tool, pip, eventually I can run the unit tests.
My machine isn't a fresh ubuntu-20.04 instance , probably new installed machine could need more dependencies.

@buckyroberts buckyroberts reopened this Feb 16, 2021
@dmugtasimov dmugtasimov self-assigned this Feb 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants