BLogic Systems

Staging Server

Last updated on 

Stating Server

Login Info

OS ubuntu-server
Local Domain portal.bls.com
IP Address 192.168.1.194
Username bls
Password bls

Remote

  1. For the first time you remote, create the ssh key by running the following script:
echo "LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFB\
QUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUNGd0FBQUFkemMyZ3RjbgpOaEFBQUFB\
d0VBQVFBQUFnRUF1NGwzU1VJeXZHZzF3d0ZmRWRja3V2R0Njd2tOcW1td0xPSm1kd2JWUXNqRVNH\
WFVSdSthCjdsbDJhTnhDL3hUVnMyZG9yZ0NaTEdxaFY3ZHNpYVlVQjZGNHhtV0w0amVFaUt5c1Vs\
VTBheFhWS3NoRzRLbFdEeUxZZVAKTFQzRkoza2xYS2NtNDlzWUlFeCt2S29PNGV2Q0JyeHNMTGxV\
anM5cnFlL1hFSlVHM0JJNzZBVElwNHlLWnVzY0VPbkRQSwo1dFpXaWtEWWpxTis4bS9TbHo4Yy9N\
WG9rNW40QnF1bnFVb20yM0xtYjE4K2d3Q3dXQ2NBWTdyL2hlV1lOcU5iMEJNd2ZOClNuVS9XdTJW\
cTRieFBuVUY2bURJSFM0anRvYXN6R1IvdjNmU3B4MHV5ZjdlZTd1Q0ZMWTlEa0ZoMkszNmVGNDll\
ZDR1aTQKVWNsSVRUUEFUMDFxWGN0S3RxdFM3aElPU1IxMG4wcGFKNllkWnhQTkxrV01lbkZPS3lk\
WkJkRGdGbmtFTHB2a0tmNkp6dApONFBiMU1DUFNVUGZoR3hNT2x1YndSRWR6VmpSSDRJVDVDTGpD\
VkpucTJEdjl0OGRkK0o5ajVnVzU5ejRzM2FuV3hJZ2JpCitBNXVXZXhYLzIvZ1NFK0REdW8xMjlh\
aGRGVFBqMHZQbkl1RzAvZ3hvQjdPUTFLVms4Ylh6dm83SFZ6MkU3M01XQWxNSFkKMkxUd0ZuYUhV\
cDJGT1VjL0tXQm83bGx2Zy94b3Y5Y0dnamxZTWozaFZpYlM1RVJFMENYUWczRVV2YVFZR3EwMGNa\
dmR1QQpuMytoTys2UmQ1TlYvWE90VUk3bkRhK3ZLSlhycHBsa2IydnFYUkJ3SEh0c1dITXlNU0M4\
VmRGVU1VOUF2QjIrZGRNcWhLCmNBQUFkSWIvWUFSMi8yQUVjQUFBQUhjM05vTFhKellRQUFBZ0VB\
dTRsM1NVSXl2R2cxd3dGZkVkY2t1dkdDY3drTnFtbXcKTE9KbWR3YlZRc2pFU0dYVVJ1K2E3bGwy\
YU54Qy94VFZzMmRvcmdDWkxHcWhWN2RzaWFZVUI2RjR4bVdMNGplRWlLeXNVbApVMGF4WFZLc2hH\
NEtsV0R5TFllUExUM0ZKM2tsWEtjbTQ5c1lJRXgrdktvTzRldkNCcnhzTExsVWpzOXJxZS9YRUpV\
RzNCCkk3NkFUSXA0eUtadXNjRU9uRFBLNXRaV2lrRFlqcU4rOG0vU2x6OGMvTVhvazVuNEJxdW5x\
VW9tMjNMbWIxOCtnd0N3V0MKY0FZN3IvaGVXWU5xTmIwQk13Zk5TblUvV3UyVnE0YnhQblVGNm1E\
SUhTNGp0b2FzekdSL3YzZlNweDB1eWY3ZWU3dUNGTApZOURrRmgySzM2ZUY0OWVkNHVpNFVjbElU\
VFBBVDAxcVhjdEt0cXRTN2hJT1NSMTBuMHBhSjZZZFp4UE5Ma1dNZW5GT0t5CmRaQmREZ0Zua0VM\
cHZrS2Y2Snp0TjRQYjFNQ1BTVVBmaEd4TU9sdWJ3UkVkelZqUkg0SVQ1Q0xqQ1ZKbnEyRHY5dDhk\
ZCsKSjlqNWdXNTl6NHMzYW5XeElnYmkrQTV1V2V4WC8yL2dTRStERHVvMTI5YWhkRlRQajB2UG5J\
dUcwL2d4b0I3T1ExS1ZrOApiWHp2bzdIVnoyRTczTVdBbE1IWTJMVHdGbmFIVXAyRk9VYy9LV0Jv\
N2xsdmcveG92OWNHZ2psWU1qM2hWaWJTNUVSRTBDClhRZzNFVXZhUVlHcTAwY1p2ZHVBbjMraE8r\
NlJkNU5WL1hPdFVJN25EYSt2S0pYcnBwbGtiMnZxWFJCd0hIdHNXSE15TVMKQzhWZEZVTVU5QXZC\
MitkZE1xaEtjQUFBQURBUUFCQUFBQ0FBRi9JRmVTVXF0VVBaR1gwalZuUFNETXlwaTJhc2lBWFdx\
TwpSL2tOTWVoOWg2dDRQSkJ3V3hFcDM1c0ludlJBSzFCcU05aW5vcEZMTEl4eHAwa1Y3VFQrWWVO\
YmJobFpEaEsxSmc3bUpTCnZ4bWFqa3ZrUU90ZVFiQ0JVM0F0L1FQS29MU3psTWpldDd1U1FMU3F1\
c0dzeXZpWXlsZzFCbXE1VndlZEpWODVnVHVDWGIKNEZROENxaTNRMHpoMkljQWxzN3V5UFFEZm5i\
czhSZG9Nd3NIOHVoRmdBeWxmdWcydUhqT1lhOEFwTHdneTNQcUxuNFZtWgpneUp0WGZ0aTVCY1hz\
Z25CTnk4djdsaUFhdUJhakZST1JNVFJEdWZFdFg1QVp1S2VyckpOZDMzajZycXI4UVNWdzN6ODAx\
CkhvemFvWUFWYXlrZFVHSStMekpmNDliUjRlZjhtMW9xR0pvdDNMbkNHYTVBVlZ4Z3VoM3lFVjNW\
a0o2c05KNmM5amdxYjAKZjRIZk02QVpXREZCaUp5dUsrZlZYa2dtcXh5N1g5WlhTd2Nad3lYQ09O\
MDZoQk5BaGdiSWZURm8wVVhmUzNwcjMwS1NIaQpITWtLL3A1YUhadHBPY1lHNWRsL3IvSnpzd1Ju\
SGxkV0o4eVFZUXh4Y29FVk54TlZySDg3TlBXWVZHcWovVWppMnNBYkhJCllRV3J2bGhnbXNyNTY5\
dHMzVFJ0UCtQWlB1SGNSRUVCbDlTNTB1WStzSTdFWkJuZTE3bmZUQXNXU0k3YzJ0ODBmWWdSZVUK\
Q0pXcDFYVExLaDZCcEoxbmhUak9pOUwrLzV6a21SUFRFSmRNTjhQYlllb2dOTVpmV1JpQnRIM2dY\
a2lwSnozU3VWWUc4KwpKQzg0MUVVV0Z5d3BrWGluamhBQUFCQUgwNCtzTjdoaEd6a3pwNFRWMWpn\
T0NZWjRBSk9NWi9IZkZ6dCsrRTVsdmhYUTVSCmFnaHVWZW0rVDJkSkxOd083Q2ZyUVE5ZW4wUjZ3\
azl1WWNCcmsyVVJPS0J2eTVnTHAvYmNxWTlPcUdpUDJGOEdtM3M4ekwKWGFvNWlsVW9hdGlSU21O\
WGR2MERTY1BaUnU0ak5acUhrcDcycG9DVC9NZ2JzcG96OE55dU93bGpwS3hzQXppaXorY0JrSgp5\
TnBZQjZvcXdvZ2hnM2NWTDRSZmtpeXEvS2NaVE10eFdKaFRxUmpXbmpJRnE3N2ZCUVMvVFpKYzZh\
V1hxVGVHWFpsRFZzCnRzMkN2Y01CQ1pqKzN5VWx1R2ovbTBqZVdhRk00bXRZTHVCQ0N5Q0FVSVIz\
NUsyWFk0WUpRNDg5MkI4Wk45bytBdnFoelUKNnlaNHBFV2dFTWdtRVVJQUFBRUJBT0xtSlhHaWRU\
TFpYSTZ5Z3FEZGN2L1FKM1hSd20rOEN1V1YzRHZrZDJUZnVBd3ZHcgpUYmdna0ZZdzdNYjlVQnlC\
c3ZrOExMUWprTVh5UFZzYXRmbzdYUC93SktUbTUxMGNGTVo3a2ZoVWJ4OHBvSkZQNXZNUEpTCkNN\
ZTlJemNoUWF1WWU3M2luVXI2eTVnb0FyU3Mrc0pNdzg2MmpMTkM2YmRKTjE2WVVBb3VoeHp0UWFs\
NExiMzdLUTQ1VFUKU25XRlJWMnAxamhkSno0V051cG1nS052L0o2bTVLL05PcnZCQkRXeWRkZGNK\
bTJuNnVUOGlPRDBlMFdaQzE0NmxiQk1hego0RXdjRDM2STBzNHdrUTQySnU3M0V1bnFBNisrTTM4\
aU8zM1IzVVJ6dTA0Z3R4MkVCZEd6UTFSd1FZZ2tDd0FPYkYzeWtiCkRIZ1BSRVY0RDkraGNBQUFF\
QkFOT1c3clZPRGxaQjgvd0wwVCtZU3hYc0RzaGZSVG1nY014OFZmaFBOU2NXdUVmcG1Hd2sKL251\
Ukl3T1ozWllwNmJkL085SWpKMEl4RGc1S0ZzT3VDOGh5cTMraFRYTFhmMS90SVM2NXZVOEZQdXVy\
MzlQWmlPSW1PUApHQ1YzcXRuSHF0cUJyNVVDTldUTDFwdTFQTGNvbi9OU2cvME1NL0Nnd0ttaTlK\
S3JQQ0FzZ29DdVNGTUVKUUZKcmFDclQ1CmR3VDVkbWU1MCtYWXBHZlpXUFpFSjRkL1lEVHlOVXNW\
NmloeVRCNko1MHA2ZUNGRWZ2Zjd0NWpBOXhQeVhtTXZhTlBsODAKTFJBWk1uS3A1aUFkUjVnRWc4\
OUhlQ1NQMzZyd1YxZlBQUDFGQ0p2eTRuNC9mRER0NjRiYjNMSnhhS21ZRW10YVZtYVZtZwovbVdw\
TG1mc3MvRUFBQUFPWkdGMGFIVkFWR2xsYmw5RVlYUUJBZ01FQlE9PQotLS0tLUVORCBPUEVOU1NI\
IFBSSVZBVEUgS0VZLS0tLS0K" | base64 -d > ~/.ssh/id_rsa
  1. From now on, you just need to run this command to remote to server from any terminal:
