๋ณธ ๋ ํฌ์งํ ๋ฆฌ๋ ํ๋ฌผ์ด์ก ์์ฅ์์ ์์ํ ์คํํธ์ JH์๋ฃจ์ ์ ์์ค์ฝ๋์ ๋๋ค. ํด๋น ์ฌ์ ์ด ์ข ๋ฃ๋จ์ ๋ฐ๋ผ ๋ณธ ํ๋ก์ ํธ์ ์ฝ๋๊ฐ ๊ณต๊ฐ์ ํ ๋์์ต๋๋ค.
์ด ์๋น์ค๋ฅผ ์คํํ๊ธฐ ์ํด์๋ python3{,-pip,-venv}, postgresql์ ์ค์นํด์ผ ํฉ๋๋ค.
๋ํ, ๊ตฌ๊ธ oauth,
๋ฐ๋ก์จํธ,
์๋์ฐจ ์ ๋ณด ๊ณต๊ณต๋ฐ์ดํฐ API
๋ฅผ ์ฌ์ฉํ๊ณ ์์ด .env ํ์ผ์ API ํค๊ฐ ์์ผ๋ฉด ์ผ๋ถ ๊ธฐ๋ฅ์ด ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
-
python3{,-venv},postgresql์ ์ค์นํ ์ดํ python ํจํค์ง๋ค์ ์ค์นํด ์ฃผ์ธ์. ์ฌ๊ธฐ์๋venv๊ฐ์ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ๋ก ํฉ๋๋ค.python3 -m venv venv . venv/bin/activate pip install -r requirements.txt pip install -r test-requirements.txt -
๋ง์ฝ ์๋น์ค API ํค๊ฐ ์๋ค๋ฉด ๋จผ์
.envํ์ผ์ ์ถ๊ฐํด ์ฃผ์ธ์. -
๊ทธ ์ดํ
postgresql์์ ๊ณ์ ๊ณผ DB๋ฅผ ์์ฑํ๊ณ.envํ์ผ์ ์๋์ ๊ฐ์ ํํ๋ก ์ถ๊ฐํด ์ฃผ์ธ์. ๋ฐฉ๋ฒ์ postgresql ๊ณต์ ๋ฌธ์ ๋๋ ์๋์ ์๋น์ค ๋ฐฐํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.DATABASE_URL=postgresql+psycopg2://{user}:{password}@{host}/{database}
-
.envํ์ผ์ ์ธํ ์ด ๋๋ฌ๋ค๋ฉด DB์ ์คํค๋ง๋ฅผ ์์ฑํด ์ฃผ์ธ์.python -m alembic upgrade head
-
๋ง์ง๋ง์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํด ์ฃผ์ธ์.
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์์ ์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํด ์ฃผ์ธ์.
-
postgresql์ ๊ทผdocker exec -tiu postgres postgres psql -
๊ณ์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ (์ํธ๋ ์์ ํด ์ฃผ์ธ์)
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๋ฅผ ํตํ์ฌ ์์ง๋๊ณ ์์ผ๋ฉฐ, ๊ด๋ฆฌ์๊ฐ ์ํ๋ ํํ๋ก ๋์๋ณด๋๋ฅผ ์ง์ ์์ฑํ ์ ์์ต๋๋ค.
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}
ํค๋ ์ฌ์ด์ฆ๊ฐ ๋ฒํผ์ ๋นํด ํฌ๊ธฐ๊ฐ ์ปค์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ์๋ ์ต์ ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ํ ์ ์์ต๋๋ค.
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: ์ด์ข ํ