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為.envclient/.env.development.example to 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.
.env到: localhost ${DB_HOST}的更改值docker-compose -f docker-compose.dev.yml up -dnpm i && npm run server${REACT_APP_BASE_URL} client/.env.development文件中的$ {react_app_base_url}的端口,將.env文件中指定的${SERVER_PORT}cd client && npm i && cd .. && npm run clientlocalhost:3000 This will run db, pgadmin, server and build react with disabled redux devtools.
.env到postgres ${DB_HOST}的更改值。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應用程序的構建版本。
我們正在使用兩個Docker-Compose文件。開發模式和docker-compose.dev.yml 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 Server,其中持續數據存儲在卷中。還有SQL客戶端的容器pgadmin_container 。最後一個容器,名為server_container ,是我們的主要應用程序正在運行的地方。上一節中討論的是在Dockerfile中定義的構建,而是使用構建。
開發模式的組合配置與部署模式的配置非常相似。唯一的區別是,沒有server_container ,因為服務器和客戶端是從docker用完的單獨實例。
.env.example複製為.env ,並將${DB_HOST}的設置值設置為postgres 。client/.env.production.example複製和重命名為client/.env.production 。client/.env.production中獲取${REACT_APP_GOOGLE_API}的值,請按照以下步驟進行操作。 必須設置反向代理以將訪問到Jenkins和Application Server。 ./env中指定的端口必須與Nginx反向代理配置中的端口匹配。
首先,導航到可用站點配置目錄。
cd /etc/nginx/sites-available/創建配置文件。您可以將其命名。好的做法是以與您的DNS地址相同的方式命名。在我們的情況下,是lora.fiit.stuba.sk 。
touch lora.fiit.stuba.sk將以下代碼複製並粘貼到新創建的文件。為每個位置更改proxy_pass的配置,以匹配.env中指定的端口。不要忘記還要調整server_name以匹配您的DNS。
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詹金斯應用程序應在lora.fiit.stuba.sk/jenkins上訪問。在您的情況下,這將是您的DNS名稱,而不是lora.fiit.stuba.sk 。
當您想更改Jenkins的默認房屋時,您可以更改JENKINS_HOME變量。該指南受到本教程的啟發。
無論您想將詹金斯帶回家,創建一個新的目錄。在我們的情況下,是/data/jenkins 。
mkdir /data/jenkins更改新創建目錄的所有權。
sudo chown jenkins:jenkins /data/jenkins使用以下命令將內容從舊的Jenkins主目錄, /var/lib/jenkins/複製到新的jenkins主目錄, /data/jenkins/ ,使用以下命令。
sudo cp -prv /var/lib/jenkins /data/jenkins/接下來,更改Jenkins用戶之家。
sudo usermod -d /data/jenkins/ jenkins更新新的Jenkins主目錄路徑/etc/default/jenkins 。您可以使用您選擇的任何編輯器。在我們的情況下,我們正在使用vi。
sudo vi /etc/default/jenkins向下滾動到Jenkins 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
訪問您的瀏覽器jenkins,網址為lora.fiit.stuba.sk/jenkins 。
登錄應用程序。
導航至Manage Jenkins按鈕。
單擊位於Security group中的Manage Credentials卡。
然後,單擊表中的(global)鏈接。
單擊屏幕左側的addCredentials按鈕。
從Kind下拉菜單中選擇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上訪問。