Skip to content

Commit

Permalink
Add Dockerfile
Browse files Browse the repository at this point in the history
  • Loading branch information
kuznetsov-m committed May 8, 2022
1 parent 840b95e commit 29bec82
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 2 deletions.
35 changes: 35 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
FROM python:3.9.12-buster

RUN adduser user

WORKDIR /home/flask_app

############################
# poetry
ENV POETRY_VERSION=1.1.13

RUN pip install "poetry==$POETRY_VERSION"

COPY poetry.lock pyproject.toml /home/flask_app/

RUN poetry config virtualenvs.create false \
&& poetry install --no-interaction --no-ansi
############################
# project files

COPY app app
COPY migrations migrations
COPY flask_app.py config.py boot.sh ./
RUN chmod +x boot.sh

ENV FLASK_APP flask_app.py

RUN chown -R user:user ./

############################

USER user

EXPOSE 5000

CMD [ "./boot.sh" ]
48 changes: 46 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# О проекте
### Заметки
- Используется самореферентные отношения (self-referential relationship) «многие ко многим» для отслеживания подписчиков.
- `flask-moment` (Moment.js) - для решения задачи отображения даты и времени в нужной time zone для пользователя на клиенте
Expand All @@ -8,5 +9,48 @@
Весь код, который взаимодействует с индексом Elasticsearch в модуле app/search.py.
Идея состоит в том, чтобы сохранить весь код Elasticsearch в этом модуле. Остальная часть приложения будет использовать функции в этом новом модуле для доступа к индексу и не будет иметь прямого доступа к Elasticsearch. Это важно, потому что если однажды я решу, что мне больше не нравится Elasticsearch и соберусь переключиться на другой движок, все, что мне нужно сделать, это перезаписать функции в этом одном модуле, и приложение будет продолжать работать по-прежнему.

### deployment
- добавить индекс в elasticsearch. Выполнить `Posts.reindex()`. Возможно перед этим потребуется вручную создать индекс `post`.
# Настройка приложения (переменные окружения)
Общие настройки:
```
SECRET_KEY=""
FLASK_ENV="development" / "production"
APP_SETTINGS="config.DevelopmentConfig" / "config.ProductionConfig"
FLASK_DEBUG= "1" / "0"
```

БД:
```
DATABASE_URL="postgresql://localhost/flask_app"
```

Для получения сообщений о сбоях на email:
```
MAIL_SERVER="smtp.googlemail.com"
MAIL_PORT="587"
MAIL_USE_TLS="1"
MAIL_USERNAME="[email protected]"
MAIL_PASSWORD="pass"
```

Elasticsearch
```
ELASTICSEARCH_URL=http://localhost:9200
```

# deployment
- добавить индекс в elasticsearch. Выполнить `Posts.reindex()`. Возможно перед этим потребуется вручную создать индекс `post`.

## Docker
Развертывание контейнера:
```
# Создание образа
docker build -t flask_app:latest .
# Создание и запук контейнера
# --name <name> создать контейнер с именем
# -d фоновый режим
# -p проброс порта
# -e <VAR_NAME>=<VAR_VALUE> задать переменную окружения
# название образа
docker run --name flask_app_container -d -p 8000:5000 -e SECRET_KEY="1234" -e APP_SETTINGS="config.DevelopmentConfig" -e FLASK_DEBUG="1" -e flask_app:latest
```
12 changes: 12 additions & 0 deletions boot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash
# this script is used to boot a Docker container

while true; do
flask db upgrade
if [[ "$?" == "0" ]]; then
break
fi
echo Deploy command failed, retrying in 5 secs...
sleep 5
done
exec gunicorn -b :5000 --access-logfile - --error-logfile - flask_app:app

0 comments on commit 29bec82

Please sign in to comment.