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

FEATURE: Update base image and set default to postgresql 15 #909

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ image/squash.tar
image/nsenter/nsenter
image/docker-squash
image/docker-squash.tar.gz
image/discourse_dev/install-rust
image/discourse_dev/postgres.template.yml
image/discourse_dev/redis.template.yml
.gc-state/*
Expand Down
2 changes: 1 addition & 1 deletion image/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

To build a new image, just run `ruby auto_build.rb image-name`. The build process will build a local image with a predefined tag.

Images and tag names are defined [here](https://github.com/discourse/discourse_docker/blob/master/image/auto_build.rb#L6-L11).
Images and tag names are defined [here](https://github.com/discourse/discourse_docker/blob/main/image/auto_build.rb#L6-L88).

> **A note about --squash**: By default we squash the images we serve on Docker Hub. You will need to [enable experimental features](https://github.com/docker/docker-ce/blob/master/components/cli/experimental/README.md) on your Docker daemon for that.

Expand Down
2 changes: 1 addition & 1 deletion image/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ RUN /tmp/install-imagemagick
FROM discourse/ruby:3.3.6-${DEBIAN_RELEASE}-slim AS discourse_dependencies

ARG DEBIAN_RELEASE
ENV PG_MAJOR=13 \
ENV PG_MAJOR=15 \
RUBY_ALLOCATOR=/usr/lib/libjemalloc.so \
LEFTHOOK=0 \
DEBIAN_RELEASE=${DEBIAN_RELEASE}
Expand Down
10 changes: 5 additions & 5 deletions image/discourse_dev/postgres_dev.template.yml
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
run:

- replace:
filename: "/etc/postgresql/13/main/postgresql.conf"
from: /#?fullpage_writes *=.*/
to: "fullpage_writes = off"
filename: "/etc/postgresql/15/main/postgresql.conf"
from: /#?full_page_writes *=.*/
to: "full_page_writes = off"

- replace:
filename: "/etc/postgresql/13/main/postgresql.conf"
filename: "/etc/postgresql/15/main/postgresql.conf"
from: /#?fsync *=.*/
to: "fsync = off"

- exec:
background: true
# use fast shutdown for pg
stop_signal: INT
cmd: HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
cmd: HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main

- exec:
background: true
Expand Down
1 change: 1 addition & 0 deletions launcher
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ kernel_min_version='4.4.0'
config_file=containers/"$config".yml
cidbootstrap=cids/"$config"_bootstrap.cid
local_discourse=local_discourse
# TODO: replace base image before merging
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mwaniki-wairungu I just realised a problem you have here. The new base image with PG 15 installed is only built and made available roughly 30 minutes after this commit lands on the main branch. However it is possible for self hosters to be using the new templates before we are able to update the tag in launcher. With that in mind, I think we need some sort of conditionals in the existing template where we account for the fact that either PG 15 or PG 13 packages may be present in the base image?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

During the PG 13 update, we built a temporary 'placeholder' image from the pg13 branch which was then referenced in launcher. After the changes were merged and the new 'official' image was built, a follow-up commit updated the ref accordingly.

I think we should use a similar approach.

image="discourse/base:2.0.20250105-0017"
docker_path=`which docker.io 2> /dev/null || which docker`
git_path=`which git`
Expand Down
3 changes: 2 additions & 1 deletion templates/postgres.10.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ hooks:
to: sv start postgres || exit 1

run:
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-13 postgresql-client-13 postgresql-contrib-13
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15
- exec: apt-get update && apt-get install -y postgresql-10 postgresql-client-10 postgresql-contrib-10
- exec: mkdir -p /shared/postgres_run
- exec: chown postgres:postgres /shared/postgres_run
Expand Down Expand Up @@ -141,6 +141,7 @@ run:
- exec: su postgres -c 'psql template1 -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists hstore;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists unaccent;"'
- exec:
stdin: |
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = '$db_name' AND encoding = pg_char_to_encoding('SQL_ASCII');
Expand Down
3 changes: 2 additions & 1 deletion templates/postgres.12.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ hooks:
to: sv start postgres || exit 1

