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

Luan oliveira #28

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 30 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,52 +1,31 @@
# Desafio DevOps Apiki.
## Apresentação

Escolhi fazer a automação utilizando userdata, passando as ações com estrutura cloud-init.
O userdata pode ser passada manualmente durante a criação da instãncia via dashboard ou em qualquer outro método de criação/orquestração disponível para AWS
O userdata utilizado está no arquivo `userdata.cfg`.
Foi configurado wordpress em container docker, usando o compose. Estando em um container servidor web apache, wordpress, php e outras depêndencias; utilizei imagem oficial do wordpress.
Também foi instânciado banco de dados mysql em docker, no mesmo compose.
E por fim, nginx instalado diretamente no sistema operacional e funcionando como proxy reverso, estando com as configurações de headers, ssl e websockets realizadas.
Foi utilizado um certificado *let's encrypt*, gerado previamente, para o domínio `apiki.loscaranlu.com.br`, a criação do certificado e a configuração de ssl no servidor web poderiam ser realizadas no boot integrando o certbot com provedores de dns como cloudfare e route53, também poderia ser feita através de um run padrão do certbot caso fosse previamente feito o apontamento de dns.


## Funcionamento
Cloud-init é o principal inicializar utilizado em nuvem, para a inicialização básica, padrão das instâncias e personalização já voltada ao deploy.
É uma linguagem declarativa, dizemos o que queremos que aconteça, e utiliza sintaxe yaml
São comandadas as seguintes ações:
- Update da lista de repositórios
- Upgrade dos pacotes
- Definição de timezone
- Instalação de pacotes: vim, docker, docker-compose, nginx e git
- Definição de hostname
- Criação de arquivos: docker-compose e de site no nginx
Além das ações integradas no cloud-init também é possível passar comandos a serem executados, método usado para as demais ações:
- Habilitar e iniciar o serviço docker no systemd
- Rodar deploy docker-compose
- Importar os dados do let's encrypt, que inclui os scripts de renovação e os arquivos de certificado
- Reiniciar o serviço do nginx para que as configurações entrassem em vigor

## Uso
Copiar o conteúdo do arquivo `userdata.cfg` e passa-lo como userdata na criação da instância.
O arquivo foi feito tendo em mente Debian 11, pode haver problemas de compatibilade com outras distribuições devido a nomes de pacotes e de unidades de serviço, e também devido diferente estrutura de diretórios, presença de firewall e selinux.

Objetivo é criar um processo automatizado para construção de um servidor web para [WordPress](https://wordpress.org/) em sua última versão.

O candidato deve seguir os seguintes **Requisitos**;

- O projeto dever ser configurado na [AWS](https://aws.amazon.com/free/), crie uma conta Free.
- A máquina configurada deverar ter às portas 80, 443 e 22 abertas.
- Uso de Shell Script **Linux**.
- [Docker](https://www.docker.com/)

### Arquitertura!

- [Nginx](https://www.nginx.com/) configurado como proxy para o Apache.
- [Apache](https://www.apache.org/) servidor para o WordPress.
- [PHP](https://php.net/) a última versão.
- [MySql](https://www.mysql.com/) Versão mínima requirida 5.7.
- [WordPress](https://wordpress.org) última versão configurada no servidor Apache.

**Modelo conceitual**

[![N|Solid](https://apiki.com/wp-content/uploads/2019/05/Screenshot_20190515_174205.png)](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/)

---

### Se liga!

Você também pode usar como **Diferencial**:

- [Docker Compose](https://docs.docker.com/compose/).
- [Kubernetes](https://kubernetes.io/).
- [Ansible](https://www.ansible.com/).
- [RDS AWS](https://aws.amazon.com/pt/rds/).
- Outras tecnologias para somar no projeto.

---

### Entrega

1. Efetue o fork deste repositório e crie um branch com o seu nome e sobrenome. (exemplo: fulano-dasilva)
2. Após finalizar o desafio, crie um Pull Request.
3. Aguarde algum contribuidor realizar o code review.
4. Deverá conter a documentação para instalação e configuração README.md.
5. Enviar para o email [email protected] os dados de acesso SSH com permissão root, da máquina configurada na AWS.

---

### Validação

* Será executado os precessos de instalação e configuração de acordo com a orientação da documentação em um servidor interno da Apiki.
* Será avaliado o processo de automação para criação do ambiente em cloud, tempo de execução e a configuração no server na AWS com os dados fornecidos pelo candidato.
* Deverar constar pelo menos 2 containers.
Binary file added cert
Binary file not shown.
104 changes: 104 additions & 0 deletions userdata.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#cloud-config
hostname: apiki.loscaranlu.com.br
users:
- default
timezone: America/Belem
package_update: true
package_upgrade: true
packages:
- docker.io
- docker-compose
- vim
- nginx
- git

write_files:
- content: |
version: '3.1'

services:

wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html

db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql

volumes:
wordpress:
db:

path: /root/wordpress/docker-compose.yaml

- content: |
# websockets
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
return 301 https://$host$request_uri;
error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
ssl_certificate /etc/letsencrypt/live/apiki.loscaranlu.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/apiki.loscaranlu.com.br/privkey.pem;
root /usr/share/nginx/html;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://localhost:8080/;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
path: /etc/nginx/sites-available/default
runcmd:
- systemctl enable --now docker.service
- docker-compose -f /root/wordpress/docker-compose.yaml up -d
- git clone -b luan-oliveira https://github.com/Luan1Carlos2/devops-challenge.git
- tar -xvf /devops-challenge/cert -C /
- systemctl restart nginx.service