Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web container fixes and backups templates #301

Merged
merged 51 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
b17d416
Add osmcha container
Sep 5, 2023
218373d
Add chartpress config for osmcha
Sep 5, 2023
56bcee6
Update start point in osmcha
Sep 6, 2023
12b389f
Add osmcha database helm template
Sep 6, 2023
b04f998
Update osmcha db config
Sep 6, 2023
72553f6
Add helm template for osmcha-web
Sep 6, 2023
b720b2f
Rename files
Sep 6, 2023
0310df9
Update osmcha db helm template
Sep 11, 2023
0793f23
Update osmcha-web deployment template
Sep 11, 2023
ce23b13
Add osm server env var for osmcha
Sep 12, 2023
d653e17
Update OSMCha Dockerfile and start script
willemarcel Sep 12, 2023
6a15ed5
Remove pip uninstall command
willemarcel Sep 12, 2023
881151c
Update env vars for osmcha web
Sep 12, 2023
4437d4d
Update env var
Sep 12, 2023
9ed0dc9
Open port 81 for cgimap
Sep 12, 2023
8bc80ea
Fix service - web config
Sep 12, 2023
600fbd2
Add cgimap endpoint
Sep 12, 2023
a5dabc8
Update to web-cgimap endpoint
Sep 12, 2023
b46f555
Update cgimap endpoint
Sep 12, 2023
e804bd6
Build osmcha to ohm config + add env vars
willemarcel Oct 12, 2023
6c06e2c
Fix git clone url
willemarcel Oct 12, 2023
ef26116
Use npm install instead of yarn
willemarcel Oct 12, 2023
b16b7d4
Install yarnpkg and use it instead of npm
willemarcel Oct 12, 2023
0bd9da7
Try to fix error on yarn command
willemarcel Oct 13, 2023
a4da1da
Fix yarn instalation for osmcha
Oct 13, 2023
73eb8ae
Add extra osmcha env vars in deployent
Oct 13, 2023
3df2f57
Fix the path for static files - osmcha
Oct 16, 2023
1547f7e
Build osmcha app
Oct 16, 2023
5b6149a
Remove cgimap from web config
Oct 18, 2023
e000fb3
Add multiple backup database jobs
Oct 31, 2023
90b8fc9
Add supervisor + nginx
willemarcel Oct 31, 2023
3cd3302
Update docker container for backup db
Nov 1, 2023
9162957
Update Script to backup and restore db
Nov 1, 2023
994af82
Update path for bucket and env vars for backups db
Nov 1, 2023
18e8348
Change port for osmcha web
Nov 1, 2023
d606229
Add env vars for backups
Nov 1, 2023
f35b460
Update bakup db template
Nov 1, 2023
236fa2e
Add function to clean up backup older than x days
Nov 1, 2023
cc656c1
Update target port for osmcha
Nov 3, 2023
347c296
Update env vars for backup db
Nov 4, 2023
6f59175
Update log and config for backups
Nov 4, 2023
2a372ea
Add node selector for backups config
Nov 7, 2023
bf9aacf
Raising shared memory limit for web api
Nov 13, 2023
1062be1
Install wget for db-bakups container
Nov 18, 2023
494a27b
Store results of restoring db
Nov 19, 2023
3796c2c
Fix name for backup
Nov 19, 2023
5a34712
Set file name
Nov 19, 2023
30b90ca
osm-seed/values.yaml
Nov 22, 2023
a69715d
Add sharedMemorySize for db
Nov 22, 2023
ccedaed
Remove comment
Nov 22, 2023
a1443d4
Add liveness using bash
Dec 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 46 additions & 42 deletions chartpress.yaml
Original file line number Diff line number Diff line change
@@ -1,44 +1,48 @@
charts:
- name: osm-seed
imagePrefix: developmentseed/osmseed-
repo:
git: developmentseed/osm-seed-chart
published: https://devseed.com/osm-seed-chart
- name: osm-seed
imagePrefix: developmentseed/osmseed-
repo:
git: developmentseed/osm-seed-chart
published: https://devseed.com/osm-seed-chart

