This commit is contained in:
Matej Maťkuliak 2021-04-04 02:17:49 +02:00
parent 916bd8bcb7
commit 11a4c2c01e
17 changed files with 253 additions and 0 deletions

11
z1/README.md Normal file
View File

@ -0,0 +1,11 @@
## Dockerizing Flask With Compose and Machine - From Localhost to the Cloud
Featuring:
- Docker v18.09.2
- Docker Compose v1.23.2
- Docker Machine v0.16.1
**Check out the awesome blog post here > https://realpython.com/blog/python/dockerizing-flask-with-compose-and-machine-from-localhost-to-the-cloud/**
Cheers!

46
z1/docker-compose.yml Normal file
View File

@ -0,0 +1,46 @@
version: '3'
services:
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- web-data:/usr/src/app/static
env_file:
- .env
command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app
nginx:
restart: always
build: ./nginx
ports:
- "80:80"
volumes:
- .:/www/static
- web-data:/usr/src/app/static
links:
- web:web
data:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
command: "true"
postgres:
restart: always
image: postgres:latest
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
db-data:
web-data:

5
z1/nginx/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY sites-enabled/ /etc/nginx/sites-enabled

View File

@ -0,0 +1,17 @@
server {
listen 80;
server_name example.org;
charset utf-8;
location /static {
alias /usr/src/app/static;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

10
z1/web/Dockerfile Normal file
View File

@ -0,0 +1,10 @@
FROM python:3.7-slim
RUN python -m pip install --upgrade pip
WORKDIR /usr/src/app
COPY requirements.txt requirements.txt
RUN python -m pip install -r requirements.txt
COPY . .

30
z1/web/app.py Normal file
View File

@ -0,0 +1,30 @@
# app.py
from flask import Flask
from flask import request, render_template
from flask_sqlalchemy import SQLAlchemy
from config import BaseConfig
app = Flask(__name__)
app.config.from_object(BaseConfig)
db = SQLAlchemy(app)
from models import *
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
text = request.form['text']
post = Post(text)
db.session.add(post)
db.session.commit()
posts = Post.query.order_by(Post.date_posted.desc()).all()
return render_template('index.html', posts=posts)
if __name__ == '__main__':
app.run()

28
z1/web/config.py Normal file
View File

@ -0,0 +1,28 @@
# config.py
import os
class BaseConfig(object):
SECRET_KEY = os.environ['SECRET_KEY']
DEBUG = os.environ['DEBUG']
DB_NAME = os.environ['DB_NAME']
DB_USER = os.environ['DB_USER']
DB_PASS = os.environ['DB_PASS']
DB_SERVICE = os.environ['DB_SERVICE']
DB_PORT = os.environ['DB_PORT']
SQLALCHEMY_DATABASE_URI = 'postgresql://{0}:{1}@{2}:{3}/{4}'.format(
DB_USER, DB_PASS, DB_SERVICE, DB_PORT, DB_NAME
)
# class BaseConfig(object):
# SECRET_KEY = 'hi'
# DEBUG = True
# DB_NAME = 'postgres'
# DB_SERVICE = 'localhost'
# DB_PORT = 5432
# SQLALCHEMY_DATABASE_URI = 'postgresql://{0}:{1}/{2}'.format(
# DB_SERVICE, DB_PORT, DB_NAME
# )

6
z1/web/create_db.py Normal file
View File

@ -0,0 +1,6 @@
# create_db.py
from app import db
db.create_all()

18
z1/web/models.py Normal file
View File

@ -0,0 +1,18 @@
# models.py
import datetime
from app import db
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.String, nullable=False)
date_posted = db.Column(db.DateTime, nullable=False)
def __init__(self, text):
self.text = text
self.date_posted = datetime.datetime.now()

9
z1/web/requirements.txt Normal file
View File

@ -0,0 +1,9 @@
Flask==1.0.2
Flask-SQLAlchemy==2.3.2
Jinja2==2.10
MarkupSafe==1.1.1
SQLAlchemy==1.3.1
Werkzeug==0.15.1
gunicorn==19.9.0
itsdangerous==1.1.0
psycopg2==2.7.7

5
z1/web/static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
/* custom styles */
.container {
max-width: 500px;
}

View File

@ -0,0 +1 @@

7
z1/web/static/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
z1/web/static/js/main.js Normal file
View File

@ -0,0 +1 @@
// custom scripts

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Flask on Docker</title>
<!-- meta -->
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- styles -->
<link href="static/css/bootstrap.min.css" rel="stylesheet">
<link href="static/css/main.css" rel="stylesheet">
{% block css %}{% endblock %}
</head>
<body>
<div class="container">
<br>
<!-- child template -->
{% block content %}{% endblock %}
</div>
<!-- scripts -->
<script src="//code.jquery.com/jquery-1.11.2.min.js" type="text/javascript"></script>
<script src="static/js/bootstrap.min.js" type="text/javascript"></script>
<script src="static/js/main.js" type="text/javascript"></script>
{% block js %}{% endblock %}
</body>
</html>

View File

@ -0,0 +1,27 @@
{% extends "_base.html" %}
{% block content %}
<div class="text-center">
<h1>Welcome!</h1>
</div>
<br>
<form action="/" method="POST">
<div class="form-group">
<input name="text" class="form-control input-lg" type="text" placeholder="Enter a message" required>
</div>
<input type="submit" class="btn btn-primary btn-lg btn-block" value="Submit">
</form>
<br>
<hr>
<div>
{% for post in posts %}
<h4 class="well"><strong>{{post.text}}</strong> - <em>{{post.date_posted.strftime('%Y-%m-%d')}}</em></h4>
{% endfor %}
</div>
{% endblock %}