Skip to content

dev-jwel/jhsolution

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

JHsolution service archive

๋ณธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ํ™”๋ฌผ์šด์†ก ์‹œ์žฅ์—์„œ ์‹œ์ž‘ํ•œ ์Šคํƒ€ํŠธ์—… JH์†”๋ฃจ์…˜์˜ ์†Œ์Šค์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ์—…์ด ์ข…๋ฃŒ๋จ์— ๋”ฐ๋ผ ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ๊ณต๊ฐœ์ „ํ™˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ํ•˜๊ธฐ

๋กœ์ปฌ ์‹คํ–‰

์ด ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” python3{,-pip,-venv}, postgresql์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ตฌ๊ธ€ oauth, ๋ฐ”๋กœ์จํŠธ, ์ž๋™์ฐจ ์ •๋ณด ๊ณต๊ณต๋ฐ์ดํ„ฐ API ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด .env ํŒŒ์ผ์— API ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. python3{,-venv}, postgresql์„ ์„ค์น˜ํ•œ ์ดํ›„ python ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”. ์—ฌ๊ธฐ์„œ๋Š” venv ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

    python3 -m venv venv
    . venv/bin/activate
    pip install -r requirements.txt
    pip install -r test-requirements.txt
  2. ๋งŒ์•ฝ ์„œ๋น„์Šค API ํ‚ค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋จผ์ € .env ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

  3. ๊ทธ ์ดํ›„ postgresql์—์„œ ๊ณ„์ •๊ณผ DB๋ฅผ ์ƒ์„ฑํ•˜๊ณ  .env ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”. ๋ฐฉ๋ฒ•์€ postgresql ๊ณต์‹ ๋ฌธ์„œ ๋˜๋Š” ์•„๋ž˜์˜ ์„œ๋น„์Šค ๋ฐฐํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

    DATABASE_URL=postgresql+psycopg2://{user}:{password}@{host}/{database}
  4. .env ํŒŒ์ผ์˜ ์„ธํŒ…์ด ๋๋‚ฌ๋‹ค๋ฉด DB์— ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

    python -m alembic upgrade head
  5. ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด ์ฃผ์„ธ์š”.

    python -m uvicorn --host 127.0.0.1 --port 8888 jhsolution.main:app

๋กœ์ปฌ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด playwright์šฉ ๋ธŒ๋ผ์šฐ์ € ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„ค์น˜๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. python -m playwright install์„ ํ†ตํ•ด์„œ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.

๋˜ํ•œ, DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ์šฉ DB๊ฐ€ ๋ณ„๋„๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. postgresql์—์„œ ํ…Œ์ŠคํŠธ์šฉ DB๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•ด์ฃผ์‹œ๊ณ  .envํŒŒ์ผ์˜ TEST_DATABASE_URL์— ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

์œ„์—์„œ์˜ ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, pytest๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --no-cov๋Š” ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์ธ์„ ํ•˜์ง€ ์•Š์„ ๋•Œ, --test-migration์€ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋ถ™์—ฌ์ฃผ์„ธ์š”.

pytest [--no-cov] [--test-migration]

์„œ๋น„์Šค ๋ฐฐํฌ

