diff --git a/.github/actions/setup-services/action.yml b/.github/actions/setup-services/action.yml new file mode 100644 index 0000000..1daddab --- /dev/null +++ b/.github/actions/setup-services/action.yml @@ -0,0 +1,14 @@ +name: Set up db and storage config +description: Set up db and storage configurations. + +runs: + using: "composite" + steps: + - name: Set up db and storage configuration + shell: bash + run: | + cp config/database.yml.sample config/database.yml + cp config/storage.yml.sample config/storage.yml + RAILS_ENV=test bundle exec rails db:setup + + diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2b1f04c..de46fec 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,10 +37,8 @@ jobs: with: bundler-cache: true - - name: Setup Test Database - run: bundle exec rails db:setup - env: - RAILS_ENV: test + - name: Set up Project + uses: ./.github/actions/setup-services - name: Precompile Assets run: bundle exec rails assets:precompile diff --git a/.gitignore b/.gitignore index e95e7c7..2b047a4 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,10 @@ # Ignore master key for decrypting credentials and more. /config/master.key +# Ignore local database setup +/config/database.yml +/config/storage.yml + /app/assets/builds/* !/app/assets/builds/.keep diff --git a/Dockerfile b/Dockerfile index d5c5da3..b5568cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,6 +43,10 @@ RUN yarn install --frozen-lockfile # Copy application code COPY . . +# Use sample configs +RUN mv config/database.yml.production config/database.yml 2>/dev/null || true +RUN mv config/storage.yml.production config/storage.yml 2>/dev/null || true + # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile app/ lib/ diff --git a/README.md b/README.md index 1ac47d1..0e5d4b8 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,30 @@ Website, Rails powered! * Ruby 3.2.2 * yarn 1.22.6 * node >= 20 +* PSQL >= 14 ### Development Setup -Changes should be added via merge request, as `main` has a CI action that deploys on merge. +Changes should be added via merge request, as `main` has a CI action that deploys on merge. The application relies on a PostgreSQL instance for its database, so make sure to set that up for your local environment. -Currently, the application does not require any database and so defaults to SQLite, but this might change in the future. +Because we use ActionText, the application does require dependencies for ActiveStorage as well (ie, `libvips`) though these are currently not used. + +The database and storage configurations are provided in a `.sample` file, make sure you copy those and rename them to the correct `.yml` file. These files are git ignored, so you can set up your local environment as needed. 1. Pull/clone the repo -1. `bundle install` -1. `yarn install` +1. Run `bundle install` +1. Run `yarn install` +1. Run `cp ./config/database.yml.sample ./config/database.yml` +1. Run `cp ./config/storage.yml.sample ./config/storage.yml` +1. Edit the two files above as needed. +1. Run `bundle exec rails db:setup` + +This should get the application setup and ready to run. -This should get the application setup. +To run the application locally: +1. Run `bin/dev` - this command will watch JS and CSS to rebuild +1. Run `bundle exec rails s` - this command will run the Rails server -To run development, run `bin/dev` - this command will watch JS and CSS to rebuild and run the Rails server +### Deploying to Production +This application is deployed via Dockerfile, so changes that will affect dependencies, etc should be reflected in the `Dockerfile`. diff --git a/config/database.yml b/config/database.yml.production similarity index 100% rename from config/database.yml rename to config/database.yml.production diff --git a/config/database.yml.sample b/config/database.yml.sample new file mode 100644 index 0000000..2bf56ed --- /dev/null +++ b/config/database.yml.sample @@ -0,0 +1,88 @@ +# 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 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 + adapter: postgresql + encoding: unicode + # 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 + database: site_v2_development + + # The specified database role being used to connect to PostgreSQL. + # To create additional roles in PostgreSQL see `$ createuser --help`. + # When left blank, PostgreSQL will use the default role. This is + # the same name as the operating system user running Rails. + #username: site_v2 + + # The password associated with the PostgreSQL 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 + database: site_v2_test + username: postgres + password: postgres + port: 5432 + host: localhost + encoding: utf8 + +# 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 + url: <%= ENV["DATABASE_URL"] %> diff --git a/config/storage.yml b/config/storage.yml.production similarity index 100% rename from config/storage.yml rename to config/storage.yml.production diff --git a/config/storage.yml.sample b/config/storage.yml.sample new file mode 100644 index 0000000..4942ab6 --- /dev/null +++ b/config/storage.yml.sample @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket-<%= Rails.env %> + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket-<%= Rails.env %> + +# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name-<%= Rails.env %> + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ]