Dockerize the application
This commit is contained in:
parent
5a82354b78
commit
7fad75fc08
8 changed files with 101 additions and 8 deletions
22
Dockerfile
Normal file
22
Dockerfile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM python:3.9.2-slim AS development
|
||||||
|
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
RUN pip install pymysql
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
WORKDIR /src/app
|
||||||
|
CMD python app.py db upgrade && \
|
||||||
|
python app.py runserver -h 0.0.0.0 -p 8000
|
||||||
|
|
||||||
|
FROM development AS production
|
||||||
|
|
||||||
|
RUN pip install waitress
|
||||||
|
|
||||||
|
CMD python app.py db upgrade && \
|
||||||
|
python wsgi.py
|
|
@ -1,11 +1,16 @@
|
||||||
"""An example for a Haldis config"""
|
"""An example for a Haldis config"""
|
||||||
# config
|
# import os
|
||||||
|
|
||||||
|
|
||||||
class Configuration:
|
class Configuration:
|
||||||
"Haldis configuration object"
|
"Haldis configuration object"
|
||||||
# pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
SQLALCHEMY_DATABASE_URI = "sqlite:///haldis.db"
|
SQLALCHEMY_DATABASE_URI = "sqlite:///haldis.db"
|
||||||
|
# MARIADB_HOST = os.environ.get("MARIADB_HOST")
|
||||||
|
# MARIADB_DB = os.environ.get("MARIADB_DATABASE")
|
||||||
|
# MARIADB_USER = os.environ.get("MARIADB_USER")
|
||||||
|
# MARIADB_PASS = os.environ.get("MARIADB_PASSWORD")
|
||||||
|
# SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MARIADB_USER}:{MARIADB_PASS}@{MARIADB_HOST}/{MARIADB_DB}"
|
||||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
HALDIS_ADMINS = []
|
HALDIS_ADMINS = []
|
||||||
|
|
|
@ -17,5 +17,8 @@ DATA_DIR = ROOT_DIR / "menus"
|
||||||
location_definitions: List[Location] = parse_all_directory(str(DATA_DIR))
|
location_definitions: List[Location] = parse_all_directory(str(DATA_DIR))
|
||||||
location_definitions.sort(key=lambda l: l.name)
|
location_definitions.sort(key=lambda l: l.name)
|
||||||
|
|
||||||
|
try:
|
||||||
proc = subprocess.run(["git", "rev-parse", "HEAD"], stdout=subprocess.PIPE, cwd=str(ROOT_DIR), check=True)
|
proc = subprocess.run(["git", "rev-parse", "HEAD"], stdout=subprocess.PIPE, cwd=str(ROOT_DIR), check=True)
|
||||||
location_definition_version = proc.stdout.decode().strip()
|
location_definition_version = proc.stdout.decode().strip()
|
||||||
|
except FileNotFoundError:
|
||||||
|
location_definition_version = ""
|
||||||
|
|
|
@ -43,7 +43,7 @@ def upgrade():
|
||||||
sa.Column("starttime", sa.DateTime(), nullable=True),
|
sa.Column("starttime", sa.DateTime(), nullable=True),
|
||||||
sa.Column("stoptime", sa.DateTime(), nullable=True),
|
sa.Column("stoptime", sa.DateTime(), nullable=True),
|
||||||
sa.Column("public", sa.Boolean(), nullable=True),
|
sa.Column("public", sa.Boolean(), nullable=True),
|
||||||
sa.ForeignKeyConstraint(["location_id"], ["location.id"]),
|
sa.ForeignKeyConstraint(["location_id"], ["location.id"], name="order_ibfk_1"),
|
||||||
sa.PrimaryKeyConstraint("id"),
|
sa.PrimaryKeyConstraint("id"),
|
||||||
)
|
)
|
||||||
op.create_table(
|
op.create_table(
|
||||||
|
@ -65,7 +65,7 @@ def upgrade():
|
||||||
sa.Column("extra", sa.String(length=254), nullable=True),
|
sa.Column("extra", sa.String(length=254), nullable=True),
|
||||||
sa.Column("name", sa.String(length=120), nullable=True),
|
sa.Column("name", sa.String(length=120), nullable=True),
|
||||||
sa.ForeignKeyConstraint(["order_id"], ["order.id"]),
|
sa.ForeignKeyConstraint(["order_id"], ["order.id"]),
|
||||||
sa.ForeignKeyConstraint(["product_id"], ["product.id"]),
|
sa.ForeignKeyConstraint(["product_id"], ["product.id"], name="order_item_ibfk_3"),
|
||||||
sa.ForeignKeyConstraint(["user_id"], ["user.id"]),
|
sa.ForeignKeyConstraint(["user_id"], ["user.id"]),
|
||||||
sa.PrimaryKeyConstraint("id"),
|
sa.PrimaryKeyConstraint("id"),
|
||||||
)
|
)
|
||||||
|
|
|
@ -112,14 +112,12 @@ def upgrade():
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Historical product data migrated, drop obsolete column and table
|
# Historical product data migrated, drop obsolete column and table
|
||||||
op.execute(text("ALTER TABLE order_item DROP FOREIGN KEY order_item_ibfk_3"))
|
op.drop_constraint("order_item_ibfk_3", "order_item", type_="foreignkey")
|
||||||
op.drop_column("order_item", "product_id")
|
op.drop_column("order_item", "product_id")
|
||||||
op.drop_table("product")
|
op.drop_table("product")
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------
|
||||||
# Migrate historical location data to orders
|
# Migrate historical location data to orders
|
||||||
|
|
||||||
op.execute(text("ALTER TABLE `order` DROP FOREIGN KEY order_ibfk_2"))
|
|
||||||
op.alter_column(
|
op.alter_column(
|
||||||
"order",
|
"order",
|
||||||
"location_id",
|
"location_id",
|
||||||
|
@ -157,6 +155,7 @@ def upgrade():
|
||||||
for query in chain(new_location_id, [location_name_from_location]):
|
for query in chain(new_location_id, [location_name_from_location]):
|
||||||
op.execute(query)
|
op.execute(query)
|
||||||
# Historical location data migrated, drop obsolete column and table
|
# Historical location data migrated, drop obsolete column and table
|
||||||
|
op.drop_constraint("order_ibfk_1", "order", type_="foreignkey")
|
||||||
op.drop_column("order", "legacy_location_id")
|
op.drop_column("order", "legacy_location_id")
|
||||||
op.drop_table("location")
|
op.drop_table("location")
|
||||||
|
|
||||||
|
|
16
app/wsgi.py
Normal file
16
app/wsgi.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
import sentry_sdk
|
||||||
|
from sentry_sdk.integrations.flask import FlaskIntegration
|
||||||
|
from waitress import serve
|
||||||
|
|
||||||
|
from app import create_app
|
||||||
|
from config import Configuration
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if Configuration.SENTRY_DSN:
|
||||||
|
sentry_sdk.init(
|
||||||
|
dsn=Configuration.SENTRY_DSN,
|
||||||
|
integrations=[FlaskIntegration()]
|
||||||
|
)
|
||||||
|
|
||||||
|
app, app_mgr = create_app()
|
||||||
|
serve(app_mgr, host="0.0.0.0", port=8000)
|
17
docker-compose.override.yml
Normal file
17
docker-compose.override.yml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
version: "3.4"
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
target: "development"
|
||||||
|
environment:
|
||||||
|
- MARIADB_DATABASE=haldis
|
||||||
|
- MARIADB_USER=haldis
|
||||||
|
- MARIADB_PASSWORD=haldis
|
||||||
|
volumes: ["$PWD:/src"]
|
||||||
|
database:
|
||||||
|
environment:
|
||||||
|
- MARIADB_DATABASE=haldis
|
||||||
|
- MARIADB_ROOT_PASSWORD=mariadb
|
||||||
|
- MARIADB_USER=haldis
|
||||||
|
- MARIADB_PASSWORD=haldis
|
31
docker-compose.yml
Normal file
31
docker-compose.yml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
version: "3.4"
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
target: production
|
||||||
|
restart: on-failure
|
||||||
|
depends_on: [database]
|
||||||
|
ports: ["8000:8000"]
|
||||||
|
environment:
|
||||||
|
- MARIADB_HOST=database
|
||||||
|
- MARIADB_DATABASE
|
||||||
|
- MARIADB_USER
|
||||||
|
- MARIADB_PASSWORD
|
||||||
|
networks: [haldis]
|
||||||
|
database:
|
||||||
|
image: mariadb:10.8
|
||||||
|
hostname: database
|
||||||
|
restart: on-failure
|
||||||
|
environment:
|
||||||
|
- MARIADB_DATABASE
|
||||||
|
- MARIADB_ROOT_PASSWORD
|
||||||
|
- MARIADB_USER
|
||||||
|
- MARIADB_PASSWORD
|
||||||
|
networks: [haldis]
|
||||||
|
volumes: [haldis_data:/var/lib/mysql]
|
||||||
|
networks:
|
||||||
|
haldis:
|
||||||
|
volumes:
|
||||||
|
haldis_data:
|
Loading…
Reference in a new issue