From 2c8635c9fd3967d7dfb101934ae639bd41a9e7f5 Mon Sep 17 00:00:00 2001 From: Jeff Wong Date: Sun, 22 Sep 2024 10:50:10 -0700 Subject: [PATCH] DEV: allow for 2 container data services to setup on boot allow postgres templates to assign themselves a DB password allows 2 container setups to be able to create db on boot and setup passwords move missing folder check to data services when running images without unicorn standalone just needs to wait for db to setup via the postgres service start script exit if migrate or precompile on boot fail so services retry gracefully when db is not yet up. --- samples/data.yml | 6 ++++-- templates/postgres.15.template.yml | 28 ++++++++++++++++++++++------ templates/postgres.template.yml | 27 +++++++++++++++++++++------ templates/redis.template.yml | 9 ++++----- templates/web.template.yml | 5 ++--- 5 files changed, 53 insertions(+), 22 deletions(-) diff --git a/samples/data.yml b/samples/data.yml index 2ecb61a92..61794b073 100644 --- a/samples/data.yml +++ b/samples/data.yml @@ -9,8 +9,10 @@ templates: # any extra arguments for Docker? # docker_args: +# TODO: SOME_SECRET to a password for the discourse user params: db_default_text_search_config: "pg_catalog.english" + db_password: SOME_SECRET ## Set db_shared_buffers to a max of 25% of the total memory. ## will be set automatically by bootstrap based on detected RAM, or you can override @@ -24,6 +26,7 @@ env: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 LANGUAGE: en_US.UTF-8 + DISCOURSE_DB_PASSWORD: $db_password volumes: - volume: @@ -33,12 +36,11 @@ volumes: host: /var/discourse/shared/data/log/var-log guest: /var/log -# TODO: SOME_SECRET to a password for the discourse user hooks: after_postgres: - exec: stdin: | - alter user discourse with password 'SOME_SECRET'; + alter user discourse with password '$db_password'; cmd: su - postgres -c 'psql discourse' raise_on_fail: false diff --git a/templates/postgres.15.template.yml b/templates/postgres.15.template.yml index 548c575eb..b0beef6cb 100644 --- a/templates/postgres.15.template.yml +++ b/templates/postgres.15.template.yml @@ -14,22 +14,38 @@ hooks: - replace: filename: /etc/service/unicorn/run from: "# postgres" - to: | - if [ -f /root/install_postgres ]; then - /root/install_postgres - rm /root/install_postgres - fi - sv start postgres || exit 1 + to: 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/config-postgres/run + chmod: "+x" + contents: | + #!/bin/sh + if [ -f /usr/local/bin/create_db ] && [ "$CREATE_DB_ON_BOOT" = "1" ]; then + sleep 5 + /usr/local/bin/create_db + if [ ! -z "$DISCOURSE_DB_PASSWORD" ]; then + echo "alter user discourse with password '$DISCOURSE_DB_PASSWORD';" | su - postgres -c 'psql $db_name' + fi + fi + - file: path: /etc/service/postgres/run chmod: "+x" contents: | #!/bin/sh exec 2>&1 + if [ -f /root/install_postgres ]; then + /root/install_postgres + rm /root/install_postgres + fi + if [ "$CREATE_DB_ON_BOOT" = "1" ]; then + sv once config-postgres + fi HOME=/var/lib/postgresql USER=postgres exec thpoff chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main - file: diff --git a/templates/postgres.template.yml b/templates/postgres.template.yml index 95001a0f1..df3b556ee 100644 --- a/templates/postgres.template.yml +++ b/templates/postgres.template.yml @@ -14,20 +14,35 @@ hooks: - replace: filename: /etc/service/unicorn/run from: "# postgres" - to: | - if [ -f /root/install_postgres ]; then - /root/install_postgres - rm /root/install_postgres - fi - sv start postgres || exit 1 + to: sv start postgres || exit 1 run: + - file: + path: /etc/service/config-postgres/run + chmod: "+x" + contents: | + #!/bin/sh + if [ -f /usr/local/bin/create_db ] && [ "$CREATE_DB_ON_BOOT" = "1" ]; then + sleep 5 + /usr/local/bin/create_db + if [ ! -z "$DISCOURSE_DB_PASSWORD" ]; then + echo "alter user discourse with password '$DISCOURSE_DB_PASSWORD';" | su - postgres -c 'psql $db_name' + fi + fi + - file: path: /etc/service/postgres/run chmod: "+x" contents: | #!/bin/sh exec 2>&1 + if [ -f /root/install_postgres ]; then + /root/install_postgres + rm /root/install_postgres + fi + if [ "$CREATE_DB_ON_BOOT" = "1" ]; then + sv once config-postgres + fi HOME=/var/lib/postgresql USER=postgres exec thpoff chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main - file: diff --git a/templates/redis.template.yml b/templates/redis.template.yml index 9044869ee..a09b767a1 100644 --- a/templates/redis.template.yml +++ b/templates/redis.template.yml @@ -8,6 +8,9 @@ run: contents: | #!/bin/sh exec 2>&1 + if [ ! -d /shared/redis_data ]; then + install -d -m 0755 -o redis -g redis /shared/redis_data + fi exec thpoff chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf - file: path: /etc/service/redis/log/run @@ -86,8 +89,4 @@ hooks: - replace: filename: /etc/service/unicorn/run from: "# redis" - to: | - if [ ! -d /shared/redis_data ]; then - install -d -m 0755 -o redis -g redis /shared/redis_data - fi - sv start redis || exit 1 + to: sv start redis || exit 1 diff --git a/templates/web.template.yml b/templates/web.template.yml index d5dd09526..b9987f5a3 100644 --- a/templates/web.template.yml +++ b/templates/web.template.yml @@ -60,9 +60,8 @@ run: if [[ -z "$PRECOMPILE_ON_BOOT" ]]; then PRECOMPILE_ON_BOOT=1 fi - if [ -f /usr/local/bin/create_db ] && [ "$CREATE_DB_ON_BOOT" = "1" ]; then /usr/local/bin/create_db; fi; - if [ "$MIGRATE_ON_BOOT" = "1" ]; then su discourse -c 'bundle exec rake db:migrate'; fi - if [ "$PRECOMPILE_ON_BOOT" = "1" ]; then SKIP_EMBER_CLI_COMPILE=1 su discourse -c 'bundle exec rake assets:precompile'; fi + if [ "$MIGRATE_ON_BOOT" = "1" ]; then su discourse -c 'bundle exec rake db:migrate' || exit 1; fi + if [ "$PRECOMPILE_ON_BOOT" = "1" ]; then SKIP_EMBER_CLI_COMPILE=1 su discourse -c 'bundle exec rake assets:precompile' || exit 1; fi LD_PRELOAD=$RUBY_ALLOCATOR HOME=/home/discourse USER=discourse exec thpoff chpst -u discourse:www-data -U discourse:www-data bundle exec config/unicorn_launcher -E production -c config/unicorn.conf.rb - file: