File Structure
project_name/ ansible/ services/ terraform/ .gitignore
Create rails project using docker
cd project_name
docker run -v pwd/services:/services mokevnin/rails rails new /services/app --skip-bundle --database=postgresql --skip-git --skip-coffee
Add ./services/app/.gitignore
log vendor
Commit project to bitbucket
Setup docker composer
Add ./services/app/Dockerfile.development
Create project_name/docker-composer.yml with app services
Add ./services/app/.dockerignore
vendor tmp log
Add project_name/make-app.mk and include it to Makefile.
app: docker-compose up
app-build: docker-compose build
app-bash: docker-compose run app bash
Install deps
$ make app-bash bundle install
Run make app and check that site is working.
Add db
Add db service to project_name/docker-composer.yml
db: image: postgres environment: POSTGRES_USER: app
Update ./services/app/config/database.yml
Add some logic
$ make app-bash bin/rails generate scaffold Post title body:text bin/rails active_storage:install bin/rails db:migrate
Run tests
$ make app-bash bin/rails db:test:prepare bin/rails test
Run app and open page /posts
Add make setup
app-setup: app-build docker-compose run app bin/setup
app-build: docker-compose build
Checkpoint
Commit everything
Remove project
Clone project
Run make app-setup app
Open site and check it on pages / and /posts
https://docs.docker.com/docker-cloud/builds/automated-testing/
Add ansible/group_vars/all/vars.yml
Add ansible/group_vars/all/vault.yml
Add ansible/development/group_vars/all/vars.yml
Add ansible/development/group_vars/all/vault.yml
Add ansible/development/inventory
localhost ansible_connection=local
Create playbook ansible/development.yml which generate project_name/.env from template ansible/templates/environment.j2
Create development-setup-env and run it (for check)
development-setup-env: ansible-playbook ansible/development.yml -i ansible/development -vv
Add development-setup-env as deps for app-setup
app-setup: development-setup-env app-build docker-compose run app bin/setup
Add project_name/.env to docker-composer.yml
app: env_file: ".env"
Setup db username by env for docker-composer.yml and database.yml
ansible/development/group_vars/all/vars.ymlansible/group_vars/all/vars.yml with value "true"ansible/templates/environment.j2make development-setup-env (dont forget run it everytime after new variable added)services/app/config/master.key to ansible/group_vars/all/vault.ymlansible/templates/environment.j2https://www.engineyard.com/blog/rails-encrypted-credentials-on-rails-5.2
make-ansible.mkhttps://docs.ansible.com/ansible/2.4/vault.html
ansible-vaults-encrypt:
ansible-vault encrypt ansible/development/group_vars/all/vault.yml
ansible-vault encrypt ansible/group_vars/all/vault.yml
ansible-vaults-decrypt:
ansible-vault decrypt ansible/development/group_vars/all/vault.yml
ansible-vault encrypt ansible/group_vars/all/vault.yml
Always encrypt before commit!
services/app/Dockerfile.productionConfigure rails logger for using stdout in production environment services/app/config/environment/production.rb
Check locally that production image can be built
Create repository workshop-devops-app on Docker Cloud
v3 or v5services/app/docker-compose.test.ymlservices/nginx/<you_domain_name>.confservices/nginx/Dockerfile and copy config to /etc/nginx/conf.d/<you_domain_name.confworkshop-devops-nginx repository on docker cloudAdd remote servers to ansible/production/inventory
Install Ansible deps
use ansible galaxy for install https://github.com/geerlingguy/ansible-role-docker
Create task ansible-deps-install
ansible-deps-install: ansible-galaxy install -r requirements.yml
write playbook ansible/site.yml
write make production-setup
ansible-playbook ansible/site.yml -i ansible/production -u ubuntu -vv
Run and check it
ansible/deploy.yml playbookmake production-deploymake production-deploy-app which deploy only applicationappContent type
Image
Digest
Size
42.4 MB
Last updated
over 8 years ago
docker pull mokevnin/workshop-devops-nginx