aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile18
-rw-r--r--app/models.py4
-rw-r--r--boot.sh2
-rw-r--r--config.py10
-rw-r--r--migrations/versions/f3622e20dd86_initialize.py4
-rw-r--r--poetry.lock46
-rw-r--r--pyproject.toml1
7 files changed, 69 insertions, 16 deletions
diff --git a/Dockerfile b/Dockerfile
index d7e5ff6..b9abb92 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,12 @@
-FROM python:3.6-alpine
+FROM python:3.7-alpine
+
+RUN apk add gcc musl-dev libffi-dev openssl-dev
# This Dockerfile is based on:
# https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xix-deployment-on-docker-containers
-RUN adduser -D annotatechange
+RUN addgroup --gid 1024 mygroup
+RUN adduser --ingroup mygroup -D annotatechange
WORKDIR /home/annotatechange
@@ -20,7 +23,7 @@ ENV YOUR_ENV=${YOUR_ENV} \
RUN pip install "poetry==$POETRY_VERSION"
-COPY poetry.lock pyproject.toml /home/annotatechange
+COPY poetry.lock pyproject.toml /home/annotatechange/
RUN poetry config settings.virtualenvs.create false \
&& poetry install $(test "$YOUR_ENV" == production && echo "--no-dev") \
@@ -33,8 +36,13 @@ RUN chmod +x boot.sh
ENV FLASK_APP annotate_change.py
-RUN chown -R annotatechange:annotatechange ./
+RUN mkdir -p /home/annotatechange/instance
+VOLUME /home/annotatechange/instance
+
+RUN ls -lh /home/annotatechange/instance
+
+RUN chown -R annotatechange:mygroup /home/annotatechange
USER annotatechange
-EXPOSE 80
+EXPOSE 7831
ENTRYPOINT ["./boot.sh"]
diff --git a/app/models.py b/app/models.py
index 3bc394c..5016505 100644
--- a/app/models.py
+++ b/app/models.py
@@ -16,7 +16,7 @@ from app import login
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
- email = db.Column(db.String(), unique=True, nullable=False)
+ email = db.Column(db.String(256), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
last_active = db.Column(
db.DateTime(), nullable=False, default=datetime.datetime.utcnow
@@ -70,7 +70,7 @@ class User(UserMixin, db.Model):
class Dataset(db.Model):
id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(), unique=True, nullable=False)
+ name = db.Column(db.String(128), unique=True, nullable=False)
created = db.Column(
db.DateTime, nullable=False, default=datetime.datetime.utcnow
)
diff --git a/boot.sh b/boot.sh
index 7662566..93e64d2 100644
--- a/boot.sh
+++ b/boot.sh
@@ -13,4 +13,4 @@ while true; do
sleep 5
done
-exec gunicorn -b :80 --access-logfile - --error-logfile - annotate_change:app
+exec gunicorn -b :7831 --access-logfile - --error-logfile - annotate_change:app
diff --git a/config.py b/config.py
index 6ddf9fb..1823a54 100644
--- a/config.py
+++ b/config.py
@@ -17,11 +17,11 @@ class Config(object):
DB_TYPE = os.environ.get("DB_TYPE") or "sqlite3"
if DB_TYPE == "mysql":
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}".format(
- username=os.environ.get("MYSQL_USER"),
- password=os.environ.get("MYSQL_PASSWORD"),
- host=os.environ.get("MYSQL_HOST"),
- port=os.environ.get("MYSQL_PORT"),
- database=os.environ.get("MYSQL_DATABASE"),
+ username=os.environ.get("AC_MYSQL_USER"),
+ password=os.environ.get("AC_MYSQL_PASSWORD"),
+ host=os.environ.get("AC_MYSQL_HOST"),
+ port=os.environ.get("AC_MYSQL_PORT"),
+ database=os.environ.get("AC_MYSQL_DATABASE"),
)
else:
SQLALCHEMY_DATABASE_URI = "sqlite:///{filepath}".format(
diff --git a/migrations/versions/f3622e20dd86_initialize.py b/migrations/versions/f3622e20dd86_initialize.py
index 545ca5b..56475bd 100644
--- a/migrations/versions/f3622e20dd86_initialize.py
+++ b/migrations/versions/f3622e20dd86_initialize.py
@@ -20,7 +20,7 @@ def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('dataset',
sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('name', sa.String(), nullable=False),
+ sa.Column('name', sa.String(length=128), nullable=False),
sa.Column('created', sa.DateTime(), nullable=False),
sa.Column('md5sum', sa.String(length=32), nullable=False),
sa.PrimaryKeyConstraint('id'),
@@ -30,7 +30,7 @@ def upgrade():
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('username', sa.String(length=80), nullable=False),
- sa.Column('email', sa.String(), nullable=False),
+ sa.Column('email', sa.String(length=256), nullable=False),
sa.Column('password_hash', sa.String(length=128), nullable=False),
sa.Column('last_active', sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint('id'),
diff --git a/poetry.lock b/poetry.lock
index 3af79dc..007a034 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -13,6 +13,14 @@ python-dateutil = "*"
python-editor = ">=0.3"
[[package]]
+category = "main"
+description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP"
+name = "asn1crypto"
+optional = false
+python-versions = "*"
+version = "0.24.0"
+
+[[package]]
category = "dev"
description = "Atomic file writes."
name = "atomicwrites"
@@ -38,6 +46,17 @@ version = "1.4"
[[package]]
category = "main"
+description = "Foreign Function Interface for Python calling C code."
+name = "cffi"
+optional = false
+python-versions = "*"
+version = "1.12.2"
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+category = "main"
description = "Composable command line interface toolkit"
name = "click"
optional = false
@@ -55,6 +74,19 @@ version = "0.4.1"
[[package]]
category = "main"
+description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
+name = "cryptography"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "2.6.1"
+
+[package.dependencies]
+asn1crypto = ">=0.21.0"
+cffi = ">=1.8,<1.11.3 || >1.11.3"
+six = ">=1.4.1"
+
+[[package]]
+category = "main"
description = "DNS toolkit"
name = "dnspython"
optional = false
@@ -248,6 +280,14 @@ version = "1.8.0"
[[package]]
category = "main"
+description = "C parser in Python"
+name = "pycparser"
+optional = false
+python-versions = "*"
+version = "2.19"
+
+[[package]]
+category = "main"
description = "JSON Web Token implementation in Python"
name = "pyjwt"
optional = false
@@ -340,16 +380,19 @@ python-versions = "*"
version = "2.2.1"
[metadata]
-content-hash = "a9ea74089171860e4f80393ba29530ec1573224fa2ecbe951229caca3573397e"
+content-hash = "17221732a240b9e6bcae8517bb21e2032b8749962fe680f3dfba434f8aea1770"
python-versions = "^3.7"
[metadata.hashes]
alembic = ["505d41e01dc0c9e6d85c116d0d35dbb0a833dcb490bf483b75abeb06648864e8"]
+asn1crypto = ["2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87", "9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"]
atomicwrites = ["03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", "75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"]
attrs = ["69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", "f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"]
blinker = ["471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"]
+cffi = ["00b97afa72c233495560a0793cdc86c2571721b4271c0667addc83c417f3d90f", "0ba1b0c90f2124459f6966a10c03794082a2f3985cd699d7d63c4a8dae113e11", "0bffb69da295a4fc3349f2ec7cbe16b8ba057b0a593a92cbe8396e535244ee9d", "21469a2b1082088d11ccd79dd84157ba42d940064abbfa59cf5f024c19cf4891", "2e4812f7fa984bf1ab253a40f1f4391b604f7fc424a3e21f7de542a7f8f7aedf", "2eac2cdd07b9049dd4e68449b90d3ef1adc7c759463af5beb53a84f1db62e36c", "2f9089979d7456c74d21303c7851f158833d48fb265876923edcb2d0194104ed", "3dd13feff00bddb0bd2d650cdb7338f815c1789a91a6f68fdc00e5c5ed40329b", "4065c32b52f4b142f417af6f33a5024edc1336aa845b9d5a8d86071f6fcaac5a", "51a4ba1256e9003a3acf508e3b4f4661bebd015b8180cc31849da222426ef585", "59888faac06403767c0cf8cfb3f4a777b2939b1fbd9f729299b5384f097f05ea", "59c87886640574d8b14910840327f5cd15954e26ed0bbd4e7cef95fa5aef218f", "610fc7d6db6c56a244c2701575f6851461753c60f73f2de89c79bbf1cc807f33", "70aeadeecb281ea901bf4230c6222af0248c41044d6f57401a614ea59d96d145", "71e1296d5e66c59cd2c0f2d72dc476d42afe02aeddc833d8e05630a0551dad7a", "8fc7a49b440ea752cfdf1d51a586fd08d395ff7a5d555dc69e84b1939f7ddee3", "9b5c2afd2d6e3771d516045a6cfa11a8da9a60e3d128746a7fe9ab36dfe7221f", "9c759051ebcb244d9d55ee791259ddd158188d15adee3c152502d3b69005e6bd", "b4d1011fec5ec12aa7cc10c05a2f2f12dfa0adfe958e56ae38dc140614035804", "b4f1d6332339ecc61275bebd1f7b674098a66fea11a00c84d1c58851e618dc0d", "c030cda3dc8e62b814831faa4eb93dd9a46498af8cd1d5c178c2de856972fd92", "c2e1f2012e56d61390c0e668c20c4fb0ae667c44d6f6a2eeea5d7148dcd3df9f", "c37c77d6562074452120fc6c02ad86ec928f5710fbc435a181d69334b4de1d84", "c8149780c60f8fd02752d0429246088c6c04e234b895c4a42e1ea9b4de8d27fb", "cbeeef1dc3c4299bd746b774f019de9e4672f7cc666c777cd5b409f0b746dac7", "e113878a446c6228669144ae8a56e268c91b7f1fafae927adc4879d9849e0ea7", "e21162bf941b85c0cda08224dade5def9360f53b09f9f259adb85fc7dd0e7b35", "fb6934ef4744becbda3143d30c6604718871495a5e36c408431bf33d9c146889"]
click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"]
colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"]
+cryptography = ["066f815f1fe46020877c5983a7e747ae140f517f1b09030ec098503575265ce1", "210210d9df0afba9e000636e97810117dc55b7157c903a55716bb73e3ae07705", "26c821cbeb683facb966045e2064303029d572a87ee69ca5a1bf54bf55f93ca6", "2afb83308dc5c5255149ff7d3fb9964f7c9ee3d59b603ec18ccf5b0a8852e2b1", "2db34e5c45988f36f7a08a7ab2b69638994a8923853dec2d4af121f689c66dc8", "409c4653e0f719fa78febcb71ac417076ae5e20160aec7270c91d009837b9151", "45a4f4cf4f4e6a55c8128f8b76b4c057027b27d4c67e3fe157fa02f27e37830d", "48eab46ef38faf1031e58dfcc9c3e71756a1108f4c9c966150b605d4a1a7f659", "6b9e0ae298ab20d371fc26e2129fd683cfc0cfde4d157c6341722de645146537", "6c4778afe50f413707f604828c1ad1ff81fadf6c110cb669579dea7e2e98a75e", "8c33fb99025d353c9520141f8bc989c2134a1f76bac6369cea060812f5b5c2bb", "9873a1760a274b620a135054b756f9f218fa61ca030e42df31b409f0fb738b6c", "9b069768c627f3f5623b1cbd3248c5e7e92aec62f4c98827059eed7053138cc9", "9e4ce27a507e4886efbd3c32d120db5089b906979a4debf1d5939ec01b9dd6c5", "acb424eaca214cb08735f1a744eceb97d014de6530c1ea23beb86d9c6f13c2ad", "c8181c7d77388fe26ab8418bb088b1a1ef5fde058c6926790c8a0a3d94075a4a", "d4afbb0840f489b60f5a580a41a1b9c3622e08ecb5eec8614d4fb4cd914c4460", "d9ed28030797c00f4bc43c86bf819266c76a5ea61d006cd4078a93ebf7da6bfd", "e603aa7bb52e4e8ed4119a58a03b60323918467ef209e6ff9db3ac382e5cf2c6"]
dnspython = ["36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01", "f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"]
dominate = ["4076735c0745fe771e57b2313dbb4bfeec42731816ee23cee509f66e8912aa51", "4b9fd42d2824b79761799590697db45bf93daad511b130c50513af38da33df9b"]
email-validator = ["ddc4b5b59fa699bb10127adcf7ad4de78fde4ec539a072b104b8bb16da666ae5"]
@@ -369,6 +412,7 @@ markupsafe = ["00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"
more-itertools = ["0125e8f60e9e031347105eb1682cef932f5e97d7b9a1a28d9bf00c22a5daef40", "590044e3942351a1bdb1de960b739ff4ce277960f2425ad4509446dbace8d9d1"]
pluggy = ["19ecf9ce9db2fce065a7a0586e07cfb4ac8614fe96edf628a264b1c70116cf8f", "84d306a647cc805219916e62aab89caa97a33a1dd8c342e87a37f91073cd4746"]
py = ["64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", "dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"]
+pycparser = ["a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"]
pyjwt = ["5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e", "8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"]
pymysql = ["3943fbbbc1e902f41daf7f9165519f140c4451c179380677e6a848587042561a", "d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7"]
pytest = ["3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec", "e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"]
diff --git a/pyproject.toml b/pyproject.toml
index eebd710..a9d0d9d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,6 +17,7 @@ flask-bootstrap = "^3.3"
email_validator = "^1.0"
gunicorn = "^19.9"
pymysql = "^0.9.3"
+cryptography = "^2.6"
[tool.poetry.dev-dependencies]
pytest = "^3.0"