Merge pull request #343 from openbikesensor/next-document-upgrade

Next document upgrade
This commit is contained in:
gluap 2023-06-19 20:41:36 +02:00 committed by GitHub
commit c897412f99
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 109 additions and 24 deletions

View file

@ -1,5 +1,28 @@
# Changelog # Changelog
## 0.8.0
### Features
* Bulk actions on users owned tracks (reprocess, download, make private, make public, delete) (#269, #38)
* Easy sorting by device for "multi-device users" (e.g. group lending out OBSes)
* Region display at higher zoom levels to easily find interesting areas (#112)
* Export of road statistics on top of the already-existing event statistics (#341)
### Improvements
* Refactored database access to hopefully combat portal crashes (#337)
* New infrastructure for map imports that makes import of larger maps possible on small VMs (#334)
* Reference current postgres and postgis versions in docker-compose.yaml files (#286)
* Configurable terms-and-conditions link (#320)
* French translation by @cbiteau (#303)
### Bug Fixes
* Logout not working (#285)
* Duplicate road usage hashes (#335, #253)
* cannot import name .... (#338)
## 0.7.0 ## 0.7.0
### Features ### Features

View file

@ -1,10 +1,33 @@
# Upgrading # Upgrading
This document describes the general steps to upgrade between major changes. This document describes the general steps to upgrade between major changes.
Simple migrations, e.g. for adding schema changes, are not documented Simple migrations, e.g. for adding schema changes, are not documented
explicitly. Their general usage is described in the [README](./README.md) (for explicitly. Their general usage is described in the [README](./README.md) (for
development) and [docs/production-deployment.md](docs/production-deployment.md) (for production). development) and [docs/production-deployment.md](docs/production-deployment.md) (for production).
## 0.8.0
Upgrade to `0.7.x` first. See below for details. Then follow these steps:
> **Warning** The update includes a reprocessing of tracks after import. Depending on the number of tracks this can take a few hours. The portal is reachable during that time but events disappear and incrementally reappear during reimport.
> **Info** With this version the import process for OpenStreetMap data has changed: the [new process](docs/osm-import.md) is easier on resources and finally permits to import a full country on a low-end VM.
- Do your [usual backup](docs/production-deployment.md)
- get the release in your source folder (``git pull; git checkout 0.8.0`` and update submodules ``git submodule update --recursive``)
- Rebuild images ``docker-compose build``
- Stop your portal and worker services ``docker-compose stop worker portal``
- run upgrade
```bash
docker-compose run --rm portal tools/upgrade.py
```
this automatically does the following
- Migration of database schema using alembic.
- Upgrade of SQL tile schema to new schema.
- Import the nuts-regions from the web into the database.
- Trigger a re-import of all tracks.
- Start your portal and worker services. ``docker-compose up -d worker portal``
## 0.7.0 ## 0.7.0
Upgrade to `0.6.x` first. See below for details. Then follow these steps: Upgrade to `0.6.x` first. See below for details. Then follow these steps:

View file

@ -88,7 +88,7 @@ async def mapdetails_road(req):
data, mask = arrays[:-1], arrays[-1] data, mask = arrays[:-1], arrays[-1]
data = data.astype(numpy.float64) data = data.astype(numpy.float64)
mask = mask.astype(numpy.bool) mask = mask.astype(bool)
def partition(arr, cond): def partition(arr, cond):
return arr[:, cond], arr[:, ~cond] return arr[:, cond], arr[:, ~cond]

View file

@ -71,10 +71,14 @@ async def import_osm(connection, filename, import_group=None):
# Pass 2: Import # Pass 2: Import
log.info("Pass 2: Import roads") log.info("Pass 2: Import roads")
amount = 0
for items in chunk(read_file(filename), 10000):
amount += 10000
log.info(f"...{amount}/{len(road_ids)} ({100*amount/len(road_ids)}%)")
async with cursor.copy( async with cursor.copy(
"COPY road (way_id, name, zone, directionality, oneway, geometry, import_group) FROM STDIN" "COPY road (way_id, name, zone, directionality, oneway, geometry, import_group) FROM STDIN"
) as copy: ) as copy:
for item in read_file(filename): for item in items:
await copy.write_row( await copy.write_row(
( (
item.way_id, item.way_id,

30
api/tools/reimport_tracks.py Executable file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env python3
import logging
import asyncio
from sqlalchemy import text
from obs.api.app import app
from obs.api.db import connect_db, make_session
log = logging.getLogger(__name__)
async def main():
logging.basicConfig(level=logging.DEBUG, format="%(levelname)s: %(message)s")
await reimport_tracks()
async def reimport_tracks():
async with connect_db(
app.config.POSTGRES_URL,
app.config.POSTGRES_POOL_SIZE,
app.config.POSTGRES_MAX_OVERFLOW,
):
async with make_session() as session:
await session.execute(text("UPDATE track SET processing_status = 'queued';"))
await session.commit()
if __name__ == "__main__":
asyncio.run(main())

View file

@ -1,14 +1,15 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import logging
import asyncio import asyncio
from alembic.config import Config import logging
from alembic import command
from os.path import join, dirname
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
from prepare_sql_tiles import prepare_sql_tiles, _run from prepare_sql_tiles import prepare_sql_tiles, _run
from import_regions import main as import_nuts
from reimport_tracks import main as reimport_tracks
async def _migrate(): async def _migrate():
await _run("alembic upgrade head") await _run("alembic upgrade head")
@ -20,7 +21,11 @@ async def main():
await _migrate() await _migrate()
log.info("Preparing SQL tiles...") log.info("Preparing SQL tiles...")
await prepare_sql_tiles() await prepare_sql_tiles()
log.info("Upgraded") log.info("Importing nuts regions...")
await import_nuts()
log.info("Nuts regions imported, scheduling reimport of tracks")
await reimport_tracks()
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -14,7 +14,7 @@ services:
############################################################ ############################################################
postgres: postgres:
image: "openmaptiles/postgis:6.0" image: "openmaptiles/postgis:7.0"
environment: environment:
- POSTGRES_DB=${OBS_POSTGRES_DB} - POSTGRES_DB=${OBS_POSTGRES_DB}
- POSTGRES_USER=${OBS_POSTGRES_USER} - POSTGRES_USER=${OBS_POSTGRES_USER}
@ -136,7 +136,7 @@ services:
- "traefik.docker.network=gateway" - "traefik.docker.network=gateway"
postgres-keycloak: postgres-keycloak:
image: postgres:13.3 image: postgres:15
restart: always restart: always
networks: networks:
- backend - backend

View file

@ -8,7 +8,7 @@ version: '3'
services: services:
postgres: postgres:
image: "openmaptiles/postgis:6.0" image: "openmaptiles/postgis:7.0"
environment: environment:
POSTGRES_USER: obs POSTGRES_USER: obs
POSTGRES_PASSWORD: obs POSTGRES_PASSWORD: obs