ThuanPham

私はフールスタック開発者

Nodeが大好き|AWS|スケーラブルなバックエンドを建築|テクノロジーで日常の課題を解決 | 自動化マニア

以下のブログでソフトウェアに関する知識を全て共有します。

2023

ComputeHub

分散コンピューティング

ブラウザーでコンピューティングパワーを共有するプロジェクト。「PandoComputingコアモジュールを使用」

ブラウザベース分散コンピューティングシステム

複雑な問題を解決ため、スマートホンやPCなど様々なデバイスを利用するリアルタイム分散コンピューティングシステムを開発しました。目的は、インターネットでタスクを配って解決時間を短縮することです。このプロジェクトはアイドルデバイスの計算リソースを利用する可能性を示します。そこから、コミュニティ主導の解決問題システムを開発できるようになります。

システム概要

アーキテクチ

  • Node.js : バックエンドAPIとタスク配信のためです。
  • Next.js : ユーザインタフェース、同時に計算環境として担います。
  • AWS : ホスティングのためのインフラ, EC2, ECR, R53 などのサービスを含まれています。
  • gRPC : マイクロサービス間の有効性が高いコミュニケーションプロトコル
  • MongoAtlat : アプリケーションのデータと計算結果を保存するため。
  • Docker : サービスを簡単にデプロイ
  • GithubAction : CI/CD

仕組み

  1. 問題提出: WebインタフェースのNext.jsを通じて、ユーザを問題を提出します。コードとインプットなどの仕様を含まれます。
  2. タスク配信: Node.jsで働くバックエンド 。PandoComputingというライブラリーのかげで、入力と実行コードを分割して、ワーカーに配信します。クライエントからエラーがあれば、自動的に他のノードにエラー入力を配信します。
  3. ワーカーノード (ブラウザー): ユーザーが登録したプロジェクトのURLを訪れると、ブラウザーがワーカーノードになります。 タークスをS3Bucketから取得して, バックエンドとのWebsocketコンネックションを作成します。それから、バックエンドからインプットを習得して、計算を実行して、バックエンドに送り返します。
  4. 結果集計: バックエンドは結果を集まって、入力の順番に基づいて出力をソートします。定期的にデータベースに保存します。 
  5. ユーザー報酬: ユーザーが問題解決に対する貢献を追跡でき、報酬が与えられます。(未実装)

技術的のハイライト

タスク並列処理

システムはワーカーに独立的に計算できる部分を配信します。デバイスによって、計算速度の違いがあるのに、いつも予想できる結果順序を受け取れます。 元々、PandoComputingはCLIでだけ実行でき、並列処理できないツールでしたが、AWSでデプロイし、Next.JSアプリと組み合わせるようにできました。

チャレンジと学び

スケーラビリティ

アクセス流量によって、自動的にEC2の仮想機械が増やすところ困っています。 さらに、かなり安定して動作できましたが、次の配信される値に影響を与えないようにエラー適用に処理することは必要です。

セキュリティ

WSの代わりに、WSSを使用する予定です。データを二重暗号化されると、セキュリティが強化されます。 しかし、コンピューティングリソースももッとかかるので、プロジェクトの管理者によって暗号化されます。

結論

このプロジェクトは、コミュニティ主導の問題解決システムを構築するもので、最新のWeb技術とクラウドインフラを組み合わせて実現可能性を示しています。

提案された解決策は、個人がコンピュータ、ノートパソコン、モバイルフォンなどの個人デバイスを通じて計算能力を提供できるボランティアコンピューティングシステムを構築することです。このシステムは、ボランティアが登録し、計算能力を提供し、研究プロジェクトに参加できるように、シンプルで使いやすいユーザーインターフェースを提供します。同時に、高度なアルゴリズムを使用してタスクを管理し、リソースを分配し、計算パフォーマンスを最適化します。

2024

Store management

私の店舗を管理するために、包括的なEコマース店舗管理システムを開発しました。

Store Management

製品および在庫管理、注文処理、顧客関係管理、支払い処理を含む包括的なEコマースストア管理システムを開発しました。フロントエンドにはNext.js、バックエンドにはNest.js、インフラにはAWSを使用しています。ログインしてご自身で体験することができます。

システム概要