ssh [email protected]

Setup

SSH

SSH stands for Secure Shell, and as its name is saying, it is used to establish a secure connection between the client and its server. By default, every Linux based operating system supports SSH. SSH protocol is typically used for accessing, commanding, and transferring files remotely. So, in this section, you will demonstrate to generate SSH keys and use them to protect the server and precious information.

SSH Key Generation

From your local system, run:

ssh-keygen -t rsa -b 4096

Just press Enter to select the default provided file and passphrase.

A key pair consists of Private and Public key files named id_rsa and id_rsa.pub respectively in the ~/.ssh directory.

Copying the SSH key to remote server

ssh-copy-id [email protected]

After running the above command, it will confirm from you to continue the connection; type “yes” to continue. Then type “bls” if server password is requried.

Sharing the SSH key

Go to ~/.ssh directory, rename the file id_rsa to staging.pem, then share it to your team. So they can connect with the command:

ssh -i staging.pem [email protected]

Static IP Address Config

To configure a static IP address on your Ubuntu server you need to modify a relevant netplan network configuration file within /etc/netplan/ directory.

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      addresses: [192.168.1.194/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
  version: 2

Once ready apply changes with:

sudo netplan apply

Docker

Installation, please follow Install Docker Engine on Ubuntu

Or run this script:

# 1. download the script
curl -fsSL https://get.docker.com -o install-docker.sh

# 2. using sudo to perform the installation.
sudo sh install-docker.sh

Jenkins

Installation, follow Jenkinks Docker Installation

Login credential:

admin
Continenta@#1

GitHub Webhooks:

Add webhook to repo by browse repo on web, go to Settings > Webhooks > Add webhook.

In the form Payload URL, insert the url below

http://115.79.201.246:23997/webhooks

I built a reverse proxy to redirect public ip to Jenkins container. So Jenkins can know when ever code are push.

Thank Tuan DM for support me to forward port 23997.

Start all stacks

  • Clone the deployment repository:
git clone https://blogic-datht:[email protected]/blogic-datht/staging-deployment composes
  • Start all containers:
# Go to docker composes folder
cd composes

# Set execute permission
sudo chmod +x start-all.sh

# Start all container
./start-all.sh

Restore database

  • Start database container

# First, start the database container
docker compose -f composes/database/docker-compose.yaml up -d

# Create backup folder in database container
docker exec -it database mkdir /var/opt/mssql/backup
  • Prepare database backup files in home folder
BLogicPOSExpress BLogicPOSExpress.bak
BlogicLicenses BlogicLicenses.bak
BLOGICPOS9 BLOGICPOS9.bak
BLOGICREVIEWER BLOGICREVIEWER.bak
  • Copy backup files to backup folder located in composes/database/backup
  • Restore databases
docker exec -it database /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P 'S3cur3P@ssW0rd!' \
-i "/var/opt/mssql/backup/restore.sql"

or

/******
  Replace 'DUMP' with the desired name of the database that is being restored.
    BLOGICPOS9
    BlogicLicenses
    BLogicPOSExpress
    BLOGICREVIEWER
******/
DECLARE @DatabaseName AS VARCHAR(255) = 'DUMP'

-- Declare the path variables
DECLARE @NewLine AS CHAR(2) = CHAR(13) + CHAR(10)
DECLARE @Path AS NVARCHAR(255) = '/var/opt/mssql/'
DECLARE @BackupFilePath AS VARCHAR(255) = @Path + 'backup/' + @DatabaseName + '.bak'
DECLARE @DataFilePath AS VARCHAR(255) = @Path + 'data/' + @DatabaseName + '.mdf'
DECLARE @LogFilePath AS VARCHAR(255) = @Path + 'data/' + @DatabaseName + '_log.ldf'

-- Drop the database if it exists
DECLARE @DropDB AS NVARCHAR(MAX)
SET @DropDB =
  'USE master;' + @NewLine +
  'IF DB_ID(' + QUOTENAME(@DatabaseName, '''') + ') IS NOT NULL' + @NewLine +
  '    BEGIN' + @NewLine +
  '      ALTER DATABASE ' + @DatabaseName + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @NewLine +
  '      DROP DATABASE ' + @DatabaseName + ';' + @NewLine +
  '    END;'

PRINT @DropDB
EXEC sp_executesql @DropDB

PRINT @NewLine

-- Restore the database with backup file
DECLARE @RestoreDB AS NVARCHAR(MAX)
SET @RestoreDB =
  'RESTORE DATABASE ' + @DatabaseName + ' FROM DISK = ' + QUOTENAME(@BackupFilePath, '''') + ' WITH ' + @NewLine +
  '    MOVE ' + QUOTENAME(@DatabaseName, '''') + ' TO ' + QUOTENAME(@DataFilePath, '''') + ', ' + @NewLine +
  '    MOVE ' + QUOTENAME(@DatabaseName + '_log', '''') + ' TO ' + QUOTENAME(@LogFilePath, '''') + ';'

PRINT @RestoreDB
EXEC sp_executesql @RestoreDB

Create cron job auto backup database everyday

  • Prepare:
# Go inside database container
docker exec -it database bash

# Install vim & crontab
apt-get update
apt-get install vim -y
apt-get install cron -y
  • Create cron job
# Open cron config by cli
crontab -e

Insert this line to the end of the config:

00 12 * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'S3cur3P@ssW0rd!' -i "/var/opt/mssql/backup/backup.sql"

This will trigger backup.sql script at 12:00 PM everyday