외부VPN을 통한 NODE.SERVER 조회

1) HOME.VPN.라우팅.설정(SK BROADBAND)

2) HOME.UBUNTU(LINUX) DESKTOP.CONTROL
2.1) REDIS.TICK.SERVER - SQLite조회해서, REDIS에 전송
2.2) REDIS에서 데이타 POP후에, WEB.BROWSER에 WEB.SOCKET으로 전송(REAL.TIME 데이타등)


3) 외부에서.VPN접속.설정후에.브라우져를 통한.조회

비고) WiseGuard VPN에 대해서


WireGuard VPN에서 PrivateKey와 PublicKey는 VPN 연결을 보안하고 암호화하는 데 중요한 역할을 합니다. 
이 두 키는 비대칭 암호화 방식을 따르며, 각 역할은 다음과 같습니다.

1. PrivateKey (개인 키)
PrivateKey는 각 클라이언트 또는 서버가 비밀로 유지해야 하는 개인 키입니다. 
이 키는 외부에 노출되지 않아야 하며, 오직 해당 장치에서만 사용됩니다.
암호화와 서명: 이 키를 사용하여 데이터를 암호화하거나 서명할 수 있습니다. 
PrivateKey로 암호화된 데이터는 해당 PrivateKey와 짝을 이루는 **PublicKey(공개 키)**로만 복호화할 수 있습니다.
WireGuard 설정: WireGuard 설정 파일에서 PrivateKey 항목에 개인 키가 포함됩니다. 이 키는 VPN 터널을 설정하는 데 사용됩니다.

2. PublicKey (공개 키)
PublicKey는 각 장치의 공개된 키로, 다른 장치들이 이 키를 사용해 해당 장치로 안전하게 통신할 수 있도록 합니다.
공유: PublicKey는 클라이언트와 서버 간에 공유됩니다. 
즉, 연결하려는 다른 장치에 이 공개 키를 제공하여 암호화된 데이터를 주고받을 수 있습니다.

WireGuard 설정: WireGuard 설정 파일에서 PublicKey는 각 피어(peer, 즉 통신 상대)의 공개 키를 나타냅니다. 이는 해당 피어와의 통신을 암호화하고 보장하는 역할을 합니다.

동작 방식

키 생성: 각 장치는 고유한 PrivateKey와 PublicKey 쌍을 생성합니다.

PublicKey 교환: 클라이언트와 서버는 서로의 PublicKey를 공유하여 암호화된 통신을 설정합니다.

데이터 암호화: 클라이언트는 서버의 PublicKey를 사용해 데이터를 암호화하고, 서버는 자신의 PrivateKey를 사용해 이 데이터를 복호화합니다. 
반대로 서버도 클라이언트의 PublicKey로 데이터를 암호화하고 클라이언트는 자신의 PrivateKey로 복호화합니다.
이렇게 PublicKey와 PrivateKey는 WireGuard VPN에서 데이터의 기밀성, 무결성 및 인증을 보장하는 핵심 요소로 작동합니다.


 

증권정보.홈페이지(Infra.Introduction)
1) 조회
2) 실시간

Ubuntu에서 Node.js를 설치하려면 다음 단계를 따르세요:

패키지 목록 업데이트:

sudo apt update
Node.js 설치: Node.js는 여러 방법으로 설치할 수 있지만, 가장 간편한 방법은 NodeSource PPA를 사용하는 것입니다. 다음 명령어를 실행하여 Node.js를 설치합니다.

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
위 명령어에서 setup_18.x는 Node.js의 최신 LTS 버전을 설치합니다. 다른 버전이 필요하다면, 해당 버전의 번호로 변경하세요.

설치 확인: 설치가 완료되면 Node.js와 npm(노드 패키지 관리자)이 제대로 설치되었는지 확인합니다.

node -v
npm -v
이제 Node.js와 npm이 정상적으로 설치되었습니다. 필요한 패키지를 설치하거나 프로젝트를 시작할 수 있습니다!

npm install express
npm install @redis/client
npm install ws

sinfo@sinfo:~$ netstat -an | grep 3000
tcp6       0      0 :::3000                 :::*                    LISTEN
sinfo@sinfo:~$

sudo ufw status
sudo ufw allow 3000
sudo ufw status
sudo ufw enable

sudo ufw allow 8080
sudo ufw status
sudo ufw enable


app.js 수정부분)

app.listen(port, '0.0.0.0', () => {
    console.log(`HTTP Server is running at http://0.0.0.0:${port}`);
});
const wss = new WebSocketServer({ port: 8080, host: '0.0.0.0' });
위의 수정으로 WebSocketServer도 모든 인터페이스에서 접속을 허용하게 됩니다.


index.html 수정부분)

<script>
    // ... (이전 코드)

    const ws = new WebSocket('ws://192.168.45.54:8080'); // 수정된 부분

    // ... (이후 코드)
</script>
이제 수정한 코드를 사용하여 index.html을 테스트해 보세요. 추가적인 질문이 있으면 언제든지 말씀해 주세요!


 

