- Provisione uma instância EC2 na AWS com Ubuntu 22.04.
- Conecte-se à instância usando SSH.
-
Atualize todos os pacotes e clone o código.
-
Clone o repositório de código do seu aplicativo na instância do EC2:
https://github.com/thadeuguimaraes/netflix-clone-react-typescript.git
- Configure o Docker na instância EC2:
sudo apt-get update
sudo apt-get install docker.io -y
sudo usermod -aG docker $USER # Replace with your system's username, e.g., 'ubuntu'
newgrp docker
sudo chmod 777 /var/run/docker.sock
- Faça o build e execute seu aplicativo usando contêineres Docker:
docker build -t netflix .
docker run -d --name netflix -p 8081:80 netflix:latest
# delete
docker stop <containerid>
docker rmi -f netflix
Ele mostrará um erro porque você precisa da chave API
- Abra um navegador da web e navegue até o site TMDB (The Movie Database).
- Clique em “Login” e crie uma conta.
- Uma vez logado, vá ao seu perfil e selecione “Configurações”.
- Clique em “API” no painel esquerdo.
- Crie uma nova chave API clicando em “Criar” e aceitando os termos e condições.
- Forneça os detalhes básicos necessários e clique em “Enviar”.
- Você receberá sua chave API TMDB.
Agora recrie a imagem do Docker com sua chave de API:
docker build --build-arg TMDB_V3_API_KEY=<your-api-key> -t netflix .
1.Instale SonarQube e Trivy:
- Instale SonarQube e Trivy na instância EC2 para verificar vulnerabilidades.
sonarqube
docker run -d --name sonar -p 9000:9000 sonarqube:lts-community
Acessar:
publicIP:9000 (por padrão, nome de usuário e senha são admin)
Para instalar o Trivy:
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
para fazer o escaner da imagem usando trivy
trivy image <imageid>
2.Integre SonarQube e configure:
- Integre o SonarQube a sua pipeline de CI/CD.
- Configure o SonarQube para analisar o código em busca de problemas de qualidade e segurança.
- Instale o Jenkins para automação:
- Instale o Jenkins na instância EC2 para automatizar a implantação: Instale o Java
sudo apt update
sudo apt install fontconfig openjdk-17-jre
java -version
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Debian-1deb12u1, mixed mode, sharing)
#jenkins
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
- Acesse o Jenkins em um navegador da web usando o IP público da sua instância EC2.
IP público: 8080
2. Instale os plug-ins necessários no Jenkins: Goto Manage Jenkins →Plugins → Available Plugins →
Instale os plug-ins abaixo
1 Eclipse Temurin Installer 2 SonarQube Scanner 3 NodeJs Plugin 4 email Extension Plugin
Goto Manage Jenkins → Tools → Install JDK(17) and NodeJs(16)→ Click on Apply and Save
Depois de adicionar token de sonar
Clique em Aplicar e Salvar
A opção Configurar Sistema é usada no Jenkins para configurar diferentes servidores
A configuração global da ferramenta é usada para configurar diferentes ferramentas que instalamos usando plug-ins
Instalaremos um scanner sonar nas ferramentas.
Crie um webhook Jenkins
- Configure CI/CD Pipeline no Jenkins:
pipeline {
agent any
tools {
jdk 'jdk17'
nodejs 'node16'
}
environment {
SCANNER_HOME = tool 'sonar-scanner'
}
stages {
stage('clean workspace') {
steps {
cleanWs()
}
}
stage('Checkout from Git') {
steps {
git branch: 'main', url: 'https://github.com/thadeuguimaraes/netflix-clone-react-typescript.git'
}
}
stage("Sonarqube Analysis") {
steps {
withSonarQubeEnv('sonar-server') {
sh '''$SCANNER_HOME/bin/sonar-scanner -Dsonar.projectName=Netflix \
-Dsonar.projectKey=Netflix'''
}
}
}
stage("quality gate") {
steps {
script {
waitForQualityGate abortPipeline: false, credentialsId: 'Sonar-token'
}
}
}
stage('Install Dependencies') {
steps {
sh "npm install"
}
}
}
}
Certamente, aqui estão as instruções sem números de etapas:
Instale as ferramentas Dependency-Check e Docker no Jenkins
Instale o plug-in de verificação de dependência:
- Vá para "Dashboard" na interface web do Jenkins.
- Navegue até “Gerenciar Jenkins” → “Gerenciar plug-ins”.
- Clique na guia “Disponível” e pesquise “OWASP Dependency-Check”.
- Marque a caixa de seleção "OWASP Dependency-Check" e clique no botão "Instalar sem reiniciar".
- Depois de instalar o plugin Dependency-Check, você precisa configurar a ferramenta.
- Vá para "Dashboard" → "Manage Jenkins" → "Global Tool Configuration".
- Encontre a seção "Verificação de dependência do OWASP".
- Adicione o nome da ferramenta, por exemplo, “DP-Check”.
- Salve suas configurações.
- Vá para "Dashboard" na interface web do Jenkins.
- Navegue até “Manage Jenkins” → “Manage Plugins”. Clique na guia “Available” e pesquise “Docker”.
- Verifique os seguintes plug-ins relacionados ao Docker:
- Docker
- Docker Commons
- Docker Pipeline
- Docker API
- docker-build-step
- Clique no botão “Instalar sem reiniciar” para instalar esses plug-ins.
- Para lidar com credenciais do DockerHub com segurança em seu pipeline Jenkins, siga estas etapas:
-Vá para “Dashboard” →"Manage Jenkins" → "Manage Credentials."
- Clique em “System” e depois em "Global credentials (unrestricted)."
- Clique em “Add Credentials" no lado esquerdo.
- Escolha "Secret-text" como tipo de credenciais.
- Insira suas credenciais do DockerHub (Username and Password) e forneça um ID às credenciais (por exemplo, "docker").
- Clique em “OK” para salvar suas credenciais do DockerHub.
Agora, você instalou o plugin Dependency-Check, configurou a ferramenta e adicionou plugins relacionados ao Docker junto com suas credenciais do DockerHub no Jenkins. Agora você pode prosseguir com a configuração do pipeline do Jenkins para incluir essas ferramentas e credenciais em seu processo de CI/CD.
pipeline{
agent any
tools{
jdk 'jdk17'
nodejs 'node16'
}
environment {
SCANNER_HOME=tool 'sonar-scanner'
}
stages {
stage('clean workspace'){
steps{
cleanWs()
}
}
stage('Checkout from Git'){
steps{
git branch: 'main', url: 'https://github.com/thadeuguimaraes/netflix-clone-react-typescript.git'
}
}
stage("Sonarqube Analysis "){
steps{
withSonarQubeEnv('sonar-server') {
sh ''' $SCANNER_HOME/bin/sonar-scanner -Dsonar.projectName=Netflix \
-Dsonar.projectKey=Netflix '''
}
}
}
stage("quality gate"){
steps {
script {
waitForQualityGate abortPipeline: false, credentialsId: 'Sonar-token'
}
}
}
stage('Install Dependencies') {
steps {
sh "npm install"
}
}
stage('OWASP FS SCAN') {
steps {
dependencyCheck additionalArguments: '--scan ./ --disableYarnAudit --disableNodeAudit', odcInstallation: 'DP-Check'
dependencyCheckPublisher pattern: '**/dependency-check-report.xml'
}
}
stage('TRIVY FS SCAN') {
steps {
sh "trivy fs . > trivyfs.txt"
}
}
stage("Docker Build & Push"){
steps{
script{
withDockerRegistry(credentialsId: 'docker', toolName: 'docker'){
sh "docker build --build-arg TMDB_V3_API_KEY=<yourapikey> -t netflix ."
sh "docker tag netflix thsre/netflix:latest "
sh "docker push thsre/netflix:latest "
}
}
}
}
stage("TRIVY"){
steps{
sh "trivy image thsre/netflix:latest > trivyimage.txt"
}
}
stage('Deploy to container'){
steps{
sh 'docker run -d --name netflix -p 8081:80 thsre/netflix:latest'
}
}
}
}
Se você receber um erro de falha no login do docker
sudo su
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins
1.Instale o Prometheus e o Grafana:
Configure o Prometheus e o Grafana para monitorar seu aplicativo.
Instalando o Prometheus:
Primeiro, crie um usuário Linux dedicado para o Prometheus e baixe o Prometheus:
sudo useradd --system --no-create-home --shell /bin/false prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.47.1/prometheus-2.47.1.linux-amd64.tar.gz
Extraia arquivos do Prometheus, mova-os e crie diretórios:
tar -xvf prometheus-2.47.1.linux-amd64.tar.gz
cd prometheus-2.47.1.linux-amd64/
sudo mkdir -p /data /etc/prometheus
sudo mv prometheus promtool /usr/local/bin/
sudo mv consoles/ console_libraries/ /etc/prometheus/
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
Defina o dono dos diretórios:
sudo chown -R prometheus:prometheus /etc/prometheus/ /data/
Crie um arquivo de configuração da unidade systemd para o Prometheus:
sudo nano /etc/systemd/system/prometheus.service
Adicione o seguinte conteúdo ao arquivo prometheus.service
:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=500
StartLimitBurst=5
[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/data \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.enable-lifecycle
[Install]
WantedBy=multi-user.target
Aqui está uma breve explicação das partes principais deste arquivo prometheus.service
:
User
eGroup
especificam o usuário e grupo do Linux sob o qual o Prometheus será executado. -ExecStart
é onde você especifica o caminho binário do Prometheus, o local do arquivo de configuração(prometheus.yml
), o diretório de armazenamento e outras configurações.web.listen-address
configura o Prometheus para escutar em todas as interfaces de rede na porta 9090.web.enable-lifecycle
permite o gerenciamento do Prometheus por meio de chamadas de API.
Habilite e inicie o Prometheus:
sudo systemctl enable prometheus
sudo systemctl start prometheus
Verifique o status do Prometheus:
sudo systemctl status prometheus
Você pode acessar o Prometheus em um navegador web usando o IP do seu servidor e a porta 9090:
http://<your-server-ip>:9090
Crie um usuário de sistema para o Node Exporter e baixe o Node Exporter:
sudo useradd --system --no-create-home --shell /bin/false node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
Extraia os arquivos do Node Exporter, mova o binário e limpe:
tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz
sudo mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
rm -rf node_exporter*
Crie um arquivo de configuração da unidade systemd para o Node Exporter:
sudo vim /etc/systemd/system/node_exporter.service
Adicione o seguinte conteúdo ao arquivo node_exporter.service
:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=500
StartLimitBurst=5
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter --collector.logind
[Install]
WantedBy=multi-user.target
Substitua --collector.logind
por quaisquer sinalizadores adicionais conforme necessário.
Habilite e inicie o Node Exporter:
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
Verifique o status do Node Exporter:
sudo systemctl status node_exporter
Você pode acessar as métricas do Node Exporter no Prometheus.
2.Configure Prometheus Plugin Integration:
Integrate Jenkins with Prometheus to monitor the CI/CD pipeline.
Prometheus Configuration:
To configure Prometheus to scrape metrics from Node Exporter and Jenkins, you need to modify the prometheus.yml
file. Here is an example prometheus.yml
configuration for your setup:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
- job_name: 'jenkins'
metrics_path: '/prometheus'
static_configs:
- targets: ['<your-jenkins-ip>:<your-jenkins-port>']
Certifique-se de substituir <your-jenkins-ip>
e <your-jenkins-port>
pelos valores apropriados para sua configuração do Jenkins.
Verifique a validade do arquivo de configuração:
promtool check config /etc/prometheus/prometheus.yml
Recarregue a configuração do Prometheus sem reiniciar:
curl -X POST http://localhost:9090/-/reload
Você pode acessar os targets do Prometheus em:
http://<your-prometheus-ip>:9090/targets
Instale o Grafana no Ubuntu 22.04 e configure-o para funcionar com o Prometheus
Etapa 1: instalar dependências:
Primeiro, certifique-se de que todas as dependências necessárias estejam instaladas:
sudo apt-get update
sudo apt-get install -y apt-transport-https software-properties-common
Step 2: Adicione a GPG Key:
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
Step 3: Adicione o repositório do Grafana:
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
Step 4: Atualize e Instale o Grafana:
sudo apt-get update
sudo apt-get -y install grafana
Step 5: Habilite e inicie o serviço Grafana:
Para iniciar o Grafana automaticamente após uma reinicialização, habilite o serviço:
sudo systemctl enable grafana-server
Inicie o Grafana:
sudo systemctl start grafana-server
Step 6: verifique o status do Grafana
sudo systemctl status grafana-server
Step 7: Acesse a Interface Web do Grafana
Abra um navegador da web e navegue até Grafana usando o endereço IP do seu servidor. A porta padrão para Grafana é 3000. Por exemplo:
http://<seu-ip-do-servidor>:3000
Você será solicitado a fazer login no Grafana. O nome de usuário padrão é “admin” e a senha padrão também é “admin”.
Step 8: Troque a senha padrão Ao fazer login pela primeira vez, o Grafana solicitará que você altere a senha padrão por motivos de segurança. Siga as instruções para definir uma nova senha.
Step 9:Adicione o Prometheus Data Source:
Para visualizar métricas, você precisa adicionar uma fonte de dados. Siga esses passos:
-
Clique no ícone de engrenagem (⚙️) na barra lateral esquerda para abrir o menu “Configuration”.
-
Selecione "Data Sources".
-
Clique no botão "Add data source" button".
-
Escolha "Prometheus" como tipo de fonte de dados.
-
Na seção "HTTP":
- Defina o "URL" como
http://localhost:9090
(assumindo que o Prometheus esteja sendo executado no mesmo servidor). - Clique no botão "Salvar e testar" para garantir que a fonte de dados esteja funcionando.
- Defina o "URL" como
Step 10: Importe um Dashboard
Para facilitar a visualização das métricas, você pode importar um painel pré-configurado. Siga esses passos:
-
Clique no ícone “+” (mais) na barra lateral esquerda para abrir o menu “Criar”.
-
Selecione “Dashboard”.
-
Clique na opção do painel "Import".
-
Insira o código do painel que deseja importar (por exemplo, código 1860).
Clique no botão "load".
Selecione a fonte de dados que você adicionou (Prometheus) no menu suspenso.
- Clique no botão "Import".
Agora você deve ter um Dashboard Grafana configurado para visualizar as métricas do Prometheus.
Grafana é uma ferramenta poderosa para criar visualizações e Dashboards e você pode personalizá-lo ainda mais para atender às suas necessidades específicas de monitoramento.
É isso! Você instalou e configurou o Grafana com êxito para trabalhar com o Prometheus para monitoramento e visualização.
2.Configure a integração do plug-in Prometheus:
- Integre Jenkins ao Prometheus para monitorar o pipeline de CI/CD. Step 5: Notificação
1.Implementar serviços de notificação:
- Configure notificações por email no Jenkins ou outros mecanismos de notificação.
Nesta fase, você configurará um cluster Kubernetes com grupos de nós. Isso fornecerá um ambiente escalável para implantar e gerenciar seus aplicativos.
Prometheus é um poderoso kit de ferramentas de monitoramento e alertas, e você o usará para monitorar seu cluster Kubernetes. Além disso, você instalará o exportador de nós usando o Helm para coletar métricas dos nós do cluster.
To begin monitoring your Kubernetes cluster, you'll install the Prometheus Node Exporter. This component allows you to collect system-level metrics from your cluster nodes. Here are the steps to install the Node Exporter using Helm:
- Adicione o repositório do Prometheus Community Helm:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
2.Crie um namespace Kubernetes para o Node Exporter:
kubectl create namespace prometheus-node-exporter
3.Instale o Node Exporter usando o helm:
helm install prometheus-node-exporter prometheus-community/prometheus-node-exporter --namespace prometheus-node-exporter
Adicione um Job
ao Scrape Metrics em nodeip:9001/metrics em prometheus.yml:
Atualize sua configuração do Prometheus (prometheus.yml
) para adicionar um novo Job
para extrair métricas de nodeip:9001/metrics
. Você pode fazer isso adicionando a seguinte configuração ao arquivo prometheus.yml
:
- job_name: 'Netflix'
metrics_path: '/metrics'
static_configs:
- targets: ['node1Ip:9100']
Substitua 'nome-do-seu-job' por um nome descritivo para o seu job. A seção static_configs
especifica os targets
dos quais extrair métricas e, neste caso, é definida como nodeip:9001
.
Não se esqueça de recarregar ou reiniciar o Prometheus para aplicar essas alterações à sua configuração.
Para implantar um aplicativo com ArgoCD
, você pode seguir estas etapas, que descreverei no formato Markdown:
1.Instale o ArgoCD:
Todos esses componentes podem ser instalados usando um manifesto fornecido pelo Projeto Argo:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.7/manifests/install.yaml
2.Expose argocd-server
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
export ARGOCD_SERVER=`kubectl get svc argocd-server -n argocd -o json | jq --raw-output '.status.loadBalancer.ingress[0].hostname'`
3.Login
export ARGOCD_SERVER=`kubectl get svc argocd-server -n argocd -o json | jq --raw-output '.status.loadBalancer.ingress[0].hostname'`
4.Comandos linux para expor a senha e o server do ArgoCD:
echo $ARGOCD_SERVER
echo $ARGO_PWD
5. Defina seu repositório GitHub como fonte:
Depois de instalar o ArgoCD, você precisa configurar seu repositório GitHub como fonte para a implantação do seu aplicativo. Isso normalmente envolve configurar a conexão com o seu repositório e definir a fonte do seu aplicativo ArgoCD. As etapas específicas dependerão de sua configuração e requisitos.
6. Crie um aplicativo ArgoCD:
name
: Defina o nome do seu aplicativo.destination
: Defina o destino onde seu aplicativo deve ser implantado.project
: Especifique o projeto ao qual o aplicativo pertence.source
: defina a origem do seu aplicativo, incluindo a URL do repositório GitHub, a revisão e o caminho para o aplicativo dentro do repositório.syncPolicy
: Configure a política de sincronização, incluindo sincronização automática, remoção e autocorreção.
7.Acesse seu aplicativo
Para acessar o aplicativo, certifique-se de que a porta 30007
esteja aberta em seu grupo de segurança e, em seguida, abra uma nova aba e cole seu NodeIP:30007
, seu aplicativo deve estar em execução.