From 111442d07517ecad595415ec4f16794af75bdab3 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Sat, 26 Aug 2023 09:00:58 -0500 Subject: [PATCH 01/23] add makefile to create env files --- .gitignore | 2 ++ Makefile | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 Makefile diff --git a/.gitignore b/.gitignore index a4d61dfeb..e9593cbcb 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ spec/examples.txt # Ignore local .env files *.local +.postgres.env +.stringer.env diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..93d3c68fb --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +-include .postgres.env + +postgres_env: + echo "POSTGRES_USER=stringer\nPOSTGRES_PASSWORD=`pwgen -s 20`\nPOSTGRES_HOSTNAME=stringer-postgres\nPOSTGRES_DB=stringer\n" >> .postgres.env + +stringer_env: + echo "SECRET_KEY_BASE=`openssl rand -hex 64`\nENCRYPTION_PRIMARY_KEY=`openssl rand -hex 64`\nENCRYPTION_DETERMINISTIC_KEY=`openssl rand -hex 64`\nENCRYPTION_KEY_DERIVATION_SALT=`openssl rand -hex 64`\n\nDATABASE_URL=postgres://`echo ${POSTGRES_USER}`:`echo ${POSTGRES_PASSWORD}`@`echo ${POSTGRES_HOSTNAME}`/`echo ${POSTGRES_DB}`\nFETCH_FEEDS_CRON='*/5 * * * *'\nCLEANUP_CRON='0 0 * * *'\n" >> .stringer.env From 789c82ac6146e576ce374573d3fb62e65ec87eb2 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Sat, 26 Aug 2023 09:28:48 -0500 Subject: [PATCH 02/23] convert docker compose to use env files. closes #1088 --- docker-compose.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4ee5dcc51..db1a55cf4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,19 +1,17 @@ version: '2' services: - postgres: + + stringer-postgres: image: postgres:9.5-alpine restart: always networks: - stringer-network volumes: - ~/stringer:/var/lib/postgresql/data - environment: - - POSTGRES_PASSWORD=super_secret_password - - POSTGRES_USER=db_user - - POSTGRES_DB=stringer + env_file: .postgres.env - web: + stringer: image: stringerrss/stringer:latest build: . depends_on: @@ -23,15 +21,9 @@ services: - 80:8080 networks: - stringer-network - environment: - - SECRET_KEY_BASE= - - ENCRYPTION_PRIMARY_KEY= - - ENCRYPTION_DETERMINISTIC_KEY= - - ENCRYPTION_KEY_DERIVATION_SALT= - - PORT=8080 - - DATABASE_URL=postgres://db_user:super_secret_password@postgres:5432/stringer + env_file: .stringer.env networks: stringer-network: external: false - name: stringer-network \ No newline at end of file + name: stringer-network From f39352af85bb8900edf8c1b04874f18bdd3a4d8d Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Sat, 26 Aug 2023 09:47:53 -0500 Subject: [PATCH 03/23] update docker compose docs --- docs/Docker.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Docker.md b/docs/Docker.md index 6c9ce14ab..121e102cd 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -2,7 +2,9 @@ ## Production ready setup using docker-compose -Download [docker-compose.yml](../docker-compose.yml) and in the corresponding folder, run `docker-compose up -d`, give it a second and visit `localhost` +Set up environment variables as defined in `Makefile` with `make postgres_env` and `make stringer_env`. + +Download [docker-compose.yml](../docker-compose.yml) to the same folder and run `docker compose up -d`, give it a second and visit `localhost` ## Production ready manual setup From 0f31efc355cfbd4b65f247794ffc263a4044f498 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Sat, 26 Aug 2023 09:48:38 -0500 Subject: [PATCH 04/23] upgrade docker compose version --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index db1a55cf4..e8cae299f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2' +version: '3' services: From ddbc5d0d3f3c17944e15e2c5bf7b9b3a43d4afd4 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Fri, 8 Sep 2023 18:54:50 -0500 Subject: [PATCH 05/23] convert makefile to rakefile commands --- Makefile | 7 ------- Rakefile | 14 ++++++++++++++ docker/.postgres.env.erb | 4 ++++ docker/.stringer.env.erb | 8 ++++++++ docs/Docker.md | 2 +- 5 files changed, 27 insertions(+), 8 deletions(-) delete mode 100644 Makefile create mode 100644 docker/.postgres.env.erb create mode 100644 docker/.stringer.env.erb diff --git a/Makefile b/Makefile deleted file mode 100644 index 93d3c68fb..000000000 --- a/Makefile +++ /dev/null @@ -1,7 +0,0 @@ --include .postgres.env - -postgres_env: - echo "POSTGRES_USER=stringer\nPOSTGRES_PASSWORD=`pwgen -s 20`\nPOSTGRES_HOSTNAME=stringer-postgres\nPOSTGRES_DB=stringer\n" >> .postgres.env - -stringer_env: - echo "SECRET_KEY_BASE=`openssl rand -hex 64`\nENCRYPTION_PRIMARY_KEY=`openssl rand -hex 64`\nENCRYPTION_DETERMINISTIC_KEY=`openssl rand -hex 64`\nENCRYPTION_KEY_DERIVATION_SALT=`openssl rand -hex 64`\n\nDATABASE_URL=postgres://`echo ${POSTGRES_USER}`:`echo ${POSTGRES_PASSWORD}`@`echo ${POSTGRES_HOSTNAME}`/`echo ${POSTGRES_DB}`\nFETCH_FEEDS_CRON='*/5 * * * *'\nCLEANUP_CRON='0 0 * * *'\n" >> .stringer.env diff --git a/Rakefile b/Rakefile index 5fc8d463b..367fc351c 100644 --- a/Rakefile +++ b/Rakefile @@ -33,3 +33,17 @@ task :cleanup_old_stories, [:number_of_days] => :environment do |_t, args| args.with_defaults(number_of_days: 30) RemoveOldStories.call(args[:number_of_days].to_i) end + +desc "Generate Postgres env file" +namespace :env do + task :generate_postgres do + File.write("./.postgres.env", `erb .docker/.postgres.env.erb`) + end +end + +desc "Generate stringer env file" +namespace :env do + task :generate_stringer: :generate_postgres do + File.write("./.stringer.env", `erb .docker/.stringer.env.erb`) + end +end diff --git a/docker/.postgres.env.erb b/docker/.postgres.env.erb new file mode 100644 index 000000000..14fca982e --- /dev/null +++ b/docker/.postgres.env.erb @@ -0,0 +1,4 @@ +POSTGRES_USER=stringer +POSTGRES_PASSWORD=<%= `openssl rand -hex 32`.strip %> +POSTGRES_HOSTNAME=stringer-postgres +POSTGRES_DB=stringer diff --git a/docker/.stringer.env.erb b/docker/.stringer.env.erb new file mode 100644 index 000000000..1d6d9f76a --- /dev/null +++ b/docker/.stringer.env.erb @@ -0,0 +1,8 @@ +SECRET_KEY_BASE=<%= `openssl rand -hex 64`.strip %> +ENCRYPTION_PRIMARY_KEY=<%= `openssl rand -hex 64`.strip %> +ENCRYPTION_DETERMINISTIC_KEY=<%= `openssl rand -hex 64`.strip %> +ENCRYPTION_KEY_DERIVATION_SALT=<%= `openssl rand -hex 64`.strip %> + +DATABASE_URL=postgres://<%= "#{ENV['POSTGRES_USER']}:#{ENV['POSTGRES_PASSWORD']}@#{ENV['POSTGRES_HOSTNAME']}/#{ENV['POSTGRES_DB']}" %> +FETCH_FEEDS_CRON='*/5 * * * *' +CLEANUP_CRON='0 0 * * *' diff --git a/docs/Docker.md b/docs/Docker.md index 121e102cd..44c62d18e 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -2,7 +2,7 @@ ## Production ready setup using docker-compose -Set up environment variables as defined in `Makefile` with `make postgres_env` and `make stringer_env`. +Set up environment variables as defined in `Rakefile` with `rake env:generate_postgres env:generate_stringer`. Download [docker-compose.yml](../docker-compose.yml) to the same folder and run `docker compose up -d`, give it a second and visit `localhost` From a1f2399b1c883716de9562d24efb91a7c320dcc5 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Fri, 8 Sep 2023 19:07:41 -0500 Subject: [PATCH 06/23] remove : prefix from generate stringer rake cmd --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 367fc351c..55ffaf382 100644 --- a/Rakefile +++ b/Rakefile @@ -43,7 +43,7 @@ end desc "Generate stringer env file" namespace :env do - task :generate_stringer: :generate_postgres do + task generate_stringer: :generate_postgres do File.write("./.stringer.env", `erb .docker/.stringer.env.erb`) end end From aa4706426814b70985bac3e17c6e273facc908ba Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Fri, 8 Sep 2023 19:10:55 -0500 Subject: [PATCH 07/23] rubocop fixes --- Rakefile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Rakefile b/Rakefile index 55ffaf382..c7a2d4b5f 100644 --- a/Rakefile +++ b/Rakefile @@ -34,16 +34,14 @@ task :cleanup_old_stories, [:number_of_days] => :environment do |_t, args| RemoveOldStories.call(args[:number_of_days].to_i) end -desc "Generate Postgres env file" namespace :env do - task :generate_postgres do + desc "Generate Postgres env file" + task generate_postgres: :environment do File.write("./.postgres.env", `erb .docker/.postgres.env.erb`) end -end -desc "Generate stringer env file" -namespace :env do - task generate_stringer: :generate_postgres do + desc "Generate stringer env file" + task generate_stringer: [:generate_postgres, :environment] do File.write("./.stringer.env", `erb .docker/.stringer.env.erb`) end end From 7d67505c258ac6d1135895124b801e95fc5180e7 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Fri, 8 Sep 2023 22:05:25 -0500 Subject: [PATCH 08/23] incorporate pr feedback --- Rakefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Rakefile b/Rakefile index c7a2d4b5f..f3f97a937 100644 --- a/Rakefile +++ b/Rakefile @@ -36,12 +36,12 @@ end namespace :env do desc "Generate Postgres env file" - task generate_postgres: :environment do - File.write("./.postgres.env", `erb .docker/.postgres.env.erb`) + task :generate_postgres do + File.write("./.postgres.env", `erb ./docker/.postgres.env.erb`) end desc "Generate stringer env file" - task generate_stringer: [:generate_postgres, :environment] do - File.write("./.stringer.env", `erb .docker/.stringer.env.erb`) + task generate_stringer: :generate_postgres do + File.write("./.stringer.env", `erb ./docker/.stringer.env.erb`) end end From ffa6463736d32f65b62a1aaa82dc370a92bc58da Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:55:38 -0500 Subject: [PATCH 09/23] use single .env file --- .gitignore | 3 +-- Rakefile | 11 +++-------- docker/{.stringer.env.erb => .env.erb} | 5 +++++ docker/.postgres.env.erb | 4 ---- 4 files changed, 9 insertions(+), 14 deletions(-) rename docker/{.stringer.env.erb => .env.erb} (76%) diff --git a/.gitignore b/.gitignore index e9593cbcb..541965950 100644 --- a/.gitignore +++ b/.gitignore @@ -28,5 +28,4 @@ spec/examples.txt # Ignore local .env files *.local -.postgres.env -.stringer.env +.env diff --git a/Rakefile b/Rakefile index f3f97a937..c3a766fef 100644 --- a/Rakefile +++ b/Rakefile @@ -35,13 +35,8 @@ task :cleanup_old_stories, [:number_of_days] => :environment do |_t, args| end namespace :env do - desc "Generate Postgres env file" - task :generate_postgres do - File.write("./.postgres.env", `erb ./docker/.postgres.env.erb`) - end - - desc "Generate stringer env file" - task generate_stringer: :generate_postgres do - File.write("./.stringer.env", `erb ./docker/.stringer.env.erb`) + desc "Generate env file" + task :generate_stringer do + File.write("/.env", `erb ./docker/.stringer.env.erb`) end end diff --git a/docker/.stringer.env.erb b/docker/.env.erb similarity index 76% rename from docker/.stringer.env.erb rename to docker/.env.erb index 1d6d9f76a..62f32dbf1 100644 --- a/docker/.stringer.env.erb +++ b/docker/.env.erb @@ -1,3 +1,8 @@ +POSTGRES_USER=stringer +POSTGRES_PASSWORD=<%= `openssl rand -hex 32`.strip %> +POSTGRES_HOSTNAME=stringer-postgres +POSTGRES_DB=stringer + SECRET_KEY_BASE=<%= `openssl rand -hex 64`.strip %> ENCRYPTION_PRIMARY_KEY=<%= `openssl rand -hex 64`.strip %> ENCRYPTION_DETERMINISTIC_KEY=<%= `openssl rand -hex 64`.strip %> diff --git a/docker/.postgres.env.erb b/docker/.postgres.env.erb index 14fca982e..e69de29bb 100644 --- a/docker/.postgres.env.erb +++ b/docker/.postgres.env.erb @@ -1,4 +0,0 @@ -POSTGRES_USER=stringer -POSTGRES_PASSWORD=<%= `openssl rand -hex 32`.strip %> -POSTGRES_HOSTNAME=stringer-postgres -POSTGRES_DB=stringer From fdb958f00815e3d29ae7d04480f5c5144fd07b7e Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:56:13 -0500 Subject: [PATCH 10/23] add dependencies on env file creation or update --- docker-compose.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e8cae299f..749d48a4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,27 +1,41 @@ version: '3' services: + stringer-setup: + image: stringerrss/stringer:latest + restart: no + env_file: .env + volumes: + - ./.env:/.env + entrypoint: ["rails"] + cmd: ["init_or_update_env"] stringer-postgres: image: postgres:9.5-alpine restart: always + depends_on: + stringer-setup: + condition: service_completed_successfully networks: - stringer-network volumes: - ~/stringer:/var/lib/postgresql/data - env_file: .postgres.env + env_file: .env stringer: image: stringerrss/stringer:latest build: . depends_on: - - postgres + postgres: + condition: service_healthy + stringer-setup: + condition: service_completed_successfully restart: always ports: - 80:8080 networks: - stringer-network - env_file: .stringer.env + env_file: .env networks: stringer-network: From 6318cce384e16d42765c5a211e9a19b04088a2d4 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:24:22 -0500 Subject: [PATCH 11/23] add skeleton for init or update env --- Rakefile | 7 ------- docker/init_or_update_env.rb | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 docker/init_or_update_env.rb diff --git a/Rakefile b/Rakefile index c3a766fef..5fc8d463b 100644 --- a/Rakefile +++ b/Rakefile @@ -33,10 +33,3 @@ task :cleanup_old_stories, [:number_of_days] => :environment do |_t, args| args.with_defaults(number_of_days: 30) RemoveOldStories.call(args[:number_of_days].to_i) end - -namespace :env do - desc "Generate env file" - task :generate_stringer do - File.write("/.env", `erb ./docker/.stringer.env.erb`) - end -end diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb new file mode 100644 index 000000000..d57948521 --- /dev/null +++ b/docker/init_or_update_env.rb @@ -0,0 +1,20 @@ +require 'set' + +# verify existing env vars +existing_env_vars = Set.new(File.read("/.env").split) + +# hardcoded list of env vars we require +required_env_vars = Set.new(["SECRET_KEY_BASE", +"ENCRYPTION_PRIMARY_KEY", +"ENCRYPTION_DETERMINISTIC_KEY", +"ENCRYPTION_KEY_DERIVATION_SALT"]) + +# set operation to get only env vars we need that don't exist yet +new_env_var_keys = required_env_vars - existing_env_vars + +for new_env_var_key in new_env_var_keys do + # TODO: generate the default +end + +# write only new env vars to file in append mode +File.write("/.env", new_env_vars.join("\n"), mode: "a") From ddcec4690732fc29b43cc1fb688387c182e2ef22 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:31:14 -0500 Subject: [PATCH 12/23] init or update env script --- docker/init_or_update_env.rb | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index d57948521..19c02df75 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -1,20 +1,23 @@ -require 'set' +require_relative "../config/environment" -# verify existing env vars -existing_env_vars = Set.new(File.read("/.env").split) +required_env = { + "SECRET_KEY_BASE" => `openssl rand -hex 64`.strip, + "ENCRYPTION_PRIMARY_KEY" => `openssl rand -hex 64`.strip, + "ENCRYPTION_DETERMINISTIC_KEY" => `openssl rand -hex 64`.strip, + "ENCRYPTION_KEY_DERIVATION_SALT" => `openssl rand -hex 64`.strip, + # ternary operators ensure that we can set the database url if it does not exist + "POSTGRES_USER" => ENV["POSTGRES_USER"] ? ENV["POSTGRES_USER"] : "stringer", + "POSTGRES_PASSWORD" => ENV["POSTGRES_PASSWORD"] ? ENV["POSTGRES_PASSWORD"] : `openssl rand -hex 32`.strip, + "POSTGRES_HOSTNAME" => ENV["POSTGRES_HOSTNAME"] ? ENV["POSTGRES_HOSTNAME"] : "stringer-postgres", + "POSTGRES_DB" => ENV["POSTGRES_DB"] ? ENV["POSTGRES_DB"] : "stringer", + "FETCH_FEEDS_CRON" => "*/5 * * * *", + "CLEANUP_CRON" => "0 0 * * *", +} -# hardcoded list of env vars we require -required_env_vars = Set.new(["SECRET_KEY_BASE", -"ENCRYPTION_PRIMARY_KEY", -"ENCRYPTION_DETERMINISTIC_KEY", -"ENCRYPTION_KEY_DERIVATION_SALT"]) +required_env["DATABASE_URL"] = "postgres://#{required_env['POSTGRES_USER']}:#{required_env['POSTGRES_PASSWORD']}@#{required_env['POSTGRES_HOSTNAME']}/#{required_env['POSTGRES_DB']}" -# set operation to get only env vars we need that don't exist yet -new_env_var_keys = required_env_vars - existing_env_vars +required_env.each do |key, value| + next if ENV[key].present? -for new_env_var_key in new_env_var_keys do - # TODO: generate the default + File.open("/.env", "a") { |file| file << "#{key}=#{value}\n" end - -# write only new env vars to file in append mode -File.write("/.env", new_env_vars.join("\n"), mode: "a") From c13f0ac5e1900d5587769779586dccf6cac810b6 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:41:57 -0500 Subject: [PATCH 13/23] don't require app initialization --- docker/init_or_update_env.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index 19c02df75..e4c2612ad 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -1,5 +1,3 @@ -require_relative "../config/environment" - required_env = { "SECRET_KEY_BASE" => `openssl rand -hex 64`.strip, "ENCRYPTION_PRIMARY_KEY" => `openssl rand -hex 64`.strip, From d5883ad8e6aa7b22f64b2f7e3cb182fb2a20f46e Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:42:16 -0500 Subject: [PATCH 14/23] use has_key instead of present --- docker/init_or_update_env.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index e4c2612ad..ea57e8a85 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -4,10 +4,10 @@ "ENCRYPTION_DETERMINISTIC_KEY" => `openssl rand -hex 64`.strip, "ENCRYPTION_KEY_DERIVATION_SALT" => `openssl rand -hex 64`.strip, # ternary operators ensure that we can set the database url if it does not exist - "POSTGRES_USER" => ENV["POSTGRES_USER"] ? ENV["POSTGRES_USER"] : "stringer", - "POSTGRES_PASSWORD" => ENV["POSTGRES_PASSWORD"] ? ENV["POSTGRES_PASSWORD"] : `openssl rand -hex 32`.strip, - "POSTGRES_HOSTNAME" => ENV["POSTGRES_HOSTNAME"] ? ENV["POSTGRES_HOSTNAME"] : "stringer-postgres", - "POSTGRES_DB" => ENV["POSTGRES_DB"] ? ENV["POSTGRES_DB"] : "stringer", + "POSTGRES_USER" => ENV.has_key?("POSTGRES_USER") ? ENV["POSTGRES_USER"] : "stringer", + "POSTGRES_PASSWORD" => ENV.has_key?("POSTGRES_PASSWORD") ? ENV["POSTGRES_PASSWORD"] : `openssl rand -hex 32`.strip, + "POSTGRES_HOSTNAME" => ENV.has_key?("POSTGRES_HOSTNAME") ? ENV["POSTGRES_HOSTNAME"] : "stringer-postgres", + "POSTGRES_DB" => ENV.has_key?("POSTGRES_DB") ? ENV["POSTGRES_DB"] : "stringer", "FETCH_FEEDS_CRON" => "*/5 * * * *", "CLEANUP_CRON" => "0 0 * * *", } @@ -15,7 +15,7 @@ required_env["DATABASE_URL"] = "postgres://#{required_env['POSTGRES_USER']}:#{required_env['POSTGRES_PASSWORD']}@#{required_env['POSTGRES_HOSTNAME']}/#{required_env['POSTGRES_DB']}" required_env.each do |key, value| - next if ENV[key].present? + next if ENV.has_key?(key) File.open("/.env", "a") { |file| file << "#{key}=#{value}\n" end From 5c8a0f499a7302a0182dea5c602127aa228bdf10 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:42:36 -0500 Subject: [PATCH 15/23] add missing brace --- docker/init_or_update_env.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index ea57e8a85..495fe3726 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -17,5 +17,5 @@ required_env.each do |key, value| next if ENV.has_key?(key) - File.open("/.env", "a") { |file| file << "#{key}=#{value}\n" + File.open("/.env", "a") { |file| file << "#{key}=#{value}\n" } end From c54136f0b31883d185bbb5432ce3dfddd62d0bd5 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:43:03 -0500 Subject: [PATCH 16/23] move env volume to within /app folder --- docker-compose.yml | 2 +- docker/init_or_update_env.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 749d48a4a..473b7f377 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: restart: no env_file: .env volumes: - - ./.env:/.env + - ./.env:/app/.env entrypoint: ["rails"] cmd: ["init_or_update_env"] diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index 495fe3726..4268b9aff 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -17,5 +17,5 @@ required_env.each do |key, value| next if ENV.has_key?(key) - File.open("/.env", "a") { |file| file << "#{key}=#{value}\n" } + File.open("/app/.env", "a") { |file| file << "#{key}=#{value}\n" } end From 52c4dacbf9137948ae4a28c40cf211b2ccdb2ed7 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:47:42 -0500 Subject: [PATCH 17/23] fix docker compose env command --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 473b7f377..07a87fc2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,8 +7,8 @@ services: env_file: .env volumes: - ./.env:/app/.env - entrypoint: ["rails"] - cmd: ["init_or_update_env"] + entrypoint: ["ruby"] + command: ["/app/docker/init_or_update_env.rb"] stringer-postgres: image: postgres:9.5-alpine From 11db88055dd45fc183f14c8619cbaabe55cbfb0e Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:47:54 -0500 Subject: [PATCH 18/23] fix hanging reference to postgres service --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 07a87fc2e..ca5808310 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,7 +26,7 @@ services: image: stringerrss/stringer:latest build: . depends_on: - postgres: + stringer-postgres: condition: service_healthy stringer-setup: condition: service_completed_successfully From 6045a187c4bbecc5ab161cdc68ab53b55486752f Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:58:35 -0500 Subject: [PATCH 19/23] rubocop fixes --- docker/init_or_update_env.rb | 38 ++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index 4268b9aff..4cc0f851b 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -1,21 +1,43 @@ +# frozen_string_literal: true + required_env = { "SECRET_KEY_BASE" => `openssl rand -hex 64`.strip, "ENCRYPTION_PRIMARY_KEY" => `openssl rand -hex 64`.strip, "ENCRYPTION_DETERMINISTIC_KEY" => `openssl rand -hex 64`.strip, "ENCRYPTION_KEY_DERIVATION_SALT" => `openssl rand -hex 64`.strip, - # ternary operators ensure that we can set the database url if it does not exist - "POSTGRES_USER" => ENV.has_key?("POSTGRES_USER") ? ENV["POSTGRES_USER"] : "stringer", - "POSTGRES_PASSWORD" => ENV.has_key?("POSTGRES_PASSWORD") ? ENV["POSTGRES_PASSWORD"] : `openssl rand -hex 32`.strip, - "POSTGRES_HOSTNAME" => ENV.has_key?("POSTGRES_HOSTNAME") ? ENV["POSTGRES_HOSTNAME"] : "stringer-postgres", - "POSTGRES_DB" => ENV.has_key?("POSTGRES_DB") ? ENV["POSTGRES_DB"] : "stringer", + # ternary operators ensure that we can set the database url + # if it does not exist + "POSTGRES_USER" => if ENV.key?("POSTGRES_USER") + ENV["POSTGRES_USER"] + else + "stringer" + end, + "POSTGRES_PASSWORD" => if ENV.key?("POSTGRES_PASSWORD") + ENV["POSTGRES_PASSWORD"] + else + `openssl rand -hex 32`.strip + end, + "POSTGRES_HOSTNAME" => if ENV.key?("POSTGRES_HOSTNAME") + ENV["POSTGRES_HOSTNAME"] + else + "stringer-postgres" + end, + "POSTGRES_DB" => if ENV.key?("POSTGRES_DB") + ENV["POSTGRES_DB"] + else + "stringer" + end, "FETCH_FEEDS_CRON" => "*/5 * * * *", - "CLEANUP_CRON" => "0 0 * * *", + "CLEANUP_CRON" => "0 0 * * *" } -required_env["DATABASE_URL"] = "postgres://#{required_env['POSTGRES_USER']}:#{required_env['POSTGRES_PASSWORD']}@#{required_env['POSTGRES_HOSTNAME']}/#{required_env['POSTGRES_DB']}" +required_env["DATABASE_URL"] = "postgres://#{required_env['POSTGRES_USER']}:" \ + "#{required_env['POSTGRES_PASSWORD']}@" \ + "#{required_env['POSTGRES_HOSTNAME']}/" \ + "#{required_env['POSTGRES_DB']}" required_env.each do |key, value| - next if ENV.has_key?(key) + next if ENV.key?(key) File.open("/app/.env", "a") { |file| file << "#{key}=#{value}\n" } end From 7f171f259f993b480bf74aadae2e094e395bdfda Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:30:27 -0500 Subject: [PATCH 20/23] fix docker compose to not require postgres health check --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ca5808310..a9ec22378 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,7 @@ services: build: . depends_on: stringer-postgres: - condition: service_healthy + condition: service_started stringer-setup: condition: service_completed_successfully restart: always From bb7bcf2717443cf5093d1f23897871ed1ef030f5 Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:30:40 -0500 Subject: [PATCH 21/23] remove old erb files --- docker/.env.erb | 13 ------------- docker/.postgres.env.erb | 0 2 files changed, 13 deletions(-) delete mode 100644 docker/.env.erb delete mode 100644 docker/.postgres.env.erb diff --git a/docker/.env.erb b/docker/.env.erb deleted file mode 100644 index 62f32dbf1..000000000 --- a/docker/.env.erb +++ /dev/null @@ -1,13 +0,0 @@ -POSTGRES_USER=stringer -POSTGRES_PASSWORD=<%= `openssl rand -hex 32`.strip %> -POSTGRES_HOSTNAME=stringer-postgres -POSTGRES_DB=stringer - -SECRET_KEY_BASE=<%= `openssl rand -hex 64`.strip %> -ENCRYPTION_PRIMARY_KEY=<%= `openssl rand -hex 64`.strip %> -ENCRYPTION_DETERMINISTIC_KEY=<%= `openssl rand -hex 64`.strip %> -ENCRYPTION_KEY_DERIVATION_SALT=<%= `openssl rand -hex 64`.strip %> - -DATABASE_URL=postgres://<%= "#{ENV['POSTGRES_USER']}:#{ENV['POSTGRES_PASSWORD']}@#{ENV['POSTGRES_HOSTNAME']}/#{ENV['POSTGRES_DB']}" %> -FETCH_FEEDS_CRON='*/5 * * * *' -CLEANUP_CRON='0 0 * * *' diff --git a/docker/.postgres.env.erb b/docker/.postgres.env.erb deleted file mode 100644 index e69de29bb..000000000 From 180775a308a79d75517868468f5cef4f33ac994c Mon Sep 17 00:00:00 2001 From: Guido Petri <18634426+guidopetri@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:30:49 -0500 Subject: [PATCH 22/23] update docs --- docs/Docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Docker.md b/docs/Docker.md index 44c62d18e..0e5cf51e4 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -2,7 +2,7 @@ ## Production ready setup using docker-compose -Set up environment variables as defined in `Rakefile` with `rake env:generate_postgres env:generate_stringer`. +Create a local environment file named `.env`, e.g. via `touch .env`. Download [docker-compose.yml](../docker-compose.yml) to the same folder and run `docker compose up -d`, give it a second and visit `localhost` From 0af091e5956cd4a257cad8232f14e270ab677b05 Mon Sep 17 00:00:00 2001 From: Robert Fletcher Date: Fri, 27 Oct 2023 09:25:02 -0700 Subject: [PATCH 23/23] edits --- docker-compose.yml | 2 +- docker/init_or_update_env.rb | 50 ++++++++++++++---------------------- docs/Docker.md | 8 ++++-- 3 files changed, 26 insertions(+), 34 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a9ec22378..ff1fc6757 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: stringer-setup: - image: stringerrss/stringer:latest + build: . restart: no env_file: .env volumes: diff --git a/docker/init_or_update_env.rb b/docker/init_or_update_env.rb index 4cc0f851b..907c6371e 100644 --- a/docker/init_or_update_env.rb +++ b/docker/init_or_update_env.rb @@ -1,40 +1,28 @@ # frozen_string_literal: true +def generate_secret(length) + `openssl rand -hex #{length}`.strip +end + +pg_user = ENV.fetch("POSTGRES_USER", "stringer") +pg_password = ENV.fetch("POSTGRES_PASSWORD", generate_secret(32)) +pg_host = ENV.fetch("POSTGRES_HOSTNAME", "stringer-postgres") +pg_db = ENV.fetch("POSTGRES_DB", "stringer") + required_env = { - "SECRET_KEY_BASE" => `openssl rand -hex 64`.strip, - "ENCRYPTION_PRIMARY_KEY" => `openssl rand -hex 64`.strip, - "ENCRYPTION_DETERMINISTIC_KEY" => `openssl rand -hex 64`.strip, - "ENCRYPTION_KEY_DERIVATION_SALT" => `openssl rand -hex 64`.strip, - # ternary operators ensure that we can set the database url - # if it does not exist - "POSTGRES_USER" => if ENV.key?("POSTGRES_USER") - ENV["POSTGRES_USER"] - else - "stringer" - end, - "POSTGRES_PASSWORD" => if ENV.key?("POSTGRES_PASSWORD") - ENV["POSTGRES_PASSWORD"] - else - `openssl rand -hex 32`.strip - end, - "POSTGRES_HOSTNAME" => if ENV.key?("POSTGRES_HOSTNAME") - ENV["POSTGRES_HOSTNAME"] - else - "stringer-postgres" - end, - "POSTGRES_DB" => if ENV.key?("POSTGRES_DB") - ENV["POSTGRES_DB"] - else - "stringer" - end, + "SECRET_KEY_BASE" => generate_secret(64), + "ENCRYPTION_PRIMARY_KEY" => generate_secret(64), + "ENCRYPTION_DETERMINISTIC_KEY" => generate_secret(64), + "ENCRYPTION_KEY_DERIVATION_SALT" => generate_secret(64), + "POSTGRES_USER" => pg_user, + "POSTGRES_PASSWORD" => pg_password, + "POSTGRES_HOSTNAME" => pg_host, + "POSTGRES_DB" => pg_db, "FETCH_FEEDS_CRON" => "*/5 * * * *", - "CLEANUP_CRON" => "0 0 * * *" + "CLEANUP_CRON" => "0 0 * * *", + "DATABASE_URL" => "postgres://#{pg_user}:#{pg_password}@#{pg_host}/#{pg_db}" } -required_env["DATABASE_URL"] = "postgres://#{required_env['POSTGRES_USER']}:" \ - "#{required_env['POSTGRES_PASSWORD']}@" \ - "#{required_env['POSTGRES_HOSTNAME']}/" \ - "#{required_env['POSTGRES_DB']}" required_env.each do |key, value| next if ENV.key?(key) diff --git a/docs/Docker.md b/docs/Docker.md index 0e5cf51e4..2d2de7477 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -2,9 +2,13 @@ ## Production ready setup using docker-compose -Create a local environment file named `.env`, e.g. via `touch .env`. +Download [docker-compose.yml](../docker-compose.yml) to the same folder and run: -Download [docker-compose.yml](../docker-compose.yml) to the same folder and run `docker compose up -d`, give it a second and visit `localhost` +```sh +$ touch .env && docker compose up -d +``` + +Give it a second and visit `localhost`. ## Production ready manual setup