Skip to content

Commit d0ea0de

Browse files
committed
chore
1 parent e9a92fd commit d0ea0de

29 files changed

+209
-198
lines changed

.env/.dev-sample

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FLASK_DEBUG=1
22
FLASK_CONFIG=development
3-
DATABASE_URL=postgresql://flask_celery:flask_celery@db/flask_celery
3+
DATABASE_URL=postgresql+psycopg://flask_celery:flask_celery@db/flask_celery
44
SECRET_KEY=my_precious
55
CELERY_BROKER_URL=redis://redis:6379/0
66
CELERY_RESULT_BACKEND=redis://redis:6379/0
7-
SOCKETIO_MESSAGE_QUEUE=redis://redis:6379/0
7+
SOCKETIO_MESSAGE_QUEUE=redis://redis:6379/0

.env/.prod-sample

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
FLASK_DEBUG=0
22
FLASK_CONFIG=production
3-
DATABASE_URL=postgresql://flask_celery:flask_celery@db/flask_celery
3+
DATABASE_URL=postgresql+psycopg://flask_celery:flask_celery@db/flask_celery
44
SECRET_KEY=my_precious
55
CELERY_BROKER_URL=amqp://admin:admin@rabbitmq:5672/
66
CELERY_RESULT_BACKEND=redis://redis:6379/0

app.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
import eventlet
2-
eventlet.monkey_patch()
1+
import os
2+
if not os.environ.get('FLASK_RUN_FROM_CLI'):
3+
# avoid patching if running with flask shell
4+
import eventlet
5+
eventlet.monkey_patch()
36

47
from project import create_app, ext_celery, socketio
58

69
app = create_app()
10+
celery = ext_celery.celery
711

812

913
@app.route("/")
@@ -16,5 +20,6 @@ def hello_world():
1620
app,
1721
debug=True,
1822
use_reloader=True,
19-
host='0.0.0.0'
23+
host='0.0.0.0',
24+
allow_unsafe_werkzeug=True,
2025
)

compose/local/flask/Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
FROM python:3.9-slim-buster
1+
FROM python:3.11-slim-buster
22

33
ENV PYTHONUNBUFFERED 1
44
ENV PYTHONDONTWRITEBYTECODE 1
55

66
RUN apt-get update \
77
# dependencies for building Python packages
88
&& apt-get install -y build-essential \
9-
# psycopg2 dependencies
9+
# psycopg dependencies
1010
&& apt-get install -y libpq-dev \
1111
# Additional dependencies
1212
&& apt-get install -y telnet netcat \