アーキテクチャ

  • Nest.js : バックエンドAPI。
  • Next.js : ユーザインタフェース。
  • AWS : ホスティングのためのインフラ, EC2, ECR, S3, RDSなどのサービスを含まれています。
  • NGINX : ロードバランス, Web Server
  • Docker : サービスをデプロイ
  • GitlabCI : CI/CD

開発過程

1. 技術選択

  • 開発言語 : JavaScriptに集中しているため、Node.jsとNext.jsを選びました。同じ言語を使用することで、開発時間を短縮することができています。

  • データベース (PostgreSQL) : 一番気に入って、機能豊富なRelationDatabaseデータベースを使うことをしました。 NoSQLを使ったら実装が簡単になるのに、誰がかNoSQLを一番学習法がSQLを学ぶことだとってた。

  • Amazon Web Services :

  • - RDS : 以前が使ったことがありますが、このプロジェクトのデータベースを作成した後、作成するところに自動的にEC2インスタンスを接続するセキュリティーグループを作成することができると気づきました。

  • ・クライエントから接続を作成するため、EC2のSSHキーが必要です。
  • ・Node.JSから接続を作成するため、証明書も必要です。AWSのサイトからRDSの証明証をダウンロードできます。
const postgresSingleton = () => {
  return new pg.Pool({
    ssl:
      config.ENV === "production"
        ? {
            ca: fs.readFileSync("./cert/rds-combined-ca-bundle.pem"),
          }
        : false,
  });
};
  • ・EC2からテーブルスキマを適用するため、BashScriptを作成しました。もっと複雑ですが、
