There are two options how to run application. Develop and deploy mode.
Both modes are using same docker volume (same database is loaded).
.env.example to .envにコピーして名前を変更しますclient/.env.development.exampleをclient/.env.developmentにコピーして名前を作成して、開発モードでアプリを実行する場合はclient/.env.production.exampleにclient/.env.productionをコピーして名前を作成して、生産モードでアプリを実行する場合${REACT_APP_GOOGLE_API}の値を取得するには、これらの手順に従ってください This will just run db and pgadmin containers. React and server instances are running separately, outside of containers.
${DB_HOST}の値を.envから: localhostに変更しますdocker-compose -f docker-compose.dev.yml up -dnpm i && npm run server${REACT_APP_BASE_URL}のポートを調整することを忘れないでください${SERVER_PORT} client/.env.developmentファイルの変数.envcd client && npm i && cd .. && npm run clientlocalhost:3000で入手できます This will run db, pgadmin, server and build react with disabled redux devtools.
${DB_HOST}の値を.envからpostgresに変更します。docker-compose up -d 。localhost:${SERVER_PORT}で入手できます。正しいアプリケーション機能のためには、最初にデータベースを入力する必要があります。コマンドラインを使用してそれを達成します。
ルートディレクトリから、エクスポートされたデータが配置されているディレクトリに移動します。
cd dummy次に、データを実行中のPostgresコンテナにコピーします(開発モードにはdev_postgres_containerを使用します)。
docker cp dbexport.sql postgres_container:/
次に、コンテナを入力します(開発モードには、 dev_postgres_containerを使用します)。
docker exec -it postgres_container /bin/bash
すでに人口の多いデータベースにデータをインポートする場合は、最初に既存のテーブルを削除してから新しいテーブルを作成する必要があります。コンテナコンソールで既存のデータベースをドロップします。 (データベースをまだ作成していない場合は、この手順をスキップします)
dropdb -U ${DB_USER} ${DB_NAME}Postgresサーバーにユーザーとしてログインします。
su - ${DB_USER}次に、新しいデータベースを作成します。
createdb ${DB_NAME}Postgresサーバーコンソールを終了します。
exitデータベースを新しいデータに入力します。
psql -d ${DB_NAME} -U ${DB_USER} -f dbexport.sqlこれで、アプリケーションにログインできます。両方の、デフォルトnameとpassword adminです。
localhost:${DB_PORT}${DB_USER}${DB_PASSWORD}http://localhost:${PGADMIN_PORT}${PGADMIN_EMAIL}${PGADMIN_PASSWORD}postgres${DB_PORT}${DB_NAME}${DB_PASSWORD} Dockerファイルはプロジェクトのルートレベルにあり、展開モードにのみ使用されます。
# Dockerfile
FROM node:latest
WORKDIR /server
COPY . ./
RUN npm install
RUN npm install --prefix client
CMD npm run build最初は、最新のノードがダウンロードされ、 /server作業ディレクトリが新しく作成されたコンテナで作成されます。このワーキングディレクトリには、 client/.dockerignoreで指定されたファイルを期待して、ソースコード全体がコピーされます。これらのファイルは省略されています。次に、ノード依存関係は、サーバーとクライアントの両方のインスタンシーの両方の作業ディレクトリにインストールされます。最後に、 npm run buildコマンドは、 package.jsonにあると呼ばれます。このコマンドは、最初にReactアプリケーションを構築し、次にサーバーをトリガーします。サーバーがこの方法で開始されると、環境変数NODE_ENVがproductionに設定され、Reactアプリケーションの構築バージョンが使用されます。
2つのDocker-Composeファイルを使用しています。 docker-compose.dev.yml for developモードとdocker-compose.yml 、両方ともルートディレクトリにあります。各ファイルは、 .envファイルで指定された環境変数をロードします。
# docker-compose.dev.yml
version : " 3.5 "
# inspired by https://github.com/khezen/compose-postgres
services :
postgres :
container_name : postgres_container
image : postgres:11
environment :
POSTGRES_USER : ${DB_USER}
POSTGRES_PASSWORD : ${DB_PASSWORD}
PGDATA : /data/postgres
volumes :
- postgres:/data/postgres
ports :
- " ${DB_PORT}:5432 "
networks :
- postgres
restart : always
pgadmin :
container_name : pgadmin_container
image : dpage/pgadmin4
environment :
PGADMIN_DEFAULT_EMAIL : ${PGADMIN_EMAIL}
PGADMIN_DEFAULT_PASSWORD : ${PGADMIN_PASSWORD}
PGADMIN_CONFIG_SERVER_MODE : " False "
volumes :
- pgadmin:/root/.pgadmin
ports :
- " ${PGADMIN_PORT}:80 "
networks :
- postgres
restart : always
server :
container_name : server_container
build :
context : .
dockerfile : Dockerfile
depends_on :
- postgres
ports :
- " ${SERVER_PORT}:${SERVER_PORT} "
networks :
- postgres
restart : always
networks :
postgres :
driver : bridge
volumes :
postgres :
pgadmin :この構成は、永続的なデータを保存するために3つのコンテナ、1つのネットワーク、1つのボリュームを作成します。すべてのコンテナは、他のコンテナとの通信のために同じネットワークを使用しています。各コンテナは、障害後、自動的に再起動します。 Container postgres_container PostgreSQLサーバーを作成します。ここでは、永続的なデータがボリュームに保存されます。また、SQLクライアントであるContainer pgadmin_containerもあります。 server_containerという名前の最後のコンテナは、メインアプリが実行されている場所です。画像の代わりに、前のセクションで説明したDockerFileで定義されたビルドを使用しています。
開発モードのCompose構成は、展開モードの構成と非常に似ています。唯一の違いは、サーバーとクライアントがDockerを使い果たす別のインスタンスであるため、 server_containerがないことです。
.env.exampleを.envにコピーして変更し、 ${DB_HOST}の値をpostgresに設定します。client/.env.production.exampleにclient/.env.productionにコピーして名前を変更します。client/.env.productionで${REACT_APP_GOOGLE_API}の値を取得するには、次の手順に従ってください。 Reverse Proxyは、JenkinsおよびApplication Serverへの転送にアクセスするために設定する必要があります。 ./envで指定されたポートは、Nginx Reverse Proxy構成のポートと一致する必要があります。
まず、利用可能なサイト構成ディレクトリに移動します。
cd /etc/nginx/sites-available/構成ファイルを作成します。あなたはそれをあなたがwhishしているように名前を付けることができます。良い習慣は、DNSアドレスと同じように名前を付けることです。私たちの場合、それはlora.fiit.stuba.skです。
touch lora.fiit.stuba.sk次のコードをコピーして新しく作成したファイルに貼り付けます。 .envで指定されたポートに一致するように、各場所のproxy_passの構成を変更します。 DNSに合わせてserver_nameを調整することも忘れないでください。
upstream jenkins {
keepalive 32; # keepalive connections
server 127.0.0.1:8080; # jenkins ip and port
}
# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
server_name lora.fiit.stuba.sk www.lora.fiit.stuba.sk;
# this is the jenkins web root directory
# (mentioned in the /etc/default/jenkins file)
root /var/run/jenkins/war/;
access_log /var/log/nginx/jenkins/access.log;
error_log /var/log/nginx/jenkins/error.log;
# pass through headers from Jenkins that Nginx considers invalid
ignore_invalid_headers off;
location /jenkins/ {
autoindex on ;
sendfile off ;
proxy_pass http://jenkins/jenkins/;
proxy_redirect default ;
proxy_http_version 1.1 ;
# Required for Jenkins websocket agents
proxy_set_header Connection $connection_upgrade ;
proxy_set_header Upgrade $http_upgrade ;
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_max_temp_file_size 0 ;
#this is the maximum upload size
client_max_body_size 10m ;
client_body_buffer_size 128k ;
proxy_connect_timeout 90 ;
proxy_send_timeout 90 ;
proxy_read_timeout 90 ;
proxy_buffering off ;
proxy_request_buffering off; # Required for HTTP CLI commands
proxy_set_header Connection "" ; # Clear for keepalive
}
location / {
#Add serving gzipped files
gzip_static on ;
gzip on ;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 256 ;
gzip_types
text/plain
text/css
application/json
application/javascript
text/xml
application/xml
application/xml+rss text/javascript
application/atom+xml
application/geo+json
application/x-javascript
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
font/eot
font/otf
font/ttf
image/svg+xml;
proxy_pass http://127.0.0.1:5000/;
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 ;
# enable WebSockets
proxy_http_version 1.1 ;
proxy_set_header Upgrade $http_upgrade ;
proxy_set_header Connection "upgrade" ;
}
listen 443 ssl; # managed by Certbot
# SSL Configuration
ssl_certificate /etc/letsencrypt/live/lora.fiit.stuba.sk/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/lora.fiit.stuba.sk/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
# SSL redirect from HTTP to HTTPS
server {
if ( $host = lora.fiit.stuba.sk) {
return 301 https:// $host$request_uri ;
} # managed by Certbot
listen 80 ;
server_name lora.fiit.stuba.sk www.lora.fiit.stuba.sk;
return 404 ; # managed by Certbot
}ファイルを保存し、nginxサービスを再起動します
sudo systemctl restart nginx Jenkinsアプリケーションには、 lora.fiit.stuba.sk/jenkinsでアクセスできる必要があります。あなたの場合、それはlora.fiit.stuba.skの代わりにあなたのDNS名になります。
Jenkinsのデフォルトホームを変更したい場合は、 JENKINS_HOME変数を変更できます。このガイドは、このチュートリアルに深く触発されています。
ジェンキンスを家に移動したい場所に新しいディレクトリを作成します。私たちの場合、それは/data/jenkinsです。
mkdir /data/jenkins新しく作成されたディレクトリの所有権を変更します。
sudo chown jenkins:jenkins /data/jenkins以下のコマンドを使用して、Old Jenkins Home Directory /var/lib/jenkins/ 、新しいJenkins Home Directory、 /data/jenkins/にコンテンツをコピーします。
sudo cp -prv /var/lib/jenkins /data/jenkins/次に、Jenkinsユーザーホームを変更します。
sudo usermod -d /data/jenkins/ jenkins /etc/default/jenkinsの新しいJenkinsホームディレクトリパスを更新します。選択した任意のエディターを使用できます。私たちの場合、viを使用しています。
sudo vi /etc/default/jenkinsJenkins Homeの場所までスクロールして、新しいホームディレクトリパスを更新します。
# defaults for Jenkins automation server
# pulled in from the init script; makes things easier.
NAME=jenkins
# arguments to pass to java
# Allow graphs etc. to work even when an X server is present
JAVA_ARGS= " -Djava.awt.headless=true "
# JAVA_ARGS="-Xmx256m"
# make jenkins listen on IPv4 address
# JAVA_ARGS="-Djava.net.preferIPv4Stack=true"
PIDFILE=/var/run/$NAME/$NAME.pid
# user and group to be invoked as (default to jenkins)
JENKINS_USER=$NAME
JENKINS_GROUP=$NAME
# location of the jenkins war file
JENKINS_WAR=/usr/share/$NAME/$NAME.war
# jenkins home location
JENKINS_HOME=/data/$NAME
# set this to false if you don't want Jenkins to run by itself
# in this set up, you are expected to provide a servlet container
# to host jenkins.
RUN_STANDALONE=true次のコマンドを使用して、Jenkinsサービスを開始します。
sudo service jenkins start
lora.fiit.stuba.sk/jenkinsのブラウザからJenkinsにアクセスしてください。
アプリケーションにログインします。
画面の左側にあるManage Jenkinsために移動します。
Security groupにあるManage Credentialsタブをクリックします。
次に、テーブルにある(global)リンクをクリックします。
画面の左側にあるaddCredentialsボタンをクリックします。
Kind DropdownメニューからSecret fileオプションを選択します。
.envファイルをアップロードし、IDフィールドをenvに設定します。
ステップ6を繰り返してから、充実したclient/.env.productionファイルをアップロードし、IDフィールドをenvClientに設定します。
別の資格情報を作成しますが、今回はドロップダウンメニューからSSH Username with private keyを選択します。 IDフィールドをlora-application-server-sshに設定します。リポジトリのSSHキーを取得するには(アプリケーションサーバーのソースコードがある場所)、この指示に従ってください。
ダッシュボードから、画面の左側にあるNew Itemボタンをクリックします。
目的の名前を入力し、 Pipelineボタンをクリックして、[OK]ボタンをクリックすることを確認します
パイプラインスクリプトに次のコードを貼り付けます
node {
/*** 1 Pull new changes from git branch deploy ***/
stage ( 'Pull master branch' ) {
git credentialsId : 'lora-application-server-ssh' , url : '[email protected]:danielhros/lora-application-server.git'
}
/*** 2 Add secret enviroment variables stored securely in Jenkins ***/
stage ( 'Add enviroment variables' ) {
/* 2.1 Remove .env file if exists */
sh 'rm -f -- .env'
/* 2.2 Add .env file to server */
withCredentials ( [ file ( credentialsId : 'env' , variable : 'env' ) ] ) {
sh "cp $env ./"
}
/* 2.2 Add .env file to client */
withCredentials ( [ file ( credentialsId : 'envClient' , variable : 'envClient' ) ] ) {
sh 'cp $envClient client/.env.production'
}
}
/*** 3 Build docker image ***/
stage ( 'Build docker image' ) {
sh '(docker-compose build)'
}
/*** 4 Run docker image in production ***/
stage ( 'Run docker images' ) {
sh '(docker-compose up -d)'
}
/*** 5 Clean after build ***/
stage ( 'Clean workspace' ) {
sh 'docker system prune -f'
cleanWs ( )
}
}変更を保存して、最初のパイプラインを実行します
おめでとう!パイプラインがアプリケーションの構築と展開に成功した後、アプリはlora.fiit.stuba.skでアクセスできます。