From 5b086bb55901ccaed26ce44f90037d5903e515c1 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 1 Sep 2020 14:57:03 +0100 Subject: [PATCH] Fix migration error when migrating from scratch --- README.md | 83 ++++++++++++++++++++++------ config.example.cfg | 4 +- migrations/versions/c141a63b2487_.py | 10 ---- migrations/versions/cb6ab141c522_.py | 3 +- 4 files changed, 68 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index a81a8ee..7943bad 100644 --- a/README.md +++ b/README.md @@ -4,31 +4,78 @@ Content database for Minetest mods, games, and more.\ Developed by rubenwardy, license GPLv3.0+. +## Getting started (debug/dev) + +Docker is the recommended way to develop and deploy ContentDB. + +1. Install `docker` and `docker-compose`. + + sudo apt install docker-ce docker-compose + +1. Copy `config.example.cfg` to `config.cfg`. + +2. Fill out `config.cfg` + 1. Set `SQLALCHEMY_DATABASE_URI` = "postgres://contentdb:password@db:5432/contentdb" + 2. Optionally, set the MAIL settings. + +3. (Optional) Set up GitHub integration + 1. Make a Github OAuth Client at : + 2. Homepage URL - `http://localhost:5123/` + 3. Authorization callback URL - `http://localhost:5123/user/github/callback/` + 4. Put client id and client secret in `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` in config.cfg. + +4. Create config.env: + + POSTGRES_USER=contentdb + POSTGRES_PASSWORD=password + POSTGRES_DB=contentdb + FLASK_DEBUG=1 + +5. Start docker images: + + docker-compose up --build + +6. Setup database: + + ./utils/run_migrations.sh + +8. (Optional) create initial data + 1. `./utils/bash.sh` + 2. Either `python setup.py -o` or `python setup.py -t` + 1. `-o` creates just the admin, and static data like tags, and licenses. + 2. `-t` will create test pacakges. + +9. View at . + The admin username is `rubenwardy` and the password is `tuckfrump`. + +In the future, starting CDB is as simple as: + + docker-compose up --build + +To hot/live update CDB whilst it is running, use: + + ./utils/reload.sh + +This will only work with python code and templates, it won't update tasks or config. + + ## How-tos -Note: you should first read one of the guides on the [Github repo wiki](https://github.com/minetest/contentdb/wiki) - ```sh -# Run celery worker -FLASK_CONFIG=../config.cfg celery -A app.tasks.celery worker - -# if sqlite -python utils/setup.py -t -rm db.sqlite && python setup.py -t && FLASK_CONFIG=../config.cfg FLASK_APP=app/__init__.py flask db stamp head - -# Create migration -FLASK_CONFIG=../config.cfg FLASK_APP=app/__init__.py flask db migrate -# Run migration -FLASK_CONFIG=../config.cfg FLASK_APP=app/__init__.py flask db upgrade - -# Enter docker -docker exec -it contentdb_app_1 bash - # Hot/live reload (only works with FLASK_DEBUG=1) ./utils/reload.sh -# Cold update a running version of CDB with minimal downtime +# Cold update a running version of CDB with minimal downtime (production) ./utils/update.sh + +# Enter docker +./utils/bash.sh + +# Run migrations +./utils/run_migrations.sh + +# Create new migration +./utils/create_migration.sh ``` ## Database diff --git a/config.example.cfg b/config.example.cfg index 860469a..b3a66e9 100644 --- a/config.example.cfg +++ b/config.example.cfg @@ -1,11 +1,11 @@ USER_APP_NAME = "ContentDB" -SERVER_NAME = "content.minetest.net" +SERVER_NAME = "localhost:5123" BASE_URL = "http://" + SERVER_NAME SECRET_KEY = "" WTF_CSRF_SECRET_KEY = "" -SQLALCHEMY_DATABASE_URI = "sqlite:///../db.sqlite" +SQLALCHEMY_DATABASE_URI = "postgres://contentdb:password@db:5432/contentdb" SQLALCHEMY_TRACK_MODIFICATIONS = False GITHUB_CLIENT_ID = "" diff --git a/migrations/versions/c141a63b2487_.py b/migrations/versions/c141a63b2487_.py index 571eef6..a5d7297 100644 --- a/migrations/versions/c141a63b2487_.py +++ b/migrations/versions/c141a63b2487_.py @@ -21,16 +21,6 @@ depends_on = None def upgrade(): op.add_column('package', sa.Column('downloads', sa.Integer(), nullable=False, server_default="0")) - bind = op.get_bind() - session = orm.Session(bind=bind) - - for package in session.query(Package).all(): - downloads_result = session.query(func.sum(PackageRelease.downloads)).filter_by(package_id=package.id).one_or_none() - downloads = 0 if not downloads_result or not downloads_result[0] else downloads_result[0] - package.downloads = downloads - - session.commit() - def downgrade(): # ### commands auto generated by Alembic - please adjust! ### diff --git a/migrations/versions/cb6ab141c522_.py b/migrations/versions/cb6ab141c522_.py index 33da88b..be0378b 100644 --- a/migrations/versions/cb6ab141c522_.py +++ b/migrations/versions/cb6ab141c522_.py @@ -31,8 +31,7 @@ def upgrade(): bind = op.get_bind() session = orm.Session(bind=bind) - for package in session.query(Package).all(): - package.maintainers.append(package.author) + op.execute('INSERT INTO maintainers (package_id, user_id) SELECT id, author_id FROM package;') session.commit()