發表於 程式分享

Angular使用環境變數-node

1.安裝@angular-builders/custom-webpack

npm install -D @angular-builders/custom-webpack

2.angular.json設定

"projects": {
    "name-of-the-project": {
      //...
      "architect": {
        "build": {
          "builder":"@angular-builders/custom-webpack:browser"_,
          "options": {
            "customWebpackConfig": {
                "path":"webpack.config.js"
            },
            //...
        //...
    }
}

3.webpack.config.js設定

const webpack = require('webpack');

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      $ENV: {
        publicPath: JSON.stringify((process.env['publicpath'] == undefined) ? "http://testepf.test.com.tw:4200/" : process.env['publicpath']),
        apiBaseUrl: JSON.stringify((process.env['apiBaseUrl'] == undefined) ? "http://127.0.0.1:8003/" : process.env['apiBaseUrl']),
      }
    })
  ]
};

4.新增typing.d.ts

export interface Env {
  apiBaseUrl: any;
  publicPath: string;
}

5.environment.prod.ts

import { Env } from "../typing";
declare var $ENV: Env;

export const environment = {
  production: false,
  publicPath: $ENV.publicPath,
};

參考: https://codinglatte.com/posts/angular/using-os-environment-variables-in-angular-with-docker/

發表於 程式分享

微前端介紹

  • 微前端解決的問題 & 基本概念
    1. 無技術棧限制: 不同團隊(技術線不同),同時開發一個應用程式
    2. 應用單獨開發: 每個團隊開發的模組都可以獨立開發、獨立部署
    3. 多應用整合
  • 微前端種類
    1. 基座模式:通過搭建基座、配置中心來管理子應用。如基於SIngle Spa的偏通用的乾坤方案,也有基於本身團隊業務量身定制的方案。
    2. 自組織模式: 通過約定進行互調,但會遇到處理第三方依賴等問題。
    3. 去中心模式
      • 脫離基座模式,每個應用之間都可以彼此分享資源。
      • 如基於Webpack 5 Module Federation(模塊聯邦,mf,提供了能在當前應用中遠程加載其他服務器上應用的能力)。
      • 實現的EMP微前端方案,可以實現多個應用彼此共享資源分享。
  • 作法
    1. iframe

      iframe雖然基本能做到微前端所要做的所有事情,但它的最大問題也在於他的隔離性無法被突破,導致應用間上下文無法被共享,隨之帶來開發體驗、產品體驗的問題。

    2. webComponent
      • 技術棧無關:Web Components是瀏覽器原生組件,那即是在任何框架中都可以使用。
      • 獨立開發:使用Web Components開發的應用無需與其他應用間產生任何關聯。
      • 應用間隔離: Shadow DOM的特性,各個引入的微應用間可以達到相互隔離的效果。綜上所述,Web Components是有能力以組件加載的方式將微應用整合在一起作為微前端的一種手段,但不幸的是,Web Components是瀏覽器的新特性,所以它的兼容性不是很好,如果有兼容性要求的項目還是無法使用,具體請查看can i use。
    3. ESM (ES Module): ECMA Script 2015提出的前端模塊化手段;既可以實現跨技術棧調用,又可以在相同技術棧的應用間深度定制共享資源
      • 無技術棧限制:ESM加載的只是js內容,無論哪個框架,最終都要編譯成js,因此,無論哪種框架,ESM都能加載。
      • 應用單獨開發: ESM只是js的一種規範,不會影響應用的開發模式。
      • 多應用整合: 只要將微應用以ESM的方式暴露出來,就能正常加載。
      • 遠程加載模塊:ESM能夠直接請求cdn資源,這是它與生俱來的能力。
      • ESM是能做到微前端的核心思想,但是它也存在著兼容性這一大弊端,儘管ESM已經很優秀了,但是大部分老版的瀏覽器仍然無法直接使用,這也是babel等編譯工具出現的原因,幸運的是,他可以通過webpack、rollup、esbuild、snowpack等編譯工具成為兼容性的代碼。
    4. 2018yr: Single-SPA實現路劫持和應用加載,針對單頁面,沒樣式、js隔離
    5. Qiankun:2019yr,基於Single-SPA提供開箱即用的API (single-spa + sandbox + import-html-entry),接入簡單(同iframe一樣簡單)
      • 基於single-spa封裝,提供了更加開箱即用的 API
      • 技術棧無關,任意技術棧的應用均可 使用/接入,不論是 React/Vue/Angular/JQuery 還是其他等框架
      • HTML Entry 接入方式,讓你接入微應用像使用 iframe 一樣簡單
      • 樣式隔離,確保微應用之間樣式互相不干擾
      • JS 沙箱,確保微應用之間 全局變量/事件 不衝突
      • 資源預加載,在瀏覽器空閒時間預加載未打開的微應用資源,加速微應用打開速度 umi 插件,提供了 @umijs/plugin-qiankun 供 umi 應用一鍵切換成微前端架構系統 除了最後一點拓展以外,微前端想要達到的效果都已經達到。
    6. EMP:2020yr 由歡聚時代業務中台自主研發的最年輕的單頁微前端解決方案,基於module Federation,接入成本低、解決第三方依賴包問題

      尚不支持Angular

      • 基於Webpack5的新特性Module Federation實現,達到第三方依賴共享,減少不必要的代碼引入的目的,什麼是Module Federation這裡就不再贅述。
      • 每個微應用獨立部署運行,並通過cdn的方式引入主程序中,因此只需要部署一次,便可以提供給任何基於Module Federation的應用使用。並且此部分代碼是遠程引入,無需參與應用的打包。
      • 動態更新微應用:EMP是通過cdn加載微應用,因此每個微應用中的代碼有變動時,無需重新打包發布新的整合應用便能加載到最新的微應用。
      • 去中心化,每個微應用間都可以引入其他的微應用,無中心應用的概念。
      • 跨技術棧組件式調用,提供了在主應用框架中可以調用其他框架組件的能力(目前已支持互相調用的框架及使用方式請參閱官方文檔)。
      • 按需加載,開發者可以選擇只加載微應用中需要的部分,而不是強制只能將整個應用全部加載。
      • 應用間通信,每一個應用都可以進行狀態共享,就像在使用npm模塊進行開發一樣便捷。
      • 生成對應技術棧模板,它能像create-react-app一樣,也能像create-vue-app一樣,通過指令一鍵搭建好開發環境,減少開發者的負擔。
      • 遠程拉取ts聲明文件,emp-cli中內置了拉取遠程應用中代碼聲明文件的能力,讓使用ts開發的開發者不再為代碼報錯而煩惱。