ํ”„๋กœ์ ํŠธ์˜ devops ๋””๋ ‰ํ† ๋ฆฌ์— CI/CD์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ, https๋ฅผ ์œ„ํ•ด nginx/certs/{chain,key}.pem ํŒŒ์ผ์ด ์žˆ์–ด์•ผ๋งŒ ๋™์ž‘ํ•จ์„ ์œ ์˜ํ•ด ์ฃผ์„ธ์š”. ๊ทธ ๋‹ค์Œ, ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด nginx/default_server_name ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ install.sh๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ดˆ๊ธฐ ์ธ์Šคํ„ด์Šค์— ํ•„์š”ํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด jenkins, grafana, portainer์˜ ์ถœ๋ ฅ๋˜๋Š” ์•”ํ˜ธ๋Š” ๊ด€๋ฆฌ์ž ์ดˆ๊ธฐ ์•”ํ˜ธ์ž…๋‹ˆ๋‹ค. ์ด ๊ด€๋ฆฌ์ „์šฉ ์„œ๋น„์Šค๋“ค์€ https://jenkins.mydomain ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, ์šฐ์„  postgresql์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

  1. postgresql ์ ‘๊ทผ

    docker exec -tiu postgres postgres psql
    
  2. ๊ณ„์ • ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ (์•”ํ˜ธ๋Š” ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”)

    CREATE USER jhsol_backend WITH PASSWORD 'FAKE_PASSWORD';
    CREATE DATABASE jhsol_backend WITH OWNER jhsol_backend;
    CREATE DATABASE jhsol_backend_test WITH OWNER jhsol_backend;
    

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ์ด ๋๋‚ฌ๋‹ค๋ฉด, ๋ฐฐํฌํ™˜๊ฒฝ์šฉ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  jenkins์— ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋กœ jenkins์— ๋“ค์–ด๊ฐ„ ํ›„ ์ดˆ๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•ด ์ฃผ์„ธ์š”. ์„ค์น˜ ์™„๋ฃŒ ํ›„ pipeline job์„ ์ƒ์„ฑํ•œ ํ›„, ํ”„๋กœ์ ํŠธ์˜ Jenkinsfile์™€ ๋ฐฐํฌ์šฉ .env ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์„ค์ •์ด ๋๋‚ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด grafana์— ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค์˜ ๋กœ๊ทธ๋“ค์€ opentelemetry๋ฅผ ํ†ตํ•˜์—ฌ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ด€๋ฆฌ์ž๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Troubleshooting

url_for์˜ ํ”„๋กœํ† ์ฝœ์ด `https'๋กœ ๋ฐ”๋€Œ์ง€ ์•Š์Œ

nginx์™€ ๊ฐ™์€ ์›น์„œ๋ฒ„๊ฐ€ ํ”„๋ก์‹œ๋กœ์จ ์•ž๋‹จ์— ์žˆ์„ ๋•Œ, fastapi๊ฐ€ ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋ก์‹œ ํ—ค๋”๊ฐ€ ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ—ค๋”๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Host ${domain_name}
X-Forwarded-For ${remote_address}
X-Forwarded-Proto https

๋˜๋Š”, /etc/nginx/proxy_params๋ฅผ ์ด์šฉํ•˜์—ฌ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ํ”„๋ก์‹œ๊ฐ€ ๋‘˜ ์ด์ƒ์ผ๋•Œ, X-Forwarded-Proto https๋ฅผ ๋ฎ์–ด์จ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ, fastapi์—์„œ ํ”„๋ก์‹œ ํ—ค๋”๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‹คํ–‰์‹œ ์•„๋ž˜ ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--proxy-headers --forwarded-allow-ips ${proxy_server_ips}

nginx์—์„œ 502 ์—๋Ÿฌ์™€ ํ•จ๊ป˜ ์—๋Ÿฌ ๋กœ๊ทธ์—์„œ upstream sent too big header ...๊ฐ€ ๋ฐœ๊ฒฌ๋จ

ํ—ค๋” ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ฒ„ํผ์— ๋น„ํ•ด ํฌ๊ธฐ๊ฐ€ ์ปค์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ, ์•„๋ž˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fastcgi_buffers         16  16k;
fastcgi_buffer_size         32k;
proxy_buffer_size          128k;
proxy_buffers            4 256k;
proxy_busy_buffers_size    256k;

์ถœ์ฒ˜: https://stackoverflow.com/a/43093634/7579126

์ฐฝ๋ฆฝ ๋ฉค๋ฒ„

  • CEO: ๋ช…์žฌํ›ˆ
  • CTO: ์ด์ข…ํœ˜

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jinja 59.4%
  • Python 36.7%
  • Shell 1.5%
  • SCSS 1.1%
  • HTML 0.8%
  • JavaScript 0.3%
  • Mako 0.2%