From a8acefc4eca3b9d5f32c9c2f5da34aa76dc1336a Mon Sep 17 00:00:00 2001 From: MonHun Date: Fri, 29 Mar 2024 17:36:47 +0900 Subject: [PATCH] win 0329 --- Recognition/.obsidian/appearance.json | 6 +- .../plugins/obsidian-style-settings/data.json | 13 +- .../plugins/recent-files-obsidian/data.json | 252 +++++++------- Recognition/.obsidian/workspace.json | 80 ++--- .../Programing/Docker/Docker Compose.md | 46 ++- .../Programing/Docker/Docker 명령어.md | 2 +- .../Docker/Docker 폐쇄망 설치.md | 72 ++-- .../Programing/Docker/무제 파일 1.md | 0 .../Programing/Docker/무제 파일 2.md | 0 .../ELK/ELK 폐쇄망 설치(New).md | 86 +---- .../Kafka(AMQP)/Kafka ELK로 모니터링.md | 35 +- .../ssh포트로 파일 전송.md | 2 +- .../리눅스 ls 정렬해서 보기.md | 6 + .../Linux/Linux 명령어/리눅스 mkdir.md | 7 + .../리눅스 데몬 서비스 관련.md | 22 ++ ...스 특정 폴더, 파일 용량 확인.md | 5 + .../리눅스 확장자 일괄 변경.md | 8 + .../Linux 명령어/무제 폴더/desktop.ini | 2 - .../Linux 프로그램/리눅스 crontab.md | 14 + ...xy HA (High Availability) 구성하기.md | 274 ++++++++++++++++ ...INX HA (High Availability) 구성하기.md | 309 ++++++++++++++++++ .../프로세스 확인 및 강제 종료.md | 3 + .../테이블 컬럼 코멘트 조회.md | 11 + .../Tools/VSCode_Server/Maven 설치.md | 2 +- .../1.업무메모/{ => 2023}/2022-11-11.md | 0 .../1.업무메모/{ => 2023}/2023-02-14.md | 0 .../1.업무메모/{ => 2023}/2023-03-27.md | 0 .../1.업무메모/{ => 2023}/2023-03-28.md | 0 .../1.업무메모/{ => 2023}/2023-03-29.md | 0 .../1.업무메모/{ => 2023}/2023-03-30.md | 0 .../1.업무메모/{ => 2023}/2023-04-03.md | 0 .../1.업무메모/{ => 2023}/2023-04-06.md | 0 .../1.업무메모/{ => 2023}/2023-04-07.md | 0 .../1.업무메모/{ => 2023}/2023-04-12.md | 0 .../1.업무메모/{ => 2023}/2023-05-08.md | 0 .../1.업무메모/{ => 2023}/2023-05-23.md | 0 .../Work Related/1.업무메모/2024-03-25.md | 167 ++++++++++ .../0.관련정보/공유문서.md | 3 + .../항공기 등급 기준.md | 3 + .../9.기타/Filebeat 재배포.md | 39 +++ .../9.기타/SACP maven 빌드 명령어.md | 5 + .../프로젝트/스마트계류장/TODO.md | 2 +- .../Pasted image 20240320095219.png | Bin 0 -> 48383 bytes Recognition/무제 파일.canvas | 1 + 44 files changed, 1190 insertions(+), 287 deletions(-) create mode 100644 Recognition/Programing/Docker/무제 파일 1.md create mode 100644 Recognition/Programing/Docker/무제 파일 2.md create mode 100644 Recognition/Programing/Linux/Linux 명령어/리눅스 ls 정렬해서 보기.md create mode 100644 Recognition/Programing/Linux/Linux 명령어/리눅스 mkdir.md create mode 100644 Recognition/Programing/Linux/Linux 명령어/리눅스 데몬 서비스 관련.md create mode 100644 Recognition/Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md create mode 100644 Recognition/Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md delete mode 100644 Recognition/Programing/Linux/Linux 명령어/무제 폴더/desktop.ini create mode 100644 Recognition/Programing/Linux/Linux 프로그램/리눅스 crontab.md create mode 100644 Recognition/Programing/Linux/RHEL9/HAProxy HA (High Availability) 구성하기.md create mode 100644 Recognition/Programing/Linux/RHEL9/NGINX HA (High Availability) 구성하기.md create mode 100644 Recognition/Programing/Tibero/테이블 컬럼 코멘트 조회.md rename Recognition/Work Related/1.업무메모/{ => 2023}/2022-11-11.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-02-14.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-03-27.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-03-28.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-03-29.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-03-30.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-04-03.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-04-06.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-04-07.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-04-12.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-05-08.md (100%) rename Recognition/Work Related/1.업무메모/{ => 2023}/2023-05-23.md (100%) create mode 100644 Recognition/Work Related/1.업무메모/2024-03-25.md create mode 100644 Recognition/Work Related/프로젝트/스마트계류장/1.데이터베이스/항공기 등급 기준.md create mode 100644 Recognition/Work Related/프로젝트/스마트계류장/9.기타/Filebeat 재배포.md create mode 100644 Recognition/Work Related/프로젝트/스마트계류장/9.기타/SACP maven 빌드 명령어.md create mode 100644 Recognition/zzz.resources/Pasted image 20240320095219.png create mode 100644 Recognition/무제 파일.canvas diff --git a/Recognition/.obsidian/appearance.json b/Recognition/.obsidian/appearance.json index 82d57aa..842ad85 100644 --- a/Recognition/.obsidian/appearance.json +++ b/Recognition/.obsidian/appearance.json @@ -1,8 +1,8 @@ { - "cssTheme": "Blue Topaz", + "cssTheme": "Prism", "theme": "obsidian", - "textFontFamily": "맑은 고딕", - "baseFontSize": 12, + "textFontFamily": "D2Coding,맑은 고딕,Consolas", + "baseFontSize": 15, "enabledCssSnippets": [], "accentColor": "", "translucency": false, diff --git a/Recognition/.obsidian/plugins/obsidian-style-settings/data.json b/Recognition/.obsidian/plugins/obsidian-style-settings/data.json index fe5640f..502f1a6 100644 --- a/Recognition/.obsidian/plugins/obsidian-style-settings/data.json +++ b/Recognition/.obsidian/plugins/obsidian-style-settings/data.json @@ -48,5 +48,16 @@ "minimal-style@@embed-strict": true, "blue-topaz-theme@@rainbow-checkbox": false, "blue-topaz-theme@@list-style-change-options": "list-no-border", - "Blue-Topaz-Codebox-Highlight@@code-theme-selection": "code-theme-sublime" + "Blue-Topaz-Codebox-Highlight@@code-theme-selection": "code-theme-sublime", + "obsidian-prism-theme@@pt-file-explorer-folder-icon": true, + "obsidian-prism-theme@@pt-icons-accent": true, + "obsidian-prism-theme@@pt-fade-inactive-tabs": false, + "obsidian-prism-theme@@pt-disable-blur": false, + "obsidian-prism-theme@@pt-disable-callout-styling": false, + "obsidian-prism-theme@@pt-custom-vault-banner": false, + "obsidian-prism-theme@@custom-vault-banner-horizontal-align": "pt-custom-vault-banner-justify-content-center", + "obsidian-prism-theme@@pt-custom-vault-banner-sticky": false, + "obsidian-prism-theme@@pt-focused-mode": true, + "obsidian-prism-theme@@pt-titlebar-hide-text": true, + "obsidian-prism-theme@@scroll-bar-size": 9 } \ No newline at end of file diff --git a/Recognition/.obsidian/plugins/recent-files-obsidian/data.json b/Recognition/.obsidian/plugins/recent-files-obsidian/data.json index 479123b..d93ed26 100644 --- a/Recognition/.obsidian/plugins/recent-files-obsidian/data.json +++ b/Recognition/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,204 +1,204 @@ { "recentFiles": [ { - "basename": "CLI에서 Git 사용", - "path": "Tools/GitHub/CLI에서 Git 사용.md" + "basename": "Maven 설치", + "path": "Tools/VSCode_Server/Maven 설치.md" }, { - "basename": "Gitea 설치", - "path": "Tools/GitHub/Gitea 설치.md" + "basename": "프로젝트 생성", + "path": "Tools/VSCode_Server/프로젝트 생성.md" }, { - "basename": "TODO", - "path": "Work Related/프로젝트/스마트계류장/TODO.md" + "basename": "Ubuntu에 설치", + "path": "Tools/VSCode_Server/Ubuntu에 설치.md" }, { - "basename": "주기장 기준 항공기 유무 확인 쿼리(GAM)", - "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/주기장 기준 항공기 유무 확인 쿼리(GAM).md" + "basename": "vscode_server 설치관련", + "path": "Tools/VSCode_Server/vscode_server 설치관련.md" }, { - "basename": "Docker 명령어", - "path": "Programing/Docker/Docker 명령어.md" + "basename": "VSCode 설치", + "path": "Tools/VSCode/VSCode 설치.md" }, { - "basename": "Docker 폐쇄망 설치", - "path": "Programing/Docker/Docker 폐쇄망 설치.md" - }, - { - "basename": "CMD 명령어", - "path": "Programing/Windows/CMD 명령어.md" - }, - { - "basename": "Docker 페쇄망 이관", - "path": "Programing/Docker/Docker 페쇄망 이관.md" - }, - { - "basename": "Docker 설치", - "path": "Programing/Docker/Docker 설치.md" + "basename": "VSCode Extension", + "path": "Tools/VSCode/VSCode Extension.md" }, { "basename": "공유문서", "path": "Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md" }, { - "basename": "중단파서버 보안취약점", - "path": "Work Related/프로젝트/D-MHFH/유지보수/중단파서버 보안취약점.md" + "basename": "2024-03-25", + "path": "Work Related/1.업무메모/2024-03-25.md" + }, + { + "basename": "방문증 신청 문구", + "path": "Work Related/프로젝트/스마트계류장/9.기타/방문증 신청 문구.md" + }, + { + "basename": "Docker 폐쇄망 설치", + "path": "Programing/Docker/Docker 폐쇄망 설치.md" }, { "basename": "프로세스 확인 및 강제 종료", "path": "Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md" }, { - "basename": "RabbitMQ 설치", - "path": "Programing/RabbitMQ(AMQP)/RabbitMQ 설치.md" + "basename": "Reno server URL", + "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/Reno server URL.md" }, { - "basename": "Server에 VNC 설치", - "path": "Programing/Linux/Ubuntu/Server에 VNC 설치.md" - }, - { - "basename": "Ubuntu GitLab-CE 설치", - "path": "Programing/Linux/Ubuntu/Ubuntu GitLab-CE 설치.md" - }, - { - "basename": "테이블 Archive 로그 설정 변경", - "path": "Programing/Tibero/테이블 Archive 로그 설정 변경.md" - }, - { - "basename": "통계관련", - "path": "Work Related/프로젝트/스마트계류장/통계관련.md" - }, - { - "basename": "Kafka ELK로 모니터링", - "path": "Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md" - }, - { - "basename": "Tibero 이중화 구성시 서비스 실행", - "path": "Programing/Tibero/Tibero 이중화 구성시 서비스 실행.md" - }, - { - "basename": "Tibero 7 설치", - "path": "Programing/Tibero/Tibero 7 설치.md" - }, - { - "basename": "Ubuntu Gitlab 설치", - "path": "Tools/GitHub/Ubuntu Gitlab 설치.md" - }, - { - "basename": "리눅스 명령어", - "path": "Programing/Linux/Linux 명령어/리눅스 명령어.md" - }, - { - "basename": "function Table", - "path": "Programing/Tibero/function Table.md" + "basename": "Docker 설치", + "path": "Programing/Docker/Docker 설치.md" }, { "basename": "Docker Compose", "path": "Programing/Docker/Docker Compose.md" }, { - "basename": "ASDE UDP", - "path": "Work Related/프로젝트/스마트계류장/외부연계 관련/Asterix분석/ASDE UDP.md" + "basename": "Docker 페쇄망 이관", + "path": "Programing/Docker/Docker 페쇄망 이관.md" }, { - "basename": "Ubuntu 버전 확인", - "path": "Programing/Linux/Ubuntu/Ubuntu 버전 확인.md" + "basename": "Docker Engine", + "path": "Programing/Docker/Docker Engine.md" }, { - "basename": "2023-04-06", - "path": "Work Related/1.업무메모/2023-04-06.md" + "basename": "2022-06-06", + "path": "Work Related/1.업무메모/2022.06/2022-06-06.md" }, { - "basename": "win탐색기에서 roo 폴더 열기", - "path": "Programing/Linux/WSL/win탐색기에서 roo 폴더 열기.md" + "basename": "2022-06-16", + "path": "Work Related/1.업무메모/2022.06/2022-06-16.md" }, { - "basename": "WSL2설치", - "path": "Programing/Linux/WSL/WSL2설치.md" + "basename": "상황관제-방송수신내역(항적)", + "path": "Work Related/프로젝트/D-MHFH/유지보수/상황관제-방송수신내역(항적).md" }, { - "basename": "ElasticSearch 검색 관련", - "path": "Programing/ELK/ElasticSearch 검색 관련.md" + "basename": "커맨트라인(bash) 단축키", + "path": "Programing/Linux/Linux 명령어/커맨트라인(bash) 단축키.md" }, { "basename": "ElasticSearch 쿼리", "path": "Programing/ELK/ElasticSearch 쿼리.md" }, { - "basename": "query DSL", - "path": "Programing/ELK/query DSL.md" + "basename": "Set Up", + "path": "Learning/Programing/WSL개발환경 셋팅/Set Up.md" }, { - "basename": "LAG, LEAD 함수 (위아래 행간 컬럼 비교)", - "path": "Programing/Oracle/LAG, LEAD 함수 (위아래 행간 컬럼 비교).md" + "basename": "Tibero 7 설치", + "path": "Programing/Tibero/Tibero 7 설치.md" }, { - "basename": "정렬된 자료에서 빈칸채우기", - "path": "Programing/MariaDB/정렬된 자료에서 빈칸채우기.md" + "basename": "리눅스 확장자 일괄 변경", + "path": "Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md" }, { - "basename": "용어정리", - "path": "Work Related/프로젝트/스마트계류장/항공용어/용어정리.md" + "basename": "리눅스 특정 폴더, 파일 용량 확인", + "path": "Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md" }, { - "basename": "엔티티설계서", - "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/산출물작업/엔티티설계서.md" + "basename": "무제 파일 2", + "path": "Programing/Docker/무제 파일 2.md" }, { - "basename": "2022-05-31", - "path": "Work Related/1.업무메모/2022.05/2022-05-31.md" + "basename": "HAProxy HA (High Availability) 구성하기", + "path": "Programing/Linux/RHEL9/HAProxy HA (High Availability) 구성하기.md" }, { - "basename": "한영 마우스 툴팁", - "path": "Tools/Autohotkey/한영 마우스 툴팁.md" + "basename": "NGINX HA (High Availability) 구성하기", + "path": "Programing/Linux/RHEL9/NGINX HA (High Availability) 구성하기.md" }, { - "basename": "통계화면 초안 차트", - "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/통계관련/통계화면 초안 차트.md" + "basename": "리눅스 crontab", + "path": "Programing/Linux/Linux 프로그램/리눅스 crontab.md" }, { - "basename": "테이블 정의서 DB테이블 생성", - "path": "Programing/MariaDB/테이블 정의서 DB테이블 생성.md" + "basename": "Utils", + "path": "Programing/Linux/Linux 프로그램/Utils.md" + }, + { + "basename": "테이블 일괄 생성 스크립트", + "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/산출물작업/테이블 일괄 생성 스크립트.md" + }, + { + "basename": "테이블 Archive 로그 설정 변경", + "path": "Programing/Tibero/테이블 Archive 로그 설정 변경.md" + }, + { + "basename": "일반 유저에 관리자 권한 부여", + "path": "Programing/Linux/Ubuntu/일반 유저에 관리자 권한 부여.md" + }, + { + "basename": "무제 파일", + "path": "무제 파일.canvas" + }, + { + "basename": "자주사용하는 마크다운", + "path": "Programing/Markdown/자주사용하는 마크다운.md" + }, + { + "basename": "Filebeat 재배포", + "path": "Work Related/프로젝트/스마트계류장/9.기타/Filebeat 재배포.md" + }, + { + "basename": "2022-11-11", + "path": "Work Related/1.업무메모/2023/2022-11-11.md" + }, + { + "basename": "리눅스 데몬 서비스 관련", + "path": "Programing/Linux/Linux 명령어/리눅스 데몬 서비스 관련.md" + }, + { + "basename": "리눅스 명령어", + "path": "Programing/Linux/Linux 명령어/리눅스 명령어.md" + }, + { + "basename": "ELK 폐쇄망 설치(New)", + "path": "Programing/ELK/ELK 폐쇄망 설치(New).md" + }, + { + "basename": "리눅스 ls 정렬해서 보기", + "path": "Programing/Linux/Linux 명령어/리눅스 ls 정렬해서 보기.md" + }, + { + "basename": "무제 파일 1", + "path": "Programing/Docker/무제 파일 1.md" + }, + { + "basename": "유닉스(AIX) 유저 생성", + "path": "Programing/Linux/Unix/유닉스(AIX) 유저 생성.md" + }, + { + "basename": "ssh포트로 파일 전송", + "path": "Programing/Linux/Linux 명령어/ssh포트로 파일 전송.md" + }, + { + "basename": "Ubuntu 버전 확인", + "path": "Programing/Linux/Ubuntu/Ubuntu 버전 확인.md" + }, + { + "basename": "리눅스 OS 버전확인", + "path": "Programing/Linux/Linux 명령어/리눅스 OS 버전확인.md" }, { "basename": "Kafka 설치", "path": "Programing/Kafka(AMQP)/Kafka 설치.md" }, { - "basename": "DB 컬럼 이름 변경", - "path": "Work Related/프로젝트/스마트계류장/1.데이터베이스/DB 컬럼 이름 변경.md" + "basename": "특정 포트 임시 오픈", + "path": "Programing/Linux/Ubuntu/특정 포트 임시 오픈.md" }, { - "basename": "Kafka JMX 설정", - "path": "Programing/Kafka(AMQP)/Kafka JMX 설정.md" + "basename": "특정포트 허용", + "path": "Programing/Linux/RHEL9/특정포트 허용.md" }, { - "basename": "무제 파일", - "path": "Programing/Kafka(AMQP)/무제 파일.md" - }, - { - "basename": "Kafka로 Logback 보내기", - "path": "Programing/Kafka(AMQP)/Kafka로 Logback 보내기.md" - }, - { - "basename": "VScode UI 명칭", - "path": "Tools/VSCode/VScode UI 명칭.md" - }, - { - "basename": "Termux Linux 설치", - "path": "Programing/Linux/Termux/Termux Linux 설치.md" - }, - { - "basename": "start", - "path": "Programing/Linux/LFS(Linux From Scratch)/start.md" - }, - { - "basename": "CentOS에 JAVA 설치", - "path": "Programing/Linux/CentOS/CentOS에 JAVA 설치.md" - }, - { - "basename": "CentOS Java 설치", - "path": "Programing/Linux/CentOS/CentOS Java 설치.md" + "basename": "2023-05-08", + "path": "Work Related/1.업무메모/2023/2023-05-08.md" } ], "omittedPaths": [], diff --git a/Recognition/.obsidian/workspace.json b/Recognition/.obsidian/workspace.json index 82a5e5d..a4030cd 100644 --- a/Recognition/.obsidian/workspace.json +++ b/Recognition/.obsidian/workspace.json @@ -4,16 +4,16 @@ "type": "split", "children": [ { - "id": "615ebe2faa749939", + "id": "665ce87635c13187", "type": "tabs", "children": [ { - "id": "1b9c58f1fa7c8461", + "id": "1b13dc8db74ebc6c", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Work Related/프로젝트/D-MHFH/유지보수/중단파서버 보안취약점.md", + "file": "Work Related/1.업무메모/2024-03-25.md", "mode": "source", "backlinks": true, "source": false @@ -21,12 +21,12 @@ } }, { - "id": "8f63a3303041aef4", + "id": "bd4fead765e9c739", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Programing/Windows/CMD 명령어.md", + "file": "Programing/Docker/Docker 페쇄망 이관.md", "mode": "source", "backlinks": true, "source": false @@ -34,12 +34,12 @@ } }, { - "id": "8d740b927ee10e19", + "id": "6b3bea491a79b018", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Work Related/프로젝트/스마트계류장/TODO.md", + "file": "Tools/VSCode_Server/Maven 설치.md", "mode": "source", "backlinks": true, "source": false @@ -76,7 +76,7 @@ "state": { "type": "search", "state": { - "query": "netstat", + "query": "프로세스", "matchingCase": false, "explainSearch": false, "collapseAll": true, @@ -113,7 +113,7 @@ } ], "direction": "horizontal", - "width": 286.5 + "width": 296.5 }, "right": { "id": "4797c4301ffee1db", @@ -129,7 +129,7 @@ "state": { "type": "backlink", "state": { - "file": "Work Related/프로젝트/스마트계류장/TODO.md", + "file": "Tools/VSCode_Server/Maven 설치.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -146,7 +146,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Work Related/프로젝트/스마트계류장/TODO.md", + "file": "Tools/VSCode_Server/Maven 설치.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -169,7 +169,7 @@ "state": { "type": "outline", "state": { - "file": "Work Related/프로젝트/스마트계류장/TODO.md" + "file": "Tools/VSCode_Server/Maven 설치.md" } } }, @@ -194,7 +194,7 @@ } } ], - "currentTab": 2 + "currentTab": 3 } ], "direction": "horizontal", @@ -211,36 +211,39 @@ "command-palette:명령어 팔레트 열기": false } }, - "active": "8d740b927ee10e19", + "active": "6b3bea491a79b018", "lastOpenFiles": [ - "Work Related/프로젝트/스마트계류장/1.데이터베이스/주기장 기준 항공기 유무 확인 쿼리(GAM).md", - "Work Related/프로젝트/스마트계류장/TODO.md", - "Programing/Docker/Docker 명령어.md", - "Programing/Docker/Docker 폐쇄망 설치.md", - "Programing/Windows/CMD 명령어.md", - "Programing/Docker/Docker 페쇄망 이관.md", - "Programing/Docker/Docker 설치.md", + "Tools/VSCode_Server/프로젝트 생성.md", + "Tools/VSCode_Server/Ubuntu에 설치.md", + "Tools/VSCode_Server/vscode_server 설치관련.md", + "Tools/VSCode_Server/Maven 설치.md", + "Tools/VSCode/VSCode 설치.md", + "Tools/VSCode/VSCode Extension.md", "Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md", - "Work Related/프로젝트/D-MHFH/유지보수/중단파서버 보안취약점.md", + "Work Related/1.업무메모/2024-03-25.md", + "Work Related/프로젝트/스마트계류장/9.기타/방문증 신청 문구.md", + "Programing/Docker/Docker 폐쇄망 설치.md", "Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md", - "Programing/RabbitMQ(AMQP)/RabbitMQ 설치.md", - "Programing/Linux/Ubuntu/Server에 VNC 설치.md", - "Programing/Linux/Ubuntu/Ubuntu GitLab-CE 설치.md", - "Programing/Tibero/테이블 Archive 로그 설정 변경.md", - "Work Related/프로젝트/스마트계류장/통계관련.md", - "Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md", - "Programing/Tibero/Tibero 이중화 구성시 서비스 실행.md", - "Programing/Tibero/Tibero 7 설치.md", - "Tools/GitHub/Ubuntu Gitlab 설치.md", - "Programing/Linux/Linux 명령어/리눅스 명령어.md", - "Programing/Tibero/function Table.md", + "Work Related/프로젝트/스마트계류장/1.데이터베이스/Reno server URL.md", + "Programing/Docker/Docker 설치.md", "Programing/Docker/Docker Compose.md", - "Work Related/프로젝트/스마트계류장/외부연계 관련/Asterix분석/ASDE UDP.md", - "Programing/Linux/Ubuntu/Ubuntu 버전 확인.md", - "Work Related/1.업무메모/2023-04-06.md", + "Programing/Docker/Docker 페쇄망 이관.md", + "Programing/Docker/Docker Engine.md", + "Work Related/1.업무메모/2022.06/2022-06-06.md", + "Work Related/1.업무메모/2022.06/2022-06-16.md", + "Work Related/프로젝트/D-MHFH/유지보수/상황관제-방송수신내역(항적).md", + "Programing/Linux/Linux 명령어/커맨트라인(bash) 단축키.md", + "Programing/ELK/ElasticSearch 쿼리.md", + "Learning/Programing/WSL개발환경 셋팅/Set Up.md", + "Programing/Tibero/Tibero 7 설치.md", + "Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md", + "Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md", + "Programing/Docker/무제 파일 2.md", + "무제 파일.canvas", + "Work Related/1.업무메모/2023", + "zzz.resources/Pasted image 20240320095219.png", "zzz.resources/Pasted image 20240304095048.png", "zzz.resources/Pasted image 20240304095038.png", - "Programing/Linux/WSL/win탐색기에서 roo 폴더 열기.md", "zzz.resources/tibero-jdbc-7.jar", "Work Related/프로젝트/스마트계류장/Java PGM/Components/DB", "Work Related/프로젝트/스마트계류장/Java PGM/Components", @@ -252,14 +255,11 @@ "새 텍스트 문서.txt", "zzz.resources/Pasted image 20221228170541.png", "Programing/Linux/Unix", - "무제 파일.canvas", "Work Related/프로젝트/스마트계류장/Java PGM/Radar/desktop.ini", "Work Related/프로젝트/스마트계류장/Java PGM/desktop.ini", "Work Related/프로젝트/스마트계류장/Java PGM/Radar", - "Work Related/프로젝트/스마트계류장/외부연계 관련/desktop.ini", "zzz.resources/Pasted image 20230618182519.png", "zzz.resources/Pasted image 20230606235608.png", - "zzz.resources/Pasted image 20230525092338.png", "무제 파일 2.canvas", "무제 파일 1.canvas" ] diff --git a/Recognition/Programing/Docker/Docker Compose.md b/Recognition/Programing/Docker/Docker Compose.md index 37c771a..8e023e4 100644 --- a/Recognition/Programing/Docker/Docker Compose.md +++ b/Recognition/Programing/Docker/Docker Compose.md @@ -1,21 +1,49 @@ #docker - +- 명령어 ```bash +# -f : 파일경로 지정 +# -d : 데몬모드(up옵션) +# build +# down +# ps --- -docker-compose -f docker-compose-kafka.yml up -d +# 데몬 모드로 compose 실행 +docker-compose -f docker-compose.yml up -d -docker-compose -f docker-compose-kafka.yml down +# 해당 compose로 실행 중인 컨테이너 일괄 삭제 +docker-compose -f docker-compose.yml down -docker-compose -f docker-compose-kafka.yml ps +# 해당 compose로 실행중인 프로세스 확인 +docker-compose -f docker-compose.yml ps +# 빌드와 실행 같이 수행 docker-compose build && docker-compose up -d -docker exec -it kafka1 bash -kafka-topics --list --bootstrap-server kafka1:9091 +# compose 버전 확인 +docker-compose --version ``` -- 버전확인 -> docker-compose --version \ No newline at end of file + +- docker-compose.yml 파일 작성 +```yml +version: "3" + services: + {Service Name}: + container_name: my-jenkins + user: "${UID}:${GID}" # volume 폴더 젒근 권한 설정 + image: my-jenkins + build: . + volumes: + - $VOLUME_JENKINS_HOME:/var/jenkins_home # jenkins 설치 폴더 + - /var/run:/var/run:ro # docker 실행 폴더 공유 + environment: + - TZ=Asia/Seoul # jenkins 시간 + ports: + - "18080:8080" # jenkins 접속 port + - "50000:50000" # jenkins agent를 통해 통신 할때 + group_add: + - ${DOCKER_GROUP} # docker 실행을 위한 그룹 추가 + +``` diff --git a/Recognition/Programing/Docker/Docker 명령어.md b/Recognition/Programing/Docker/Docker 명령어.md index 9ba2389..950a387 100644 --- a/Recognition/Programing/Docker/Docker 명령어.md +++ b/Recognition/Programing/Docker/Docker 명령어.md @@ -39,7 +39,7 @@ > docker stop {container name} - 외부에서 컨테이너 내부 명령어 사용 -> docker exec -it {container name} {명령어} +> docker exec {--user root} -it {container name} {명령어} - 컨테이너 생성 > docker run {이미지명} {명령어} diff --git a/Recognition/Programing/Docker/Docker 폐쇄망 설치.md b/Recognition/Programing/Docker/Docker 폐쇄망 설치.md index 47c6621..f35265c 100644 --- a/Recognition/Programing/Docker/Docker 폐쇄망 설치.md +++ b/Recognition/Programing/Docker/Docker 폐쇄망 설치.md @@ -1,32 +1,36 @@ #### 폐쇄망에서 도커 설치(tgz) -- 설치 및 기동 -1. https://download.docker.com/linux/static/stable/x86_64/ 링크를 통해 원하는 도커 버전을 받는다. -2. 해당 폴더를 서버에 업로드 한다. -3. tar -xvf docker-20.10.21.tgz -4. mv * /usr/bin/ -5. dockerd & -> 데몬을 시작할 때 옵션을 추가하고 싶다면 /etc/docker/daemon.json 파일을 수정해주거나 없다면 생성. + +##### Docker 설치 +```shell +# 도커 다운로드 + https://download.docker.com/linux/static/stable/x86_64/ + +# 압축풀기 +tar -xvf docker-20.10.21.tgz + +# 소유자 변경 +chown -R root:root docker + +# bin폴더로 이동 +mv docker/* /usr/bin/ + +# 도커 데몬 실행 +dockerd & + +``` ##### Compose 설치 ```bash # docker-compose 파일 다운로드 # (https://github.com/docker/compose/releases) -cp docker-compose /usr/local/bin/docker-compose -chmod +x /usr/local/bin/docker-compose -ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + +cp docker-compose /usr/local/bin/docker-compose && +chmod +x /usr/local/bin/docker-compose && +ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose && docker-compose --version ``` - -##### 도커 이미지 로드 -```bash - -docker load -i /home/gmt/SACP-INSTALL/Docker/docimg_cp-kafka.tar - -``` - - ##### 일반 유저 도커 사용 ```Shell @@ -39,7 +43,12 @@ usermod -aG docker user_id # 데몬 설치전 docker 컨테이너와 프로세스 모두 종료 # /var/lib/docker 폴더 삭제 +# 도커용 로그 폴더 생성 +# mkdir /home/gmt/{elk_data,Docker-data} + +# 데몬 서비스 작성 nano /etc/systemd/system/docker.service +######################################################### [Unit] Description=Systemd Docker Daemon @@ -50,16 +59,37 @@ Restart=on-failure [Install] WantedBy=multi-user.target +######################################################### -systemctl enable docker -systemctl start docker + +# 도커 서비스 실행전 도커 데몬 프로세스 종료 +ps -ef | grep docker +kill -9 [PID] + +# 서비스 실행 +systemctl daemon-reload && +systemctl enable docker && +systemctl start docker && systemctl status docker +``` + + +##### 도커 이미지 로드 +```bash + +docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_cp-kafka.tar + +# ELK 도커 이미지 로드 +docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_elasticserch.tar +docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_kibana.tar +docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_logstash.tar ``` + ``` ##### Compose 실행 diff --git a/Recognition/Programing/Docker/무제 파일 1.md b/Recognition/Programing/Docker/무제 파일 1.md new file mode 100644 index 0000000..e69de29 diff --git a/Recognition/Programing/Docker/무제 파일 2.md b/Recognition/Programing/Docker/무제 파일 2.md new file mode 100644 index 0000000..e69de29 diff --git a/Recognition/Programing/ELK/ELK 폐쇄망 설치(New).md b/Recognition/Programing/ELK/ELK 폐쇄망 설치(New).md index b8dfb17..3088e0d 100644 --- a/Recognition/Programing/ELK/ELK 폐쇄망 설치(New).md +++ b/Recognition/Programing/ELK/ELK 폐쇄망 설치(New).md @@ -1,67 +1,14 @@ +##### 도커 설치 +[[Docker 폐쇄망 설치]] + + ```shell -# 폴더 생성 및 설치 파일 이동 -## local : C:\kdggmtwork\스마트계류장\3.개발관련문서\배포및설치\ELK - -# 도커 설치 -cd /home/gmt/SACP-INSTALL/Docker/ -tar -xvf docker-20.10.21.tgz -chown -R root:root docker -cd docker/ -mv * /usr/bin/ - -# 도커 설치 확인 -docker --version - -# 도커 실행 -dockerd & - -# 도커 compose 설치 -cd /home/gmt/SACP-INSTALL/Docker/ -cp docker-compose /usr/local/bin/docker-compose -chmod +x /usr/local/bin/docker-compose -ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose - -# 도커 compose 설치 확인 -docker-compose --version - # ELK 도커 이미지 로드 docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_elasticserch.tar docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_kibana.tar docker load -i /home/gmt/SACP-INSTALL/docimgs/docimg_logstash.tar -# 도커용 로그 폴더 생성 -mkdir /home/gmt/elk_data -mkdir /home/gmt/Docker-Data - -# 도커 데몬 서비스 등록 -nano /etc/systemd/system/docker.service -##################################################### -[Unit] -Description=Systemd Docker Daemon - -[Service] -Type=simple -ExecStart=dockerd --data-root=/home/gmt/Docker_data -Restart=on-failure - -[Install] -WantedBy=multi-user.target -##################################################### - - - -# 도커 서비스 실행전 도커 데몬 프로세스 종료 -ps -ef | grep docker -kill -9 [PID] - -# 도커 서비스 실행 -systemctl daemon-reload -systemctl enable docker -systemctl status docker - - - # ELK 도커 설치 cd /home/gmt/SACP-INSTALL/elk/ docker-compose build && docker-compose up -d @@ -73,9 +20,6 @@ docker exec -it es01 bash docker exec -it --user root es01 bash - - - ``` @@ -83,23 +27,11 @@ docker exec -it --user root es01 bash ```shell # ELK 실행 오류시 -mkdir /home/gmt/elk_data/backup -nano /home/gmt/elk_data/es01/nodes/0/node.lock -chmod -R 755 /home/gmt/elk_data - -# JAVA 설치 확 -tar -xvf openjdk-18+36_linux-x64_bin.tar.gz -nano /etc/profile -##################################################### - -export JAVA_HOME=/home/gmt/SACP-INSTALL/java/jdk-18 -export PATH=$JAVA_HOME/bin:$PATH -export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH - -##################################################### -source /etc/profile -echo $JAVA_HOME -java -version +... +root "cause: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/data/nodes/0/node.lock" +... +## elk data 폴더 uid를 container uid와 일치 시켜야 함. +chown -R 1000:0 /data/elk_data/ # 도커 서비스 실행 안되는 경우 diff --git a/Recognition/Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md b/Recognition/Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md index 3eba6c7..b053ab3 100644 --- a/Recognition/Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md +++ b/Recognition/Programing/Kafka(AMQP)/Kafka ELK로 모니터링.md @@ -1,6 +1,9 @@ - metricbeat 사용 https://www.elastic.co/kr/blog/how-to-monitor-containerized-kafka-with-elastic-observability + + + ``` yml -- 다운로드 @@ -22,11 +25,35 @@ cd ${설치경로} -- 서비스 실행 ./metricbeat -e --strict.perms=false - - - -./filebeat setup -c filebeat.yml +./metricbeat -e -c metricbeat.yml ``` + +- jolokia 적용 +https://dev.to/martinhynar/monitoring-kafka-brokers-using-jolokia-metricbeat-and-elasticsearch-5678 +```shell +# 다운로드 +https://jolokia.org/download.html + +# docker-compose에 volumes추가 +volumes: + - ./jolokia-agent-jvm-2.0.2-javaagent.jar:/home/appuser/jolokia.jar + + +KAFKA_JMX_OPTS: "-javaagent:/home/appuser/jolokia.jar=port=8771,host=10.200.31.6 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" + + + +``` + + + +- ELK 연동 +https://github.com/freepsw/kafka-metrics-monitoring/tree/master/kafka_monitoring_package + + +- AKHQ +/home/gmt/SACP-INSTALL/akhq/jdk-18/bin/java -Dmicronaut.config.files=akhq_config_simple.yml -jar akhq.jar + diff --git a/Recognition/Programing/Linux/Linux 명령어/ssh포트로 파일 전송.md b/Recognition/Programing/Linux/Linux 명령어/ssh포트로 파일 전송.md index de81fc3..ba5aa59 100644 --- a/Recognition/Programing/Linux/Linux 명령어/ssh포트로 파일 전송.md +++ b/Recognition/Programing/Linux/Linux 명령어/ssh포트로 파일 전송.md @@ -3,6 +3,6 @@ scp -P 8022 "C:\kdggmtwork\업무유틸\티베로7_메뉴얼\install\tibero7.tar.gz" u0_a319@39.123.110.133:/$PREFIX/tmp # 로컬에서 원격서버로 복사 -scp -P 11443 /Tibero_Archive1/* root@10.200.31.56:/Tibero_arc_backup/1108 +scp -P 11443 /home/gmt/SACP-INSTALL.tar root@10.200.31.132:/home/gmt/ ``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/리눅스 ls 정렬해서 보기.md b/Recognition/Programing/Linux/Linux 명령어/리눅스 ls 정렬해서 보기.md new file mode 100644 index 0000000..b62c39d --- /dev/null +++ b/Recognition/Programing/Linux/Linux 명령어/리눅스 ls 정렬해서 보기.md @@ -0,0 +1,6 @@ +```shell + +# 시간순 정렬 +ls -t -r -l + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/리눅스 mkdir.md b/Recognition/Programing/Linux/Linux 명령어/리눅스 mkdir.md new file mode 100644 index 0000000..5b3a612 --- /dev/null +++ b/Recognition/Programing/Linux/Linux 명령어/리눅스 mkdir.md @@ -0,0 +1,7 @@ +```bash + +# 모든 폴더 자동 생성 +mkdir -p vehicles/{sedan,coupe,convertible,truck} + + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/리눅스 데몬 서비스 관련.md b/Recognition/Programing/Linux/Linux 명령어/리눅스 데몬 서비스 관련.md new file mode 100644 index 0000000..567af10 --- /dev/null +++ b/Recognition/Programing/Linux/Linux 명령어/리눅스 데몬 서비스 관련.md @@ -0,0 +1,22 @@ +```bash + +``` + +##### 서비스 삭제 +```bash + +systemctl stop [servicename].service +systemctl disable [servicename].service +rm /etc/systemd/system/[servicename].service +rm /etc/systemd/system/[servicename].service # and symlinks that might be related +rm /usr/lib/systemd/system/[servicename].service +rm /usr/lib/systemd/system/[servicename].service # and symlinks that might be related +systemctl daemon-reload +systemctl reset-failed + + + + + + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md b/Recognition/Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md new file mode 100644 index 0000000..429acab --- /dev/null +++ b/Recognition/Programing/Linux/Linux 명령어/리눅스 특정 폴더, 파일 용량 확인.md @@ -0,0 +1,5 @@ +``` shell + +du -h --max-depth=1 /home/gmt/ + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md b/Recognition/Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md new file mode 100644 index 0000000..683e69f --- /dev/null +++ b/Recognition/Programing/Linux/Linux 명령어/리눅스 확장자 일괄 변경.md @@ -0,0 +1,8 @@ +#Linux +```bash + +# .jpi의 확장자파일을 찾아서 .hpi로 변경 + +ls | grep '.jpi' | cut -d . -f 1 | while read line; do mv $line.jpi $line.hpi; done + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Linux 명령어/무제 폴더/desktop.ini b/Recognition/Programing/Linux/Linux 명령어/무제 폴더/desktop.ini deleted file mode 100644 index e39dc6a..0000000 --- a/Recognition/Programing/Linux/Linux 명령어/무제 폴더/desktop.ini +++ /dev/null @@ -1,2 +0,0 @@ -[.ShellClassInfo] -IconResource=C:\Program Files\Google\Drive File Stream\79.0.2.0\GoogleDriveFS.exe,23 diff --git a/Recognition/Programing/Linux/Linux 프로그램/리눅스 crontab.md b/Recognition/Programing/Linux/Linux 프로그램/리눅스 crontab.md new file mode 100644 index 0000000..14d0f94 --- /dev/null +++ b/Recognition/Programing/Linux/Linux 프로그램/리눅스 crontab.md @@ -0,0 +1,14 @@ +#Linux + +- tibero archive log 일괄 삭제 스크립트 +``` +#! /bin/bash + +# +---------------------------------+ +# tibero archive log delete +# +---------------------------------+ +find /sdata1/tbarch/ -mtime +3 -type f -delete + + +``` + diff --git a/Recognition/Programing/Linux/RHEL9/HAProxy HA (High Availability) 구성하기.md b/Recognition/Programing/Linux/RHEL9/HAProxy HA (High Availability) 구성하기.md new file mode 100644 index 0000000..9b4663c --- /dev/null +++ b/Recognition/Programing/Linux/RHEL9/HAProxy HA (High Availability) 구성하기.md @@ -0,0 +1,274 @@ +##### HA 구성 +``` bash + +# keepalived 설치 +dnf install keepalived -y + +# HAProxy 설치 +dnf install haproxy -y + +-------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- + +# keepalived 기본 구성 파일을 편집 +nano /etc/keepalived/keepalived.conf +## MASTER를 BACKUP으로, 110을 100으로 변경 +-------------------------------------------------------------------------------------- +global_defs { + # Keepalived process identifier + router_id LVS_ELK +} + + # Nginx가 실행 중인지 확인하는 스크립트 +vrrp_script check_nginx { + script "/etc/keepalived/check_alived.sh" + interval 2 + weight 50 +} + + # Virtual interface - 우선 순위는 장애 조치 시 할당된 인터페이스가 인계받는 순서를 지정합니다. +vrrp_instance VI_01 { + state MASTER + interface bond0 + virtual_router_id 151 + priority 110 + + # 가상IP + virtual_ipaddress { + 10.200.31.129/24 + } + track_script { + check_alived + } + authentication { + auth_type AH + auth_pass secret + } +} +-------------------------------------------------------------------------------------- + +# keepalived 서비스 확인 스크립트 작성 +nano /etc/keepalived/check_alived.sh +-------------------------------------------------------------------------------------- +#!/bin/sh + +exit 0 + +if [ -z "`pidof nginx`" ]; then + exit 1 +fi + +nc -z localhost 8080 &> /dev/null +result1=$? + +if [ $result1 == 1 ]; then + + exit 1 + +fi + +nc -z localhost 8090 &> /dev/null +result1=$? + +if [ $result1 == 1 ]; then + + exit 1 + +fi +-------------------------------------------------------------------------------------- + +# 스크립트 권한 설정 +chmod 755 /etc/keepalived/check_alived.sh + +# keepalived 서비스 실행 +systemctl enable keepalived && +systemctl start keepalived && +systemctl status keepalived + +# 가상 ip 설정 상태 확인 +ip add show + +-------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- + +# HAProxy 구성파일 편집 (서비스 포트 Healsh-check) +## 1,2번 서버 모두 동일하게 설정 +nano /etc/haproxy/haproxy.cfg +-------------------------------------------------------------------------------------- +#--------------------------------------------------------------------- +# Example configuration for a possible web application. See the +# full configuration options online. +# +# https://www.haproxy.org/download/1.8/doc/configuration.txt +# +#--------------------------------------------------------------------- + +#--------------------------------------------------------------------- +# Global settings +#--------------------------------------------------------------------- +global + # to have these messages end up in /var/log/haproxy.log you will + # need to: + # + # 1) configure syslog to accept network log events. This is done + # by adding the '-r' option to the SYSLOGD_OPTIONS in + # /etc/sysconfig/syslog + # + # 2) configure local2 events to go to the /var/log/haproxy.log + # file. A line like the following can be added to + # /etc/sysconfig/syslog + # + # local2.* /var/log/haproxy.log + # + log 127.0.0.1:514 local2 + + chroot /var/lib/haproxy + pidfile /var/run/haproxy.pid + maxconn 4000 + user haproxy + group haproxy + daemon + + # turn on stats unix socket + stats socket /var/lib/haproxy/stats + + # utilize system-wide crypto-policies + ssl-default-bind-ciphers PROFILE=SYSTEM + ssl-default-server-ciphers PROFILE=SYSTEM + +#--------------------------------------------------------------------- +# common defaults that all the 'listen' and 'backend' sections will +# use if not designated in their block +#--------------------------------------------------------------------- +defaults + defaults + defaults + mode http + log global + option httplog + option dontlognull + option http-server-close + option forwardfor except 127.0.0.0/8 + option redispatch + retries 3 + timeout http-request 10s + timeout queue 1m + timeout connect 10s + timeout client 1m + timeout server 1m + timeout http-keep-alive 10s + timeout check 10s + maxconn 3000 + +#--------------------------------------------------------------------- +# main frontend which proxys to the backends +#--------------------------------------------------------------------- +frontend http_front + bind *:19200 + default_backend http_back + +#--------------------------------------------------------------------- +# round robin balancing between the various backends +#--------------------------------------------------------------------- +backend http_back + server main 10.200.31.130:9200 check fall 3 rise 2 + server backup 10.200.31.132:9200 check fall 3 rise 2 backup + +frontend http_front_5601 + bind *:15601 + default_backend http_back_5601 + +backend http_back_5601 + server main 10.200.31.130:5601 check fall 3 rise 2 + server backup 10.200.31.132:5601 check fall 3 rise 2 backup + +listen hastats + mode http + bind *:9900 + stats enable + stats show-legends + stats uri /haproxy-status + + +#--------------------------------------------------------------------- +# TEST +#--------------------------------------------------------------------- +frontend http_front_8080 + bind *:18080 + default_backend http_back_8080 + + +backend http_back_8080 + server main 10.200.31.130:8080 check fall 3 rise 2 + server backup 10.200.31.132:8080 check fall 3 rise 2 backup + +frontend http_front_9090 + bind *:19090 + default_backend http_back_9090 + + +backend http_back_9090 + server main 10.200.31.130:9090 check fall 3 rise 2 + server backup 10.200.31.132:9090 check fall 3 rise 2 backup +-------------------------------------------------------------------------------------- + + +# HAProxy 서비스 실행 +systemctl enable haproxy && +systemctl start haproxy && +systemctl status haproxy + + + +``` + +##### HAProxy 로깅 +```bash +# rsyslog 구성 파일 수정 +nano /etc/rsyslog.conf + +-------------------------------------------------------------------------------------- +... +## 아래 두줄 주석 해제 +module(load="imudp") # needs to be done just once +input(type="imudp" port="514") + +## 로깅 경로 추가 +local2.* /var/log/haproxy/haproxy.log +local2.notice /var/log/haproxy/haproxy_notice.log + +... +-------------------------------------------------------------------------------------- + +# rsyslog 서비스 재시작 +systemctl restart rsyslog + +# haproxy 구성 파일 수정 +nano /etc/haproxy/haproxy.cfg +------------------------------------------------------------------------------------- +gloal +... + ## 포트 추가작성(514, UDP) + log 127.0.0.1:514 local2 + +... +-------------------------------------------------------------------------------------- + +# haproxy 재시작 + + +# 로깅파일 rotate +nano /etc/logrotate.d/haproxy +-------------------------------------------------------------------------------------- +## 파일명 설정 부분 변경(범용 설정 * ) + /var/log/haproxy/haproxy*.log + +-------------------------------------------------------------------------------------- + +systemctl restart haproxy + + + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/RHEL9/NGINX HA (High Availability) 구성하기.md b/Recognition/Programing/Linux/RHEL9/NGINX HA (High Availability) 구성하기.md new file mode 100644 index 0000000..199753b --- /dev/null +++ b/Recognition/Programing/Linux/RHEL9/NGINX HA (High Availability) 구성하기.md @@ -0,0 +1,309 @@ +```shell + +# nginx 설치 확인 +nginx +or +dnf install nginx -y + +# keepalived 설치 확인 +keepalived +or +dnf install keepalived -y + +# service 사용, 상태 확인 +systemctl enable nginx +systemctl start nginx + +systemctl enable keepalived +systemctl start keepalived + +# index.thml 수정 (테스트시 노드 구분 하기 위함) +nano /usr/share/nginx/html/index.html + +# keepalived 기본 구성 파일을 편집 +nano /etc/keepalived/keepalived.conf +-------------------------------------------------------------------------------------------- +global_defs { + # Keepalived process identifier + router_id LVS_ELK +} + + # Nginx가 실행 중인지 확인하는 스크립트 +vrrp_script check_nginx { + script "/etc/keepalived/check_nginx.sh" + interval 2 + weight 50 +} + + # Virtual interface - 우선 순위는 장애 조치 시 할당된 인터페이스가 인계받는 순서를 지정합니다. +vrrp_instance VI_01 { + state MASTER + interface bond0 + virtual_router_id 151 + priority 110 + + # 가상IP + virtual_ipaddress { + 10.200.31.129/24 + } + track_script { + check_nginx + } + authentication { + auth_type AH + auth_pass secret + } +} +-------------------------------------------------------------------------------------------- +## MASTER를 BACKUP으로, 110을 100으로 변경 + +# 실행중인지 확인 스크립트 작성 +nano /etc/keepalived/check_nginx.sh + +#!/bin/sh +if [ -z "`pidof nginx`" ]; then + exit 1 +fi + +# 스크립트 권한 설정 +chmod 755 /etc/keepalived/check_nginx.sh + +systemctl enable keepalived +systemctl start keepalived + +# 가상 ip 설정 상태 확인 +ip add show + +``` + + + + + + +```shell +https://www.nakjunizm.com/2020/02/20/haproxy/ +https://bryan.wiki/243 + +https://www.owl-dev.me/blog/74 + +haproxy +nginx +keepalived +------------------------------------------------------------------------- +https://bkim.tistory.com/12 + +# nginx 다운로드 (https://nginx.org/download) +# 의존성 라이브러리 다운로드 +## PCRE (https://sourceforge.net/projects/pcre/files/pcre/) +## zlib (http://zlib.net) 최신 버전 확인 후 --> http://zlib.net/zlib-1.3.1.tar.gz +## OpenSSL (http://www.openssl.org/source) + + + + +# nginx 압축풀기 +tar -zxvf nginx-1.20.2.tar.gz +cd nginx-ha/nginx-1.20.2 + +tar -zxvf pcre-8.39.tar.gz +tar -zxvf zlib-1.3.1.tar.gz + +# 설정 파일 수정 +nano conf/nginx.conf + +## location / { ... 밑에 추가 +location /nginx_status { + stub_status; + allow 127.0.0.1; + deny all; +} + +# nginx 설치 2 +./configure --prefix=/home/gmt/SACP-INSTALL/nginx --user=root --with-http_stub_status_module make && make install + +./configure --prefix=/home/gmt/SACP-INSTALL/nginx-ha/nginx --with-zlib=./zlib-1.3.1 --with-pcre=./pcre-8.39 --with-http_stub_status_module +make install + +## --with-http_stub_status_module: nginx stats page 적용을 위한 옵션 +## ssl 적용 필요시 --with-openssl=./openssl-1.0.2 --with-http_ssl_module + +# Service 파일 생성 +nano /usr/lib/systemd/system/nginx.service + +-------------------------------------------------------------------------------------------- +[Unit] + +Description=The NGINX HTTP and reverse proxy server + +After=syslog.target network.target remote-fs.target nss-lookup.target + + + +[Service] + +Type=forking + +PIDFile=/home/gmt/SACP-INSTALL/nginx-ha/nginx-1.20.2/nginx.pid + +ExecStartPre=/usr/local/nginx/sbin/nginx -t + +ExecStart=/usr/local/nginx/sbin/nginx + +ExecReload=/usr/local/nginx/sbin/nginx -s reload + +ExecStop=/bin/kill -s QUIT $MAINPID + +PrivateTmp=true + + +[Install] + +WantedBy=multi-user.target +-------------------------------------------------------------------------------------------- + +# nginx.confg PID 위치 설정 +cd /usr/local/nginx/conf +nano nginx.conf +-------------------------------------------------------------------------------------------- +worker_processes 1; + +pid /var/run/nginx.pid; + + +.... + +http{ + +... + +} +-------------------------------------------------------------------------------------------- + +# deamon 리로드 +systemctl daemon-reload +systemctl status nginx + + +# keepalived 설치 +tar -zxvf keepalived-1.1.19.tar.gz + +# Keepalived configureation +cd [keepalived Root] + +nano ./keepalived.conf + +# MASTER +vrrp_script check_nginx { + script "killall -0 nginx" + interval 2 +} + +vrrp_instance VI_1 { + interface eth0 + state MASTER + priority 200 + + virtual_router_id 33 + virtual_ipaddress { + 10.205.199.200 # 가상 IP + } + + authentication { + auth_type PASS + auth_pass password + } + + track_script { + check_nginx + } + +} + +# BACKUP + script "killall -0 nginx" + interval 2 +} + +vrrp_instance VI_1 { + interface eth0 + state BACKUP + priority 100 + + virtual_router_id 33 + virtual_ipaddress { + 10.205.199.200 + } + + authentication { + auth_type PASS + auth_pass password + } + + track_script { + check_nginx + } + +} + +# keepalived 실행 + + + + + + +``` + + + + +```bash + +# 설치 +apt-get install nginx-ha-keepalived +## /usr/bin으로 설치됨 + +# 스크립트 실행 +nginx-ha-setup +## /etc/keepalived/keepalived.conf가 생성됨 + +# keepalived 구성 스크립트 수정 + +# health check 기능 구성 +vrrp_script chk_nginx_service { + script "/usr/libexec/keepalived/nginx-ha-check" # nginx-ha-check 스크립트 경로 + interval 3 # 스크립트가 실행되는 빈도 (초 단위) + weight 50 # 가중치, priority와 함께 어떤 노드가 기본 노드가 될지 결정하는데 사용됨. + # 50 + 101 = 151.. 높을수록 우선순위 높음. + # NGINX Plus 관리자 가이드 문서에서 health check 스크립트 참조. +} + +# 노드 VRRP 인스턴스를 구성 +vrrp_instance VI_1 { + interface eth0 + state BACKUP + priority 101 + virtual_router_id 51 # 샘플값(필요에 따라 환경에서 고유하도록 변경) + advert_int 1 # 기본 노드의 VRRP인스턴스가 백업 노드 피어에 보내는 빈도(초) + unicast_src_ip 192.168.100.100 # 로컬 노드 + unicast_peer { + 192.168.100.101 # 다른 노드 + } + authentication { + auth_type PASS + auth_pass f8f0e5114cbe031a3e1e622daf18f82a + } + virtual_ipaddress { + 192.168.100.150 # 기본 노드에 할당된 가상 IP + } + track_script { + chk_nginx_service + } + notify "/usr/libexec/keepalived/nginx-ha-notify" +} + + + + +``` \ No newline at end of file diff --git a/Recognition/Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md b/Recognition/Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md index 9fdb708..a0183e0 100644 --- a/Recognition/Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md +++ b/Recognition/Programing/Linux/Ubuntu/프로세스 확인 및 강제 종료.md @@ -12,4 +12,7 @@ netstat -tnlp|grep 20001 # 프로세스 강제 종료 kill -9 1234 +# 프로세스 경로 확인 + netstat -ntap | grep LISTEN | grep 80 + ls -al /proc/4091928 | grep exe ```` \ No newline at end of file diff --git a/Recognition/Programing/Tibero/테이블 컬럼 코멘트 조회.md b/Recognition/Programing/Tibero/테이블 컬럼 코멘트 조회.md new file mode 100644 index 0000000..991857a --- /dev/null +++ b/Recognition/Programing/Tibero/테이블 컬럼 코멘트 조회.md @@ -0,0 +1,11 @@ +```sql + +select comments +from ALL_COL_COMMENTS a, ALL_TAB_COLUMNS b +where b.table_name = 'EAI_AWOS_RCV' +and a.table_name(+) = b.table_name +and a.column_name(+) = b.column_name +order by b.column_id + + +``` \ No newline at end of file diff --git a/Recognition/Tools/VSCode_Server/Maven 설치.md b/Recognition/Tools/VSCode_Server/Maven 설치.md index 56bc29f..f51dd6e 100644 --- a/Recognition/Tools/VSCode_Server/Maven 설치.md +++ b/Recognition/Tools/VSCode_Server/Maven 설치.md @@ -14,7 +14,7 @@ mkdir apache-maven wget https://archive.apache.org/dist/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz -p /root/apache-maven/ # 압축푹기 -tar -xvf apache-maven-3.0.4-bin.tar.g +tar -xvf apache-maven-3.0.4-bin.tar.gz # 환경변수 등록 cd diff --git a/Recognition/Work Related/1.업무메모/2022-11-11.md b/Recognition/Work Related/1.업무메모/2023/2022-11-11.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2022-11-11.md rename to Recognition/Work Related/1.업무메모/2023/2022-11-11.md diff --git a/Recognition/Work Related/1.업무메모/2023-02-14.md b/Recognition/Work Related/1.업무메모/2023/2023-02-14.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-02-14.md rename to Recognition/Work Related/1.업무메모/2023/2023-02-14.md diff --git a/Recognition/Work Related/1.업무메모/2023-03-27.md b/Recognition/Work Related/1.업무메모/2023/2023-03-27.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-03-27.md rename to Recognition/Work Related/1.업무메모/2023/2023-03-27.md diff --git a/Recognition/Work Related/1.업무메모/2023-03-28.md b/Recognition/Work Related/1.업무메모/2023/2023-03-28.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-03-28.md rename to Recognition/Work Related/1.업무메모/2023/2023-03-28.md diff --git a/Recognition/Work Related/1.업무메모/2023-03-29.md b/Recognition/Work Related/1.업무메모/2023/2023-03-29.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-03-29.md rename to Recognition/Work Related/1.업무메모/2023/2023-03-29.md diff --git a/Recognition/Work Related/1.업무메모/2023-03-30.md b/Recognition/Work Related/1.업무메모/2023/2023-03-30.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-03-30.md rename to Recognition/Work Related/1.업무메모/2023/2023-03-30.md diff --git a/Recognition/Work Related/1.업무메모/2023-04-03.md b/Recognition/Work Related/1.업무메모/2023/2023-04-03.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-04-03.md rename to Recognition/Work Related/1.업무메모/2023/2023-04-03.md diff --git a/Recognition/Work Related/1.업무메모/2023-04-06.md b/Recognition/Work Related/1.업무메모/2023/2023-04-06.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-04-06.md rename to Recognition/Work Related/1.업무메모/2023/2023-04-06.md diff --git a/Recognition/Work Related/1.업무메모/2023-04-07.md b/Recognition/Work Related/1.업무메모/2023/2023-04-07.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-04-07.md rename to Recognition/Work Related/1.업무메모/2023/2023-04-07.md diff --git a/Recognition/Work Related/1.업무메모/2023-04-12.md b/Recognition/Work Related/1.업무메모/2023/2023-04-12.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-04-12.md rename to Recognition/Work Related/1.업무메모/2023/2023-04-12.md diff --git a/Recognition/Work Related/1.업무메모/2023-05-08.md b/Recognition/Work Related/1.업무메모/2023/2023-05-08.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-05-08.md rename to Recognition/Work Related/1.업무메모/2023/2023-05-08.md diff --git a/Recognition/Work Related/1.업무메모/2023-05-23.md b/Recognition/Work Related/1.업무메모/2023/2023-05-23.md similarity index 100% rename from Recognition/Work Related/1.업무메모/2023-05-23.md rename to Recognition/Work Related/1.업무메모/2023/2023-05-23.md diff --git a/Recognition/Work Related/1.업무메모/2024-03-25.md b/Recognition/Work Related/1.업무메모/2024-03-25.md new file mode 100644 index 0000000..5c7fdf7 --- /dev/null +++ b/Recognition/Work Related/1.업무메모/2024-03-25.md @@ -0,0 +1,167 @@ +SFR-27 +1. 플랫폼 감시 +2. 플랫폼 제어 + - ~~하부시스템에 대한 Start, Stop, Restart, Shutdown 동작~~ + - 응용프로그램 설치 및 update + +3. 플랫폼 관리 + - 설치된 SW 버전 관리 + - S/W 별 버전 정보 이력이 표시 된다. + - 최신 SW 및 어플리케이션 관리 + - ~~운영환경 관리 + - 관리시스템 S/W + +#### Jenkins Book +https://www.jenkins.io/doc/book/blueocean/ + +###### Jenkins 사용 +https://dev-overload.tistory.com/39 + +###### Jenkins 설치 +https://marindie.github.io/jenkins/Ubuntu-Jenkins-Install-KR-copy/#google_vignette +https://server-engineer.tistory.com/763 + +https://ppoble.tistory.com/52#google_vignette + +https://hwannny.tistory.com/89 + +###### Jenkins + Docker +https://1minute-before6pm.tistory.com/49 + +##### 특정 파일만 배포 +https://hye0-log.tistory.com/42 +https://velog.io/@ysy3285/GitLab-Jenkins-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B02 +https://g4daclom.tistory.com/78 + +젠킨스 플러그인 사이트 : https://plugins.jenkins.io/ + + +publish over ssh 대체 +SSH Plugin : https://ktaes.tistory.com/100 + +---- + +##### Docker-compose +```bash + +# 인터넷 연결되는 환경에서 작업 +# docker image, jenkins plugin 파일 다운받아야함. + +mkdir ./jenkins && cd jenkins +mkdir ./jenkins_home +nano docker-compose-jenkins.yml + +-------------------------------------------------------------------------------- +version: '3.8' +services: + jenkins: + image: jenkins/jenkins:lts + container_name: jenkins + user: root +# environment: +# - TZ=Asia/Seoul + privileged: true + ports: + - 9900:8080 +# - 9000:50000 + volumes: + - ./jenkins_home:/var/jenkins_home + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped +-------------------------------------------------------------------------------- +docker-compose build && docker-compose up -d + + +# Jenkins Unlock Password 확인 (Unlock 이후 파일 삭제됨) +cat ./jenkins_home/secrets/initialAdminPassword + +# jenkins 페이지 초기 설정 +1. http://{hostname}:9900 접속하여 Unlock +2. 계정 생성 +3. Jenkins URL 정보 확인 및 수정 +Start using Jenkins 버튼 + + +# Install Suggested plugins 선택하여 기본 plugin 설치 +# 또는 Plugin 수동 설치 [Plugin 수동 설치] + +# 추가 플러그인 설치 +> Jenkins 관리 -> Jenkins Global Tool Configuration +publish over ssh +maven +jdk + + +# publish over ssh 설정 + +# SSH key 발급 +docker exec -it jenkins bash + +ssh-keygen + +cat /root/.ssh/id_rsa + +------------------------------------------------------- +#배포 대상 서버 설정 +## jenkins 서버에서 내용복사 +cat /root/.ssh/id_rsa.pub + +## 배포서버 root 로그인 +## 파일생성하고 복사한 내용 붙여넣기 +nano /root/.ssh/authorized_keys + +## 폴더, 파일 권한 변경 +chmod 700 /root/.ssh +chmod 644 /root/.ssh/authorized_keys +--------------------------------------------------------- + +# Jenkins 페이지에서 배포서버 추가 +Dashboard > Jenkins 관리 >System +Publish over SSH > 추가 + + + + +``` + +https://velog.io/@wijoonwu/AWS-Jenkins-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC + +##### Plugin 수동 설치 +```bash + + +cp -r jenkins_home/plugins/*.jpi jenkins_plugins/ + +ls | grep '.jpi' | cut -d . -f 1 | while read line; do mv $line.jpi $line.hpi; done + +tar -cvf plugins.tar ./jenkins_plugins + + +# 수동설치 할 서버 +tar -xvf plugins.tar -C /home/gmt/jenkins_home/plugins/ + + +``` + + +``` + + +```bash + +ssh-keygen + + +cat /root/.ssh/id_rsa + + + +``` + + + + +##### 기타 +- CI(Continuous Integration) +- CD(Continuous Delivery/Deployment) +- Unity 연동 (https://github.com/KorStrix/Unity_JenkinsBuilder) \ No newline at end of file diff --git a/Recognition/Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md b/Recognition/Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md index 104f5c3..aca569d 100644 --- a/Recognition/Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md +++ b/Recognition/Work Related/프로젝트/스마트계류장/0.관련정보/공유문서.md @@ -12,6 +12,9 @@ - https://docs.google.com/spreadsheets/d/1p07GOVObBReD6Xs82gk6_YzhQqJhaa4IP98i7xFtTMk/edit?usp=sharing - https://docs.google.com/spreadsheets/d/1eO4Nqkqbx-Cqn8v8cMKc1XrlYkQ218Un9MNUkwLbKXM/edit#gid=1329685206 +- 스마트시트 +https://app.smartsheet.com/b/home + - ELK http://118.220.143.172:5601/app/dev_tools#/console diff --git a/Recognition/Work Related/프로젝트/스마트계류장/1.데이터베이스/항공기 등급 기준.md b/Recognition/Work Related/프로젝트/스마트계류장/1.데이터베이스/항공기 등급 기준.md new file mode 100644 index 0000000..e918602 --- /dev/null +++ b/Recognition/Work Related/프로젝트/스마트계류장/1.데이터베이스/항공기 등급 기준.md @@ -0,0 +1,3 @@ +https://airtravelinfo.kr/wiki/index.php?title=%ED%95%AD%EA%B3%B5%EA%B8%B0_%EB%93%B1%EA%B8%89#google_vignette + +![[Pasted image 20240320095219.png]] \ No newline at end of file diff --git a/Recognition/Work Related/프로젝트/스마트계류장/9.기타/Filebeat 재배포.md b/Recognition/Work Related/프로젝트/스마트계류장/9.기타/Filebeat 재배포.md new file mode 100644 index 0000000..6753937 --- /dev/null +++ b/Recognition/Work Related/프로젝트/스마트계류장/9.기타/Filebeat 재배포.md @@ -0,0 +1,39 @@ +Filebeat 재배포 + +```bash + +systemctl stop filebeat.service && +systemctl disable filebeat.service && +rm -f /usr/lib/systemd/system/filebeat.service && +systemctl daemon-reload && +systemctl reset-failed && +ps -ef | grep filebeat + + + +cd /home/gmt/app && +rm -rf filebeat && +tar -xvf filebeat.tar && +rm -f filebeat.tar && +cd filebeat $$ +chmod -R 755 /home/gmt/app/filebeat && +chown -R gmt:gmt /home/gmt/app/filebeat && +sh /home/gmt/app/filebeat/filebeat_service_reg/service_reg.sh && +ll + + +nano /etc/sudoers + +gmt ALL=(ALL) ALL + +tss_fusion +tss_asde +tss_ana +tss_ai_location + + + +cd /home/gmt/app/filebeat/ && ./start.sh + + +``` \ No newline at end of file diff --git a/Recognition/Work Related/프로젝트/스마트계류장/9.기타/SACP maven 빌드 명령어.md b/Recognition/Work Related/프로젝트/스마트계류장/9.기타/SACP maven 빌드 명령어.md new file mode 100644 index 0000000..169291f --- /dev/null +++ b/Recognition/Work Related/프로젝트/스마트계류장/9.기타/SACP maven 빌드 명령어.md @@ -0,0 +1,5 @@ +```txt + +mvn clean package -DskipTests + +``` \ No newline at end of file diff --git a/Recognition/Work Related/프로젝트/스마트계류장/TODO.md b/Recognition/Work Related/프로젝트/스마트계류장/TODO.md index 410968d..08d8507 100644 --- a/Recognition/Work Related/프로젝트/스마트계류장/TODO.md +++ b/Recognition/Work Related/프로젝트/스마트계류장/TODO.md @@ -1,4 +1,4 @@ -- [x] 데이터블럭 뷰 생성 +g- [x] 데이터블럭 뷰 생성 - [x] 도착/출발 항공기 - [x] 계류장 이동 항공기 - [x] 재생용 데이터 블럭 diff --git a/Recognition/zzz.resources/Pasted image 20240320095219.png b/Recognition/zzz.resources/Pasted image 20240320095219.png new file mode 100644 index 0000000000000000000000000000000000000000..7df772c6556ee72474de3fd28db619d7784ceb17 GIT binary patch literal 48383 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 literal 0 HcmV?d00001 diff --git a/Recognition/무제 파일.canvas b/Recognition/무제 파일.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Recognition/무제 파일.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file