diff --git a/Dockerfile b/Dockerfile index c90a311..bb63a22 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ ################################# # Build the support container -FROM ruby:2.6.5-slim-stretch as base +FROM ruby:2.6.5-slim-stretch AS base LABEL edu.northwestern.library.app=Arch \ edu.northwestern.library.stage=build \ edu.northwestern.library.role=support @@ -21,31 +21,30 @@ RUN sed -i '/stretch-updates/d' /etc/apt/sources.list && \ RUN apt-get update -qq && \ apt-get install -y $BUILD_DEPS --no-install-recommends - -RUN \ - # Set locale - dpkg-reconfigure -f noninteractive tzdata && \ + +# Set locale +RUN dpkg-reconfigure -f noninteractive tzdata && \ sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \ dpkg-reconfigure --frontend=noninteractive locales && \ update-locale LANG=en_US.UTF-8 && \ \ - mkdir -p /tmp/stage/bin && \ - \ - # Install FFMPEG - mkdir -p /tmp/ffmpeg && \ + mkdir -p /tmp/stage/bin + +# Install FFMPEG +RUN mkdir -p /tmp/ffmpeg && \ cd /tmp/ffmpeg && \ curl https://s3.amazonaws.com/nul-repo-deploy/ffmpeg-release-64bit-static.tar.xz | tar xJ && \ - cp `find . -type f -executable` /tmp/stage/bin/ && \ - \ - # Install FITS - cd /tmp && \ + cp `find . -type f -executable` /tmp/stage/bin/ + +# Install FITS +RUN cd /tmp && \ curl -O https://s3.amazonaws.com/nul-repo-deploy/fits-${FITS_VERSION}.zip && \ cd /tmp/stage && \ - unzip -o /tmp/fits-${FITS_VERSION}.zip && \ - \ - # Update bundler - gem install rubygems-update --version 3.3.24 && \ + unzip -o /tmp/fits-${FITS_VERSION}.zip + +# Update bundler +RUN gem install rubygems-update --version 3.3.24 && \ update_rubygems && \ gem install bundler --version 2.3.8 @@ -64,7 +63,7 @@ RUN chown -R app:app /home/app && \ ################################# # Build the Application container -FROM ruby:2.6.5-slim-stretch as app +FROM ruby:2.6.5-slim-stretch AS app LABEL edu.northwestern.library.app=Arch \ edu.northwestern.library.stage=run \ edu.northwestern.library.role=app @@ -86,35 +85,42 @@ RUN sed -i '/stretch-updates/d' /etc/apt/sources.list && \ RUN mkdir -p /usr/share/man/man1 /usr/share/man/man7 && \ apt-get update -qq && \ - apt-get install -y curl gnupg2 --no-install-recommends && \ - # Install NodeJS and Yarn package repos - curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ + apt-get install -y ca-certificates curl gnupg2 --no-install-recommends + +# Install NodeJS and Yarn package repos +RUN curl -sL https://deb.nodesource.com/setup_12.x | sed '/deprecation_warning$/ s/^/#/' | bash - && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ - echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - # Install runtime dependencies - apt-get update -qq && \ - apt-get install -y $RUNTIME_DEPS --no-install-recommends && \ - # Install webpack - alias nodejs=node && \ - yarn add webpack && \ - # Set locale - dpkg-reconfigure -f noninteractive tzdata && \ + echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + +# Install runtime dependencies +RUN apt-get update -qq && \ + apt-get install -y $RUNTIME_DEPS --no-install-recommends + +# Install webpack +RUN alias nodejs=node && \ + yarn add webpack + +# Set locale +RUN dpkg-reconfigure -f noninteractive tzdata && \ sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \ dpkg-reconfigure --frontend=noninteractive locales && \ - update-locale LANG=en_US.UTF-8 && \ - # Install VIPS - cd /tmp && \ + update-locale LANG=en_US.UTF-8 + +# Install VIPS +RUN cd /tmp && \ curl -sO https://s3.amazonaws.com/nul-repo-deploy/packages/libvips-tools_8.7.4-1_amd64.deb && \ curl -sO https://s3.amazonaws.com/nul-repo-deploy/packages/libvips-dev_8.7.4-1_amd64.deb && \ curl -sO https://s3.amazonaws.com/nul-repo-deploy/packages/libvips42_8.7.4-1_amd64.deb && \ curl -sO https://s3.amazonaws.com/nul-repo-deploy/packages/gir1.2-vips-8.0_8.7.4-1_amd64.deb && \ - apt-get install -y $(find . -name '*.deb') && \ - # Clean up package cruft - apt-get clean -y && \ - rm -rf /var/lib/apt/lists/* /tmp/*.deb && \ - # Update Bundler - gem install rubygems-update --version 3.3.24 && \ + apt-get install -y $(find . -name '*.deb') + +# Clean up package cruft +RUN apt-get clean -y && \ + rm -rf /var/lib/apt/lists/* /tmp/*.deb + +# Update Bundler +RUN gem install rubygems-update --version 3.3.24 && \ update_rubygems && \ gem install bundler --version 2.3.8 diff --git a/app/views/cookie_consent/_content.html.erb b/app/views/cookie_consent/_content.html.erb new file mode 100644 index 0000000..225bcde --- /dev/null +++ b/app/views/cookie_consent/_content.html.erb @@ -0,0 +1 @@ +Cookie Settings \ No newline at end of file diff --git a/app/views/cookie_consent/_head.html.erb b/app/views/cookie_consent/_head.html.erb new file mode 100644 index 0000000..ecf243f --- /dev/null +++ b/app/views/cookie_consent/_head.html.erb @@ -0,0 +1,2 @@ + + diff --git a/app/views/layouts/hyrax.html.erb b/app/views/layouts/hyrax.html.erb index 4808495..c44b35a 100644 --- a/app/views/layouts/hyrax.html.erb +++ b/app/views/layouts/hyrax.html.erb @@ -1,6 +1,7 @@ " prefix="og:http://ogp.me/ns#"> + <%= render '/cookie_consent/head' %> <%= render partial: 'layouts/head_tag_content' %> <%= content_for(:head) %> diff --git a/app/views/shared/_footer.html.erb b/app/views/shared/_footer.html.erb index 7cc01c3..8ebe62b 100644 --- a/app/views/shared/_footer.html.erb +++ b/app/views/shared/_footer.html.erb @@ -44,5 +44,6 @@
  • Provide Feedback
  • + <%= render '/cookie_consent/content' %> diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl index e09711d..f797ea0 100644 --- a/terraform/.terraform.lock.hcl +++ b/terraform/.terraform.lock.hcl @@ -2,73 +2,80 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/archive" { - version = "2.2.0" + version = "2.7.0" hashes = [ - "h1:2K5LQkuWRS2YN1/YoNaHn9MAzjuTX8Gaqy6i8Mbfv8Y=", - "zh:06bd875932288f235c16e2237142b493c2c2b6aba0e82e8c85068332a8d2a29e", - "zh:0c681b481372afcaefddacc7ccdf1d3bb3a0c0d4678a526bc8b02d0c331479bc", - "zh:100fc5b3fc01ea463533d7bbfb01cb7113947a969a4ec12e27f5b2be49884d6c", - "zh:55c0d7ddddbd0a46d57c51fcfa9b91f14eed081a45101dbfc7fd9d2278aa1403", - "zh:73a5dd68379119167934c48afa1101b09abad2deb436cd5c446733e705869d6b", - "zh:841fc4ac6dc3479981330974d44ad2341deada8a5ff9e3b1b4510702dfbdbed9", - "zh:91be62c9b41edb137f7f835491183628d484e9d6efa82fcb75cfa538c92791c5", - "zh:acd5f442bd88d67eb948b18dc2ed421c6c3faee62d3a12200e442bfff0aa7d8b", - "zh:ad5720da5524641ad718a565694821be5f61f68f1c3c5d2cfa24426b8e774bef", - "zh:e63f12ea938520b3f83634fc29da28d92eed5cfbc5cc8ca08281a6a9c36cca65", - "zh:f6542918faa115df46474a36aabb4c3899650bea036b5f8a5e296be6f8f25767", + "h1:YkXq4JfcoAW0L4B9ghskZUxYbYAXIPlfSqqVFrAS06U=", + "zh:04e23bebca7f665a19a032343aeecd230028a3822e546e6f618f24c47ff87f67", + "zh:5bb38114238e25c45bf85f5c9f627a2d0c4b98fe44a0837e37d48574385f8dad", + "zh:64584bc1db4c390abd81c76de438d93acf967c8a33e9b923d68da6ed749d55bd", + "zh:697695ab9cce351adf91a1823bdd72ce6f0d219138f5124ef7645cedf8f59a1f", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7edefb1d1e2fead8fd155f7b50a2cb49f2f3fed154ac3ef5f991ccaff93d6120", + "zh:807fb15b75910bf14795f2ad1a2d41b069f9ef52c242131b2964c8527312e235", + "zh:821d9148d261df1d1a8e5a4812df2a6a3ffaf0d2070dad3c785382e489069239", + "zh:a7d92251118fb723048c482154a6ac6368aad583d28d15fffc6f5dafd9507463", + "zh:b627d4cef192b3c12ddaf9cb2c4f98c10d0129883c8c2a9c0049983f9de7030d", + "zh:dfb70306fcc0ad1d512ab7c24765703783cc286062d4849de4fbe23526f5dc8e", + "zh:f21de276f857b7e51fa2593d8fef05a7faafb0a7b62db14ac58a03ce1be7d881", ] } provider "registry.terraform.io/hashicorp/aws" { - version = "3.56.0" + version = "5.96.0" hashes = [ - "h1:XuiEcFvwm+GkRpt4MqfwJpfdU2BssSjpyqMkqrI3Pjs=", - "zh:001373be6fbc5738bf8c3aa8688b248ba5f99b04174310c0efcbbf23e6c4dc29", - "zh:0d4af59266668089790f5a7bdeb25642ba750fb5dc7934fe28d1cc36310ba495", - "zh:1413ff4d445678c096d46e8957e27320df94561354955d7bc5d8054b6df7b299", - "zh:19d614259f7ce16b50ec07868404b58749702baaf86bcd14fbaea2756e1c9f25", - "zh:2d148ff632da25852622b06b5be9f5a0b6d509621a002a47338f96509021945b", - "zh:3959a1d989c99f3e7cdd5de07eb3e7df7a85e19677488278c77ab753dd7127e6", - "zh:5d8d65b458a8934dc67d22904da368b5bc3a77fb9c900ac89c54e736a221b76f", - "zh:94d5660e56118fcaa40fccaff960a9bf4166b7b0e7fedeb21b2402c8fc7b4cb1", - "zh:a6002ecc23ebc468ccac6f36c0ed7cc95de3223ef6b100e6c81762d22cc14077", - "zh:b0880c82bc2ad395ef3dbf5a592a23e65bf943df8995d5d4238740f96a02f529", - "zh:ee65f3d2c13653e0828222a63fb832f98e9835b84443eeca00ce36ae39783c08", + "h1:hqoQJnKaTfzNge5oCELAs+jqiT0R0oygDYlG4pmy3yk=", + "zh:3f7e734abb9d647c851f5cb987837d7c073c9cbf1f520a031027d827f93d3b68", + "zh:5ca9400360a803a11cf432ca203be9f09da8fff9c96110a83c9029102b18c9d5", + "zh:5d421f475d467af182a527b7a61d50105dc63394316edf1c775ef736f84b941c", + "zh:68f2328e7f3e7666835d6815b39b46b08954a91204f82a6f648c928a0b09a744", + "zh:6a4170e7e2764df2968d1df65efebda55273dfc36dc6741207afb5e4b7e85448", + "zh:73f2a15bee21f7c92a071e2520216d0a40041aca52c0f6682e540da8ffcfada4", + "zh:9843d6973aedfd4cbaafd7110420d0c4c1d7ef4a2eeff508294c3adcc3613145", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9d1abd6be717c42f2a6257ee227d3e9548c31f01c976ed7b32b2745a63659a67", + "zh:a70d642e323021d54a92f0daa81d096cb5067cb99ce116047a42eb1cb1d579a0", + "zh:b9a2b293208d5a0449275fae463319e0998c841e0bcd4014594a49ba54bb70d6", + "zh:ce0b0eb7ac24ff58c20efcb526c3f792a95be3617c795b45bbeea9f302903ae7", + "zh:dbbf98b3cd8003833c472bdb89321c17a9bbdc1b785e7e3d75f8af924ee5a0e4", + "zh:df86cf9311a4be8bb4a251196650653f97e01fbf5fe72deecc8f28a35a5352ae", + "zh:f92992881afd9339f3e539fcd90cfc1e9ed1356b5e760bbcc804314c3cd6837f", ] } provider "registry.terraform.io/hashicorp/null" { - version = "3.1.0" + version = "3.2.4" hashes = [ - "h1:xhbHC6in3nQryvTQBWKxebi3inG5OCgHgc4fRxL0ymc=", - "zh:02a1675fd8de126a00460942aaae242e65ca3380b5bb192e8773ef3da9073fd2", - "zh:53e30545ff8926a8e30ad30648991ca8b93b6fa496272cd23b26763c8ee84515", - "zh:5f9200bf708913621d0f6514179d89700e9aa3097c77dac730e8ba6e5901d521", - "zh:9ebf4d9704faba06b3ec7242c773c0fbfe12d62db7d00356d4f55385fc69bfb2", - "zh:a6576c81adc70326e4e1c999c04ad9ca37113a6e925aefab4765e5a5198efa7e", - "zh:a8a42d13346347aff6c63a37cda9b2c6aa5cc384a55b2fe6d6adfa390e609c53", - "zh:c797744d08a5307d50210e0454f91ca4d1c7621c68740441cf4579390452321d", - "zh:cecb6a304046df34c11229f20a80b24b1603960b794d68361a67c5efe58e62b8", - "zh:e1371aa1e502000d9974cfaff5be4cfa02f47b17400005a16f14d2ef30dc2a70", - "zh:fc39cc1fe71234a0b0369d5c5c7f876c71b956d23d7d6f518289737a001ba69b", - "zh:fea4227271ebf7d9e2b61b89ce2328c7262acd9fd190e1fd6d15a591abfa848e", + "h1:hkf5w5B6q8e2A42ND2CjAvgvSN3puAosDmOJb3zCVQM=", + "zh:59f6b52ab4ff35739647f9509ee6d93d7c032985d9f8c6237d1f8a59471bbbe2", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:795c897119ff082133150121d39ff26cb5f89a730a2c8c26f3a9c1abf81a9c43", + "zh:7b9c7b16f118fbc2b05a983817b8ce2f86df125857966ad356353baf4bff5c0a", + "zh:85e33ab43e0e1726e5f97a874b8e24820b6565ff8076523cc2922ba671492991", + "zh:9d32ac3619cfc93eb3c4f423492a8e0f79db05fec58e449dee9b2d5873d5f69f", + "zh:9e15c3c9dd8e0d1e3731841d44c34571b6c97f5b95e8296a45318b94e5287a6e", + "zh:b4c2ab35d1b7696c30b64bf2c0f3a62329107bd1a9121ce70683dec58af19615", + "zh:c43723e8cc65bcdf5e0c92581dcbbdcbdcf18b8d2037406a5f2033b1e22de442", + "zh:ceb5495d9c31bfb299d246ab333f08c7fb0d67a4f82681fbf47f2a21c3e11ab5", + "zh:e171026b3659305c558d9804062762d168f50ba02b88b231d20ec99578a6233f", + "zh:ed0fe2acdb61330b01841fa790be00ec6beaac91d41f311fb8254f74eb6a711f", ] } provider "registry.terraform.io/hashicorp/random" { - version = "3.1.0" + version = "3.7.2" hashes = [ - "h1:rKYu5ZUbXwrLG1w81k7H3nce/Ys6yAxXhWcbtk36HjY=", - "zh:2bbb3339f0643b5daa07480ef4397bd23a79963cc364cdfbb4e86354cb7725bc", - "zh:3cd456047805bf639fbf2c761b1848880ea703a054f76db51852008b11008626", - "zh:4f251b0eda5bb5e3dc26ea4400dba200018213654b69b4a5f96abee815b4f5ff", - "zh:7011332745ea061e517fe1319bd6c75054a314155cb2c1199a5b01fe1889a7e2", - "zh:738ed82858317ccc246691c8b85995bc125ac3b4143043219bd0437adc56c992", - "zh:7dbe52fac7bb21227acd7529b487511c91f4107db9cc4414f50d04ffc3cab427", - "zh:a3a9251fb15f93e4cfc1789800fc2d7414bbc18944ad4c5c98f466e6477c42bc", - "zh:a543ec1a3a8c20635cf374110bd2f87c07374cf2c50617eee2c669b3ceeeaa9f", - "zh:d9ab41d556a48bd7059f0810cf020500635bfc696c9fc3adab5ea8915c1d886b", - "zh:d9e13427a7d011dbd654e591b0337e6074eef8c3b9bb11b2e39eaaf257044fd7", - "zh:f7605bd1437752114baf601bdf6931debe6dc6bfe3006eb7e9bb9080931dca8a", + "h1:356j/3XnXEKr9nyicLUufzoF4Yr6hRy481KIxRVpK0c=", + "zh:14829603a32e4bc4d05062f059e545a91e27ff033756b48afbae6b3c835f508f", + "zh:1527fb07d9fea400d70e9e6eb4a2b918d5060d604749b6f1c361518e7da546dc", + "zh:1e86bcd7ebec85ba336b423ba1db046aeaa3c0e5f921039b3f1a6fc2f978feab", + "zh:24536dec8bde66753f4b4030b8f3ef43c196d69cccbea1c382d01b222478c7a3", + "zh:29f1786486759fad9b0ce4fdfbbfece9343ad47cd50119045075e05afe49d212", + "zh:4d701e978c2dd8604ba1ce962b047607701e65c078cb22e97171513e9e57491f", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7b8434212eef0f8c83f5a90c6d76feaf850f6502b61b53c329e85b3b281cba34", + "zh:ac8a23c212258b7976e1621275e3af7099e7e4a3d4478cf8d5d2a27f3bc3e967", + "zh:b516ca74431f3df4c6cf90ddcdb4042c626e026317a33c53f0b445a3d93b720d", + "zh:dc76e4326aec2490c1600d6871a95e78f9050f9ce427c71707ea412a2f2f1a62", + "zh:eac7b63e86c749c7d48f527671c7aee5b4e26c10be6ad7232d6860167f99dbb0", ] } diff --git a/terraform/ecs_services.tf b/terraform/ecs_services.tf index 58a6ed0..779d4c7 100644 --- a/terraform/ecs_services.tf +++ b/terraform/ecs_services.tf @@ -33,6 +33,7 @@ module "db_schema" { module "arch_task_webapp" { source = "./modules/arch_task" + db_pool_size = 5 container_config = local.container_config cpu = 2048 memory = 4096 @@ -81,9 +82,9 @@ resource "aws_ecs_service" "arch_webapp" { module "arch_task_worker" { source = "./modules/arch_task" container_config = local.container_config - cpu = 2048 - db_pool_size = 20 - memory = 4096 + cpu = 4096 + memory = 8192 + db_pool_size = 50 container_role = "worker" role_arn = aws_iam_role.arch_role.arn app_name = var.app_name @@ -117,3 +118,50 @@ resource "aws_ecs_service" "arch_worker" { tags = local.tags } + +resource "aws_appautoscaling_target" "webapp_target" { + count = var.enable_autoscaling ? 1 : 0 + max_capacity = var.service_count_max + min_capacity = var.service_count_min + resource_id = "service/${aws_ecs_cluster.arch.name}/${aws_ecs_service.arch_webapp.name}" + scalable_dimension = "ecs:service:DesiredCount" + service_namespace = "ecs" +} + +resource "aws_appautoscaling_policy" "webapp_cpu_policy" { + count = var.enable_autoscaling ? 1 : 0 + name = "scale-up-on-cpu" + policy_type = "TargetTrackingScaling" + resource_id = aws_appautoscaling_target.webapp_target[0].resource_id + scalable_dimension = aws_appautoscaling_target.webapp_target[0].scalable_dimension + service_namespace = aws_appautoscaling_target.webapp_target[0].service_namespace + + target_tracking_scaling_policy_configuration { + predefined_metric_specification { + predefined_metric_type = "ECSServiceAverageCPUUtilization" + } + scale_in_cooldown = 300 + scale_out_cooldown = 300 + + target_value = var.cpu_target + } +} + +resource "aws_appautoscaling_policy" "webapp_memory_policy" { + count = var.enable_autoscaling ? 1 : 0 + name = "auto-scale-on-mem" + policy_type = "TargetTrackingScaling" + resource_id = aws_appautoscaling_target.webapp_target[0].resource_id + scalable_dimension = aws_appautoscaling_target.webapp_target[0].scalable_dimension + service_namespace = aws_appautoscaling_target.webapp_target[0].service_namespace + + target_tracking_scaling_policy_configuration { + predefined_metric_specification { + predefined_metric_type = "ECSServiceAverageMemoryUtilization" + } + scale_in_cooldown = 300 + scale_out_cooldown = 300 + + target_value = var.cpu_target + } +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf index 3dbae1e..202bab1 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -72,3 +72,33 @@ variable "recaptcha_secret_key" { variable "recaptcha_site_key" { type = string } + +variable "enable_autoscaling" { + type = bool + default = false +} + +variable "service_count_min" { + type = number + default = 1 +} + +variable "service_count_max" { + type = number + default = 3 +} + +variable "service_count_desired" { + type = number + default = 1 +} + +variable "cpu_target" { + type = number + default = 70 +} + +variable "memory_target" { + type = number + default = 70 +} \ No newline at end of file