From 6004d30d84f6a0789591e2a4bba2b52942d465a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannes=20H=C3=B6ke?= Date: Thu, 23 Jan 2020 13:28:28 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Deploy=20to=20Heroku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 49 ----- Pipfile | 9 +- Pipfile.lock | 420 +++++++++--------------------------- Procfile | 2 + app.json | 19 ++ app/main/custom_storages.py | 11 + app/main/settings.py | 105 +++------ app/zappa_settings.json | 45 ---- runtime.txt | 1 + 9 files changed, 177 insertions(+), 484 deletions(-) delete mode 100644 .travis.yml create mode 100644 Procfile create mode 100644 app.json create mode 100644 app/main/custom_storages.py delete mode 100644 app/zappa_settings.json create mode 100644 runtime.txt diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 683961a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -dist: xenial -language: python -sudo: false -python: -- '3.6' -env: - global: - - AWS_REGION=eu-central-1 - - STAGING_S3_BUCKET_NAME=newsforyou-static-staging - - PROD_S3_BUCKET_NAME=newsforyou-static-prod - - SECRET_KEY=a - - BOT_SERVICE_ENDPOINT=https://example.com/ -before_install: - - | - if [ "$TRAVIS_BRANCH" = "master" ]; then - for prefixed_envvar in ${!STAGING_*}; do - eval export ${prefixed_envvar#STAGING_}="${!prefixed_envvar}" - done - elif [ "$TRAVIS_BRANCH" = "production" ]; then - for prefixed_envvar in ${!PROD_*}; do - eval export ${prefixed_envvar#PROD_}="${!prefixed_envvar}" - done - fi -cache: pip -install: -- pip install pipenv -- pipenv sync --dev -script: -- echo "No tests :)" -deploy: -- provider: script - skip_cleanup: true - script: cd app && zappa update staging && zappa manage staging "migrate" && ./manage.py - collectstatic --noinput - on: - branch: master -- provider: script - skip_cleanup: true - script: cd app && zappa update prod && zappa manage prod "migrate" && ./manage.py - collectstatic --noinput - on: - branch: production -notifications: - slack: - secure: k04gHLr2jCikDDkxgh3XIOMS4h+f7OL4Gnao1LpueSFYmL19qp5q9gvtIpMPz7u5yGWQarD/FNoH5xM6Crm/4BLIDYYZtezaSEoRUGGqlGrx4ViTXCUVAlrV3V+8T+4KSJ4lzE0iwY0V3BrqyITHzyURnv3P5TirtyXQnf+HqUKd7AJqPPKswxGpSXVGXOkslzyz+qQsF6rGM31wF7W1fBnzhTmeDtWOlDglKSRnWhInDXfhdUCiEs4un0bmmlNFSo4vtCqa1FTlxbYJxosRFfQ3I1+ozFLdXzhFMjORq0HKjPYz7lygg/SZmEGq8hX/hfzjhi4LFIF3v0KVsmuheXiZeGDZvLn2OgvFC9SoSUSYmZyOW6SFnm5Xm2RCTCV01jYw9t0jY/wyu5dO6upNrEJh+tH5hzclQ/DUspWviAADpH9XQbf3od2U4fIDK3+ZuwXjAxiRg7luB5JRndGScOkcCsulrBzkwlvwPUmanWYDNIehYFmAydrqqZQnRql4LEYRROT5YghY/fCN1cGTNdB4wyPIxsSy2VNypsaHarWfd3UJzwqRHyGvOPub0qAtC9fqeaXrL06AWTCrA6YF4uNWF2EqGFaZ3FutA+IO/rKeu/0JFy7J+r2F2PDrowRCXAiqk1hgynba9+ZJzZTdRqGooxUwZwVhkFXlJ2FC4YY= - on_pull_requests: false - template: - - "Deployment %{result}:" - - "<%{compare_url}|%{repository_slug}:%{branch}#%{commit}> by %{author}" \ No newline at end of file diff --git a/Pipfile b/Pipfile index ac0e649..2fcbba3 100644 --- a/Pipfile +++ b/Pipfile @@ -10,7 +10,6 @@ djangorestframework = "*" django-emoji-picker = "*" django-filter = "*" django-tz-detect = "*" -"django-s3-storage" = "*" "psycopg2-binary" = "*" requests = "*" pillow = "*" @@ -18,9 +17,13 @@ pillow = "*" slackclient = "*" certifi = "*" idna-ssl = "*" +gunicorn = "*" +django-storages = "*" +whitenoise = "*" +raven = "*" +dj-database-url = "*" [dev-packages] -zappa = "*" [requires] -python_version = "3.6" +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index a3a0a64..4cee172 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "f8b0471e9eee84b0835cf7834f62828269da581b3ff72f0173464f60739523ed" + "sha256": "b6b05ccf8e7d28a53e5ac4538df1f171b9b0d25a3d5a80b45715da0edf3c2e58" }, "pipfile-spec": 6, "requires": { - "python_version": "3.6" + "python_version": "3.8" }, "sources": [ { @@ -49,18 +49,18 @@ }, "boto3": { "hashes": [ - "sha256:8a3b9bb731270888271cd3e0de8d96b35db86be55cfd47296087a074ff23ea86", - "sha256:e8f02208f0127dd73443b8518aacd8207563576e6f6b245a621fdf5080acd5fb" + "sha256:5222edc5b20d5c6ab7440fc4f89f987ead05be37ff5cc5359a3b9148d9b5a51e", + "sha256:bd3337cfc15613b0091fa567dc3065d94df88e5837ba1adbb1e35b91db728a66" ], "index": "pypi", - "version": "==1.10.40" + "version": "==1.11.7" }, "botocore": { "hashes": [ - "sha256:0f30d5f09181231166c4e74ba7335d0740e1645c4354d76271fde0cad606d8a4", - "sha256:7e44f4c527c11c90942b3ea32ef4577596b08e77d01ab3f9a260b4873402a84d" + "sha256:9a17d36ee43f1398c7db3cb29aa2216de94bcb60f058b1c645d71e72a330ddf8", + "sha256:e4b82b1a7389f3d16732eb839240c9d3e42470100d5a71415ea2a0a35b911b23" ], - "version": "==1.13.40" + "version": "==1.14.7" }, "certifi": { "hashes": [ @@ -77,13 +77,21 @@ ], "version": "==3.0.4" }, + "dj-database-url": { + "hashes": [ + "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163", + "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9" + ], + "index": "pypi", + "version": "==0.5.0" + }, "django": { "hashes": [ - "sha256:a4ad4f6f9c6a4b7af7e2deec8d0cbff28501852e5010d6c2dc695d3d1fae7ca0", - "sha256:fa98ec9cc9bf5d72a08ebf3654a9452e761fbb8566e3f80de199cbc15477e891" + "sha256:662a1ff78792e3fd77f16f71b1f31149489434de4b62a74895bd5d6534e635a5", + "sha256:687c37153486cf26c3fdcbdd177ef16de38dc3463f094b5f9c9955d91f277b14" ], "index": "pypi", - "version": "==2.2.8" + "version": "==2.2.9" }, "django-emoji-picker": { "hashes": [ @@ -101,19 +109,20 @@ "index": "pypi", "version": "==2.2.0" }, - "django-s3-storage": { + "django-s3direct": { "hashes": [ - "sha256:53c0d5a6b5064073246c120c67dbe011c16f27f77bd195573bccfd4c38756f83" + "sha256:37ecd7df9b391518a84bfeb2e75be50a39658326aa2dde979a1846c064e59978" ], "index": "pypi", - "version": "==0.13.0" + "version": "==1.1.5" }, - "django-s3direct": { + "django-storages": { "hashes": [ - "sha256:37ecd7df9b391518a84bfeb2e75be50a39658326aa2dde979a1846c064e59978" + "sha256:0a9b7e620e969fb0797523695329ed223bf540bbfdf6cd163b061fc11dab2d1c", + "sha256:9322ab74ba6371e2e0fccc350c741686ade829e43085597b26b07ae8955a0a00" ], "index": "pypi", - "version": "==1.1.5" + "version": "==1.8" }, "django-tz-detect": { "hashes": [ @@ -139,6 +148,14 @@ ], "version": "==0.15.2" }, + "gunicorn": { + "hashes": [ + "sha256:1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626", + "sha256:cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c" + ], + "index": "pypi", + "version": "==20.0.4" + }, "idna": { "hashes": [ "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", @@ -162,61 +179,53 @@ }, "multidict": { "hashes": [ - "sha256:09c19f642e055550c9319d5123221b7e07fc79bda58122aa93910e52f2ab2f29", - "sha256:0c1a5d5f7aa7189f7b83c4411c2af8f1d38d69c4360d5de3eea129c65d8d7ce2", - "sha256:12f22980e7ed0972a969520fb1e55682c9fca89a68b21b49ec43132e680be812", - "sha256:258660e9d6b52de1a75097944e12718d3aa59adc611b703361e3577d69167aaf", - "sha256:3374a23e707848f27b3438500db0c69eca82929337656fce556bd70031fbda74", - "sha256:503b7fce0054c73aa631cc910a470052df33d599f3401f3b77e54d31182525d5", - "sha256:6ce55f2c45ffc90239aab625bb1b4864eef33f73ea88487ef968291fbf09fb3f", - "sha256:725496dde5730f4ad0a627e1a58e2620c1bde0ad1c8080aae15d583eb23344ce", - "sha256:a3721078beff247d0cd4fb19d915c2c25f90907cf8d6cd49d0413a24915577c6", - "sha256:ba566518550f81daca649eded8b5c7dd09210a854637c82351410aa15c49324a", - "sha256:c42362750a51a15dc905cb891658f822ee5021bfbea898c03aa1ed833e2248a5", - "sha256:cf14aaf2ab067ca10bca0b14d5cbd751dd249e65d371734bc0e47ddd8fafc175", - "sha256:cf24e15986762f0e75a622eb19cfe39a042e952b8afba3e7408835b9af2be4fb", - "sha256:d7b6da08538302c5245cd3103f333655ba7f274915f1f5121c4f4b5fbdb3febe", - "sha256:e27e13b9ff0a914a6b8fb7e4947d4ac6be8e4f61ede17edffabd088817df9e26", - "sha256:e53b205f8afd76fc6c942ef39e8ee7c519c775d336291d32874082a87802c67c", - "sha256:ec804fc5f68695d91c24d716020278fcffd50890492690a7e1fef2e741f7172c" - ], - "version": "==4.7.1" + "sha256:13f3ebdb5693944f52faa7b2065b751cb7e578b8dd0a5bb8e4ab05ad0188b85e", + "sha256:26502cefa86d79b86752e96639352c7247846515c864d7c2eb85d036752b643c", + "sha256:4fba5204d32d5c52439f88437d33ad14b5f228e25072a192453f658bddfe45a7", + "sha256:527124ef435f39a37b279653ad0238ff606b58328ca7989a6df372fd75d7fe26", + "sha256:5414f388ffd78c57e77bd253cf829373721f450613de53dc85a08e34d806e8eb", + "sha256:5eee66f882ab35674944dfa0d28b57fa51e160b4dce0ce19e47f495fdae70703", + "sha256:63810343ea07f5cd86ba66ab66706243a6f5af075eea50c01e39b4ad6bc3c57a", + "sha256:6bd10adf9f0d6a98ccc792ab6f83d18674775986ba9bacd376b643fe35633357", + "sha256:83c6ddf0add57c6b8a7de0bc7e2d656be3eefeff7c922af9a9aae7e49f225625", + "sha256:93166e0f5379cf6cd29746989f8a594fa7204dcae2e9335ddba39c870a287e1c", + "sha256:9a7b115ee0b9b92d10ebc246811d8f55d0c57e82dbb6a26b23c9a9a6ad40ce0c", + "sha256:a38baa3046cce174a07a59952c9f876ae8875ef3559709639c17fdf21f7b30dd", + "sha256:a6d219f49821f4b2c85c6d426346a5d84dab6daa6f85ca3da6c00ed05b54022d", + "sha256:a8ed33e8f9b67e3b592c56567135bb42e7e0e97417a4b6a771e60898dfd5182b", + "sha256:d7d428488c67b09b26928950a395e41cc72bb9c3d5abfe9f0521940ee4f796d4", + "sha256:dcfed56aa085b89d644af17442cdc2debaa73388feba4b8026446d168ca8dad7", + "sha256:f29b885e4903bd57a7789f09fe9d60b6475a6c1a4c0eca874d8558f00f9d4b51" + ], + "version": "==4.7.4" }, "pillow": { "hashes": [ - "sha256:047d9473cf68af50ac85f8ee5d5f21a60f849bc17d348da7fc85711287a75031", - "sha256:0f66dc6c8a3cc319561a633b6aa82c44107f12594643efa37210d8c924fc1c71", - "sha256:12c9169c4e8fe0a7329e8658c7e488001f6b4c8e88740e76292c2b857af2e94c", - "sha256:248cffc168896982f125f5c13e9317c059f74fffdb4152893339f3be62a01340", - "sha256:27faf0552bf8c260a5cee21a76e031acaea68babb64daf7e8f2e2540745082aa", - "sha256:285edafad9bc60d96978ed24d77cdc0b91dace88e5da8c548ba5937c425bca8b", - "sha256:384b12c9aa8ef95558abdcb50aada56d74bc7cc131dd62d28c2d0e4d3aadd573", - "sha256:38950b3a707f6cef09cd3cbb142474357ad1a985ceb44d921bdf7b4647b3e13e", - "sha256:4aad1b88933fd6dc2846552b89ad0c74ddbba2f0884e2c162aa368374bf5abab", - "sha256:4ac6148008c169603070c092e81f88738f1a0c511e07bd2bb0f9ef542d375da9", - "sha256:4deb1d2a45861ae6f0b12ea0a786a03d19d29edcc7e05775b85ec2877cb54c5e", - "sha256:59aa2c124df72cc75ed72c8d6005c442d4685691a30c55321e00ed915ad1a291", - "sha256:5a47d2123a9ec86660fe0e8d0ebf0aa6bc6a17edc63f338b73ea20ba11713f12", - "sha256:5cc901c2ab9409b4b7ac7b5bcc3e86ac14548627062463da0af3b6b7c555a871", - "sha256:6c1db03e8dff7b9f955a0fb9907eb9ca5da75b5ce056c0c93d33100a35050281", - "sha256:7ce80c0a65a6ea90ef9c1f63c8593fcd2929448613fc8da0adf3e6bfad669d08", - "sha256:809c19241c14433c5d6135e1b6c72da4e3b56d5c865ad5736ab99af8896b8f41", - "sha256:83792cb4e0b5af480588601467c0764242b9a483caea71ef12d22a0d0d6bdce2", - "sha256:846fa202bd7ee0f6215c897a1d33238ef071b50766339186687bd9b7a6d26ac5", - "sha256:9f5529fc02009f96ba95bea48870173426879dc19eec49ca8e08cd63ecd82ddb", - "sha256:a423c2ea001c6265ed28700df056f75e26215fd28c001e93ef4380b0f05f9547", - "sha256:ac4428094b42907aba5879c7c000d01c8278d451a3b7cccd2103e21f6397ea75", - "sha256:b1ae48d87f10d1384e5beecd169c77502fcc04a2c00a4c02b85f0a94b419e5f9", - "sha256:bf4e972a88f8841d8fdc6db1a75e0f8d763e66e3754b03006cbc3854d89f1cb1", - "sha256:c6414f6aad598364aaf81068cabb077894eb88fed99c6a65e6e8217bab62ae7a", - "sha256:c710fcb7ee32f67baf25aa9ffede4795fd5d93b163ce95fdc724383e38c9df96", - "sha256:c7be4b8a09852291c3c48d3c25d1b876d2494a0a674980089ac9d5e0d78bd132", - "sha256:c9e5ffb910b14f090ac9c38599063e354887a5f6d7e6d26795e916b4514f2c1a", - "sha256:e0697b826da6c2472bb6488db4c0a7fa8af0d52fa08833ceb3681358914b14e5", - "sha256:e9a3edd5f714229d41057d56ac0f39ad9bdba6767e8c888c951869f0bdd129b0" + "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be", + "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946", + "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837", + "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f", + "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00", + "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d", + "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533", + "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a", + "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358", + "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda", + "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435", + "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2", + "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313", + "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff", + "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317", + "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2", + "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614", + "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0", + "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386", + "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9", + "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636", + "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865" ], "index": "pypi", - "version": "==6.2.1" + "version": "==7.0.0" }, "psycopg2-binary": { "hashes": [ @@ -258,11 +267,10 @@ }, "python-dateutil": { "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "markers": "python_version >= '2.7'", - "version": "==2.8.0" + "version": "==2.8.1" }, "pytz": { "hashes": [ @@ -271,6 +279,14 @@ ], "version": "==2019.3" }, + "raven": { + "hashes": [ + "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", + "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" + ], + "index": "pypi", + "version": "==6.10.0" + }, "requests": { "hashes": [ "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", @@ -281,17 +297,17 @@ }, "s3transfer": { "hashes": [ - "sha256:6efc926738a3cd576c2a79725fed9afde92378aa5c6a957e3af010cb019fac9d", - "sha256:b780f2411b824cb541dbcd2c713d0cb61c7d1bcadae204cdddda2b35cef493ba" + "sha256:248dffd2de2dfb870c507b412fc22ed37cd3255293e293c395158e7c55fbe5f9", + "sha256:80ed96731b3bd77395cd6197246069092015e1124164b2c152c8f741a823dd04" ], - "version": "==0.2.1" + "version": "==0.3.1" }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.13.0" + "version": "==1.14.0" }, "slackclient": { "hashes": [ @@ -308,22 +324,20 @@ ], "version": "==0.3.0" }, - "typing-extensions": { + "urllib3": { "hashes": [ - "sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2", - "sha256:910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d", - "sha256:cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "markers": "python_version < '3.7'", - "version": "==3.7.4.1" + "version": "==1.25.8" }, - "urllib3": { + "whitenoise": { "hashes": [ - "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", - "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73", + "sha256:62556265ec1011bd87113fb81b7516f52688887b7a010ee899ff1fd18fd22700" ], - "markers": "python_version >= '3.4'", - "version": "==1.25.7" + "index": "pypi", + "version": "==5.0.1" }, "yarl": { "hashes": [ @@ -348,233 +362,5 @@ "version": "==1.4.2" } }, - "develop": { - "argcomplete": { - "hashes": [ - "sha256:c079ceb0b72d4d4e03531ed77e6071babb9d42c3f790d7def2c41295b4990b44", - "sha256:d97b7f3cfaa4e494ad59ed6d04c938fc5ed69b590bd8f53274e258fb1119bd1b" - ], - "version": "==1.9.3" - }, - "boto3": { - "hashes": [ - "sha256:8a3b9bb731270888271cd3e0de8d96b35db86be55cfd47296087a074ff23ea86", - "sha256:e8f02208f0127dd73443b8518aacd8207563576e6f6b245a621fdf5080acd5fb" - ], - "index": "pypi", - "version": "==1.10.40" - }, - "botocore": { - "hashes": [ - "sha256:0f30d5f09181231166c4e74ba7335d0740e1645c4354d76271fde0cad606d8a4", - "sha256:7e44f4c527c11c90942b3ea32ef4577596b08e77d01ab3f9a260b4873402a84d" - ], - "version": "==1.13.40" - }, - "certifi": { - "hashes": [ - "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", - "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" - ], - "index": "pypi", - "version": "==2019.11.28" - }, - "cfn-flip": { - "hashes": [ - "sha256:40fc5e279fd99ebebec164b2b9e6f7b76f22e0ae42b3b48e45f70010bd082619", - "sha256:8ddd026cef53cd11a4a27e6dc239417a2bbf86587ba2e59fd6bf615ad8dec516" - ], - "version": "==1.2.2" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" - ], - "version": "==7.0" - }, - "docutils": { - "hashes": [ - "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", - "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", - "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" - ], - "version": "==0.15.2" - }, - "durationpy": { - "hashes": [ - "sha256:5ef9416b527b50d722f34655becfb75e49228eb82f87b855ed1911b3314b5408" - ], - "version": "==0.5" - }, - "future": { - "hashes": [ - "sha256:e39ced1ab767b5936646cedba8bcce582398233d6a627067d4c6a454c90cfedb" - ], - "version": "==0.16.0" - }, - "hjson": { - "hashes": [ - "sha256:1d1727faa6aaef2973921877125a3ab7c5f6d34b93233179d01770f41fab51f9" - ], - "version": "==3.0.1" - }, - "idna": { - "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" - ], - "version": "==2.8" - }, - "jmespath": { - "hashes": [ - "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", - "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" - ], - "version": "==0.9.4" - }, - "kappa": { - "hashes": [ - "sha256:4b5b372872f25d619e427e04282551048dc975a107385b076b3ffc6406a15833", - "sha256:4d6b7b3accce4a0aaaac92b36237a6304f0f2fffbbe3caea3f7c9f52d12c9989" - ], - "version": "==0.6.0" - }, - "lambda-packages": { - "hashes": [ - "sha256:b5e3b81ecef5f7c1b0903b5c40813536ba2343a33868a567e4e4ff1e26243406" - ], - "version": "==0.20.0" - }, - "placebo": { - "hashes": [ - "sha256:03157f8527bbc2965b71b88f4a139ef8038618b346787f20d63e3c5da541b047" - ], - "version": "==0.9.0" - }, - "python-dateutil": { - "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" - ], - "markers": "python_version >= '2.7'", - "version": "==2.8.0" - }, - "python-slugify": { - "hashes": [ - "sha256:57a385df7a1c6dbd15f7666eaff0ff29d3f60363b228b1197c5308ed3ba5f824", - "sha256:c3733135d3b184196fdb8844f6a74bbfb9cf6720d1dcce3254bdc434353f938f" - ], - "version": "==1.2.4" - }, - "pyyaml": { - "hashes": [ - "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", - "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", - "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", - "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", - "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", - "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", - "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", - "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", - "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", - "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", - "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" - ], - "version": "==5.2" - }, - "requests": { - "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" - ], - "index": "pypi", - "version": "==2.22.0" - }, - "s3transfer": { - "hashes": [ - "sha256:6efc926738a3cd576c2a79725fed9afde92378aa5c6a957e3af010cb019fac9d", - "sha256:b780f2411b824cb541dbcd2c713d0cb61c7d1bcadae204cdddda2b35cef493ba" - ], - "version": "==0.2.1" - }, - "six": { - "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" - ], - "version": "==1.13.0" - }, - "toml": { - "hashes": [ - "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", - "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" - ], - "version": "==0.10.0" - }, - "tqdm": { - "hashes": [ - "sha256:ba650e08b8b102923a05896bf9d7e1c9cdc20b484156df0511a4bbf1f6b6f89b", - "sha256:fa6d2ea6285f56e75d7efe9259805deadc450f16066a1f82ad0629ea9be2cd0f" - ], - "version": "==4.19.1" - }, - "troposphere": { - "hashes": [ - "sha256:fbf3592fb0559102e2abf15aa26cadbeced3390565ee294e6df0fb2d421bf759" - ], - "version": "==2.5.3" - }, - "unidecode": { - "hashes": [ - "sha256:1d7a042116536098d05d599ef2b8616759f02985c85b4fef50c78a5aaf10822a", - "sha256:2b6aab710c2a1647e928e36d69c21e76b453cd455f4e2621000e54b2a9b8cce8" - ], - "version": "==1.1.1" - }, - "urllib3": { - "hashes": [ - "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", - "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" - ], - "markers": "python_version >= '3.4'", - "version": "==1.25.7" - }, - "werkzeug": { - "hashes": [ - "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7", - "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4" - ], - "version": "==0.16.0" - }, - "wheel": { - "hashes": [ - "sha256:10c9da68765315ed98850f8e048347c3eb06dd81822dc2ab1d4fde9dc9702646", - "sha256:f4da1763d3becf2e2cd92a14a7c920f0f00eca30fdde9ea992c836685b9faf28" - ], - "version": "==0.33.6" - }, - "wsgi-request-logger": { - "hashes": [ - "sha256:445d7ec52799562f812006394d0b4a7064b37084c6ea6bd74ea7a2136c97ed83" - ], - "version": "==0.4.6" - }, - "zappa": { - "hashes": [ - "sha256:621209ceaf2cf5fcc18ed6bb6cf53aeb2315e38989a6929cbb49c66b5454d656", - "sha256:86b125c0e9696b177f61bf636ab19ead7aba1bb9281cdba0651825358337008e", - "sha256:b7a04172407cdb9277cb166b42920d3c5d745fd50204d1ce7f42769e61b6649e" - ], - "index": "pypi", - "version": "==0.48.2" - } - } + "develop": {} } diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..d5706f1 --- /dev/null +++ b/Procfile @@ -0,0 +1,2 @@ +web: gunicorn --chdir app main.wsgi --log-file - +release: python app/manage.py migrate diff --git a/app.json b/app.json new file mode 100644 index 0000000..eb912b5 --- /dev/null +++ b/app.json @@ -0,0 +1,19 @@ +{ + "name": "Infosforyou CMS", + "description": "This app is the CMS part of Infosforyou", + "repository": "https://github.com/wdr-data/wdrforyou-cms", + "success_url": "/admin", + "scripts": { + "postdeploy": "python app/manage.py migrate" + }, + "env": {}, + "addons": ["heroku-postgresql:hobby-dev"], + "buildpacks": [ + { + "url": "heroku/python" + }, + { + "url": "https://github.com/heroku/heroku-buildpack-locale" + } + ] +} diff --git a/app/main/custom_storages.py b/app/main/custom_storages.py new file mode 100644 index 0000000..cd5acdc --- /dev/null +++ b/app/main/custom_storages.py @@ -0,0 +1,11 @@ +import os +import uuid +from storages.backends.s3boto3 import S3Boto3Storage + + +class S3BotoRandomNameStorage(S3Boto3Storage): + def generate_filename(self, filename): + filename = super().generate_filename(filename) + extension = os.path.splitext(filename)[1] + path = os.path.dirname(filename) + return os.path.join(path, "%s%s") % (uuid.uuid4(), extension) diff --git a/app/main/settings.py b/app/main/settings.py index 7bccb7b..9bed735 100644 --- a/app/main/settings.py +++ b/app/main/settings.py @@ -11,11 +11,13 @@ """ import os - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +from urllib.parse import urlparse, unquote from os.path import splitext from uuid import uuid4 +import dj_database_url +import raven + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -38,9 +40,6 @@ if not DEBUG: SECURE_SSL_REDIRECT = True -AWS_LAMBDA = os.environ.get('SERVERTYPE') == 'AWS Lambda' -CI = os.environ.get('CI') - # Application definition INSTALLED_APPS = [ @@ -50,17 +49,19 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'django_s3_storage', # Static files + 'storages', 'cms.apps.CmsConfig', 'rest_framework', 'django_filters', 'tz_detect', 'rest_framework.authtoken', + 'raven.contrib.django.raven_compat', 'emoji_picker', 's3direct', ] MIDDLEWARE = [ + 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -102,16 +103,9 @@ } } -if AWS_LAMBDA: +if os.environ.get('DATABASE_URL') is not None: DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': os.environ['DB_NAME'], - 'USER': os.environ['DB_USER'], - 'PASSWORD': os.environ['DB_PASSWORD'], - 'HOST': os.environ['DB_HOST'], - 'PORT': '5432', - } + 'default': dj_database_url.config() } @@ -152,38 +146,27 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/ -if AWS_LAMBDA or CI: - S3_BUCKET_NAME = os.environ['S3_BUCKET_NAME'] - - DEFAULT_FILE_STORAGE = 'django_s3_storage.storage.S3Storage' - STATICFILES_STORAGE = 'django_s3_storage.storage.ManifestStaticS3Storage' - - AWS_S3_BUCKET_NAME = S3_BUCKET_NAME - AWS_S3_BUCKET_NAME_STATIC = S3_BUCKET_NAME - - # The AWS region to connect to. - AWS_REGION = "eu-central-1" - - # Config for s3direct - AWS_S3_REGION_NAME = "eu-central-1" - AWS_S3_ENDPOINT_URL = f'https://{S3_BUCKET_NAME}.s3-{AWS_S3_REGION_NAME}.amazonaws.com' - - # The AWS access key to use. - AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] - - # The AWS secret access key to use. - AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY'] - - AWS_S3_BUCKET_AUTH = False - - # Enable S3 file overwriting as temp fix for django-s3-storage - # (uploading processed images) - AWS_S3_FILE_OVERWRITE = True - +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL[1:]) + +STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' + +aws_url = os.environ.get('S3_MEDIA_URL') +if aws_url is not None: + aws_creds = urlparse(aws_url) + DEFAULT_FILE_STORAGE = 'main.custom_storages.S3BotoRandomNameStorage' + AWS_ACCESS_KEY_ID = unquote(aws_creds.username) + AWS_SECRET_ACCESS_KEY = unquote(aws_creds.password) + AWS_STORAGE_BUCKET_NAME = aws_creds.hostname + AWS_AUTO_CREATE_BUCKET = False + AWS_QUERYSTRING_AUTH = False + AWS_S3_REGION_NAME = 'eu-central-1' + AWS_S3_ENDPOINT_URL = f'https://s3.{AWS_S3_REGION_NAME}.amazonaws.com' + + custom_domain = os.environ.get('S3_CUSTOM_DOMAIN') + if custom_domain: + AWS_S3_CUSTOM_DOMAIN = custom_domain else: - STATIC_URL = '/static/' - STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL[1:]) - MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, MEDIA_URL[1:]) @@ -200,32 +183,14 @@ TZ_DETECT_COUNTRIES = ('DE', 'FR', 'GB', 'US', 'CN', 'IN', 'JP', 'BR', 'RU') +sentry_dsn = os.environ.get('SENTRY_DSN') -AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] -AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY'] - -AWS_STORAGE_BUCKET_NAME = os.environ['S3_BUCKET_NAME'] - -# The region of your bucket, more info: -# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region -S3DIRECT_REGION = 'eu-central-1' - -# Destinations, with the following keys: -# -# key [required] Where to upload the file to, can be either: -# 1. '/' = Upload to root with the original filename. -# 2. 'some/path' = Upload to some/path with the original filename. -# 3. functionName = Pass a function and create your own path/filename. -# key_args [optional] Arguments to be passed to 'key' if it's a function. -# auth [optional] An ACL function to whether the current Django user can perform this action. -# allowed [optional] List of allowed MIME types. -# acl [optional] Give the object another ACL rather than 'public-read'. -# cache_control [optional] Cache control headers, eg 'max-age=2592000'. -# content_disposition [optional] Useful for sending files as attachments. -# bucket [optional] Specify a different bucket for this particular object. -# server_side_encryption [optional] Encryption headers for buckets that require it. - +if sentry_dsn is not None: + RAVEN_CONFIG = { + 'dsn': sentry_dsn, + } +# S3Direct def generate_filename(fn): name, ext = splitext(fn) return f'{name}-{str(uuid4())}{ext}' diff --git a/app/zappa_settings.json b/app/zappa_settings.json deleted file mode 100644 index 26573c3..0000000 --- a/app/zappa_settings.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "dev": { - "aws_region": "eu-central-1", - "django_settings": "main.settings", - "project_name": "newsforyou-cms", - "runtime": "python3.6", - "keep_warm": false, - "s3_bucket": "newsforyou-zappa-jhoeke", - "remote_env": "s3://newsforyou-cms-config-jhoeke/master/env.json", - "vpc_config" : { - "SubnetIds": [ "subnet-6022fc1d", "subnet-e46ee8a9", "subnet-7d107616" ], - "SecurityGroupIds": [ "sg-0e6f12a560361382e" ] - } - }, - "staging": { - "aws_region": "eu-central-1", - "django_settings": "main.settings", - "project_name": "newsforyou-cms", - "runtime": "python3.6", - "keep_warm": true, - "s3_bucket": "newsforyou-zappa-staging", - "remote_env": "s3://newsforyou-cms-config/master/env.json", - "vpc_config" : { - "SubnetIds": [ "subnet-f93ff784", "subnet-ff209db2", "subnet-7c2abc17" ], - "SecurityGroupIds": [ "sg-05ba59e5bb294c372" ] - }, - "certificate_arn": "arn:aws:acm:us-east-1:801564247782:certificate/56c59a04-32ff-444f-9b28-f1ac1d9fe58e", - "domain": "staging.infosforyou.wdr.cloud" - }, - "prod": { - "aws_region": "eu-central-1", - "django_settings": "main.settings", - "project_name": "newsforyou-cms", - "runtime": "python3.6", - "keep_warm": true, - "s3_bucket": "newsforyou-zappa-prod", - "remote_env": "s3://newsforyou-cms-config/production/env.json", - "vpc_config" : { - "SubnetIds": [ "subnet-f93ff784", "subnet-ff209db2", "subnet-7c2abc17" ], - "SecurityGroupIds": [ "sg-05ba59e5bb294c372" ] - }, - "certificate_arn": "arn:aws:acm:us-east-1:801564247782:certificate/b80e94f2-bed9-474e-bec4-723b0e753234", - "domain": "infosforyou.wdr.cloud" - } -} \ No newline at end of file diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..3c3ceda --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.8.1 \ No newline at end of file