diff --git a/.env.example b/.env.example index 3d8eacd42cc7f13b0a90c0ccd04be34a1aaa781b..202fdfbf05e5d8e4152bf7b53ea2c37e7aa7b436 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,7 @@ # 해당 파일 수정후 .env로 변경 -# MongoDB 루트 유저 이름 -DB_USER=example -# MongoDB 루트 유저 비밀번호 -DB_PASSWORD=samplepwd -# MongoDB 데이터베이스 이름 -DB_NAME=datadb -# 서버 이름(localhost일시 자동으로 도메인 설정) -SERVER_NAME=localhost -# 유튜브 API 키 -YOUTUBE_API_KEY=sampleapikey \ No newline at end of file +# MySQL 루트 비밀번호(5자 이상 특수문자, 공백 제외) +MYSQL_ROOT_PASSWORD=example + +# MySQL 데이터베이스 이름 +MYSQL_DATABASE=db_name \ No newline at end of file diff --git a/.gitignore b/.gitignore index 428c69b6c294e2c55a3c45d790d0a0c4b649f456..2e166e671e2dc8527b8f47499dc1c96aa25427bd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ node_modules .vscode db/data .env -ssl/*.pem -ssl/certbot/* \ No newline at end of file +front/nginx/ssl/*.pem \ No newline at end of file diff --git a/ProjectGuidelines.md b/ProjectGuidelines.md index cf4dfa6f8320889996bbfd031b1237a94751b001..0c8b1afc423cdb165db3675b5cef608ad49f673b 100644 --- a/ProjectGuidelines.md +++ b/ProjectGuidelines.md @@ -73,19 +73,6 @@ git rebase A ### 로컬에서 작업 중 ssl 인증서 발급 > ! 윈도우 작업시 wsl 환경에서 작업 필요 ```sh -./setup.sh +cd front/nginx/ssl +sudo ./setup_ssl.sh ``` -> 필요시 패키지 수동 설치 후 진행 - -#### 참고사항 -* nginx가 설치되어 기본 포트랑 충돌시 -```sh -netstat -tunlp | grep 80 -``` -> 80번 포트 사용중인 프로그램 종료 후 진행 -```sh -sudo systemctl stop nginx -``` - -### .env 파일 수정 시 -이젠 setup.sh 실행시 .env.example 토대로 자동 생성되나 YOUTUBE_API_KEY 수정 필요 \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index beb06b6484420c35e1c277691d8d22bd63739170..61718ca3cca0b1339569d24e3f56c739c7d053a7 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -19,10 +19,10 @@ services: mybridge: ipv4_address: 172.20.0.4 ports: - - "27017:27017" + - "3307:3306" volumes: - - ./db/data:/data/db - - ./db/init.js:/docker-entrypoint-initdb.d/init.js + - ./db/data:/var/lib/mysql + - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql restart: always wss-back: @@ -46,8 +46,6 @@ services: context: ./front dockerfile: Dockerfile container_name: wss-front - env_file: - - .env depends_on: - wss-back networks: @@ -59,32 +57,7 @@ services: volumes: - ./front/src:/app/src - ./front/public:/app/public - - ./ssl/fullchain.pem:/etc/nginx/ssl/fullchain.pem - - ./ssl/privkey.pem:/etc/nginx/ssl/privkey.pem - - ./ssl/certbot/conf:/etc/letsencrypt - - ./ssl/certbot/www:/var/www/certbot - command: > - /bin/sh -c ' - /etc/nginx/env.sh && - nginx -g "daemon off;" & - while :; do - sleep 6h & - wait $${!} - nginx -s reload - done - ' + - ./front/nginx/ssl:/etc/nginx/ssl + environment: + - SERVER_NAME=fiturring.kro.kr, localhost restart: always - - wss-certbot: - image: certbot/certbot - container_name: wss-certbot - env_file: - - .env - volumes: - - ./ssl/certbot/conf:/etc/letsencrypt - - ./ssl/certbot/www:/var/www/certbot - entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" - networks: - mybridge: - ipv4_address: 172.20.0.5 - restart: always \ No newline at end of file diff --git a/down.sh b/down.sh deleted file mode 100755 index 12aad936a58ed043cddf61e10a2a04efeb681f2f..0000000000000000000000000000000000000000 --- a/down.sh +++ /dev/null @@ -1 +0,0 @@ -docker-compose down -v; \ No newline at end of file diff --git a/front/nginx/env.sh b/front/nginx/env.sh deleted file mode 100755 index b86c8f6e30e040643ed81866e2211d730d8fb8e2..0000000000000000000000000000000000000000 --- a/front/nginx/env.sh +++ /dev/null @@ -1,9 +0,0 @@ -# front/nginx/env.sh -if [ "$SERVER_NAME" = "localhost" ]; then - envsubst '${SERVER_NAME}' < /etc/nginx/templates/local-nginx.conf.template > /etc/nginx/nginx.conf -else - envsubst '${SERVER_NAME}' < /etc/nginx/templates/server-nginx.conf.template > /etc/nginx/nginx.conf -fi - -# locations.conf의 내용으로 # INSERT_LOCATIONS_HERE를 교체 -sed -i -e '/# INSERT_LOCATIONS_HERE/r /etc/nginx/locations.conf' -e '/# INSERT_LOCATIONS_HERE/d' /etc/nginx/nginx.conf \ No newline at end of file diff --git a/front/nginx/locations.conf b/front/nginx/locations.conf deleted file mode 100644 index 3e66be883963281fcf837fa3fab62523e75f6c2f..0000000000000000000000000000000000000000 --- a/front/nginx/locations.conf +++ /dev/null @@ -1,24 +0,0 @@ -# front/nginx/locations.conf -location / { - try_files $uri $uri/ index.html; # 추가: React Router를 위한 설정 -} - -location /uptime { - try_files $uri /uptime.html =404; -} - -location /robots.txt { - try_files $uri /robots.txt =404; -} - -location /src/ { - alias /app/src/; -} - -location /api/ { - proxy_pass http://backend; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; -} \ No newline at end of file diff --git a/front/nginx/local-nginx.conf.template b/front/nginx/nginx.conf similarity index 51% rename from front/nginx/local-nginx.conf.template rename to front/nginx/nginx.conf index 40a9ef40ec149ef404f1a0629886e43e73d6ba73..ccdead485cc17d7ac7b370602c4cea00f4b69202 100644 --- a/front/nginx/local-nginx.conf.template +++ b/front/nginx/nginx.conf @@ -17,7 +17,7 @@ http { server { listen 80; - server_name ${SERVER_NAME}; + server_name fiturring.kro.kr localhost; # Redirect all HTTP requests to HTTPS return 301 https://$host$request_uri; @@ -25,7 +25,7 @@ http { server { listen 443 ssl; - server_name ${SERVER_NAME}; + server_name fiturring.kro.kr localhost; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; @@ -35,7 +35,29 @@ http { root /usr/share/nginx/html; - # INSERT_LOCATIONS_HERE + location / { + try_files $uri $uri/ index.html; # 추가: React Router를 위한 설정 + } + + location /uptime { + try_files $uri /uptime.html =404; + } + + location /robots.txt { + try_files $uri /robots.txt =404; + } + + location /src/ { + alias /app/src/; + } + + location /api/ { + proxy_pass http://backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } error_page 500 502 503 504 /50x.html; location = /50x.html { diff --git a/front/nginx/server-nginx.conf.template b/front/nginx/server-nginx.conf.template deleted file mode 100644 index e2f1b8e51f024b9a0757ba15e668794c2910e9cb..0000000000000000000000000000000000000000 --- a/front/nginx/server-nginx.conf.template +++ /dev/null @@ -1,52 +0,0 @@ -worker_processes 1; - -events { - worker_connections 1024; -} - -http { - include mime.types; - default_type application/octet-stream; - - sendfile on; - keepalive_timeout 65; - - upstream backend { - server 172.20.0.3:8080; # wss-back - } - - server { - listen 80; - server_name ${SERVER_NAME}; - server_tokens off; - - location /.well-known/acme-challenge/ { - allow all; - root /var/www/certbot; - } - - location / { - return 301 https://$host$request_uri; - } - } - - server { - listen 443 ssl; - server_name ${SERVER_NAME}; - server_tokens off; - - ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem; - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - root /usr/share/nginx/html; - - # INSERT_LOCATIONS_HERE - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } -} \ No newline at end of file diff --git a/ssl/setup_ssl.sh b/front/nginx/ssl/setup_ssl.sh similarity index 58% rename from ssl/setup_ssl.sh rename to front/nginx/ssl/setup_ssl.sh index b9f5d7e843de261c6ca09386d3142f8d074409f1..4d64141f9acdcd28e3d5f9eaa36d6656e4b4fa6e 100755 --- a/ssl/setup_ssl.sh +++ b/front/nginx/ssl/setup_ssl.sh @@ -1,13 +1,5 @@ #!/bin/sh -# .env 파일 로드 -if [ -f ../.env ]; then - export $(grep -v '^#' ../.env | xargs) -else - echo ".env 파일을 찾을 수 없습니다. .env.example을 사용하여 .env 파일을 생성하세요." - exit 1 -fi - # mkcert 설치 확인 및 설치 install_mkcert() { if ! command -v mkcert >/dev/null 2>&1; then @@ -45,27 +37,16 @@ install_local_ca() { # SSL 인증서 발급 및 이동 generate_and_move_ssl_certificates() { - # IS_LOCAL이 true이면 localhost, 아니면 SERVER_NAME 사용 - if [ "$IS_LOCAL" = "true" ]; then - local domains="localhost" - else - local domains="$SERVER_NAME" - fi + local domains="localhost fiturring.kro.kr" # 필요한 도메인 추가 echo "SSL 인증서 발급 중... 도메인: $domains" mkcert $domains - # 정확한 인증서 파일 이름을 확인하고 수정 - local cert_file="${domains}.pem" - local key_file="${domains}-key.pem" + # 인증서 파일 이름 변경 및 이동 + mv "localhost+1.pem" "fullchain.pem" + mv "localhost+1-key.pem" "privkey.pem" - if [ -f "$cert_file" ] && [ -f "$key_file" ]; then - mv "$cert_file" "fullchain.pem" - mv "$key_file" "privkey.pem" - echo "인증서 파일이 $(pwd)에 fullchain.pem 및 privkey.pem으로 저장되었습니다." - else - echo "인증서 파일 생성에 실패했습니다. 파일이 존재하지 않습니다: $cert_file 또는 $key_file" - fi + echo "인증서 파일이 ${ssl_dir}에 fullchain.pem 및 privkey.pem으로 저장되었습니다." } # 스크립트 실행 diff --git a/setup.sh b/setup.sh deleted file mode 100755 index b96751ab1f6357672ffcf33378c05b94a7a3d96a..0000000000000000000000000000000000000000 --- a/setup.sh +++ /dev/null @@ -1,29 +0,0 @@ -# .env 파일 로드 -if [ -f .env ]; then - export $(grep -v '^#' .env | xargs) -else - cp .env.example .env - echo -e "\e[31m.env파일이 설정되지 않아 기본 설정 파일을 토대로 새 .env 파일을 생성하였습니다. .env 파일 수정을 권장합니다\e[0m" - export $(grep -v '^#' .env | xargs) -fi - -echo "SERVER_NAME: $SERVER_NAME" - -docker-compose down -v - -if [ "$SERVER_NAME" = "localhost" ]; then - if [ ! -f ssl/fullchain.pem ]; then - cd ssl - sudo ./setup_ssl.sh - cd .. - fi -else - if [ ! -d ssl/certbot ]; then - cd ssl - sudo ./init-letsencrypt.sh -y - cd .. - fi -fi - -sudo rm -rf db/data -docker-compose up -d --build \ No newline at end of file diff --git a/ssl/init-letsencrypt.sh b/ssl/init-letsencrypt.sh deleted file mode 100755 index 9d65edb4b0b14abba482f071aeb05f352df1b48c..0000000000000000000000000000000000000000 --- a/ssl/init-letsencrypt.sh +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/bash - -# 필요한 패키지 설치 확인 및 설치 -echo "### Checking and installing required packages..." -packages=(curl docker docker-compose openssl) - -# 패키지 매니저 확인 -if command -v apt-get &> /dev/null; then - PKG_MANAGER="apt-get" - PKG_UPDATE="apt-get update" -elif command -v yum &> /dev/null; then - PKG_MANAGER="yum" - PKG_UPDATE="yum update" -else - echo "지원되지 않는 패키지 매니저입니다." - exit 1 -fi - -# 패키지 매니저 업데이트 -sudo $PKG_UPDATE - -# 필요한 패키지 설치 -for pkg in "${packages[@]}"; do - if ! command -v $pkg &> /dev/null; then - echo "$pkg 설치 중..." - sudo $PKG_MANAGER install -y $pkg - fi -done - -# Docker 서비스 실행 확인 및 시작 -if ! systemctl is-active --quiet docker; then - echo "Docker 서비스 시작 중..." - sudo systemctl start docker -fi - -# .env 파일 로드 -if [ -f ../.env ]; then - export $(grep -v '^#' ../.env | xargs) -fi - -if [ -z "$SERVER_NAME" ]; then - echo "Error: SERVER_NAME environment variable is not set." - exit 1 -fi - -if ! [ -x "$(command -v docker-compose)" ]; then - echo 'Error: docker-compose is not installed.' >&2 - exit 1 -fi - -domains=("${SERVER_NAME}") -rsa_key_size=4096 -data_path="./certbot" -email="rudghrnt12@naver.com" # Adding a valid address is strongly recommended -staging=1 # Set to 1 if you're testing your setup to avoid hitting request limits - -# -y 옵션 처리 -auto_yes=false -while getopts "y" opt; do - case $opt in - y) auto_yes=true ;; - *) ;; - esac -done - -if [ -d "$data_path" ]; then - if [ "$auto_yes" = true ]; then - decision="y" - else - read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision - fi - if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then - exit - fi -fi - - -if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then - echo "### Downloading recommended TLS parameters ..." - mkdir -p "$data_path/conf" - curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf" - curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem" - echo -fi - -echo "### Creating dummy certificate for $domains ..." -path="/etc/letsencrypt/live/$domains" -mkdir -p "$data_path/conf/live/$domains" -docker-compose run --rm --entrypoint "\ - openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\ - -keyout '$path/privkey.pem' \ - -out '$path/fullchain.pem' \ - -subj '/CN=localhost'" wss-certbot -echo - - -echo "### Starting wss-front ..." -docker-compose up --force-recreate -d wss-front -echo - -echo "### Deleting dummy certificate for $domains ..." -docker-compose run --rm --entrypoint "\ - rm -Rf /etc/letsencrypt/live/$domains && \ - rm -Rf /etc/letsencrypt/archive/$domains && \ - rm -Rf /etc/letsencrypt/renewal/$domains.conf" wss-certbot -echo - - -echo "### Requesting Let's Encrypt certificate for $domains ..." -#Join $domains to -d args -domain_args="" -for domain in "${domains[@]}"; do - domain_args="$domain_args -d $domain" -done - -# Select appropriate email arg -case "$email" in - "") email_arg="--register-unsafely-without-email" ;; - *) email_arg="--email $email" ;; -esac - -# Enable staging mode if needed -if [ $staging != "0" ]; then staging_arg="--staging"; fi - -docker-compose run --rm --entrypoint "\ - certbot certonly --webroot -w /var/www/certbot \ - $staging_arg \ - $email_arg \ - $domain_args \ - --rsa-key-size $rsa_key_size \ - --agree-tos \ - --force-renewal" wss-certbot -echo - -# 인증서 복사 -echo "### Copying certificate to desired path ..." -sudo cp "/etc/letsencrypt/live/${domains}/fullchain.pem" "$data_path/conf/live/${domains}/fullchain.pem" -sudo cp "/etc/letsencrypt/live/${domains}/privkey.pem" "$data_path/conf/live/${domains}/privkey.pem" -echo - -echo "### Reloading wss-front ..." -docker-compose exec wss-front nginx -s reload diff --git a/up.sh b/up.sh deleted file mode 100755 index 68cdf23ea4a6845bc66796a34841a0f2363088f5..0000000000000000000000000000000000000000 --- a/up.sh +++ /dev/null @@ -1 +0,0 @@ -docker-compose down -v; sudo rm -rf db/data; docker-compose up -d --build \ No newline at end of file