images:
web:
valuesPath: web.image
db:
valuesPath: db.image
backup-restore:
valuesPath: dbBackupRestore.image
planet-dump:
valuesPath: planetDump.image
full-history:
valuesPath: fullHistory.image
replication-job:
valuesPath: replicationJob.image
populate-apidb:
valuesPath: populateApidb.image
osm-processor:
valuesPath: osmProcessor.image
tiler-db:
valuesPath: tilerDb.image
tiler-imposm:
valuesPath: tilerImposm.image
tiler-server:
valuesPath: tilerServer.image
tasking-manager-api:
valuesPath: tmApi.image
# tiler-visor:
# valuesPath: tilerVisor.image
nominatim:
valuesPath: nominatimApi.image
overpass-api:
valuesPath: overpassApi.image
taginfo:
valuesPath: taginfo.image
osm-simple-metrics:
valuesPath: osmSimpleMetrics.image
changeset-replication-job:
valuesPath: changesetReplicationJob.image
images:
web:
valuesPath: web.image
db:
valuesPath: db.image
backup-restore:
valuesPath: dbBackupRestore.image
planet-dump:
valuesPath: planetDump.image
full-history:
valuesPath: fullHistory.image
replication-job:
valuesPath: replicationJob.image
populate-apidb:
valuesPath: populateApidb.image
osm-processor:
valuesPath: osmProcessor.image
tiler-db:
valuesPath: tilerDb.image
tiler-imposm:
valuesPath: tilerImposm.image
tiler-server:
valuesPath: tilerServer.image
tasking-manager-api:
valuesPath: tmApi.image
# tiler-visor:
# valuesPath: tilerVisor.image
nominatim:
valuesPath: nominatimApi.image
overpass-api:
valuesPath: overpassApi.image
taginfo:
valuesPath: taginfo.image
osm-simple-metrics:
valuesPath: osmSimpleMetrics.image
changeset-replication-job:
valuesPath: changesetReplicationJob.image
osmcha-web:
valuesPath: osmchaWeb.image
osmcha-db:
valuesPath: osmchaDb.image
9 changes: 5 additions & 4 deletions compose/db-backup-restore.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ services:
context: ../images/backup-restore
dockerfile: Dockerfile
volumes:
- ../data/db-backup-restore-data:/mnt/data
- ../data/db-backup-restore-data:/mnt/data
command: >
/bin/bash -c "
echo 'Set cron job for backing up DB, every 4 minutes';
while :; do echo 'Creating DB backup...'; /start.sh; sleep 4m; done;
"
env_file:
- ../envs/.env.db
- ../envs/.env.db-utils
- ../envs/.env.cloudprovider
- ../envs/.env.db
- ../envs/.env.osmcha
- ../envs/.env.db-utils
- ../envs/.env.cloudprovider
24 changes: 24 additions & 0 deletions compose/osmcha.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
version: '3'
services:
osmcha-db:
platform: linux/amd64
image: osmseed-osmcha-db:v1
build:
context: ../images/osmcha-db
dockerfile: Dockerfile
ports:
- '5432:5432'
volumes:
- ../data/osmcha-db-data:/var/lib/postgresql/data
env_file:
- ../envs/.env.osmcha
osmcha-web:
platform: linux/amd64
image: osmseed-osmcha-web:v1
build:
context: ../images/osmcha-web
dockerfile: Dockerfile
ports:
- '8000:8000'
env_file:
- ../envs/.env.osmcha
24 changes: 24 additions & 0 deletions envs/.env.osmcha.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
POSTGRES_DB=osmcha
POSTGRES_USER=postgres
POSTGRES_PASSWORD=1234
PGHOST=osmcha-db
DJANGO_DEBUG=true
DJANGO_SECRET_KEY=abc
OAUTH_OSM_KEY=xya
OAUTH_OSM_SECRET=xya
DJANGO_ANON_USER_THROTTLE_RATE=30/min
DJANGO_COMMON_USER_THROTTLE_RATE=180/min
DJANGO_NON_STAFF_USER_THROTTLE_RATE=3/min
OSMCHA_URL=public-url
OAUTH_REDIRECT_URI=$OSMCHA_URL/oauth-landing.html
DJANGO_ENABLE_CHANGESET_COMMENTS=False
DJANGO_OSM_COMMENTS_API_KEY=""
DJANGO_ROOT=/app
DJANGO_SETTINGS_MODULE=config.settings.local
C_FORCE_ROOT=True
REACT_APP_OSM_URL=https://www.openhistoricalmap.org
REACT_APP_OSM_API=https://www.openhistoricalmap.org/api/0.6
REACT_APP_OVERPASS_BASE=https://overpass-api.openhistoricalmap.org/api/interpreter
REACT_APP_NOMINATIM_URL=https://www.openhistoricalmap.org/geocoder/search_osm_nominatim
REACT_APP_PRODUCTION_API_URL=$OSMCHA_URL/api/v1
REACT_APP_MAPBOX_ACCESS_TOKEN=''
30 changes: 17 additions & 13 deletions images/backup-restore/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
FROM python:3.9.9
RUN apt-get update
RUN apt-get install -y \
curl \
postgresql-client
FROM python:3.9.9-slim

