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 ke .envclient/.env.development.example ke client/.env.development jika Anda ingin menjalankan aplikasi dalam mode pengembanganclient/.env.production.example ke client/.env.production jika Anda ingin menjalankan APP dalam mode produksi${REACT_APP_GOOGLE_API} ikuti langkah -langkah ini This will just run db and pgadmin containers. React and server instances are running separately, outside of containers.
${DB_HOST} dari .env ke: localhostdocker-compose -f docker-compose.dev.yml up -dnpm i && npm run server${REACT_APP_BASE_URL} variabel di file client/.env.development sesuai dengan ${SERVER_PORT} ditentukan dalam file .envcd client && npm i && cd .. && npm run clientlocalhost:3000 This will run db, pgadmin, server and build react with disabled redux devtools.
${DB_HOST} dari .env ke postgres .docker-compose up -d .localhost:${SERVER_PORT} .Untuk fungsi aplikasi yang benar, basis data harus diisi terlebih dahulu. Kami akan menggunakan baris perintah untuk mencapainya.
Dari Root Directory, navigasikan ke direktori di mana data yang diekspor berada.
cd dummy Kemudian, salin data ke dalam menjalankan wadah postgres (untuk mode pengembangan menggunakan dev_postgres_container ).
docker cp dbexport.sql postgres_container:/
Kemudian, masukkan wadah (untuk mode pengembangan Gunakan dev_postgres_container ).
docker exec -it postgres_container /bin/bash
Jika Anda ingin mengimpor data ke dalam database yang sudah diisi, Anda harus terlebih dahulu menghapus tabel yang ada dan kemudian membuat yang baru. Dalam Konsol Kontainer menjatuhkan database yang ada. (Lewati langkah ini jika Anda belum membuat database)
dropdb -U ${DB_USER} ${DB_NAME}Masuk ke server postgres sebagai pengguna.
su - ${DB_USER}Kemudian buat database baru.
createdb ${DB_NAME}Keluar dari konsol server postgres.
exitMengisi database dengan data baru.
psql -d ${DB_NAME} -U ${DB_USER} -f dbexport.sql Sekarang Anda dapat masuk ke aplikasi. Keduanya, name default dan password adalah: admin .
localhost:${DB_PORT}${DB_USER}${DB_PASSWORD}http://localhost:${PGADMIN_PORT}${PGADMIN_EMAIL}${PGADMIN_PASSWORD}postgres${DB_PORT}${DB_NAME}${DB_PASSWORD} File Docker terletak di level root proyek dan hanya digunakan untuk mode Deploy.
# Dockerfile
FROM node:latest
WORKDIR /server
COPY . ./
RUN npm install
RUN npm install --prefix client
CMD npm run build Pada awalnya, node terbaru diunduh dan /server dibuat dalam wadah yang baru dibuat. Ke dalam direktori kerja ini, seluruh kode sumber disalin, diharapkan untuk file yang ditentukan dalam client/.dockerignore . File -file ini dihilangkan. Kemudian, dependensi simpul diinstal ke dalam direktori kerja untuk, instanci server dan klien. Terakhir, perintah npm run build dipanggil yang terletak di package.json . Perintah ini pertama -tama membangun aplikasi bereaksi dan kemudian memicu server. Ketika server dimulai dengan cara ini, variabel lingkungan NODE_ENV diatur ke production dan versi yang dibangun dari aplikasi React digunakan.
Kami menggunakan dua file komposisi Docker. docker-compose.dev.yml untuk mengembangkan mode dan docker-compose.yml untuk mode produksi, keduanya terletak di direktori root. Masing -masing membuat file memuat variabel lingkungan yang ditentukan dalam file .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 : Konfigurasi yang menyusun ini menciptakan 3 kontainer, 1 jaringan, dan 1 volume untuk menyimpan data persisten. Setiap wadah menggunakan jaringan yang sama untuk komunikasi dengan wadah lain. Setiap wadah, setelah kegagalan, restart secara otomatis. Container postgres_container Membuat Server PostgreSQL, di mana data persisten disimpan dalam volume. Ada juga kontainer pgadmin_container , yang merupakan klien sql. Container terakhir, bernama server_container , adalah tempat aplikasi utama kami berjalan. Alih -alih gambar itu menggunakan build, didefinisikan dalam DockerFile, dibahas di bagian sebelumnya.
Konfigurasi Kompose untuk Mode Kembangkan sangat mirip dengan yang untuk mode Deploy. Satu -satunya perbedaan adalah bahwa, tidak ada server_container , karena server dan klien adalah contoh terpisah yang kehabisan Docker.
.env.example ke .env dan atur nilai ${DB_HOST} ke postgres .client/.env.production.example ke client/.env.production .${REACT_APP_GOOGLE_API} di client/.env.production , ikuti langkah -langkah ini. Proxy terbalik harus diatur untuk meneruskan akses ke Jenkins dan server aplikasi. Port yang ditentukan dalam ./env harus cocok dengan yang ada di Nginx Reverse Proxy Config.
Pertama, arahkan ke direktori konfigurasi situs yang tersedia.
cd /etc/nginx/sites-available/ Buat file konfigurasi. Anda bisa menamakannya saat Anda meraih. Praktik yang baik adalah untuk menamainya dengan cara yang sama seperti alamat DNS Anda. Dalam kasus kami, itu adalah lora.fiit.stuba.sk .
touch lora.fiit.stuba.sk Salin dan tempel kode berikut ke file yang baru dibuat. Ubah konfigurasi proxy_pass untuk setiap lokasi agar sesuai dengan port yang ditentukan dalam .env . Jangan lupa juga menyesuaikan server_name agar sesuai dengan DNS Anda.
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
}Simpan file dan restart layanan nginx
sudo systemctl restart nginx Aplikasi Jenkins harus dapat diakses di lora.fiit.stuba.sk/jenkins . Dalam kasus Anda itu akan menjadi nama DNS Anda, bukan lora.fiit.stuba.sk .
Ketika Anda ingin mengubah rumah default untuk Jenkins, Anda dapat mengubah variabel JENKINS_HOME . Panduan ini sangat terinspirasi oleh tutorial ini.
Buat direktori baru ke mana pun Anda ingin memindahkan ke rumah Jenkins. Dalam kasus kami adalah /data/jenkins .
mkdir /data/jenkinsUbah kepemilikan direktori yang baru dibuat.
sudo chown jenkins:jenkins /data/jenkins Salin konten dari Old Jenkins Home Directory, /var/lib/jenkins/ , ke direktori Home Jenkins baru, /data/jenkins/ , menggunakan perintah berikut.
sudo cp -prv /var/lib/jenkins /data/jenkins/Selanjutnya, ubah rumah pengguna Jenkins.
sudo usermod -d /data/jenkins/ jenkins Perbarui Jenkins Home Directory Path di /etc/default/jenkins . Anda dapat menggunakan editor pilihan Anda. Dalam kasus kami, kami menggunakan VI.
sudo vi /etc/default/jenkinsGulir ke bawah ke lokasi rumah Jenkins dan perbarui jalur direktori home baru.
# 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=trueMulai Layanan Jenkins dengan menggunakan perintah berikut.
sudo service jenkins start
Kunjungi Jenkins dari browser Anda di lora.fiit.stuba.sk/jenkins .
Masuk ke aplikasi.
Arahkan untuk Manage Jenkins yang terletak di sisi kiri layar.
Klik tab Manage Credentials yang terletak di Security group .
Kemudian, klik tautan (global) yang terletak di tabel.
Klik tombol addCredentials di sisi kiri layar.
Pilih Opsi Secret file dari Menu Dropdown Kind .
Unggah file .env terpenuhi dan atur bidang ID ke env .
Ulangi langkah 6 dan kemudian unggah file client/.env.production yang terpenuhi dan atur bidang ID ke envClient .
Buat kredensial lain tetapi kali ini pilih SSH Username with private key dari menu dropdown. Atur bidang ID ke lora-application-server-ssh . Untuk mendapatkan tombol SSH untuk repositori Anda (di mana kode sumber server aplikasi) ikuti instruksi ini.
Dari dasbor klik tombol New Item , terletak di sisi kiri layar.
Masukkan nama yang diinginkan, klik tombol Pipeline dan konfirmasi mengklik tombol OK
Ke skrip pipa tempel kode berikut
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 ( )
}
}Simpan perubahan dan jalankan pipa pertama Anda
Selamat! Setelah pipa berhasil membangun dan menggunakan aplikasi, aplikasi Anda dapat diakses di lora.fiit.stuba.sk .