DevOpsGenel

Docker with Strapi [CI-CD Azure DevOps]

Merhaba,

Bu makalede strapi uygulamasını dockerize olarak kullanacağız.

1-Yeni bir proje oluşturuyoruz.

npx create-strapi-app@latest strapidemo –quickstart

-Projemiz başarılı bir şekilde oluşturuldu. Sizde de aşağıda ki şekilde dosyaların oluşması gerekiyor. (Dockerfile ve docker-compose.yml hariç)


Dockerfile hazırlanması. D harfi büyük olacak şekilde aşağıdaki kodları alıp sudo nano Dockerfile ile projemizin root dizinininde oluşturuyoruz.

FROM node:16
# Installing libvips-dev for sharp Compatability
RUN apt-get update && apt-get install libvips-dev -y
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}
WORKDIR /opt/
COPY . .
ENV PATH /opt/node_modules/.bin:$PATH
RUN npm install
WORKDIR /opt/app
COPY ./ .
RUN npm run build
EXPOSE 1337
CMD ["npm", "run", "develop"]

– .dockerignore dosyası oluşturuyoruz
.tmp/
.cache/
.git/
build/
node_modules/
data/

-docker-compose.yml dosyayını aynı şekilde root dizininde oluşturuyoruz.

version: "3"
services:
  strapi:
    container_name: strapi
    build: .
    image: mystrapi:latest
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_CLIENT: ${DATABASE_CLIENT}
      DATABASE_HOST: strapiDB
      DATABASE_NAME: ${DATABASE_NAME}
      DATABASE_USERNAME: ${DATABASE_USERNAME}
      DATABASE_PORT: ${DATABASE_PORT}
      JWT_SECRET: ${JWT_SECRET}
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      NODE_ENV: ${NODE_ENV}
    volumes:
      - ./config:/opt/app/config
      - ./src:/opt/app/src
      - ./package.json:/opt/package.json
      - ./package.json:/opt/package.json
      - ./.env:/opt/app/.env
    ports:
      - "1337:1337"
    networks:
      - strapi
    depends_on:
      - strapiDB

  strapiDB:
    image: postgres:12.0-alpine
    container_name: strapiDB
    platform: linux/amd64 #for platform error on Apple M1 chips
    restart: unless-stopped
    env_file: .env
    environment:
      POSTGRES_USER: ${DATABASE_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
    volumes:
      - strapi-data:/var/lib/postgresql/data/ #using a volume
      #- ./data:/var/lib/postgresql/data/ # if you want to use a bind folder
    ports:
      - "5432:5432"
    networks:
      - strapi

volumes:
    strapi-data:

networks:
  strapi:
    name: Strapi
    driver: bridge

Projenin root dizininde data isimli bir klasör oluşturup bunu .gitignore dosyasına ekliyoruz.
mkdir data

config/database.js dosyasını aşağıdaki gibi güncelliyoruz. sqlite olan kısmı postgres olarak ve en alt kısımda bulunan bilgileride güncelliyoruz.

-Npm PG install; bu host machine’de postgre kullanacağımızı iletiyor.

npm install pg

-.env dosyasının oluşturulması, bu dosya yeni bir strapi projesi oluşturduğunuz da otomatik olarak oluşuyor. #Database etiketinden sonra ki kısmını dolduruyoruz ve kullanacağımız database’e ait bilgileri giriyoruz.

HOST=0.0.0.0
PORT=1337
APP_KEYS=V4wROGRzavnx8dnUQLHGvQ==,FU+CLcSl2cYzW+8uCZz/aA==,KTb9Hx+N//c6vfkTTpMU4Q==,YjJ7sJhQb2RZH5QBVTULMA==
API_TOKEN_SALT=rtFPwZ+cuImsrilRDPSuWw==
ADMIN_JWT_SECRET=OiBZCOPCshgzSfjP463lOQ==
TRANSFER_TOKEN_SALT=GDVItCwRHtcEutohTqXwjw==
# Database
DATABASE_HOST=devopsmachine.eastus.cloudapp.azure.com
DATABASE_PORT=5432
DATABASE_NAME=strapi
DATABASE_USERNAME=strapi
DATABASE_PASSWORD=strapi
NODE_ENV=development
DATABASE_CLIENT=postgres
DATABASE_FILENAME=.tmp/data.db
JWT_SECRET=/VBqoDoo/HpskZu7hYqjPw==

-Projeyi ve dockerize dosyalarını build agentta veya kendi localinizde oluşturduktan sonra Azure DevOps’da açtığınız projenin repo’suna pushlabilirsiniz.


-Artık projeyi önce build edip sonra docker-compose ile ayağa kaldırabiliriz. Build işlemleri için Azure DevOps kullanacağım.

CI Pipeline’ın yaml formatı aşağıdaki gibi;
-Önce nexus repository’e login oluyoruz.
-Dockerfile build ediyoruz.
-Build edilen image tagliyoruz
-Nexus repository’e pushluyoruz.
-Docker-compose ile nexus’tan build ettiğimiz imajı ve postgresql imajını çekip uygulamayı ayağa kaldırıyoruz.

pool:
  name: azure
steps:
- task: Docker@2
  displayName: login
  inputs:
    containerRegistry: nexusrepo
    command: login

- bash: 'docker build -t $(Build.Repository.Name):$(Build.BuildId) .'
  displayName: 'docker build'

- bash: 'docker tag $(Build.Repository.Name):$(Build.BuildId) nexusrepo2.eastus.cloudapp.azure.com:8082/$(Build.Repository.Name):$(Build.BuildId)'
  displayName: tag

- bash: 'docker push nexusrepo2.eastus.cloudapp.azure.com:8082/$(Build.Repository.Name):$(Build.BuildId)'
  displayName: 'docker push nexus'

- task: DockerCompose@0
  displayName: 'Run a Docker Compose command'
  inputs:
    containerregistrytype: 'Container Registry'
    dockerRegistryEndpoint: nexusrepo
    dockerComposeFile: 'docker-compose.yml'
    dockerComposeCommand: 'up -d'

-Build alıyoruz ve sonuç;

-Url adresinden 1337 portunu kullanarak uygulamaya giriş yapıyoruz. Username ve Pass bilgilerini create edebilirsiniz.

-Strapi başarılı bir şekilde container üzerinde ayağa kalkmış durumda.