run:
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-13 postgresql-client-13 postgresql-contrib-13
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15
- exec: apt-get update && apt-get install -y postgresql-12 postgresql-client-12 postgresql-contrib-12
- exec: mkdir -p /shared/postgres_run
- exec: chown postgres:postgres /shared/postgres_run
Expand Down Expand Up @@ -140,6 +140,7 @@ run:
- exec: su postgres -c 'psql template1 -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists hstore;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists unaccent;"'
- exec:
stdin: |
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = '$db_name' AND encoding = pg_char_to_encoding('SQL_ASCII');
Expand Down
176 changes: 66 additions & 110 deletions templates/postgres.13.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,16 @@ hooks:
- replace:
filename: /etc/service/unicorn/run
from: "# postgres"
to: sv start postgres || exit 1
to: |
if [ -f /root/install_postgres ]; then
/root/install_postgres
rm /root/install_postgres
fi
sv start postgres || exit 1

run:
- exec: sed -i "s/^# $LANG/$LANG/" /etc/locale.gen
- exec: locale-gen && update-locale
- exec: mkdir -p /shared/postgres_run
- exec: chown postgres:postgres /shared/postgres_run
- exec: chmod 775 /shared/postgres_run
- exec: rm -fr /var/run/postgresql
- exec: ln -s /shared/postgres_run /var/run/postgresql
- exec: socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
- exec: rm -fr /shared/postgres_run/.s*
- exec: rm -fr /shared/postgres_run/*.pid
- exec: mkdir -p /shared/postgres_run/13-main.pg_stat_tmp
- exec: chown postgres:postgres /shared/postgres_run/13-main.pg_stat_tmp
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
- exec: apt-get update && apt-get install -y postgresql-13 postgresql-client-13 postgresql-contrib-13 postgresql-13-pgvector
- file:
path: /etc/service/postgres/run
chmod: "+x"
Expand All @@ -53,79 +48,30 @@ run:
sv stop postgres

- file:
path: /root/upgrade_postgres
chmod: "+x"
contents: |
#!/bin/bash
PG_MAJOR_OLD=`cat /shared/postgres_data/PG_VERSION`

if [ ! "13" = "$PG_MAJOR_OLD" ]; then
echo Upgrading PostgreSQL from version ${PG_MAJOR_OLD} to 13
free_disk=$(df -P -B1 /shared | tail -n 1 | awk '{print $4}')
required=$(($(du -sb /shared/postgres_data | awk '{print $1}') * 2))

if [ "$free_disk" -lt "$required" ]; then
echo "WARNING: Upgrading PostgreSQL would require an additional $(numfmt --to=si $(($required - $free_disk))) of disk space"
echo "Please free up some space, or expand your disk, before continuing."
echo ''
echo 'To avoid upgrading change "templates/postgres.template.yml" TO "templates/postgres.12.template.yml" in containers/app.yml'
exit 1
fi

if [ -d /shared/postgres_data_old ]; then
mv /shared/postgres_data_old /shared/postgres_data_older
fi

rm -fr /shared/postgres_data_new
install -d -m 0755 -o postgres -g postgres /shared/postgres_data_new && sudo -u postgres /usr/lib/postgresql/13/bin/initdb -D /shared/postgres_data_new || exit 0
apt-get update
apt-get install -y postgresql-${PG_MAJOR_OLD}
chown -R postgres:postgres /var/lib/postgresql/13
/etc/init.d/postgresql stop
rm -fr /shared/postgres_data/postmaster.pid
cd ~postgres
cp -pr /etc/postgresql/${PG_MAJOR_OLD}/main/* /shared/postgres_data
echo >> /shared/postgres_data/postgresql.conf
echo "data_directory = '/shared/postgres_data'" >> /shared/postgres_data/postgresql.conf
SUCCESS=true
sudo -u postgres /usr/lib/postgresql/13/bin/pg_upgrade -d /shared/postgres_data -D /shared/postgres_data_new -b /usr/lib/postgresql/${PG_MAJOR_OLD}/bin -B /usr/lib/postgresql/13/bin || SUCCESS=false

if [[ "$SUCCESS" == 'false' ]]; then
echo -------------------------------------------------------------------------------------
echo UPGRADE OF POSTGRES FAILED
echo
echo Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.
echo
echo You can run "./launcher start app" to restart your app in the meanwhile
echo
exit 1
fi

mv /shared/postgres_data /shared/postgres_data_old
mv /shared/postgres_data_new /shared/postgres_data

echo -------------------------------------------------------------------------------------
echo UPGRADE OF POSTGRES COMPLETE
echo
echo Old ${PG_MAJOR_OLD} database is stored at /shared/postgres_data_old
echo
echo To complete the upgrade, rebuild again using:
echo
echo ./launcher rebuild app
echo -------------------------------------------------------------------------------------
# Magic exit status to denote no failure
exit 77
fi

- exec:
cmd:
- chown -R root /var/lib/postgresql/13/main
- "[ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/13/bin/initdb -D /shared/postgres_data || exit 0"
- chown -R postgres:postgres /shared/postgres_data
- chown -R postgres:postgres /var/run/postgresql

- exec: /root/upgrade_postgres
- exec: rm /root/upgrade_postgres
path: /root/install_postgres
chmod: "+x"
contents: |
#!/bin/bash -x
sed -i "s/^# $LANG/$LANG/" /etc/locale.gen
locale-gen && update-locale
mkdir -p /shared/postgres_run
chown postgres:postgres /shared/postgres_run
chmod 775 /shared/postgres_run
rm -fr /var/run/postgresql
ln -s /shared/postgres_run /var/run/postgresql
if [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
rm -fr /shared/postgres_run/.s*
rm -fr /shared/postgres_run/*.pid
mkdir -p /shared/postgres_run/13-main.pg_stat_tmp
chown postgres:postgres /shared/postgres_run/13-main.pg_stat_tmp
chown -R root /var/lib/postgresql/13/main
[ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/13/bin/initdb -D /shared/postgres_data || exit 0
chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /var/run/postgresql
# Necessary to enable backups
install -d -m 0755 -o postgres -g postgres /shared/postgres_backup

- replace:
filename: "/etc/postgresql/13/main/postgresql.conf"
Expand Down Expand Up @@ -162,11 +108,6 @@ run:
from: /#?default_text_search_config *=.*/
to: "default_text_search_config = '$db_default_text_search_config'"