#!/bin/bash
PASSWORD=""
export PGPASSWORD=$PASSWORD
schema="database/schema"
for file in $schema/*.sql
do
        echo "executing $file..."
        psql -h $HOST -p $PORT -U $USER -d $DATABASE -f $file
done
unset PGPASSWORD
  • ・EC2インスタンスに指すため、Aレコードを追加します。今、HTTPでdomain nameを通じてEC2との接続を作成できるようになりいました。HTTPSをセットアップするため、証明書が提供されることが必要です。 Nginxをセットアップステップで実装します。
  • ・Dockerfileを定義します。
#2ステップビルド
FROM node:20-alpine AS development
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV} #環境値
 
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install
COPY . .
RUN yarn run build
 
FROM node:20-alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
 
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install --only=prod
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/index.js"]
  • ・環境準備ができた後、GitlabCIでCI/CDを設定します。まず、実行環境を定義します
stages:
  - build
  - release
 
.aws_config:
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli --break-system-packages
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set region $AWS_DEFAULT_REGION
    - aws ecr-public get-login-password --region us-east-1
         docker login --username AWS --password-stdin public.ecr.aws/$AWS_REGISTRY_NAME
 
variables:
  IMAGE_NAME: lychie-back-repo
 
build:
  stage: build
  extends:
    - .aws_config
  script:
    # イメージをビルドする
    - docker build -t $IMAGE_NAME .
    - docker tag $IMAGE_NAME:latest public.ecr.aws/$AWS_REGISTRY_NAME/$IMAGE_NAME:latest
    - docker push public.ecr.aws/$AWS_REGISTRY_NAME/$IMAGE_NAME:latest
 
release:
  image: ubuntu
  stage: release
  before_script:
    # Pythonをインストール
    - apt update
    - apt install -y curl jq python3 python3-pip wget
    - pip3 install awscli --break-system-packages
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set region $AWS_DEFAULT_REGION
 
  script:
    # SessionManagementをインストール
    - wget https://s3.amazonaws.com/ec2-downloads-windows
    /SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb
    - dpkg -i amazon-ssm-agent.deb
    - aws ssm send-command --document-name "AWS-RunShellScript" --document-version "1"
        --targets '[{"Key":"InstanceIds","Values":["i-02aef90967cd313eb"]}]'
        --parameters '{"commands":[
        #ECRからイメージをプール
        "docker pull $(docker ps -a |grep back | awk '"'"'{print $2}'"'"')", 
        #コンテナーをシャットダウンして、新しいイメージを適用する
        "docker-compose down -v","docker-compose up -d"],
        #タイムアウト
        "workingDirectory":["/home/ec2-user"],"executionTimeout":["3600"]}' 
        --timeout-seconds 600 --max-concurrency "50" --max-errors "0" 
        --region xxxxxx --output text
 
    # LOG
    - echo $(aws ecr-public describe-images --repository-name xxxx 
    --region xxx | grep imageDigest | head -n 1 | awk '{print $2}') > DEL_IMG
    - cat DEL_IMG
 
  • ・DockerでEC2インスタンスにアプリとNginx適用します。 アプリの場合、SQLの接続ため、プット5432を開けて、RDS証明書を読むため、証明書フォルダーをマウントします。
services:
  lychie-back:
    image: xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/lychie:latest
    env_file:
      - ./.env  # Specify the environment file
    volumes:
      - ./cert:/usr/src/app/cert
    ports:
      - "5432:5432"
    restart: unless-stopped  # Optional: restart policy
    networks:
      - lychie-network  # Optional: specify a custom network
  • ・Nginxの場合、HTTPとHTTPSのデフォルトポットを開けます。
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    networks:
      - lychie-networ。
  • ・NginxのDockerfile
FROM alpine:latest
RUN apk add --no-cache nginx openrc
RUN rm /etc/nginx/http.d/default.conf                         
COPY default.conf /etc/nginx/http.d/default.conf              #Configをコピーする
COPY ./ssl/certificate.crt /etc/nginx/ssl/certificate.crt     #証明書をコピーする
COPY ./ssl/private.key /etc/nginx/ssl/private.key             #キーをコピーする
RUN mkdir -p /run/nginx
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
  • ・Nginxの設定
        #HTTPSにリダイレクト
server {
        listen 80 default_server;
        server_name www.lychie.online;
        return 301 https://$server_name$request_uri;
}
 
server {
        listen 443 ssl;
 
        #証明書を読み込む
        ssl_certificate /etc/nginx/ssl/certificate.crt;
        ssl_certificate_key /etc/nginx/ssl/private.key;
 
        server_name www.lychie.online;
 
        #アプリにリクエストをリダイレクト
        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
 
                proxy_pass http://lychie-back:8080;
        }
}
~   
  • ・Dockerfileを実行するとアベイラブルになります。

製品および在庫管理、注文処理、顧客関係管理、支払い処理を含む包括的なEコマースストア管理システムを開発しました。フロントエンドにはNext.js、バックエンドにはNest.js、インフラにはAWSを使用しています。ログインしてご自身で体験することができます。

2024

Dreamhacker

若い者向け留学体験共有Forum。

応募体験、勉強方法、大学評判等。

若い者向け留学体験共有Forum

ベトナムの専門職業人のため、国内的なオンラインおよびオフラインコンミュウにティプラットフォームを建築しており、個人的および職業上の目標を達成することを支援し、メンバー間の長期的な信頼を育てることをもく目的としています。 現在、留学体験に共有することに専念しています。

システム概要

アーキテクチャ

  • Node.js : バックエンドAPI。
  • Next.js : ユーザインタフェース。
  • AWS : ホスティングのためのインフラ, EC2, ECR, R53, RDSなどのサービスを含まれています。
  • NGINX : ロードバランス, Web Server
  • Docker : サービスをデプロイ
  • GitlabCI : CI/CD

仕組み

  • ブログの基本的な機能が含まれています。
  • 世の中の有名なフォーラムから情報や投稿が集まられます。

開発過程

1. 技術選択

  • 開発言語 : JavaScriptに集中しているため、Node.jsとNext.jsを選びました。同じ言語を使用することで、開発時間を短縮することができています。

  • データベース (PostgreSQL) : 一番気に入って、機能豊富なRelationDatabaseデータベースを使うことをしました。 NoSQLを使ったら実装が簡単になるのに、誰がかNoSQLを一番学習法がSQLを学ぶことだとってた。

  • Amazon Web Services :
  • - RDS : 以前が使ったことがありますが、このプロジェクトのデータベースを作成した後、作成するところに自動的にEC2インスタンスを接続するセキュリティーグループを作成することができると気づきました。
  • ・クライエントから接続を作成するため、EC2のSSHキーが必要です。
  • ・Node.JSから接続を作成するため、証明書も必要です。AWSのサイトからRDSの証明証をダウンロードできます。
const postgresSingleton = () => {
  return new pg.Pool({
    ssl:
      config.ENV === "production"
        ? {
            ca: fs.readFileSync("./cert/rds-combined-ca-bundle.pem"),
          }
        : false,
  });
};
  • ・EC2からテーブルスキマを適用するため、BashScriptを作成しました。もっと複雑ですが、
#!/bin/bash
PASSWORD=""
export PGPASSWORD=$PASSWORD
schema="database/schema"
for file in $schema/*.sql
do
        echo "executing $file..."
        psql -h $HOST -p $PORT -U $USER -d $DATABASE -f $file
done
unset PGPASSWORD
  • ・EC2インスタンスに指すため、Aレコードを追加します。今、HTTPでdomain nameを通じてEC2との接続を作成できるようになりいました。HTTPSをセットアップするため、証明書が提供されることが必要です。 Nginxをセットアップステップで実装します。
  • ・Dockerfileを定義します。
#2ステップビルド
FROM node:20-alpine AS development
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV} #環境値
 
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install
COPY . .
RUN yarn run build
 
FROM node:20-alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
 
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install --only=prod
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/index.js"]
  • ・環境準備ができた後、GithubActionでCI/CDを設定します。まず、実行環境を定義します
name: Deploy to Amazon ECS
on:
  push:
    branches:
      - main ビルドブランチを定義する
env:
  AWS_REGION: # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: # set this to your Amazon ECR repository name
  CONTAINER_NAME: # set this to the name of the container in the
  • ・次、ビルドとプッシュ過程します。mainブランチにプッシュすると、アプリがビルドして、ECRにプッシュします。
jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production
 
    steps:
      - name: Checkout
        uses: actions/checkout@v4
 
      - name: Configure AWS credentials #AWSをアクセス証明
        uses: aws-actions/configure-aws-credentials@
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}
 
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@
 
      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: #ビルドして、ECRにプッシュする
          docker build -t .dkr.ecr.ap-northeast-1.amazonaws.com/dreamhacker:latest .
          docker push .dkr.ecr.ap-northeast-1.amazonaws.com/dreamhacker:latest
          echo "image=$ECR_REGISTRY:latest" >> $GITHUB_OUTPUTname: Deploy to Amazon ECS
  • ・DockerでEC2インスタンスにアプリとNginx適用します。 アプリの場合、SQLの接続ため、プット5432を開けて、RDS証明書を読むため、証明書フォルダーをマウントします。
services:
  dreamhacker-back:
    image: xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/dreamhacker:latest
    env_file:
      - ./.env  # Specify the environment file
    volumes:
      - ./cert:/usr/src/app/cert
    ports:
      - "5432:5432"
    restart: unless-stopped  # Optional: restart policy
    networks:
      - dreamhacker-network  # Optional: specify a custom network
  • ・Nginxの場合、HTTPとHTTPSのデフォルトポットを開けます。
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    networks:
      - dreamhacker-networ。
  • ・NginxのDockerfile
FROM alpine:latest
RUN apk add --no-cache nginx openrc
RUN rm /etc/nginx/http.d/default.conf                         
COPY default.conf /etc/nginx/http.d/default.conf              #Configをコピーする
COPY ./ssl/certificate.crt /etc/nginx/ssl/certificate.crt     #証明書をコピーする
COPY ./ssl/private.key /etc/nginx/ssl/private.key             #キーをコピーする
RUN mkdir -p /run/nginx
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
  • ・Nginxの設定
        #HTTPSにリダイレクト
server {
        listen 80 default_server;
        server_name www.dreamhacker.online;
        return 301 https://$server_name$request_uri;
}
 
server {
        listen 443 ssl;
 
        #証明書を読み込む
        ssl_certificate /etc/nginx/ssl/certificate.crt;
        ssl_certificate_key /etc/nginx/ssl/private.key;
 
        server_name www.dreamhacker.online;
 
        #アプリにリクエストをリダイレクト
        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
 
                proxy_pass http://dreamhacker-back:8080;
        }
}
~   
  • ・Dockerfileを実行するとアベイラブルになります。

国際的なオンラインおよびオフラインのコミュニティを発展させることに専念しています。メンバーはGMATやTOEFLの準備、ビジネススクールへの出願、学校生活、キャリア開発、ビジネスの機会を探るなどの経験を共有することができます。他者が個人的および専門的な目標を達成する手助けをし、メンバー同士の信頼できる長期的な関係を築くことを目指しています。