# Install AWS CLI
RUN pip install awscli
# Install Postgres client, GCP CLI, and Azure CLI
RUN apt-get update \
&& apt-get install -y curl apt-transport-https lsb-release gnupg \
&& echo "deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
&& curl -L https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
&& curl -sL https://aka.ms/InstallAzureCLIDeb | bash \
&& apt-get update \
&& apt-get install -y postgresql-client-14 wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# Install GCP CLI
RUN curl -sSL https://sdk.cloud.google.com | bash
RUN ln -f -s /root/google-cloud-sdk/bin/gsutil /usr/bin/gsutil
RUN curl -sSL https://sdk.cloud.google.com | bash \
&& ln -f -s /root/google-cloud-sdk/bin/gsutil /usr/bin/gsutil
RUN rm -rf /root/google-cloud-sdk/.install/.backup

# Install Azure CLI
RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash
# Install AWS CLI
RUN pip install awscli

VOLUME /mnt/data
COPY ./start.sh /
CMD /start.sh
CMD ["/start.sh"]
152 changes: 99 additions & 53 deletions images/backup-restore/start.sh
Original file line number Diff line number Diff line change
@@ -1,65 +1,111 @@
#!/usr/bin/env bash
set -e
export PGPASSWORD=$POSTGRES_PASSWORD
export VOLUME_DIR=/mnt/data
# Upload files
cloudStorageOps() {
local LOCAL_STATE_FILE=state.txt
local filepath=$1
local cloudpath=$2

date=$(date '+%y%m%d_%H%M')
local_backupFile=$VOLUME_DIR/osmseed-db-${date}.sql.gz
cloud_backupFile=database/osmseed-db-${date}.sql.gz
stateFile=$VOLUME_DIR/state.txt
restoreFile=$VOLUME_DIR/backup.sql.gz

echo "Start...$DB_ACTION action"
# Backing up DataBase
if [ "$DB_ACTION" == "backup" ]; then
# Backup database and make maximum compression at the slowest speed
pg_dump -h $POSTGRES_HOST -U $POSTGRES_USER $POSTGRES_DB | gzip -9 >$local_backupFile

# AWS
if [ "$CLOUDPROVIDER" == "aws" ]; then
echo "$AWS_S3_BUCKET/$cloud_backupFile" > $stateFile
# Upload db backup file
aws s3 cp $local_backupFile $AWS_S3_BUCKET/$cloud_backupFile
# Upload state.txt file
aws s3 cp $stateFile $AWS_S3_BUCKET/database/state.txt
fi

# GCP
if [ "$CLOUDPROVIDER" == "gcp" ]; then
echo "$GCP_STORAGE_BUCKET/$cloud_backupFile" > $stateFile
# Upload db backup file
gsutil cp $local_backupFile $GCP_STORAGE_BUCKET/$cloud_backupFile
# Upload state.txt file
gsutil cp $stateFile $GCP_STORAGE_BUCKET/database/state.txt
fi

# Azure
if [ "$CLOUDPROVIDER" == "azure" ]; then
# Save the path file
echo "blob://$AZURE_STORAGE_ACCOUNT/$AZURE_CONTAINER_NAME/$cloud_backupFile" > $stateFile
# Upload db backup file
case "${CLOUDPROVIDER}" in
aws)
aws s3 cp ${filepath} s3://${AWS_S3_BUCKET}/${cloudpath}
echo s3://${AWS_S3_BUCKET}/${cloudpath} >${LOCAL_STATE_FILE}
aws s3 cp ${LOCAL_STATE_FILE} s3://${AWS_S3_BUCKET}/${BACKUP_CLOUD_FOLDER}/state.txt
;;
gcp)
gsutil cp ${filepath} gs://${GCP_STORAGE_BUCKET}/${cloudpath}
echo "gs://${GCP_STORAGE_BUCKET}/${CLOUD_BACKUP_FILE}" >${LOCAL_STATE_FILE}
gsutil cp ${LOCAL_STATE_FILE} gs://${GCP_STORAGE_BUCKET}/${BACKUP_CLOUD_FOLDER}/state.txt
;;
azure)
az storage blob upload \
--container-name $AZURE_CONTAINER_NAME \
--file $local_backupFile \
--name $cloud_backupFile \
--container-name ${AZURE_CONTAINER_NAME} \
--file ${filepath} \
--name ${cloudpath} \
--output table
# Upload state.txt file
echo "blob://${AZURE_STORAGE_ACCOUNT}/${AZURE_CONTAINER_NAME}/${CLOUD_BACKUP_FILE}" >${LOCAL_STATE_FILE}
az storage blob upload \
--container-name $AZURE_CONTAINER_NAME \
--file $stateFile \
--name database/state.txt \
--container-name ${AZURE_CONTAINER_NAME} \
--file ${LOCAL_STATE_FILE} \
--name ${BACKUP_CLOUD_FOLDER}/state.txt \
--output table
;;
esac
}