發表於 程式分享

WebPack基礎

1.Download nodejs

2.Init WebPack Project

mkdir webpackproj
cd webpackproj
code . # 進入VS Code
npm init # 建立專案
npm i webpack -D # -D = --save-dev

3.webpack說明

1.Entry: webpack.config.js 專案入口
2.Output: webpack.config.js 專案產出檔
3.Loaders: 加module,根據規則去建立好檔案
4.Plugins: 除了讀檔外
5.Mode: Develop / Production , Ex. file size (compress)

3-1.webpack.config.js

const path = require('path')

module.exports = {
    entry: '.src/index.js',
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'main.bundle.js'
    }
  };

Command

npm run build # will install webpack-cli

4.啟動server執行

package.json

...
"scripts": {
    "build": "webpack",
    "dev": "webpack serve"
  },
...

Command

npm run dev # will install webpack-dev-server

localhost:8080/webpack-dev-server

5.建立index.html

# 先Key !,會產出預設的html檔
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    http://./main.bundle.js
</body>

</html>

6.dev server config

DevServer | webpack

7.use css file

webpack預設只看得懂html, 要認識css要裝loader, 裝css loader & style loader

npm install --save-dev css-loader
npm install --save-dev style-loader

webpack.config.js

...
module: {
        rules: [
            { 
                test: /\\.css$/i, 
                use: ['style-loader', 'css-loader'], 
            }
        ]
    }
...

index.css

div {
    width: 100px;
    height: 100px;
    background-color: yellow;
}

index.js

import './index.css'

console.log("hello");
console.log("hello");
console.log("hello");

index.html