compose/local/flask/entrypoint

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ postgres_ready() {
1111
python << END
1212
import sys
1313
14-
import psycopg2
14+
import psycopg
1515
import urllib.parse as urlparse
1616
import os
1717
@@ -23,14 +23,14 @@ host = url.hostname
2323
port = url.port
2424
2525
try:
26-
psycopg2.connect(
26+
psycopg.connect(
2727
dbname=dbname,
2828
user=user,
2929
password=password,
3030
host=host,
3131
port=port
3232
)
33-
except psycopg2.OperationalError:
33+
except psycopg.OperationalError:
3434
sys.exit(-1)
3535
sys.exit(0)
3636

compose/local/flask/start

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ set -o nounset
66

77
flask db upgrade
88
# flask run --host=0.0.0.0
9-
python app.py
9+
python app.py

compose/production/flask/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.9-slim-buster
1+
FROM python:3.11-slim-buster
22

33
ENV PYTHONUNBUFFERED 1
44
ENV PYTHONDONTWRITEBYTECODE 1

compose/production/flask/entrypoint

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ postgres_ready() {
1111
python << END
1212
import sys
1313
14-
import psycopg2
14+
import psycopg
1515
import urllib.parse as urlparse
1616
import os
1717
@@ -23,14 +23,14 @@ host = url.hostname
2323
port = url.port
2424
2525
try:
26-
psycopg2.connect(
26+
psycopg.connect(
2727
dbname=dbname,
2828
user=user,
2929
password=password,
3030
host=host,
3131
port=port
3232
)
33-
except psycopg2.OperationalError:
33+
except psycopg.OperationalError:
3434
sys.exit(-1)
3535
sys.exit(0)
3636

compose/production/nginx/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM nginx:1.23-alpine
1+
FROM nginx:1.27-alpine
22

33
RUN rm /etc/nginx/conf.d/default.conf
44
COPY nginx.conf /etc/nginx/conf.d

compose/production/nginx/nginx.conf

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ server {
2020
client_max_body_size 20M;
2121
}
2222
location /upload/ {
23-
alias /app/upload/;
23+
alias /app/uploadfiles/;
2424
}
2525

2626
location /socket.io {

docker-compose.prod.yml

+22-22
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ services:
2828
- db
2929

3030
db:
31-
image: postgres:14.0-alpine
31+
image: postgres:16.0-alpine
3232
volumes:
3333
- postgres_data:/var/lib/postgresql/data/
3434
environment:
@@ -87,28 +87,28 @@ services:
8787
- redis
8888
- db
8989

90-
# prometheus:
91-
# image: prom/prometheus
92-
# ports:
93-
# - 9090:9090
94-
# command:
95-
# - --config.file=/etc/prometheus/prometheus.yml
96-
# volumes:
97-
# - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
98-
# depends_on:
99-
# - cadvisor
100-
#
101-
# cadvisor:
102-
# image: gcr.io/cadvisor/cadvisor
103-
# container_name: cadvisor
104-
# volumes:
105-
# - /:/rootfs:ro
106-
# - /var/run:/var/run:rw
107-
# - /sys:/sys:ro
108-
# - /var/lib/docker/:/var/lib/docker:ro
109-
# - /var/run/docker.sock:/var/run/docker.sock:ro
90+
prometheus:
91+
image: prom/prometheus
92+
ports:
93+
- 9090:9090
94+
command:
95+
- --config.file=/etc/prometheus/prometheus.yml
96+
volumes:
97+
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
98+
depends_on:
99+
- cadvisor
100+
101+
cadvisor:
102+
image: gcr.io/cadvisor/cadvisor
103+
container_name: cadvisor
104+
volumes:
105+
- /:/rootfs:ro
106+
- /var/run:/var/run:rw
107+
- /sys:/sys:ro
108+
- /var/lib/docker/:/var/lib/docker:ro
109+
- /var/run/docker.sock:/var/run/docker.sock:ro
110110

111111
volumes:
112112
postgres_data:
113113
mediafiles:
114-
flower_db:
114+
flower_db:

docker-compose.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ services:
2323
- db
2424

2525
db:
26-
image: postgres:14-alpine
26+
image: postgres:16-alpine
2727
volumes:
2828
- postgres_data:/var/lib/postgresql/data/
2929
environment:
@@ -45,7 +45,7 @@ services:
4545
env_file:
4646
- .env/.dev-sample
4747
environment:
48-
- FLASK_APP=celery_app
48+
- FLASK_APP=celery_app # updated
4949
depends_on:
5050
- redis
5151
- db
@@ -61,7 +61,7 @@ services:
6161
env_file:
6262
- .env/.dev-sample
6363
environment:
64-
- FLASK_APP=celery_app
64+
- FLASK_APP=celery_app # updated
6565
depends_on:
6666
- redis
6767
- db
@@ -77,7 +77,7 @@ services:
7777
env_file:
7878
- .env/.dev-sample
7979
environment:
80-
- FLASK_APP=celery_app
80+
- FLASK_APP=celery_app # updated
8181
ports:
8282
- 5557:5555
8383
depends_on:

migrations/env.py

+25-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import with_statement
2-
31
import logging
42
from logging.config import fileConfig
53

@@ -16,14 +14,29 @@
1614
fileConfig(config.config_file_name)
1715
logger = logging.getLogger('alembic.env')
1816

17+
18+
def get_engine():
19+
try:
20+
# this works with Flask-SQLAlchemy<3 and Alchemical
21+
return current_app.extensions['migrate'].db.get_engine()
22+
except (TypeError, AttributeError):
23+
# this works with Flask-SQLAlchemy>=3
24+
return current_app.extensions['migrate'].db.engine
25+
26+
27+
def get_engine_url():
28+
try:
29+
return get_engine().url.render_as_string(hide_password=False).replace(
30+
'%', '%%')
31+
except AttributeError:
32+
return str(get_engine().url).replace('%', '%%')
33+
34+
1935
# add your model's MetaData object here
2036
# for 'autogenerate' support
2137
# from myapp import mymodel
2238
# target_metadata = mymodel.Base.metadata
23-
config.set_main_option(
24-
'sqlalchemy.url',
25-
str(current_app.extensions['migrate'].db.get_engine().url).replace(
26-
'%', '%%'))
39+
config.set_main_option('sqlalchemy.url', get_engine_url())
2740
target_db = current_app.extensions['migrate'].db
2841

2942
# other values from the config, defined by the needs of env.py,
@@ -77,14 +90,17 @@ def process_revision_directives(context, revision, directives):
7790
directives[:] = []
7891
logger.info('No changes in schema detected.')
7992

80-
connectable = current_app.extensions['migrate'].db.get_engine()
93+
conf_args = current_app.extensions['migrate'].configure_args
94+
if conf_args.get("process_revision_directives") is None:
95+
conf_args["process_revision_directives"] = process_revision_directives
96+
97+
connectable = get_engine()
8198

8299
with connectable.connect() as connection:
83100
context.configure(
84101
connection=connection,
85102
target_metadata=get_metadata(),
86-
process_revision_directives=process_revision_directives,
87-
**current_app.extensions['migrate'].configure_args
103+
**conf_args
88104
)
89105

90106
with context.begin_transaction():

migrations/versions/de643eb1222c_initial_migration.py renamed to migrations/versions/5d3d0f517ebc_initial_migration.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
"""Initial migration.
22
3-
Revision ID: de643eb1222c
3+
Revision ID: 5d3d0f517ebc
44
Revises:
5-
Create Date: 2022-12-16 22:47:33.117492
5+
Create Date: 2024-08-20 11:33:52.011904
66
77
"""
88
from alembic import op
99
import sqlalchemy as sa
1010

1111

1212
# revision identifiers, used by Alembic.
13-
revision = 'de643eb1222c'
13+
revision = '5d3d0f517ebc'
1414
down_revision = None
1515
branch_labels = None
1616
depends_on = None

migrations/versions/bcb268967ba0_.py renamed to migrations/versions/68dbe8572338_.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
"""empty message
22
3-
Revision ID: bcb268967ba0
4-
Revises: de643eb1222c
5-
Create Date: 2022-12-19 03:32:06.930018
3+
Revision ID: 68dbe8572338
4+
Revises: 5d3d0f517ebc
5+
Create Date: 2024-08-22 03:33:55.691590
66
77
"""
88
from alembic import op
99
import sqlalchemy as sa
1010

1111

1212
# revision identifiers, used by Alembic.
13-
revision = 'bcb268967ba0'
14-
down_revision = 'de643eb1222c'
13+
revision = '68dbe8572338'
14+
down_revision = '5d3d0f517ebc'
1515
branch_labels = None
1616
depends_on = None
1717

project/__init__.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from flask_celeryext import FlaskCeleryExt
55
from flask_migrate import Migrate
66
from flask_sqlalchemy import SQLAlchemy
7-
from flask_socketio import SocketIO
7+
from flask_socketio import SocketIO # new
88
from flask_wtf.csrf import CSRFProtect
99

1010
from project.celery_utils import make_celery
@@ -16,7 +16,7 @@
1616
migrate = Migrate()
1717
ext_celery = FlaskCeleryExt(create_celery_app=make_celery)
1818
csrf = CSRFProtect()
19-
socketio = SocketIO()
19+
socketio = SocketIO(engineio_logger=True) # new
2020

2121

2222
def create_app(config_name=None):
@@ -34,7 +34,7 @@ def create_app(config_name=None):
3434
migrate.init_app(app, db)
3535
ext_celery.init_app(app)
3636
csrf.init_app(app)
37-
socketio.init_app(app, message_queue=app.config['SOCKETIO_MESSAGE_QUEUE'])
37+
socketio.init_app(app, message_queue=app.config['SOCKETIO_MESSAGE_QUEUE']) # new
3838

3939
# register blueprints
4040
from project.users import users_blueprint

project/config.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class BaseConfig:
4949
)
5050

5151
CELERY_TASK_ROUTES = (route_task,)
52+
5253
UPLOADS_DEFAULT_DEST = str(BASE_DIR / 'upload')
5354

5455

@@ -71,7 +72,7 @@ class TestingConfig(BaseConfig):
7172

7273

7374
config = {
74-
"development": DevelopmentConfig,
75-
"production": ProductionConfig,
75+
'development': DevelopmentConfig,
76+
'production': ProductionConfig,
7677
'testing': TestingConfig
7778
}

project/tdd/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
tdd_blueprint = Blueprint('tdd', __name__, url_prefix='/tdd', template_folder='templates')
44

5-
from . import models, views # noqa
5+
from . import models, views # noq

0 commit comments

Comments
 (0)