backupDB() {
local LOCAL_BACKUP_FILE=${BACKUP_CLOUD_FILE}.sql.gz
local CLOUD_BACKUP_FILE="${BACKUP_CLOUD_FOLDER}/${BACKUP_CLOUD_FILE}.sql.gz"
if [ "$SET_DATE_AT_NAME" == "true" ]; then
local CURRENT_DATE=$(date '+%Y%m%d-%H%M')
LOCAL_BACKUP_FILE="${BACKUP_CLOUD_FILE}-${CURRENT_DATE}.sql.gz"
CLOUD_BACKUP_FILE="${BACKUP_CLOUD_FOLDER}/${BACKUP_CLOUD_FILE}-${CURRENT_DATE}.sql.gz"
fi
fi

# Restoring DataBase
if [ "$DB_ACTION" == "restore" ]; then
# AWS
flag=true
# Backup database with max compression
echo "Backing up DB ${POSTGRES_DB} into ${LOCAL_BACKUP_FILE}"
pg_dump -h ${POSTGRES_HOST} -U ${POSTGRES_USER} ${POSTGRES_DB} | gzip -9 >${LOCAL_BACKUP_FILE}

# Handle cloud storage based on the provider
cloudStorageOps "${LOCAL_BACKUP_FILE}" "${CLOUD_BACKUP_FILE}"
}

restoreDB() {
local CURRENT_DATE=$(date '+%Y%m%d-%H%M')
local RESTORE_FILE="backup.sql.gz"
local LOG_RESULT_FILE="restore_results-${CURRENT_DATE}.log"
local flag=true

while "$flag" = true; do
pg_isready -h $POSTGRES_HOST -p 5432 >/dev/null 2>&2 || continue
flag=false
wget -O $restoreFile $RESTORE_URL_FILE
gunzip <$restoreFile | psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB
echo " Import data to $POSTGRES_DB has finished ..."
pg_isready -h ${POSTGRES_HOST} -p 5432 >/dev/null 2>&2 || continue
flag=false
wget -O ${RESTORE_FILE} ${RESTORE_URL_FILE}
echo "Restoring ${RESTORE_URL_FILE} in ${POSTGRES_DB}"
gunzip -c <${RESTORE_FILE} | psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} | tee ${LOG_RESULT_FILE}
aws s3 cp ${LOG_RESULT_FILE} s3://${AWS_S3_BUCKET}/${LOG_RESULT_FILE}
echo "Import data to ${POSTGRES_DB} has finished ..."
done
}

delete_old_s3_files() {
# Use RETENTION_DAYS from environment variable or default to 30 days
if [ -z "${RETENTION_DAYS}" ]; then
DAYS_AGO=30
else
DAYS_AGO="${RETENTION_DAYS}"
fi

echo "Files older than $DAYS_AGO days will be deleted."
echo "Processing s3://${AWS_S3_BUCKET}/${BACKUP_CLOUD_FOLDER}/"
TARGET_DATE=$(date -d "${DAYS_AGO} days ago" +%Y-%m-%d)
aws s3 ls "s3://${AWS_S3_BUCKET}/${BACKUP_CLOUD_FOLDER}/" --recursive | while read -r line; do
FILE_DATE=$(echo "$line" | awk '{print $1}')
FILE_PATH=$(echo "$line" | awk '{print $4}')
if [[ "$FILE_DATE" < "$TARGET_DATE" && ! -z "$FILE_PATH" ]]; then
echo "Deleting ${FILE_PATH} which was modified on ${FILE_DATE}"
aws s3 rm "s3://${AWS_S3_BUCKET}/${FILE_PATH}"
fi
done
}

# Main logic
case "${DB_ACTION}" in
backup)
backupDB
;;
restore)
restoreDB
;;
*)
echo "Unknown action: ${DB_ACTION}"
exit 1
;;
esac

# Check for the CLEAN_BACKUPS var
if [ "$CLEANUP_BACKUPS" == "true" ]; then
delete_old_s3_files
else
echo "CLEANUP_BACKUPS is not set to true. Skipping deletion."
fi
9 changes: 9 additions & 0 deletions images/osmcha-db/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM postgres:14
# Install PostGIS
RUN apt-get update && \
apt-get install -y --no-install-recommends \
postgis \
postgresql-14-postgis-3 && \
rm -rf /var/lib/apt/lists/*
# Initialize PostGIS
COPY init-postgis.sql /docker-entrypoint-initdb.d/
12 changes: 12 additions & 0 deletions images/osmcha-db/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Postgres 14 for OpenStreetMap Changeset Analyzer (OSMCha)

## Build
```sh
docker compose -f <PathTo>/compose/osmcha.yml build
```

## Run

```sh
docker compose -f <PathTo>/compose/osmcha.yml up
```
1 change: 1 addition & 0 deletions images/osmcha-db/init-postgis.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE EXTENSION IF NOT EXISTS postgis;
Loading