<body>
    http://./main.bundle.js
    <div></div>
</body>

Command

npm run dev

8.bund hash for plugin

webpack.config.js

output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'main.**[hash]**.bundle.js'
    },

install html-webpack-plugin

npm install --save-dev html-webpack-plugin
npm install --save-dev mini-css-extract-plugin

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module: {
        rules: [
            { 
                test: /\\.css$/i, 
                use: [MiniCssExtractPlugin.loader, 'css-loader'], 
            }
        ]
    },

plugins: [new HtmlWebpackPlugin({
            template: './base.html'
        }),
        new MiniCssExtractPlugin({
            filename: 'main.[hash].css'
        })
    ],

base.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    http://./main.bundle.js
    <div id="num">0</div>
    <button id="btn">加1</button>
</body>

</html>

index.js

import './index.css'

const btn = document.getElementById('btn');
const num = document.getElementById('num');

btn.addEventListener('click', function() {
    const numVal = parseInt(num.innerHTML, 10);
    console.log('numVal: ' + numVal);
    num.innerHTML = numVal + 1;
})

9.babel: 讓所有瀏覽器都看得懂

Babel · The compiler for next generation JavaScript

將Babel加入webpack

# <https://babeljs.io/setup#installation>
npm install --save-dev babel-loader @babel/core
npm install @babel/preset-env --save-dev

webpack.config.js

{
  module: {
    rules: [
      {
        test: /\\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
        }
      }
    ]
  }
}

babel.config.json

{
  "presets": ["@babel/preset-env"]
}

index.js

...
class Test {
    #a = 1
    b = 2
}

const tt = new Test()
// TODO del
console.log('tt.a', tt.a);
console.log('tt.b', tt.b);

10.sourcemap

webpack.config.js

...
devtool: 'source-map',
...

11.raw-loader: Ex.image, file…

index.css

div {
    width: 1000px;
    height: 1000px;
    background-color: yellow;
    background-image: url('./cat.png');
}

webpack.config.js

