diff --git a/Pipfile b/Pipfile index 58ff5a8..6334632 100644 --- a/Pipfile +++ b/Pipfile @@ -5,9 +5,9 @@ name = "pypi" [packages] fastapi = "*" -uvicorn = {extras = ["standard"], version = "*"} +uvicorn = { extras = ["standard"], version = "*" } python-socketio = "*" -ormar = "==0.10.24" +ormar = { version = "==0.10.24", extras = ["sqlite", "postgresql"] } passlib = "*" python-jose = "*" alembic = "*" @@ -16,6 +16,7 @@ python-multipart = "*" pydantic = "*" redis = "==4.2.0rc1" aiohttp = "*" +gunicorn = { version = "*"} [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 018eff5..0f9538a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f83f361f3f8db4da566116470b809811c0d9194b6b4372669778e9e3ef7f251a" + "sha256": "6667340defc4a3152bca65e1359586067a229573e833d055c86a6ef800e64c15" }, "pipfile-spec": 6, "requires": { @@ -142,6 +142,37 @@ "markers": "python_version >= '3.6'", "version": "==4.0.2" }, + "asyncpg": { + "hashes": [ + "sha256:0a61fb196ce4dae2f2fa26eb20a778db21bbee484d2e798cb3cc988de13bdd1b", + "sha256:18d49e2d93a7139a2fdbd113e320cc47075049997268a61bfbe0dde680c55471", + "sha256:191fe6341385b7fdea7dbdcf47fd6db3fd198827dcc1f2b228476d13c05a03c6", + "sha256:1a70783f6ffa34cc7dd2de20a873181414a34fd35a4a208a1f1a7f9f695e4ec4", + "sha256:2633331cbc8429030b4f20f712f8d0fbba57fa8555ee9b2f45f981b81328b256", + "sha256:2bc197fc4aca2fd24f60241057998124012469d2e414aed3f992579db0c88e3a", + "sha256:4327f691b1bdb222df27841938b3e04c14068166b3a97491bec2cb982f49f03e", + "sha256:43cde84e996a3afe75f325a68300093425c2f47d340c0fc8912765cf24a1c095", + "sha256:52fab7f1b2c29e187dd8781fce896249500cf055b63471ad66332e537e9b5f7e", + "sha256:56d88d7ef4341412cd9c68efba323a4519c916979ba91b95d4c08799d2ff0c09", + "sha256:5e4105f57ad1e8fbc8b1e535d8fcefa6ce6c71081228f08680c6dea24384ff0e", + "sha256:63f8e6a69733b285497c2855464a34de657f2cccd25aeaeeb5071872e9382540", + "sha256:649e2966d98cc48d0646d9a4e29abecd8b59d38d55c256d5c857f6b27b7407ac", + "sha256:6f8f5fc975246eda83da8031a14004b9197f510c41511018e7b1bedde6968e92", + "sha256:72a1e12ea0cf7c1e02794b697e3ca967b2360eaa2ce5d4bfdd8604ec2d6b774b", + "sha256:739bbd7f89a2b2f6bc44cb8bf967dab12c5bc714fcbe96e68d512be45ecdf962", + "sha256:863d36eba4a7caa853fd7d83fad5fd5306f050cc2fe6e54fbe10cdb30420e5e9", + "sha256:a738f1b2876f30d710d3dc1e7858160a0afe1603ba16bf5f391f5316eb0ed855", + "sha256:a84d30e6f850bac0876990bcd207362778e2208df0bee8be8da9f1558255e634", + "sha256:acb311722352152936e58a8ee3c5b8e791b24e84cd7d777c414ff05b3530ca68", + "sha256:beaecc52ad39614f6ca2e48c3ca15d56e24a2c15cbfdcb764a4320cc45f02fd5", + "sha256:bf5e3408a14a17d480f36ebaf0401a12ff6ae5457fdf45e4e2775c51cc9517d3", + "sha256:bf6dc9b55b9113f39eaa2057337ce3f9ef7de99a053b8a16360395ce588925cd", + "sha256:ddb4c3263a8d63dcde3d2c4ac1c25206bfeb31fa83bd70fd539e10f87739dee4", + "sha256:f55918ded7b85723a5eaeb34e86e7b9280d4474be67df853ab5a7fa0cc7c6bf2", + "sha256:fe471ccd915b739ca65e2e4dbd92a11b44a5b37f2e38f70827a1c147dafe0fa8" + ], + "version": "==0.25.0" + }, "attrs": { "hashes": [ "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4", @@ -195,7 +226,7 @@ "sha256:081649da27ced5e75709a1ee542136eaba9842a0fe4c03da4fb0a3d3ed1f3c44", "sha256:e79351e032d0b606b98d38a4b0e6e2275b31a5b85c873e587cc11b73aca026d6" ], - "markers": "python_version >= '3.6' and python_version < '4.0'", + "markers": "python_version >= '3.6' and python_full_version < '4.0.0'", "version": "==2.2.0" }, "ecdsa": { @@ -348,6 +379,14 @@ "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==1.1.2" }, + "gunicorn": { + "hashes": [ + "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", + "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" + ], + "index": "pypi", + "version": "==20.1.0" + }, "h11": { "hashes": [ "sha256:70813c1135087a248a4d38cc0e1a0181ffab2188141a93eaf567940c3957ff06", @@ -513,6 +552,10 @@ "version": "==6.0.2" }, "ormar": { + "extras": [ + "postgresql", + "sqlite" + ], "hashes": [ "sha256:0ac7765bc14237cb4ed828c823cae3a4a9f5dea6daa402e0999c80b36662c410", "sha256:908eba2cb7350c5ef0c8e7d9653d061f357e2c7706b78298bd446e0848000762" @@ -536,6 +579,67 @@ "index": "pypi", "version": "==1.7.4" }, + "psycopg2-binary": { + "hashes": [ + "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7", + "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76", + "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa", + "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9", + "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004", + "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1", + "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094", + "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57", + "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af", + "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554", + "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232", + "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c", + "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b", + "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834", + "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2", + "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71", + "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460", + "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e", + "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4", + "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d", + "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d", + "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9", + "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f", + "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063", + "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478", + "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092", + "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c", + "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce", + "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1", + "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65", + "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e", + "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4", + "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029", + "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33", + "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39", + "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53", + "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307", + "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42", + "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35", + "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8", + "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb", + "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae", + "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e", + "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f", + "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba", + "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24", + "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca", + "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb", + "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef", + "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42", + "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1", + "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667", + "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272", + "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281", + "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e", + "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd" + ], + "version": "==2.9.3" + }, "pyasn1": { "hashes": [ "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", @@ -692,9 +796,17 @@ "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17", "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb" ], - "markers": "python_version >= '3.6' and python_version < '4.0'", + "markers": "python_version >= '3.6' and python_full_version < '4.0.0'", "version": "==4.8" }, + "setuptools": { + "hashes": [ + "sha256:2347b2b432c891a863acadca2da9ac101eae6169b1d3dfee2ec605ecd50dbfe5", + "sha256:e4f30b9f84e5ab3decf945113119649fec09c1fc3507c6ebffec75646c56e62b" + ], + "markers": "python_version >= '3.7'", + "version": "==60.9.3" + }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", diff --git a/classquiz/config.py b/classquiz/config.py index e1ea9ab..059d1bb 100644 --- a/classquiz/config.py +++ b/classquiz/config.py @@ -1,4 +1,4 @@ -from pydantic import BaseSettings, RedisDsn +from pydantic import BaseSettings, RedisDsn, PostgresDsn import redis.asyncio as redis_lib @@ -9,7 +9,7 @@ class Settings(BaseSettings): root_address: str = "http://127.0.0.1:8000" redis: RedisDsn = "redis://localhost:6379/0?decode_responses=True" skip_email_verification: bool = False - db_url: str = "sqlite:///classquiz.db" + db_url: str | PostgresDsn = "sqlite:///classquiz.db" hcaptcha_key: str mail_address: str mail_password: str diff --git a/classquiz/db/__init__.py b/classquiz/db/__init__.py index ff18e85..77383ea 100644 --- a/classquiz/db/__init__.py +++ b/classquiz/db/__init__.py @@ -3,4 +3,4 @@ import sqlalchemy from classquiz.config import settings database = databases.Database(settings.db_url) -metadata = sqlalchemy.MetaData() \ No newline at end of file +metadata = sqlalchemy.MetaData() diff --git a/frontend/package.json b/frontend/package.json index 6507d6b..84b68e6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,11 +9,13 @@ "check": "svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. .", + "run:prod": "node index.js" }, "devDependencies": { "@felte/validator-yup": "^1.0.1", "@sveltejs/adapter-auto": "next", + "@sveltejs/adapter-node": "^1.0.0-next.70", "@sveltejs/kit": "next", "@types/luxon": "^2.0.9", "@types/yup": "^0.29.13", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 3b9faa9..7baff1d 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -3,6 +3,7 @@ lockfileVersion: 5.3 specifiers: '@felte/validator-yup': ^1.0.1 '@sveltejs/adapter-auto': next + '@sveltejs/adapter-node': ^1.0.0-next.70 '@sveltejs/kit': next '@types/luxon': ^2.0.9 '@types/yup': ^0.29.13 @@ -34,6 +35,7 @@ specifiers: devDependencies: '@felte/validator-yup': 1.0.1_yup@0.32.11 '@sveltejs/adapter-auto': 1.0.0-next.30 + '@sveltejs/adapter-node': 1.0.0-next.70 '@sveltejs/kit': 1.0.0-next.288_svelte@3.46.4 '@types/luxon': 2.0.9 '@types/yup': 0.29.13 @@ -209,6 +211,12 @@ packages: tiny-glob: 0.2.9 dev: true + /@sveltejs/adapter-node/1.0.0-next.70: + resolution: {integrity: sha512-9EtqSTxVOipESyPQH8uVdkl+iSqsq3oRKS3RZoE2vAG9I849MuTTxr1g9L4kALbXaklsYRztwhmrLpTdcSM4vA==} + dependencies: + tiny-glob: 0.2.9 + dev: true + /@sveltejs/adapter-vercel/1.0.0-next.45: resolution: {integrity: sha512-WoOMu4FSWjVeRiPq2NKfdZhobfOLmDykObZmm8JHptMDb0/I5SB+6wstzAeaNtQr2ZbQkUy0k7EX95riJifEEQ==} dependencies: diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js index 1398542..a7d2c02 100644 --- a/frontend/svelte.config.js +++ b/frontend/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-node'; import preprocess from 'svelte-preprocess'; /** @type {import('@sveltejs/kit').Config} */ @@ -12,7 +12,10 @@ const config = { ], kit: { - adapter: adapter() + adapter: adapter({ + out: 'build', + precompress: true + }) } }; diff --git a/init_db.py b/init_db.py index ae85267..31e16ce 100644 --- a/init_db.py +++ b/init_db.py @@ -5,3 +5,4 @@ from classquiz.db import metadata engine = sqlalchemy.create_engine(settings.db_url) metadata.create_all(engine) +print("Database setup finished!")