app.js
0.00MB
index.html
0.05MB

NODE.JS.SERVER를 이용한 조회/실시간 통합(4)

1. NODE.JS.SERVER를 이용한 SQLite조회 (3)버젼
2. NODE.JS.SERVER를 이용한 실시간데이타 반영 (2)버젼
3. NODE.JS.SERVER를 이용한 조회/실시간 통합(4)

1과 2를 3으로 통합할수 있는 핵심은, 1번의 주고받는 REDIS.QUEUE.NAME과
2번의 주고받는 REDIS.QUEUE.NAME의 PREFIX를 틀리게 운용하면 된다.

조회시에는
SEQRCHSEND:클라이언트고유키, SEQRCHRECV:클라이언트고유키
실시간에는
SEND:클라이언트고유키, RECV:클라이언트고유키

물론 REDIS에 데이타를 제공하는 REDIS.TICKER.SERVER또한 한쌍의 주고받는 부분의 로직이 추가되어야 한다.

개략적인구조)


여러개의.브라우져에서.각각.조회가.가능하며, 실시간 PUSH는 모든 브라우져에 적용된다.)


PUSH데이타.실시간.데이타화면)

버튼을 통해서 SQLite의 데이타를 가져오는 화면)

app.js
0.00MB
index.html
0.05MB

석수컴퓨터 학원에서는 아래와 같은 궁금증을 가지고 계신분들에게 온라인으로 가이드해드립니다.

1. KRX정보분배 데이타 포맷에 대해서 궁금하신분
2. KRX정보분배 데이타를 직접 받아보고 싶으신분(증권,파생,지수등)
3. KRX정보분배 데이타를 수신하기 위한 최적화되어진 TCP환경에 대해서 알고싶으신분
4. 데이타를 파싱을 위한 구조체 핸들링을 알고싶으신분(c,c#)
5. 데이타를 저장하는 방법을 알고싶으신분(MySQL, SQLite, REDIS)
6. KRX정보분배 데이타의 실시간 PUSH방법을 알고싶으신분(HTS,WTS등)
7. 위와 관련되어진 서버나 클라이언트에 대해서 궁금증을 가지고 계신분

xterm92@naver.com 으로 문의주시면 성심성의껏 답변드리겠습니다.

Node.Server/Index.HTML(2)+(3)

app.js
0.00MB
index.html
0.05MB

Node app.js 를 통한 REDIS에서 데이타 조회 (SQLite DataBase에 저장되어진 시세데이타를 불러오기, 실시간이 아님)

1. index.html에서 app.js로 데이타포맷 보내기(SQLite DataBase에 저장되어진 시세데이타를 불러오기, 실시간이 아님)
        async function sendData() {

            const data = {
                proto: "r",
                sender: "1127001637919216845106",
                id: "QUERY.0001574960.001",
                ts: new Date().toISOString(),
                method: "",
                query: "A301S",
                colcnt: ""
            };

            const response = await fetch('/send', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(data)
            });
            const result = await response.json();
        }
2. REDIS에서 app.js 를 통한 JSON데이타 하나씩 꺼내오기
3  index.html에서 반복문을 통해서 하나씩 테이블에 출력
3.1 - index.html이 주된 메인이 되어서 control하므로, 반복문을 빠져나올수 있는 이벤트가 필요함
3.2 - JSON포맷중에 남은 항목에 서버에서 호출되어진 데이타의 Total개수를 표시
index++;
console.log(`Index: ${index}, Data Result: ${data.result}`);
if (data.result == index)
{
console.log(`Index: ${index}, Data Result: ${data.result}`);
console.log(`Index: ${index}, Data Result: ${data.result}`);
break;
}

4. 정상적으로 조회가 되는것을 확인

app.js
0.00MB
index.html
0.03MB

Node app.js 를 통한 REDIS에서 데이타 추출(삭제후에 꺼내오기)

개요)
- REDIS에 QUEUE에 매칭되어진 데이타가 쌓이면 실시간으로 NODE.js에서 이벤트.수신하여
웹브라우져와 통신하여, 브라우져에 표현해준다.(실시간.웹소켓)



app.js
- REDIS에서 데이타 추출(삭제후에 꺼내오기)
// Function to fetch data from Redis list using BLPOP (blocking pop)
async function fetchDataFromRedis() {
    try {
        const result = await redisClient.blPop('QCS:1127001637919216817849', 0); // 0 means it will block until data is available
        if (result) {
            // result is [key, value] where value is the data we want
            const data = JSON.parse(result.element);
            return Array.isArray(data) ? data : [data]; // Ensure data is an array
        }
    } catch (err) {
        console.error('Error fetching data from Redis:', err);
    }
    return [];
}

index.html 
- 웹소켓을 통한 데이타 표시


비고)
마지막에 입력되어진 데이타가 제일 위에 위치한다.
그러므로, 헤더의 타이틀과 맞아떨어질수 있다.


app.js
0.00MB
index.html
0.03MB

 

+ Recent posts