module: {
        rules: [
            { 
...
            {
                test: /\\.(png|svg|jpg|jpeg|gif)$/i,
                type: 'asset/resource',
            }
        ]
    },
發表於 程式分享

Python專案管理 in VSCode

1.Install

  1. VS Colde
  2. Anaconda 3
#設定環境變數Path
C:\\ProgramData\\Anaconda3\\
C:\\ProgramData\\Anaconda3\\Scripts
C:\\ProgramData\\Anaconda3\\Library\\bin
  1. Plugin: Python, vscode-icons

2.Virtual Environment

flowchart LR

G[(Cmd + Shift + P)]:::blue ---> |select| P[(Create Terminal)]:::blue
P ---> |input| B[(conda init)]---> |input| A[(Python Interpreter,conda activate myenv)]
A ---> |install| V1[(pip3 install virtualenv)]
V1 ---> V2[(virtualenv .venv)]

G[(Cmd + Shift + P)]:::blue ---> V3[(Python Select Interpreter)]
V3 ---> |select| P2[(Create Terminal)]:::blue
P2 --> I1[(pip3 install pandas plotly)]
I1 ---> I2[(pip3 freeze)]

G[(Cmd + Shift + P)]:::blue ---> |remove env| R[(rm -rf .venv)]

3.建立main.py

print('Hello, world!')

執行

python main.py

4.建立script1.py

def writeMessage(message):
    print('Message received:', message)
    return
    
writeMessage('This is called from script1.py')
if __name__ == '__main__':
    writeMessage('This is called from script1.py')

執行

python script1.py

5.調整main.py

import script1
script1.writeMessage('This is called from main.py')

執行

python main.py

6.Ref

VSCode 1/5: macOS 最佳 Python 編程工具?豐富的插件商店?Visual Studio Code 安裝攻略 – Python 編程.圖表

發表於 程式分享

GA4簡介

一.GA發展路徑

  1. javascript library: 通用版GA是https://www.google-analytics.com/analytics.js、全域版GA是https://www.googletagmanager.com/gtag/js
  2. 兩個GA chrome外掛程式
    1. GA Debugger: 可於JavaScript Console展開Debug模式
    2. GA Tag Assistant: 僅支援全域版GA
    3. GA4串流GA資源方式: 將GA4的評估ID貼到GA追蹤資訊 > 追蹤程式碼 > 已連結的代碼 > 輸入所要連結的代碼ID

二.GA帳戶結構

三.事件結構

1.通用版GA事件結構

2.GA4事件結構

  • 事件導向,每個事件一個名稱,最多自訂25個參數
  • 參數: 可為常數、變數;可為文字、數字
  • 直接開發基礎數據框架,可自訂內容與格式;故報表要檢視參數收集到的數據,需將文字格式的參數自訂為"維度" 或 數字格式的參數自訂為"指標"

3.GA4事件類別

 

[GA4] 事件簡介

發表於 程式分享

微前端實作

1.參考 https://www.facebook.com/watch/?extid=CL-UNK-UNK-UNK-AN_GK0T-GK1C&v=283678740269320

講義

微前端_Angular.docx

指令

ng new --create-application=false mfdemo1
cd mfdemo1
ng g application mfdemo1 --routing --style=css

ng g application mf-element1 --routing=false --style=css
ng add @angular/elements --project=mf-element1
ng add ngx-build-plus --project=mf-element1

package.json

加上此兩項
"build:mfdemo1": "ng build --project=mfdemo1 --prod --output-hashing=none",
"build:mf-element1": "ng build --project=mf-element1 --prod --output-hashing=none --single-bundle",

執行build

npm run-script
npm run-script build:mf-element1
npm run-script build:mfdemo1

package.json

"build:mf-element1:deploy": "cp dist/mf-element1/main.js dist/mfdemo1/mf-element1.js && cp dist/mf-element1/polyfills.js dist/mfdemo1/mf-polyfills.js",
"serve:mfdemo1": "cd dist/mfdemo1 && lite-server",

執行build

npm run-script build:mf-element1:deploy

copy dist/mf-element1/main.js dist/mfdemo1/mf-element1.js
copy dist/mf-element1/polyfills.js dist/mfdemo1/mf-polyfills.js

出現錯誤npm run build 時報 cp 不是内部命令之錯誤

要用gitbash https://blog.csdn.net/Luzahngfeng/article/details/106999573

執行

npm install lite-server
npm run-script serve:mfdemo1

2.程式開發歷程

https://github.com/yahuihuang/microweb_mfdemo1

發表於 程式分享

ReactNative開發環境安裝

1.Tool : Expo

Introduction to Expo – Expo Documentation

2.Command

npm install --global expo-cli
expo init my-project
cd my-project
code .

npm start
Windows PowerShell
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。

請嘗試新的跨平台 PowerShell <https://aka.ms/pscore6>

PS D:\\GProj\\GReactNative\\my-project> npm start

> my-project@1.0.0 start D:\\GProj\\GReactNative\\my-project
> expo start

Starting project at D:\\GProj\\GReactNative\\my-project
Developer tools running on <http://localhost:19002>
Starting Metro Bundler
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ ▄▄▄▄▄ █▄▀▀▄▄ ▀█ █ ▄▄▄▄▄ █
█ █   █ ███▄█   ▄▄█ █   █ █
█ █▄▄▄█ ██▄▀▄▀███▀█ █▄▄▄█ █
█▄▄▄▄▄▄▄█ █ ▀▄▀ ▀ █▄▄▄▄▄▄▄█
█  ▀ ▄█▄▀█ ▄▄▀▀█▀ █▄█▀█▀▀▄█
█ ▀ ▀▀ ▄█▄▀  ▀▄▄▄▀▀███▄▀▀ █
█▀▄██ ▀▄▀█▄█▄▄▀▄ █ ▄▀▀█▀ ██
█ ▄█ ▄ ▄▀▀█▄ ▄▄█ ▄▀ ██▄▀  █
█▄████▄▄▄▀▄█▀   █ ▄▄▄  ▄▀▄█
█ ▄▄▄▄▄ ██▀ ▄  ▄█ █▄█ ██▀ █
█ █   █ █ ██▀▀██▄ ▄  ▄ █▀▀█
█ █▄▄▄█ █▀ ▄  █▄ ▄█▀▀▄█   █
█▄▄▄▄▄▄▄█▄█▄▄██▄▄▄▄█▄▄███▄█

› Metro waiting on exp://192.168.0.110:19000
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)

