diff --git a/.env b/.env index 37766b0..c68462a 100644 --- a/.env +++ b/.env @@ -12,3 +12,4 @@ # Optional: # BASIC_AUTH_PASSWORD= +# DB_ADAPTER=sqlite # defaults to postgres \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 11a87b4..060d3f4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # This Dockerfile produces a production ready image of talos-manager. ARG RUBY_VERSION=3.2.0 -FROM ruby:${RUBY_VERSION}-alpine as base +FROM ruby:${RUBY_VERSION}-slim as base WORKDIR /app @@ -11,16 +11,20 @@ ENV BUNDLE_CLEAN=true FROM base as talosctl +RUN apt-get update -qq && apt-get install --no-install-recommends -y wget + ARG TALOS_VERSION=1.7.4 +# TODO: This should use TARGETPLATFORM to determine the correct binary to download RUN wget https://github.com/siderolabs/talos/releases/download/v${TALOS_VERSION}/talosctl-linux-amd64 -O /usr/local/bin/talosctl RUN chmod +x /usr/local/bin/talosctl FROM base as gems # git for git based Gemfile definitions -# build-base for native extensions -# postgresql-dev for pg gem -RUN apk add git build-base postgresql-dev +# build-essential + pkg-config for native extensions +# libpq-dev for pg gem +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential pkg-config git libpq-dev COPY .ruby-version . COPY Gemfile* ./ @@ -31,13 +35,12 @@ RUN rm -rf vendor/bundle/ruby/*/cache FROM base -# libc6-compat required by nokogiri aarch64-linux -# libpq required by pg -# tzdata required by tzinfo -# libcurl required by typhoeus # wget for talosctl installation -# curl is required for the heroku release command output -RUN apk add wget libc6-compat tzdata libcurl libpq curl +# curl is required for typhoeus and the heroku release command output +# libsqlite3-0 for sqlite3 +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y wget curl libsqlite3-0 postgresql-client file && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives COPY --from=gems /app /app COPY --from=talosctl /usr/local/bin/talosctl /usr/local/bin/talosctl diff --git a/Gemfile b/Gemfile index 21e2e6d..b9a4ee0 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,9 @@ source "https://rubygems.org" ruby "3.2.0" +# Keep dotenv at top to ensure ENV variables are loaded before other gems initialize +gem "dotenv", require: "dotenv/load", groups: %i[development test] + gem "bootsnap", require: false gem "importmap-rails" gem "net-ssh" @@ -9,6 +12,7 @@ gem "pg" gem "propshaft" gem "puma" gem "rails" +gem "sqlite3", "~> 1.4" # locked for Rails 7.1 compatibility gem "stimulus-rails" gem "turbo-rails" gem "typhoeus" @@ -16,7 +20,6 @@ gem "typhoeus" group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "debug", platforms: %i[mri mingw x64_mingw] - gem "dotenv" gem "rspec-rails" end diff --git a/Gemfile.lock b/Gemfile.lock index 141a25b..c8d109c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -210,6 +210,8 @@ GEM rspec-mocks (~> 3.13) rspec-support (~> 3.13) rspec-support (3.13.1) + sqlite3 (1.7.3-arm64-darwin) + sqlite3 (1.7.3-x86_64-linux) stimulus-rails (1.3.3) railties (>= 6.0.0) stringio (3.1.0) @@ -237,6 +239,7 @@ GEM PLATFORMS arm64-darwin-22 x86_64-linux + x86_64-linux-musl DEPENDENCIES bootsnap @@ -250,6 +253,7 @@ DEPENDENCIES puma rails rspec-rails + sqlite3 (~> 1.4) stimulus-rails turbo-rails typhoeus diff --git a/README.md b/README.md index ceda239..6927a85 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,10 @@ docker push registry.heroku.com//web heroku container:release web --app ``` +## Using SQLite instead of Postgres + +Set `DB_ADAPTER=sqlite` and `config/database.yml` will be configured to use SQLite. + ## Config Patch Examples ### Basic diff --git a/app/controllers/clusters_controller.rb b/app/controllers/clusters_controller.rb index accb780..e007f1a 100644 --- a/app/controllers/clusters_controller.rb +++ b/app/controllers/clusters_controller.rb @@ -57,7 +57,7 @@ def kubeconfig first_control_plane = @cluster.servers .where.associated(:machine_config) - .where("name ILIKE '%control-plane%'") + .where("LOWER(name) LIKE '%control-plane%'") .order(name: :asc) .first diff --git a/app/models/cluster.rb b/app/models/cluster.rb index 88f9ce9..fd5666b 100644 --- a/app/models/cluster.rb +++ b/app/models/cluster.rb @@ -20,7 +20,7 @@ class Cluster < ApplicationRecord def talosconfig first_control_plane = servers .where.associated(:machine_config) - .where("name ILIKE '%control-plane%'") + .where("LOWER(name) LIKE '%control-plane%'") .order(name: :asc) .first diff --git a/config/cable.yml b/config/cable.yml index cc73650..bd29f0f 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -1,8 +1,8 @@ development: - adapter: postgresql + adapter: <%= ENV["DB_ADAPTER"] == "sqlite" ? "async" : "postgresql" %> test: adapter: test production: - adapter: postgresql + adapter: <%= ENV["DB_ADAPTER"] == "sqlite" ? "async" : "postgresql" %> diff --git a/config/database.yml b/config/database.yml index 046cef6..c4102ec 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,86 +1,36 @@ -# PostgreSQL. Versions 9.3 and up are supported. -# -# Install the pg driver: -# gem install pg -# On macOS with Homebrew: -# gem install pg -- --with-pg-config=/usr/local/bin/pg_config -# On macOS with MacPorts: -# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config -# On Windows: -# gem install pg -# Choose the win32 build. -# Install PostgreSQL and put its /bin directory on your path. -# -# Configure Using Gemfile -# gem "pg" -# default: &default + <% if ENV["DB_ADAPTER"] == "sqlite" %> + adapter: sqlite3 + timeout: 5000 + <% else %> adapter: postgresql encoding: unicode + <% end %> # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default + <% if ENV["DB_ADAPTER"] == "sqlite" %> + database: storage/development.sqlite3 + <% else %> database: talos_manager_development + <% end %> - # The specified database role being used to connect to postgres. - # To create additional roles in postgres see `$ createuser --help`. - # When left blank, postgres will use the default role. This is - # the same name as the operating system user running Rails. - #username: talos_manager - - # The password associated with the postgres role (username). - #password: - - # Connect on a TCP socket. Omitted by default since the client uses a - # domain socket that doesn't need configuration. Windows does not have - # domain sockets, so uncomment these lines. - #host: localhost - - # The TCP port the server listens on. Defaults to 5432. - # If your server runs on a different port number, change accordingly. - #port: 5432 - - # Schema search path. The server defaults to $user,public - #schema_search_path: myapp,sharedapp,public - - # Minimum log levels, in increasing order: - # debug5, debug4, debug3, debug2, debug1, - # log, notice, warning, error, fatal, and panic - # Defaults to warning. - #min_messages: notice - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. test: <<: *default + <% if ENV["DB_ADAPTER"] == "sqlite" %> + database: storage/test.sqlite3 + <% else %> database: talos_manager_test + <% end %> -# As with config/credentials.yml, you never want to store sensitive information, -# like your database password, in your source code. If your source code is -# ever seen by anyone, they now have access to your database. -# -# Instead, provide the password or a full connection URL as an environment -# variable when you boot the app. For example: -# -# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" -# -# If the connection URL is provided in the special DATABASE_URL environment -# variable, Rails will automatically merge its configuration values on top of -# the values provided in this file. Alternatively, you can specify a connection -# URL environment variable explicitly: -# -# production: -# url: <%= ENV["MY_APP_DATABASE_URL"] %> -# -# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database -# for a full overview on how database connection configuration can be specified. -# production: <<: *default + <% if ENV["DB_ADAPTER"] == "sqlite" %> + database: storage/production.sqlite3 + <% else %> + # NOTE: You should be relying on DATABASE_URL when using Postgres in production database: talos_manager_production - username: talos_manager - password: <%= ENV["talos_manager_DATABASE_PASSWORD"] %> + <% end %> \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index 9ad0d95..c287ee0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,10 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_04_20_073519) do - # These are extensions that must be enabled in order to support this database - enable_extension "plpgsql" - +ActiveRecord::Schema[7.1].define(version: 2023_04_20_073519) do create_table "clusters", force: :cascade do |t| t.string "name", null: false t.string "endpoint", null: false