# Necessary to enable backups
- exec:
cmd:
- install -d -m 0755 -o postgres -g postgres /shared/postgres_backup

- replace:
filename: "/etc/postgresql/13/main/postgresql.conf"
from: /#?checkpoint_segments *=.*/
Expand Down Expand Up @@ -200,29 +141,39 @@ run:
to: "host all all ::/0 md5"

- exec:
tag: db
cmd: |
if [ -f /root/install_postgres ]; then
/root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

- exec:
tag: db
background: true
# use fast shutdown for pg
stop_signal: INT
cmd: HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main

# give db a few secs to start up
- exec: "sleep 5"

- exec: su postgres -c 'createdb $db_name' || true
- exec: su postgres -c 'psql $db_name -c "create user $db_user;"' || true
- exec: su postgres -c 'psql $db_name -c "grant all privileges on database $db_name to $db_user;"' || true
- exec: su postgres -c 'psql $db_name -c "alter schema public owner to $db_user;"'
- exec: su postgres -c 'psql template1 -c "create extension if not exists hstore;"'
- exec: su postgres -c 'psql template1 -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql template1 -c "create extension if not exists vector;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists hstore;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists pg_trgm;"'
- exec: su postgres -c 'psql $db_name -c "create extension if not exists vector;"'
- exec:
stdin: |
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = '$db_name' AND encoding = pg_char_to_encoding('SQL_ASCII');
cmd: sudo -u postgres psql $db_name
raise_on_fail: false
- file:
path: /usr/local/bin/create_db
chmod: +x
contents: |
#!/bin/bash
su postgres -c 'createdb $db_name' || true
su postgres -c 'psql $db_name -c "create user $db_user;"' || true
su postgres -c 'psql $db_name -c "grant all privileges on database $db_name to $db_user;"' || true
su postgres -c 'psql $db_name -c "alter schema public owner to $db_user;"'
su postgres -c 'psql template1 -c "create extension if not exists hstore;"'
su postgres -c 'psql template1 -c "create extension if not exists pg_trgm;"'
su postgres -c 'psql template1 -c "create extension if not exists vector;"'
su postgres -c 'psql template1 -c "alter extension vector update;"' || true
su postgres -c 'psql $db_name -c "create extension if not exists hstore;"'
su postgres -c 'psql $db_name -c "create extension if not exists pg_trgm;"'
su postgres -c 'psql $db_name -c "create extension if not exists vector;"'
su postgres -c 'psql $db_name -c "alter extension vector update;"' || true
sudo -u postgres psql $db_name <<< "update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = '$db_name' AND encoding = pg_char_to_encoding('SQL_ASCII');" || true

