From 833f58dbfbe094e128e37be74fb9082d07bb91a8 Mon Sep 17 00:00:00 2001 From: Roland Date: Sun, 29 Jun 2025 18:38:32 -0600 Subject: [PATCH] Running alembic migrations whenever api container is started. --- alembic/env.py | 1 + docker-compose.prod.yml | 2 +- docker-compose.yml | 3 +- docker/api/Dockerfile | 20 +++++---- docker/api/alembic.ini | 89 ++++++++++++++++++++++++++++++++++++++++ docker/api/entrypoint.sh | 17 ++++++++ docker/app/Dockerfile | 24 ++++------- docker/push.sh | 1 + scripts/dev_build.sh | 2 - 9 files changed, 131 insertions(+), 28 deletions(-) create mode 100644 docker/api/alembic.ini create mode 100644 docker/api/entrypoint.sh diff --git a/alembic/env.py b/alembic/env.py index 751d50af..668edb72 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -1,4 +1,5 @@ import os +import sys from logging.config import fileConfig from alembic import context diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 7a2d4aa7..fff3da44 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -48,7 +48,7 @@ services: command: 'serve -s build -l 3000' map: - image: lrnselfreliance/wrolpi:wrolpi-map-latest + image: overv/openstreetmap-tile-server:v1.6.0 volumes: - openstreetmap_data:/var/lib/postgresql/12/main - openstreetmap_rendered_tiles:/var/lib/mod_tile diff --git a/docker-compose.yml b/docker-compose.yml index 274611c2..a4953efc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,6 @@ services: - './test:/opt/wrolpi/test' - './test:/media/wrolpi' - './alembic:/opt/wrolpi/alembic' - - './alembic.ini:/opt/wrolpi/alembic.ini' ports: - ${REACT_APP_API-0.0.0.0:8081}:8081 user: '${UID-1000}:${GID-1000}' @@ -58,7 +57,7 @@ services: - './app/src:/app/src' - './app/package.json:/app/package.json' - '.env:/app/.env' - command: 'npm run start' + command: 'serve -s build -l 3000' stdin_open: true healthcheck: test: [ 'CMD-SHELL', 'curl http://127.0.0.1:3000' ] diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index bbb38ba7..2bdddfc1 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -2,26 +2,30 @@ FROM python:3.11-buster ENV DOCKER=true WORKDIR /opt/wrolpi -# Update dependencies and install required packages. +# Update dependencies and install required packages RUN apt-get update && \ - apt-get install -y ffmpeg catdoc sysstat aria2 && \ + apt-get install -y ffmpeg catdoc sysstat aria2 postgresql-client && \ ffmpeg -version && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Create cache directory for yt-dlp. +# Create cache directory for yt-dlp RUN mkdir /.cache && chown -R 1000:1000 /.cache -# Install Python dependencies. +# Install Python dependencies COPY requirements.txt /opt/wrolpi/requirements.txt RUN pip3 install --no-cache-dir -r /opt/wrolpi/requirements.txt -# Copy WROLPi application files. +# Copy WROLPi application files COPY main.py /opt/wrolpi/ COPY wrolpi /opt/wrolpi/wrolpi COPY modules /opt/wrolpi/modules COPY alembic /opt/wrolpi/alembic -COPY alembic.ini /opt/wrolpi/alembic.ini +COPY docker/api/alembic.ini /opt/wrolpi/alembic.ini -ENTRYPOINT ["python3", "-OO", "/opt/wrolpi/main.py"] -CMD ["-v", "api", "--host", "0.0.0.0"] \ No newline at end of file +# Copy and set up entrypoint script +COPY docker/api/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# Use entrypoint script which will run alembic migrations before starting API. +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/docker/api/alembic.ini b/docker/api/alembic.ini new file mode 100644 index 00000000..d31e9b8d --- /dev/null +++ b/docker/api/alembic.ini @@ -0,0 +1,89 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat alembic/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = postgresql://postgres:wrolpi@db:5432/wrolpi + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/docker/api/entrypoint.sh b/docker/api/entrypoint.sh new file mode 100644 index 00000000..13f6bcae --- /dev/null +++ b/docker/api/entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +# Wait for PostgreSQL to be ready +echo "Waiting for PostgreSQL..." +until pg_isready -h db -p 5432 -U postgres; do + echo "PostgreSQL not ready, waiting..." + sleep 2 +done + +# Run Alembic migrations +echo "Running Alembic migrations..." +python3 -m alembic upgrade head + +# Start Sanic service +echo "Starting Sanic service..." +exec python3 -OO /opt/wrolpi/main.py -v api --host 0.0.0.0 diff --git a/docker/app/Dockerfile b/docker/app/Dockerfile index ed99f02b..a55a31fe 100644 --- a/docker/app/Dockerfile +++ b/docker/app/Dockerfile @@ -1,26 +1,20 @@ -# Build stage -FROM node:18-alpine AS builder +FROM node:18-alpine WORKDIR /app ENV PATH=/app/node_modules/.bin:$PATH +# Install serve and production dependencies +RUN npm install -g serve && \ + npm cache clean --force + # Copy package files and install production dependencies COPY app/package.json app/package-lock.json ./ -RUN npm ci --omit=dev +RUN npm ci --omit=dev && \ + npm cache clean --force # Copy source files and build COPY app/public ./public COPY app/src ./src RUN npm run build -# Runtime stage -FROM nginx:alpine -WORKDIR /usr/share/nginx/html - -# Copy static build from builder stage -COPY --from=builder /app/build ./ - -# Expose port -EXPOSE 80 - -# Run Nginx -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +# Serve the production build +CMD ["serve", "-s", "build", "-l", "3000"] diff --git a/docker/push.sh b/docker/push.sh index 439f9d95..df1f0aa0 100755 --- a/docker/push.sh +++ b/docker/push.sh @@ -9,6 +9,7 @@ IMAGES=( "lrnselfreliance/wrolpi:wrolpi-web-latest" "lrnselfreliance/wrolpi:wrolpi-zim-latest" "lrnselfreliance/wrolpi:wrolpi-help-latest" + "lrnselfreliance/wrolpi:wrolpi-map-latest" "lrnselfreliance/wrolpi:wrolpi-map_https-latest" "lrnselfreliance/wrolpi:wrolpi-zim_https-latest" "lrnselfreliance/wrolpi:wrolpi-help_https-latest" diff --git a/scripts/dev_build.sh b/scripts/dev_build.sh index 264acdee..e7769a46 100755 --- a/scripts/dev_build.sh +++ b/scripts/dev_build.sh @@ -6,6 +6,4 @@ docker volume create --name=openstreetmap-rendered-tiles git submodule update --init docker compose pull docker compose build --parallel -docker compose up -d db -docker compose run --rm api db upgrade docker compose stop