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 para .envclient/.env.development.example para client/.env.development se você deseja executar o aplicativo no modo de desenvolvimentoclient/.env.production.example para client/.env.production se você deseja executar o aplicativo no modo de produção${REACT_APP_GOOGLE_API} siga estas etapas This will just run db and pgadmin containers. React and server instances are running separately, outside of containers.
${DB_HOST} de .env para: localhostdocker-compose -f docker-compose.dev.yml up -dnpm i && npm run server${REACT_APP_BASE_URL} variável em client/.env.development arquivo de acordo com ${SERVER_PORT} especificado no arquivo .envcd client && npm i && cd .. && npm run clientlocalhost:3000 This will run db, pgadmin, server and build react with disabled redux devtools.
${DB_HOST} de .env para postgres .docker-compose up -d .localhost:${SERVER_PORT} .Para o funcionamento correto do aplicativo, o banco de dados deve ser preenchido primeiro. Usaremos a linha de comando para realizar isso.
Do diretório raiz, navegue para o diretório onde os dados exportados estão localizados.
cd dummy Em seguida, copie os dados para a execução do contêiner do PostGres (para o modo de desenvolvimento, use dev_postgres_container ).
docker cp dbexport.sql postgres_container:/
Em seguida, digite o contêiner (para o modo de desenvolvimento, use dev_postgres_container ).
docker exec -it postgres_container /bin/bash
Se você deseja importar dados para o banco de dados já preenchido, primeiro remova a tabela existente e depois criar uma nova. No banco de dados existente do console do console de contêineres. (Pule esta etapa se você ainda não criou um banco de dados)
dropdb -U ${DB_USER} ${DB_NAME}Faça login no servidor PostGres como usuário.
su - ${DB_USER}Em seguida, crie um novo banco de dados.
createdb ${DB_NAME}Saia do console do servidor PostGres.
exitPreencher o banco de dados com novos dados.
psql -d ${DB_NAME} -U ${DB_USER} -f dbexport.sql Agora você pode fazer login no aplicativo. Ambos, name padrão e password é: admin .
localhost:${DB_PORT}${DB_USER}${DB_PASSWORD}http://localhost:${PGADMIN_PORT}${PGADMIN_EMAIL}${PGADMIN_PASSWORD}postgres${DB_PORT}${DB_NAME}${DB_PASSWORD} O arquivo do Docker está localizado no nível raiz do projeto e é usado apenas para o modo de implantação.
# Dockerfile
FROM node:latest
WORKDIR /server
COPY . ./
RUN npm install
RUN npm install --prefix client
CMD npm run build No início, o Node mais recente é baixado e /server é criado em contêiner recém -criado. Neste diretório de trabalho, o código -fonte inteiro é copiado, espere os arquivos especificados no client/.dockerignore . Esses arquivos são omitidos. Em seguida, as dependências do nó são instaladas no diretório de trabalho para instâncias de servidor e cliente. Por fim, o comando npm run build é chamado, localizado no package.json . Este comando primeiro cria aplicativo React e depois aciona o servidor. Quando o servidor é iniciado dessa maneira, a variável de ambiente NODE_ENV está definida como a versão production e construída do aplicativo React é usada.
Estamos usando dois arquivos do Docker-Compose. O docker-compose.dev.yml para desenvolver modo e docker-compose.yml para o modo de produção, ambos localizados no diretório raiz. Cada compõe arquivos carrega variáveis de ambiente especificadas no arquivo .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 : Esta configuração de composição cria 3 contêineres, 1 rede e 1 volume para armazenar dados persistentes. Todo contêiner está usando a mesma rede para comunicação com outros contêineres. Cada contêiner, após a falha, reinicia automaticamente. O contêiner postgres_container cria o servidor PostGresql, onde os dados persistentes são armazenados em volume. Há também contêiner pgadmin_container , que é o cliente SQL. O último contêiner, chamado server_container , é onde nosso aplicativo principal está em execução. Em vez de imagem, ela está usando o Build, definido no Dockerfile, discutido na seção anterior.
A configuração de composição para o modo de desenvolvimento é muito semelhante a um para o modo de implantação. A única diferença é que, não há server_container , porque o servidor e o cliente são instâncias separadas que ficam sem o Docker.
.env.example para .env e defina o valor de ${DB_HOST} para postgres .client/.env.production.example para client/.env.production .${REACT_APP_GOOGLE_API} no client/.env.production , siga estas etapas. O proxy reverso deve ser definido para encaminhar o acesso a Jenkins e Application Server. As portas especificadas em ./env deve corresponder às da configuração de proxy reversa do Nginx.
Primeiro, navegue para o diretório de configuração de sites disponíveis.
cd /etc/nginx/sites-available/ Crie arquivo de configuração. Você pode nomeá -lo como vive. A boa prática é nomear da mesma maneira que seu endereço DNS. No nosso caso, é lora.fiit.stuba.sk .
touch lora.fiit.stuba.sk Copie e cole o código a seguir no arquivo recém -criado. Altere a configuração do proxy_pass para cada local para corresponder às portas especificadas em .env . Não se esqueça de também ajustar server_name para corresponder ao seu 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
}Salvar o arquivo e reiniciar o serviço nginx
sudo systemctl restart nginx O aplicativo Jenkins deve estar acessível em lora.fiit.stuba.sk/jenkins . No seu caso, seria o nome do seu DNS em vez de lora.fiit.stuba.sk .
Quando você deseja alterar a casa padrão para Jenkins, você pode alterar a variável JENKINS_HOME . O guia é fortemente inspirado neste tutorial.
Crie um novo diretório para onde você deseja mudar o Jenkins para casa. No nosso caso, é /data/jenkins .
mkdir /data/jenkinsAltere a propriedade do diretório recém -criado.
sudo chown jenkins:jenkins /data/jenkins Copie o conteúdo do antigo diretório inicial de Jenkins, /var/lib/jenkins/ , para o novo diretório inicial de Jenkins, /data/jenkins/ , usando o seguinte comando.
sudo cp -prv /var/lib/jenkins /data/jenkins/Em seguida, altere a casa do usuário do Jenkins.
sudo usermod -d /data/jenkins/ jenkins Atualize o novo caminho do diretório inicial de Jenkins em /etc/default/jenkins . Você pode usar qualquer editor de sua escolha. No nosso caso, estamos usando o VI.
sudo vi /etc/default/jenkinsRole para baixo até o local da casa de Jenkins e atualize o novo caminho do diretório doméstico.
# 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=trueInicie o serviço Jenkins usando o seguinte comando.
sudo service jenkins start
Visite Jenkins do seu navegador em lora.fiit.stuba.sk/jenkins .
Faça login no aplicativo.
Navegue para Manage Jenkins localizado no lado esquerdo da tela.
Clique na guia Manage Credentials localizadas no Security group .
Em seguida, clique no link (global) localizado na tabela.
Clique no botão addCredentials no lado esquerdo da tela.
Escolha a opção Secret file no menu suspenso Kind .
Upload atendido arquivo .env e defina um campo de identificação como env .
Repita a etapa 6 e, em seguida, faça o upload do arquivo atendido client/.env.production e defina o campo de identificação como envClient .
Crie outras credenciais, mas desta vez escolha SSH Username with private key no menu suspenso. Defina o campo de identificação como lora-application-server-ssh . Para obter as chaves SSH para o seu repositório (onde está o código -fonte do servidor de aplicativos), siga essas instruções.
No painel, clique no botão New Item , localizado no lado esquerdo da tela.
Digite o nome desejado, clique no botão Pipeline e confirme -o clicando no botão OK
Para a pasta de script do pipeline
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 ( )
}
}Salve mudanças e execute seu primeiro pipeline
Parabéns! Após o pipeline construir e implantar com sucesso o aplicativo, seu aplicativo está acessível em lora.fiit.stuba.sk .