› Press a │ open Android
› Press w │ open web

› Press r │ reload app
› Press m │ toggle menu
› Press d │ show developer tools
› shift+d │ toggle auto opening developer tools on startup (disabled)

› Press ? │ show all commands

Logs for your project will appear below. Press Ctrl+C to exit.

3.Install Expo Client in iOS / Android

4.重Load

  1. 實機: 搖一搖可以選選單
  2. iOS simulator ⇒ Command + R
  3. Android emulator ⇒ R + R

5.iOS simulator → XCode

Android emulator → Android Studio

發表於 程式分享

Swift的enum內含那些值

範例

enum PatOne : CaseIterable {
  case Dog
  case Cat
  case Pig
}

let thePat:PatOne = PatOne.Pig

switch thePat {
  case .Pig:
    print("pig")
  case .Dog:
    print("dog")
  case .Cat:
    print("cat")
}

print("enum count: \(PatOne.allCases.count)")
PatOne.allCases.forEach {
  print("\($0)")
}

結果

pig
enum count: 3
Dog
Cat
Pig
發表於 程式分享

MySQL 8 replication安裝 (ubuntu 20.4)

 

1.安裝

https://j7.lb168.tw/2020/12/ubuntu-install-mysql-8-0-mysql-community-server/

https://dev.mysql.com/downloads/repo/apt/

wget https://repo.mysql.com//mysql-apt-config_0.8.19-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.19-1_all.deb
sudo apt update
sudo apt install mysql-community-client mysql-community-server

mysql -u root -p [ENTER]
=> 再輸入root密碼
show databases;

2.建資料庫

mysql -u root -p
USE `mysql`

-- 1.建資料庫 - portaldb
CREATE DATABASE `portaldb` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- 2.權限
CREATE USER 'portalap'@'%' IDENTIFIED BY '!pwd.168!';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON `portaldb`.* to 'portalap'@'%';
--DROP USER 'k8sap'@'%'
--Mysql 8已不支援此指令
--GRANT ALL PRIVILEGES ON `portaldb`.* TO 'k8sap'@'%' IDENTIFIED BY '!pwd.168!' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
mysql -u root -p
USE `mysql`

-- 1.建資料庫 - datadb
CREATE DATABASE `datadb` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- 2.權限
CREATE USER 'dataap'@'%' IDENTIFIED BY '!pwd.168!';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON `datadb`.* to 'dataap'@'%';
--DROP USER 'dataap'@'%'
--Mysql 8已不支援此指令
--GRANT ALL PRIVILEGES ON `datadb`.* TO 'dataap'@'%' IDENTIFIED BY '!pwd.168!' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

3.建立主從Replication

https://blog.toright.com/posts/5062/mysql-replication-主從式架構設定教學.html

https://www.itread01.com/content/1547349681.html

3-1.建repl user

https://www.modb.pro/db/29919

https://blog.csdn.net/wawa8899/article/details/86689618

#master
USE mysql;
CREATE USER 'replication'@'%' IDENTIFIED WITH 'mysql_native_password' BY '!pwd.168!';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;

select user,host,plugin,authentication_string from user;

3-2. 設定master/slave my.cnf

? /etc/mysql/my.cnf
#master
sudo vi /etc/my.cnf

新增
[mysqld]
log-bin=mysql-bin
server-id=1

sudo systemctl restart mysql

#slave
sudo vi /etc/my.cnf

新增
[mysqld]
server-id=2

sudo systemctl restart mysql

3-3.設定slave連master參數

#master
SHOW MASTER STATUS;

#slave
CHANGE MASTER TO
MASTER_HOST='172.24.42.71',
MASTER_USER='replication',
MASTER_PASSWORD='!pwd.168!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=3062;

SHOW SLAVE STATUS;

3-4.啟動replication

#slave
START SLAVE;
SHOW SLAVE STATUS;

