django + docker + Azure(SQL)๋ฐฐํฌ
๐ ์ค๋ ๋ฐฐ์ฐ๊ณ ์ ๋ฆฌํ ๋ชฉ์ฐจ
๏ผ. django + docker + Azure(SQL)๋ฐฐํฌ
๐ ๋์ปค๋ฅผ ํตํ ๋ฐฐํฌ
๐ Azure๋ฐฐํฌ๋ฅผ ์ํ staticํ์ผ ์ค์
๏ผ. ๋ฉ์ธ ํ๋ก์ ํธ ํ์ผ์ storages.py๋ฅผ ๋ง๋ค์ด ์ค๋ค.
django-storage[azure]
installํ๊ธฐ- requirements.txt์ ์ ์ด์ฃผ๊ธฐ
- INSTALLED_APP์๋ ์์ ์ด์ค๋ ๋๋ค.
#storages.py
from storages.backends.azure_storage import AzureStorage
class StaticAzureStorage(AzureStorage):
azure_container = "static"
๏ผ. settings/prod.py์์ STATICFILES_STORAGE ์ค์ ํ๋ค.
-DEBUG = Fasle์ผ ๊ฒฝ์ฐ ALLOWED_HOSTS๋ฅผ ๊ผญ ์ค์ ํด์ผ ํ๋ค.
# prod.py
import os
DEBUG = os.environ.get("DEBUG") in ["1", "t", "true", "T", "True"]
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",")
STATICFILES_STORAGE = "gstore.storages.StaticAzureStorage"
๏ผ. Azure Storages Accounts์์ staticํด๋ ๋ง๋ค๊ธฐ
์ด ๋ถ๋ถ์์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ ฅํด์ค์ผ ํ๋๋ฐ ์ฒ์์๋ ๋ชจ๋ key๋ค์ .jsonํ์ผ์ ๊ด๋ฆฌํด์
์ฌ์ฉํ๋๋ฐ ์ข์ง ์์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ค.
ํด๋๋ฅผ ๋ง๋ค๊ณ python manage.py collacticstatic --settings=project_name.settings.prod
์ ๋ช ๋ น์ด๋ก Azure Storages Accounts์ ํ์ฌ ํ๋ก์ ํธ ๋ด ๋ชจ๋ static ํ์ผ ๋ณต์ฌํด์ ๋ฃ๊ธฐ.
๐ Docker Image Build
๏ผ. Dockerfile ์์ฑ
- manage.py์ ๊ฐ์ ๊ฒฝ๋ก์ ์์ฑํด์ค๋ค.
FROM ubuntu:18.04
RUN apt-get update && \
apt-get install -y python3-pip && \
apt-get clean
RUN apt-get install -y libpq-dev
WORKDIR /code
ADD . /code
RUN pip3 install -r requirements.txt
ENV PYTHONUNBUFFERED=1
EXPOSE 80
CMD ["gunicorn", "gstore.wsgi:application", "--bind", "0.0.0.0:80"]
๋ค์์ ๋์ปค ๋ง์ด๊ทธ๋ ์ด์
๋ถ๋ถ์์ psycopg2
๋ชจ๋์ ์ฐพ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
๊ตฌ๊ธ๋ง ๊ฒฐ๊ณผ apt-get install -y libpq-dev
๋ฅผ ์์ฑํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
libpq์ ๋ํด์ postgreSQL Docs์์ ๊ฒ์ํด ๋ดค๋ค.
โlibpq๋ PostgreSQL์ ๋ํ C ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋จธ์ ์ธํฐํ์ด์ค์ ๋๋ค.
libpq๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ด PostgreSQL ๋ฐฑ์๋ ์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํ๊ณ
์ด๋ฌํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ ์๋๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ์ธํธโ ๋ผ๊ณ ํ๋ค.
๊ฒฐ๊ตญ ์ค๋ฅ์ ์์ธ์ ๋น๋ ๊ณผ์ ์ค์ postgresql library ํจํค์ง๊ฐ ํ์ํ๋ฐ,
์ด ํฉํค์ง๊ฐ ์์ด์ ๋น๋์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ libpq๋ฅผ
์ค์นํจ์ผ๋ก์จ psycopg2
๋ชจ๋ ๋น๋์ ํ์ํ library๋ฅผ ๋ค์ด ๋ฐ์ ๊ฒ์ด์๋ค.
๐ Azure PosetgreSQL + Docker migration
๏ผ. Azure Database for PostgreSQL servers
- ์ฌ๊ธฐ์ ๋ค์ด๊ฐ์ DB ์์ฑ
๏ผ. settings/prod.py์์ DB์ค์
DATABASES = {
"default": {
"ENGINE": os.environ["DB_ENGINE"],
"HOST": os.environ["DB_HOST"],
"USER": os.environ["DB_USER"],
"PASSWORD": os.environ["DB_PASSWORD"],
"NAME": os.environ["DB_NAME"],
},
}
๏ผ. Docker migration
docker run --rm --publish 9998:80
-e DJANGO_SETTINGS_MODULE=
-e AZURE_ACCOUNT_NAME=
-e AZURE_ACCOUNT_KEY=" "
-e ALLOWED_HOSTS=
-e DB_ENGINE=
-e DB_HOST=
-e DB_USER=
-e DB_PASSWORD=
-e DB_NAME=
-it name sh
docker shell์ ์ง์ ํ๋ค.
python3 manage.py showmigrations
๋ก ํ์ฌ ์ํ ํ์ธpython3 manage.py migarte
์งํsuperuser ์์ฑ
๐ Azure PaaS ์๋น์ค์ ๋ฐฐํฌ
๏ผ. Docker Hub์ Push
> docker login
> docker push username/imagename:1.0
๏ผ. Azure App Service
# Azure ๋ด๋ถ์์ VM์ ์ฌ์ฉํ๋ค.
> Publish : Doker Container
> OS : Linux
> Image Source : Docker Hub
๏ผ. ์ถ๊ฐ ์ค์ ์ฌํญ
> Properties์ ๋ค์ด๊ฐ๋ค.
> Virtual IP address์ Outbound IP address๋ฅผ ๋ณต์ฌํ๋ค.
> Connection security์ ๋ค์ด๊ฐ์ ๋ถํ๋ฃ๊ธฐ.
> Allow access to Azure services : YES