- file:
path: /var/lib/postgresql/take-database-backup
Expand All @@ -243,5 +194,10 @@ run:
#0 */4 * * * /var/lib/postgresql/take-database-backup

- exec:
tag: db
hook: postgres
cmd: "echo postgres installed!"
cmd:
# give db a few secs to start up
- "sleep 5"
- /usr/local/bin/create_db
- "echo postgres installed!"
45 changes: 17 additions & 28 deletions templates/postgres.15.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ hooks:
sv start postgres || exit 1

run:
- exec: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-13 postgresql-client-13 postgresql-contrib-13 postgresql-13-pgvector
- exec: apt-get update && apt-get install -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
- file:
path: /etc/service/postgres/run
chmod: "+x"
Expand Down Expand Up @@ -67,10 +65,12 @@ run:
mkdir -p /shared/postgres_run/15-main.pg_stat_tmp
chown postgres:postgres /shared/postgres_run/15-main.pg_stat_tmp
chown -R root /var/lib/postgresql/15/main
[ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/15/bin/initdb -D /shared/postgres_data || exit 0
chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /var/run/postgresql
if [ -f /root/upgrade_postgres ]; then
if [ ! -e /shared/postgres_data ]; then
install -d -m 0755 -o postgres -g postgres /shared/postgres_data
sudo -E -u postgres /usr/lib/postgresql/15/bin/initdb -D /shared/postgres_data
chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /var/run/postgresql
elif [ -f /root/upgrade_postgres ]; then
/root/upgrade_postgres
rm /root/upgrade_postgres
fi
Expand All @@ -90,11 +90,13 @@ run:
required=$(($(du -sb /shared/postgres_data | awk '{print $1}') * 2))

if [ "$free_disk" -lt "$required" ]; then
echo "WARNING: Upgrading PostgreSQL would require an additional $(numfmt --to=si $(($required - $free_disk))) of disk space"
echo "Please free up some space, or expand your disk, before continuing."
echo ''
echo 'To avoid upgrading change "templates/postgres.15.template.yml" TO "templates/postgres.template.yml" in containers/app.yml'
exit 1
echo
echo "WARNING: Upgrading PostgreSQL would require an additional $(numfmt --to=si $(($required - $free_disk))) of disk space"
echo "Please free up some space, or expand your disk, before continuing."
echo
echo 'To avoid upgrading change "templates/postgres.template.yml" TO "templates/postgres.13.template.yml" in containers/app.yml'
echo 'You can run "./launcher start app" to restart your app in the meanwhile.'
exit 1
fi

if [ -d /shared/postgres_data_old ]; then
Expand All @@ -119,8 +121,11 @@ run:
echo -------------------------------------------------------------------------------------
echo UPGRADE OF POSTGRES FAILED
echo
echo You can run "./launcher start app" to restart your app in the meanwhile
# TODO: Change meta URL for PostgreSQL 15 topic
echo Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.
echo
echo You can run "./launcher start app" to restart your app in the meanwhile
echo -------------------------------------------------------------------------------------
exit 1
fi

Expand All @@ -131,10 +136,6 @@ run:
echo UPGRADE OF POSTGRES COMPLETE
echo
echo Old ${PG_MAJOR_OLD} database is stored at /shared/postgres_data_old
echo
echo To complete the upgrade, rebuild again using:
echo
echo ./launcher rebuild app
echo -------------------------------------------------------------------------------------
# Magic exit status to denote no failure
exit 77
Expand Down Expand Up @@ -207,18 +208,6 @@ run:
from: /^host.*all.*all.*::1\/128.*$/
to: "host all all ::/0 md5"

# allow replication to connect in with md5/scram auth
- replace:
filename: "/etc/postgresql/15/main/pg_hba.conf"
from: /^host.*replication.*all.*127.*$/
to: "host replication all 0.0.0.0/0 md5"

# allow replication to connect in with md5/scram auth (IPv6)
- replace:
filename: "/etc/postgresql/15/main/pg_hba.conf"
from: /^host.*replication.*all.*::1\/128.*$/
to: "host replication all ::/0 md5"

- exec:
tag: db
cmd: |
Expand Down
Loading
Loading