# Recoeve setting
```[.lang-sh]
ssh -i "C:\RecoeveNet\.ssh\Recoeve.net-medium-SSH.pem" ubuntu@ec2-43-202-241-148.ap-northeast-2.compute.amazonaws.com
ssh -i "C:\RecoeveNet\.ssh\Recoeve.net-medium-SSH.pem" -L 5900:127.0.0.1:5900 ubuntu@ec2-43-202-241-148.ap-northeast-2.compute.amazonaws.com
bash ~/.config/gitconfig.sh
# Ubuntu 업데이트 하는 방법
sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo netstat -tulnp | grep 8080
sudo kill -9 [id]
# 'recoeve'이라는 이름의 새 세션 시작
tmux new -s recoeve
# Ctrl+b, d 키로 나올 수 있음.
# or 'recoeve'라는 세션 입장
tmux attach -t recoeve
cd ~/Recoeve
./run_gradlew.sh &
cd ~/kipids-recoeve
npm run build && npm start
tail -f -n 3500 logs/log.txt
```/
## PH
2026-09-09 : Next.js 로 바꾸는 과정.
2024-08-14 : Ubuntu server settings 추가.
## TOC
## 죽는 이유 분석
로그 확인: 인스턴스가 예기치 않게 멈춘 이유를 파악하려면 시스템 로그와 CloudTrail을 확인하세요:
```[.lang-bash]
sudo journalctl -b -1 # 이전 부팅 로그 확인
```/
CloudTrail에서 RebootInstances 이벤트를 검색해 누가/무엇이 재부팅을 유발했는지 확인.
## 주의사항
### 서버 실행
```[.lang-sh]
./run_gradlew.sh # at Ubuntu
run_gradlew.bat # at Windows
```/
### 따로 추가해야 할 파일들 (Secrets)
```[.lang-sh]
gitconfig.bat
gitconfig.sh
source ./gitconfig.sh
src/main/java/recoeve/db/Config.java
```/
RecoeveNet repo 도 비밀유지를 위해서는 .gitignore 해야겠지만 귀찮으니 private repo 로 그냥 파일 공유합시다.
### Windows 내부 Ubuntu (WSL: Windows Subsystem for Linux) 에서는 편집을 지양합시다.
편집은 Windows 에서 대부분 하고 git push 하는걸로...
WSL 에서는 실행 테스트 용으로만 이용합시다.
## Ubuntu Server 에 setting 하기.
Azure (Microsoft) portal.azure.com/#@Recoevenet.onmicrosoft.com 에서 Sidebar 에 있는 Connect 클릭.
### Remote Server (Virtual Server) 접속하기.
#### CLI (Command Line Interface)
Ubuntu WSL (Windows Subsystem for Linux) 을 켜고
```[.lang-sh]
ssh -i ~/RecoeveNet/.ssh/github-recoeve-rsa kipid@4.218.23.15
// Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
sudo -i
// root 계정으로 전환.
```/
#### SFTP 설정
```[.lang-sh]
sshfs -i ~/.ssh/Recoeve.net-VM_key.pem kipid@4.218.23.15:/home/kipid/ ~/remote_storage/
```/
#### RDP (Remote Desktop Protocol) from Windows 11
Win+R 로 rdpclip.exe 실행해야 복붙이 됨.
Remote desktop from windows to linux with xRDP / fix black screen: Remote desktop from windows to linux with xRDP / fix black screen, by UFO ACADEMY, at 2023
여기 Griffon's IT Library :: xRDP – xRDP shows only black screen after authentication windows – How To Fix !, 2021-04-12 가 제대로 설명 해놓은듯.
```[.lang-sh]
sudo apt install xrdp -y
sudo systemctl enable xrdp
sudo systemctl restart xrdp
sudo systemctl status xrdp
su - kipid-rdp
sudo adduser xrdp ssl-cert
sudo ufw enable
sudo ufw allow 3389/tcp
sudo ufw reload
sudo ufw status
sudo ip -br a
curl ifconfig.me
// This command will display the public IP address of your server.
sudo vim /etc/xrdp/startwm.sh
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
sudo systemctl restart xrdp
```/
#### Graphic card settings
```[.lang-sh]
sudo lshw -c video
*-graphics
product: hyperv_drmdrmfb
physical id: 1
logical name: /dev/fb0
capabilities: fb
configuration: depth=32 resolution=1024,768
```/
### gitconfig.sh 만들기.
```[.lang-sh]
curl -sS https://webi.sh/gh | sh
// 이건 동작 안하는듯.
```/
```[.lang-sh]
cd ~/.config/
sudo touch gitconfig.sh
sudo chmod u+rw gitconfig.sh
// 소유자에게 읽기, 쓰기, 실행 권한을 부여하고 그룹과 다른 사용자에게 읽기 권한만 부여하려면:
chmod 744 gitconfig.sh
sudo vim gitconfig.sh
```/
아래와 같은 명령어들을 넣어놓고 저장 (:wq)
```[.lang-sh]
sudo git config alias.history "log --pretty=oneline" --global
sudo git config user.name "kipid" --global
sudo git config user.email "kipacti@gmail.com" --global
sudo git config init.defaultBranch main --global
```/
### git clone
```[.lang-sh]
sudo git clone https://[password-token]@github.com/kipid/kipids-recoeve.git
sudo git clone https://[password-token]@github.com/kipid/Recoeve.git
Username for 'https://github.com': kipid
Password for 'https://kipid@github.com': // 발급 받은 password 를 쳐야 함. 계정 pwd 가 아니라.
sudo git clone https://[password-token]@github.com/kipid/PortableGit.git
sudo git clone https://[password-token]@github.com/kipid/Recoeve.git
sudo git clone https://[password-token]@github.com/kipid/RecoeveNet.git
// 위처럼 해야 매번 로그인하라고 안물어봄.
// sudo git clone https://[password-token]@github.com/[username]/[repo].git
```/
#### sudo git push/pull 매번 로그인하지 않게 만들어주기. Using ssh.
```[.lang-sh]
ssh-keygen -t rsa -b 4096 -C "kipacti@gmail.com"
// Follow the prompts to save the key in the default location (~/RecoeveNet/.ssh/github-recoeve-rsa).
eval "$(ssh-agent -s)"
ssh-add ~/RecoeveNet/.ssh/github-recoeve-rsa
cat ~/RecoeveNet/.ssh/github-recoeve-rsa.pub
cd ~/Recoeve/
sudo git remote set-url origin git@github.com:kipid/Recoeve.git
cd ~/RecoeveNet/
sudo git remote set-url origin git@github.com:kipid/RecoeveNet.git
cd ~/Recoeve/
sudo git config --global credential.helper cache
```/
## AWS 및 깔아야할 Softwares.
### JAVA
```[.lang-sh]
sudo apt install openjdk-21-jdk
readlink -f $(which java)
# 출력예시 : /usr/lib/jvm/java-21-openjdk-amd64/bin/java
sudo vim ~/.bashrc
# export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
# export PATH=$JAVA_HOME/bin:$PATH
source ~/.bashrc
```/
### MySQL
```[.lang-sh]
sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation
# 거의 모든 대답에 y (yes) 하면 됨. PASSWORD 는 2:STRONG 으로...
```/
#### 대소문자 구분 설정 (lower_case_table_names) 및 시간대 설정 (default-time-zone)
```[.lang-sh]
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 와 같이 파일수정을 켜고 다음과 같이 추가.
[mysqld]
#
# * Basic Settings
#
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
lower_case_table_names = 2
# 2: 대소문자를 구분해서 저장하지만, 비교할 때는 구분 안 함 (macOS 기본).
default-time-zone = '+00:00'
```/
mysql 재부팅
```[.lang-sh]
sudo systemctl restart mysql
```/
#### Ubuntu 의 시간대 설정 (timedatectl set-timezone)
```[.lang-sh]
sudo timedatectl set-timezone UTC
timedatectl
# Time zone: UTC (UTC, +0000) 라고 나오면 성공입니다.
```/
#### root 계정의 비밀번호 설정
```[.lang-sql]
sudo mysql
# 비번 없이 접속 됨.
-- 1. 현재 root 계정의 비밀번호 설정
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
-- 2. 변경 사항 즉시 적용
FLUSH PRIVILEGES;
```/
#### eve 계정 생성 및 비밀번호 설정
```[.lang-sql]
CREATE USER 'eve'@'localhost' IDENTIFIED BY '';
CREATE DATABASE `recoeve01`;
-- recoeve01 데이터베이스에 대한 모든 권한 부여
GRANT ALL PRIVILEGES ON recoeve01.* TO 'eve'@'localhost';
FLUSH PRIVILEGES;
```/
#### Data 가져오기 (mysqldump, mysql, git-lfs (large file system))
```[.lang-sh]
# mysqldump --extended-insert=true -u root -p recoeve01 > mydump.sql
sudo apt update
sudo apt install git-lfs
git lfs install
git lfs pull
sudo mysql -u root -p recoeve01 < mydump.sql
```/
### SublimeText
특히나 sublime-snippet.
```[.linenums.lang-html]
<!-- aWithBlank.sublime-snippet -->
<snippet>
<content><![CDATA[
<a target="${1:_blank}" href="${2}">${3}</a>${4}
]]></content>
<tabTrigger>ab</tabTrigger>
<scope>text.html</scope>
<description>a tag with target _blank</description>
</snippet>
<!-- eq.sublime-snippet -->
<snippet>
<content><![CDATA[
<eq>${1}</eq>${2}
]]></content>
<tabTrigger>eq</tabTrigger>
<scope>text.html</scope>
<description>eq tag (inline equation)</description>
</snippet>
<!-- eqq.sublime-snippet -->
<snippet>
<content><![CDATA[
<eqq>
${1}
</eqq>${2}
]]></content>
<tabTrigger>eqq</tabTrigger>
<scope>text.html</scope>
<description>eqq tag (outline equation)</description>
</snippet>
<!-- img.sublime-snippet -->
<snippet>
<content><![CDATA[
<img delayed-src="${1}"/>${2}
]]></content>
<tabTrigger>img</tabTrigger>
<scope>text.html</scope>
<description>img tag with delayed-src</description>
</snippet>
<!-- iframe.sublime-snippet -->
<snippet>
<content><![CDATA[
<iframe delayed-src="${1}"></iframe>${2}
]]></content>
<tabTrigger>iframe</tabTrigger>
<scope>text.html</scope>
<description>iframe tag with delayed-src</description>
</snippet>
```/
### Node.js 랑 Python 도 깔자.
```[.lang-sh]
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
# 자동으로 ~/.bashrc 에 다음과 같은게 추가 됨.
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# ~/.bashrc 실행
source ~/.bashrc
```/
Ubuntu에는 기본적으로 Python 3가 설치되어 있습니다. 하지만 최신 버전을 깔거나 개발용 도구를 갖추는 과정이 필요합니다.
가상 환경 (venv) 사용법 (권장):
Python 프로젝트마다 라이브러리 꼬임을 방지하기 위해 가상 환경 사용을 강력히 권장합니다.
```[.lang-sh]
python3 --version
sudo apt update
sudo apt install python3 python3-pip python3-venv
```/
### Nginx 설치 및 설정하는 법
```[.lang-sh]
sudo apt update
sudo apt install nginx
```/
### tmux 설치
```[.lang-sh]
sudo apt update
sudo apt install tmux
tmux -V
nano ~/.tmux.conf
# 아래 내용 입력 후 저장
set -g mouse on
# 'recoeve'이라는 이름의 새 세션 시작
tmux new -s recoeve
# Ctrl+b, d 키로 나올 수 있음.
# or 'recoeve'라는 세션 입장
tmux attach -t recoeve
./run_gradlew.sh &
tail -f -n 3500 logs/run_gradlew_2026-03-1
```/
### 부팅시나 재부팅시 자동으로 서버가 실행되도록 만드는 법
#### crontab 이용 (비추천)
```[.lang-sh]
crontab -e
# 다음과 같이 입력하고 저장.
@reboot cd ~/Recoeve && /usr/bin/tmux new-session -d -s recoeve './run_gradlew.sh > ~/reboot_log.txt 2>&1'
```/
#### systemctl 이용 (추천)
sudo vim /etc/systemd/system/recoeve.service 로 다음과 같이 저장.
```[.lang-sh]
[Unit]
Description=Recoeve Tmux Service
After=network.target mysql.service nginx.service
[Service]
Type=simple
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/kipids-recoeve
# 이미 세션이 있으면 종료하고 새로 시작 (중복 방지)
ExecStartPre=-/usr/bin/tmux kill-session -t recoeve
# tmux 세션을 데몬(-d)으로 생성하고 명령어 실행
ExecStart=/usr/bin/tmux new -d -s recoeve 'npm run build && PORT=8080 npm start > /home/ubuntu/kipids-recoeve/logs/log.txt 2>&1'
# 서비스 중단 시 tmux 세션 삭제
ExecStop=/usr/bin/tmux kill-session -t recoeve
Restart=on-failure
[Install]
WantedBy=multi-user.target
```/
sudo vim /etc/systemd/system/kipids-recoeve.service 로 다음과 같이 저장.
```[.lang-sh]
[Unit]
Description=kipids Recoeve Service
After=network.target
[Service]
Type=simple
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/kipids-recoeve
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 이미 세션이 있으면 종료하고 새로 시작 (에러가 나도 무시하도록 '-' 유지)
ExecStartPre=-/usr/bin/tmux kill-session -t recoeve
# /bin/bash -c를 통해 빌드와 tmux 실행 명령어를 안전하게 순차 실행, tmux 세션을 데몬(-d)으로 생성하고 명령어 실행
ExecStart=/bin/bash -c "/usr/bin/tmux new -d -s recoeve './run_nextjs.sh &'"
# 서비스 중단 시 tmux 세션 삭제
ExecStop=/usr/bin/tmux kill-session -t recoeve
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
```/
```[.lang-sh]
sudo visudo
```/
다음 줄을 추가하세요:
```[.lang-sh]
ubuntu ALL=(ALL) NOPASSWD: /usr/bin/tmux
```/
다음과 같은 명령어들로 부팅 시 자동 실행 설정.
```[.lang-sh]
# 1. systemd 매니저에게 새 파일이 생겼음을 알림
sudo systemctl daemon-reload
# 2. 부팅 시 자동 실행 설정
sudo systemctl enable kipids-recoeve.service
# 3. 지금 즉시 서비스 시작
sudo systemctl start kipids-recoeve.service
sudo systemctl status kipids-recoeve.service
```/
### com.microsoft.playwright 설치
```[.lang-sh]
npx playwright install-deps
npx playwright install
# 이걸로는 ~/.cache/ms-playwright 폴더가 안생기는듯.
# 클래스패스에 playwright jar가 포함된 상태에서 CLI 실행
java -cp "build/libs/*:lib/*" com.microsoft.playwright.CLI install
# run_gradlew.sh 에서 다음과 같은 명령어를 추가
export PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/ms-playwright
```/
## Windows 시스템 환경 변수
```[.linenums]
JAVA_HOME=C:\Program Files\Java\jdk-20
MYSQL_HOME=C:\Program Files\MySQL\MySQL Server 8.0
VERTX_HOME=C:\vertx
RECOEVE_CLASS=C:\Recoeve
CLASSPATH=.;%JAVA_HOME%\lib;%RECOEVE_CLASS%\classes;%RECOEVE_CLASS%\classes\javax.mail.jar;%RECOEVE_CLASS%\classes\mysql-connector-j-8.0.33.jar;%RECOEVE_CLASS%\classes\activation-1.1.1.jar;%VERTX_HOME%\conf;%VERTX_HOME%\lib\*
```/
## Time error 나는거 해결해야 함.
```[.lang-sql]
SET GLOBAL sql_mode = "ALLOW_INVALID_DATES";
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
```/
### Timezone
```[.lang-sql]
mysql> status;
--------------
mysql Ver 8.0.30 for Win64 on x86_64 (MySQL Community Server - GPL)
Connection id: 41
Current database: recoeve01
Current user: root@localhost
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Using delimiter: ;
Server version: 8.0.30 MySQL Community Server - GPL
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
TCP port: 3306
Binary data as: Hexadecimal
Uptime: 4 days 2 hours 42 min 13 sec
Threads: 3 Questions: 122383 Slow queries: 0 Opens: 537 Flush tables: 3 Open tables: 437 Queries per second avg: 0.344
--------------
```/
```[.lang-sql]
mysql> SHOW variables like 'c%';
+----------------------------------------------+---------------------------------------------------------+
| Variable_name | Value |
+----------------------------------------------+---------------------------------------------------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_digest_rounds | 5000 |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
| check_proxy_users | OFF |
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| connection_memory_chunk_size | 8912 |
| connection_memory_limit | 18446744073709551615 |
| core_file | OFF |
| create_admin_listener_thread | OFF |
| cte_max_recursion_depth | 1000 |
+----------------------------------------------+---------------------------------------------------------+
24 rows in set (0.14 sec)
```/
```[.lang-sql]
SELECT @@global.time_zone, @@session.time_zone;
SET GLOBAL time_zone='+00:00';
SET time_zone='+00:00';
```/
## Windows firewall
Windows firewall 에서 port 80, 443 access 를 풀어줘야 함. Inbound, Outbound 둘 다 풀어줌.
AWS security group 에서도 Inbound Custom TCP port 80, 443 풀어줘야 함.
Outbound 는 all traffic 을 풀어줘야 할듯?
## Console (cmd) 한글깨짐 문제
참고 . chcp 65001 (Changes the active console code page. UTF-8) 로 바꿔주는거고, regedit 눌러서 registry 도 변경해줘야 다시 실행했을때도 자동으로 잘 보이는듯.
Font 도 한글 보이는 걸로 바꿔줘야 함.
## HTTPS 로 접속되게
```[.lang-sh]
# Certbot 설치
sudo apt install certbot python3-certbot-nginx
# Certbot 실행하여 SSL 인증서 발급 및 Nginx 설정 자동 변경
sudo certbot --nginx -d example.com -d www.example.com
```/
## RRA
http/https 링크및 수식 (\ [ Outline 수식 \ ],\ ( inline 수식 \ )::\이후 띄어쓰기 없이) 을 넣으실 수 있습니다. 또한 code 는```시작,```/마지막으로 감싸 주시면 pretty-printed 되어서 나타납니다.```[.scrollable.lang-js]같이 언어를 선택해 주실수도 있고, 긴 수식의 경우 scroll bar 가 생기게 만드실 수도 있습니다.댓글 입력 후 rendering 된 형태를 보시려면, Handle CmtZ (단축키: N) 버튼을 눌러주세요. 오른쪽 아래 Floating Keys 에 있습니다. 아니면 댓글 젤 아래에 버튼이 있습니다.