註: 測試機裝node2,不建cluster (root password: 8888)

發表於 程式分享

GitLab安裝步驟(ubuntu 20.4)

1.Update system & install dependencies

sudo apt update
sudo apt upgrade -y
sudo apt install -y ca-certificates curl openssh-server

2.Configure Postfix Send-Only SMTP Server

https://computingforgeeks.com/how-to-install-and-configure-postfix-as-a-send-only-smtp-server-on-ubuntu/

#sudo hostnamectl set-hostname master.example.com
sudo apt install mailutils
    #Internet Site => OK => System mail name: master

sudo vi /etc/postfix/main.cf
#/etc/postfix/main.cf
inet_interfaces = loopback-only
myhostname = master
sudo systemctl restart postfix
#寄測試信
echo "Postfix Send-Only Server" | mail -s "Postfix Testing" huang.yahui.grace@gmail.com

3.Add the GitLab CE Repository

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
cat /etc/apt/sources.list.d/gitlab_gitlab-ce.list
#sudo apt-get install gitlab-ce
hadoop@master:~/elk$ cat /etc/apt/sources.list.d/gitlab_gitlab-ce.list
# this file was generated by packages.gitlab.com for
# the repository at https://packages.gitlab.com/gitlab/gitlab-ce

deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ focal main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ focal main

4.Install GitLab CE on Ubuntu 20

sudo apt update
sudo apt -y install gitlab-ce
sudo vi /etc/gitlab/gitlab.rb
external_url 'http://master.example.com:8088'
sudo cat /etc/gitlab/gitlab.rb |grep -v ^$ |grep -v ^#
sudo systemctl stop ufw
sudo gitlab-ctl reconfigure
sudo gitlab-ctl status
# sudo chmod -R 755    /var/log/gitlab

執行結果

hadoop@master:~/elk$ sudo gitlab-ctl status
run: alertmanager: (pid 149845) 13s; run: log: (pid 147377) 612s
run: gitaly: (pid 149909) 10s; run: log: (pid 145835) 729s
run: gitlab-exporter: (pid 149797) 16s; run: log: (pid 147072) 631s
run: gitlab-workhorse: (pid 149768) 17s; run: log: (pid 146825) 650s
run: grafana: (pid 149871) 12s; run: log: (pid 149494) 45s
run: logrotate: (pid 145651) 744s; run: log: (pid 145669) 743s
run: nginx: (pid 146854) 647s; run: log: (pid 146912) 644s
run: node-exporter: (pid 149780) 17s; run: log: (pid 146987) 637s
run: postgres-exporter: (pid 149862) 13s; run: log: (pid 147424) 608s
run: postgresql: (pid 146040) 721s; run: log: (pid 146055) 720s
run: prometheus: (pid 149810) 15s; run: log: (pid 147257) 620s
run: puma: (pid 149837) 13s; run: log: (pid 146681) 662s
run: redis: (pid 145725) 738s; run: log: (pid 145742) 737s
run: redis-exporter: (pid 149799) 16s; run: log: (pid 147111) 626s
run: sidekiq: (pid 146694) 659s; run: log: (pid 146755) 656s
#查看Log
sudo gitlab-ctl tail postgresql

設定web root登入帳密

gitlab-rails console -e production
user = User.where(id: 1).first
user.password = '88888888'
user.password_confirmation = '88888888'
user.save
exit

註: 出現Http 502,是因跟zookeeper相衝-port 8080

#可調整 zookeeper.admin.serverPort
Ref. https://www.it1352.com/2182816.html
conf/zoo.cfg
admin.serverPort=9876 (default port : 8080)

5.Access GitLab CE Web Interface

https://computingforgeeks.com/how-to-install-gitlab-ce-on-ubuntu-linux/

https://zhuanlan.zhihu.com/p/338882906

https://zh.codepre.com/how-to-25529.html?__cf_chl_managed_tk__=pmd_40hZONm3XueVQul5s.Ad0TTVsTpj7S_fDFTZ7SlK4oI-1634027215-0-gqNtZGzNAuWjcnBszRL9

https://yehchitsai.gitbooks.io/linux-usage/content/download_gitlab.html