From 55cf7c243f404c7c916b92f96942f5e75e42c127 Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Thu, 25 May 2023 15:53:49 -0500 Subject: [PATCH] feat(example_cms): initial commit (#163) --- example_cms/.dockerignore | 4 + example_cms/Dockerfile | 8 ++ example_cms/Makefile | 39 +++++++++ example_cms/README.md | 7 ++ example_cms/docker-compose.dev.yml | 56 +++++++++++++ example_cms/elasticsearch.yml | 14 ++++ .../src}/__init__.py | 0 .../src/apps/custom_example/__init__.py | 0 .../src/apps/custom_example/apps.py | 0 .../custom_example/custom_example.html | 0 .../src/apps/custom_example/urls.py | 0 .../src/apps/custom_example/views.py | 0 .../src/taccsite_cms/custom_app_settings.py | 0 .../src/taccsite_cms/secrets.default.py | 19 +++++ .../src/taccsite_cms/settings_custom.py | 76 ++++++++++++++++++ .../src/taccsite_cms/urls_custom.py | 0 .../taccsite_custom/matcssi_cms/__init__.py | 0 .../matcssi_cms/img/favicons/favicon.ico | Bin 0 -> 34494 bytes .../matcssi_cms/img/org_logos/matcssi.png | Bin 0 -> 14074 bytes 19 files changed, 223 insertions(+) create mode 100644 example_cms/.dockerignore create mode 100644 example_cms/Dockerfile create mode 100644 example_cms/Makefile create mode 100644 example_cms/README.md create mode 100644 example_cms/docker-compose.dev.yml create mode 100644 example_cms/elasticsearch.yml rename {demdata-cms/src/apps/custom_example => example_cms/src}/__init__.py (100%) mode change 100644 => 100755 create mode 100644 example_cms/src/apps/custom_example/__init__.py rename {demdata-cms => example_cms}/src/apps/custom_example/apps.py (100%) rename {demdata-cms => example_cms}/src/apps/custom_example/templates/custom_example/custom_example.html (100%) rename {demdata-cms => example_cms}/src/apps/custom_example/urls.py (100%) rename {demdata-cms => example_cms}/src/apps/custom_example/views.py (100%) rename {demdata-cms => example_cms}/src/taccsite_cms/custom_app_settings.py (100%) create mode 100644 example_cms/src/taccsite_cms/secrets.default.py create mode 100644 example_cms/src/taccsite_cms/settings_custom.py rename {demdata-cms => example_cms}/src/taccsite_cms/urls_custom.py (100%) create mode 100755 example_cms/src/taccsite_custom/matcssi_cms/__init__.py create mode 100644 example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/favicons/favicon.ico create mode 100644 example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/org_logos/matcssi.png diff --git a/example_cms/.dockerignore b/example_cms/.dockerignore new file mode 100644 index 00000000..a64885d2 --- /dev/null +++ b/example_cms/.dockerignore @@ -0,0 +1,4 @@ +.git +.cache +**/secrets.py +**/settings_local.py diff --git a/example_cms/Dockerfile b/example_cms/Dockerfile new file mode 100644 index 00000000..cb374f74 --- /dev/null +++ b/example_cms/Dockerfile @@ -0,0 +1,8 @@ +# v3.9.3 +FROM taccwma/core-cms:4ef3608 + +WORKDIR /code + +COPY /src/apps /code/apps +COPY /src/taccsite_custom /code/taccsite_custom +COPY /src/taccsite_cms /code/taccsite_cms diff --git a/example_cms/Makefile b/example_cms/Makefile new file mode 100644 index 00000000..04d475d0 --- /dev/null +++ b/example_cms/Makefile @@ -0,0 +1,39 @@ +DOCKERHUB_REPO := $(shell cat ./docker_repo.var) +DOCKER_TAG ?= $(shell git rev-parse --short HEAD) +DOCKER_IMAGE := $(DOCKERHUB_REPO):$(DOCKER_TAG) +DOCKER_IMAGE_LATEST := $(DOCKERHUB_REPO):latest + +#### +# `DOCKER_IMAGE_BRANCH` tag is the git tag for the commit if it exists, else the branch on which the commit exists +DOCKER_IMAGE_BRANCH := $(DOCKERHUB_REPO):$(shell git describe --exact-match --tags 2> /dev/null || git symbolic-ref --short HEAD) + +#.PHONY: build +build: + docker-compose -f docker-compose.dev.yml build + +.PHONY: build-full +build-full: + docker build -t $(DOCKER_IMAGE) --target production -f Dockerfile . + docker tag $(DOCKER_IMAGE) $(DOCKER_IMAGE_BRANCH) # Note: Currently broken for branches with slashes + +.PHONY: publish +publish: + docker push $(DOCKER_IMAGE) + docker push $(DOCKER_IMAGE_BRANCH) + +.PHONY: publish-latest +publish-latest: + docker tag $(DOCKER_IMAGE) $(DOCKER_IMAGE_LATEST) + docker push $(DOCKER_IMAGE_LATEST) + +.PHONY: start +start: + docker-compose -f docker-compose.dev.yml up + +.PHONY: stop +stop: + docker-compose -f docker-compose.dev.yml down + +.PHONY: stop-full +stop-v: + docker-compose -f docker-compose.dev.yml down -v diff --git a/example_cms/README.md b/example_cms/README.md new file mode 100644 index 00000000..9c63dc74 --- /dev/null +++ b/example_cms/README.md @@ -0,0 +1,7 @@ +# matcssi_cms + +An extension of the [Core CMS](https://github.com/TACC/Core-CMS) project + +## Basic Set Up + +See [Core-CMS-Custom](https://github.com/TACC/Core-CMS-Custom). diff --git a/example_cms/docker-compose.dev.yml b/example_cms/docker-compose.dev.yml new file mode 100644 index 00000000..ade79ea2 --- /dev/null +++ b/example_cms/docker-compose.dev.yml @@ -0,0 +1,56 @@ +version: "3" +services: + cms: + build: . + ports: + - 127.0.0.1:8000:8000 + command: ["python3", "manage.py", "runserver", "0.0.0.0:8000"] + container_name: matcssi_cms + hostname: matcssi_cms + volumes: + - ./src/apps:/code/apps + - ./src/taccsite_custom:/code/taccsite_custom + - ./src/taccsite_cms/custom_app_settings.py:/code/taccsite_cms/custom_app_settings.py + - ./src/taccsite_cms/urls_custom.py:/code/taccsite_cms/urls_custom.py + - ./src/taccsite_cms/settings_custom.py:/code/taccsite_cms/settings_custom.py + - ./src/taccsite_cms/settings_local.py:/code/taccsite_cms/settings_local.py + - ./src/taccsite_cms/secrets.py:/code/taccsite_cms/secrets.py + networks: + - matcssi_cms_net + + postgres: + image: postgres:11.5 + environment: + - POSTGRES_PASSWORD=taccforever + - POSTGRES_USER=postgresadmin + - POSTGRES_DB=taccsite + - PGDATA=/var/lib/postgresql/data/taccsite + volumes: + - matcssi_cms_postgres_data:/var/lib/postgresql/data + hostname: matcssi_cms_postgres + container_name: matcssi_cms_postgres + networks: + - matcssi_cms_net + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0 + ulimits: + memlock: -1 + environment: + - ES_HEAP_SIZE:1g + - discovery.type=single-node + volumes: + - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml + - matcssi_cms_es_data:/usr/share/elasticsearch/data + container_name: matcssi_cms_elasticsearch + ports: + - 127.0.0.1:9201:9200 + networks: + - matcssi_cms_net + +volumes: + matcssi_cms_postgres_data: + matcssi_cms_es_data: + +networks: + matcssi_cms_net: diff --git a/example_cms/elasticsearch.yml b/example_cms/elasticsearch.yml new file mode 100644 index 00000000..55847499 --- /dev/null +++ b/example_cms/elasticsearch.yml @@ -0,0 +1,14 @@ +#Use this to configure elasticsearch +#More info: https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html +# +cluster.name: es-dev +network.host: 0.0.0.0 +#network.publish_host: hostname +node.name: es01 +#minimum_master_nodes need to be explicitly set when bound on a public IP +# set to 1 to allow single node clusters +# Details: https://github.com/elastic/elasticsearch/pull/17288 +discovery.zen.minimum_master_nodes: 1 +#More info about memory_lock: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html +bootstrap.memory_lock: true +xpack.security.enabled: false \ No newline at end of file diff --git a/demdata-cms/src/apps/custom_example/__init__.py b/example_cms/src/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from demdata-cms/src/apps/custom_example/__init__.py rename to example_cms/src/__init__.py diff --git a/example_cms/src/apps/custom_example/__init__.py b/example_cms/src/apps/custom_example/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/demdata-cms/src/apps/custom_example/apps.py b/example_cms/src/apps/custom_example/apps.py similarity index 100% rename from demdata-cms/src/apps/custom_example/apps.py rename to example_cms/src/apps/custom_example/apps.py diff --git a/demdata-cms/src/apps/custom_example/templates/custom_example/custom_example.html b/example_cms/src/apps/custom_example/templates/custom_example/custom_example.html similarity index 100% rename from demdata-cms/src/apps/custom_example/templates/custom_example/custom_example.html rename to example_cms/src/apps/custom_example/templates/custom_example/custom_example.html diff --git a/demdata-cms/src/apps/custom_example/urls.py b/example_cms/src/apps/custom_example/urls.py similarity index 100% rename from demdata-cms/src/apps/custom_example/urls.py rename to example_cms/src/apps/custom_example/urls.py diff --git a/demdata-cms/src/apps/custom_example/views.py b/example_cms/src/apps/custom_example/views.py similarity index 100% rename from demdata-cms/src/apps/custom_example/views.py rename to example_cms/src/apps/custom_example/views.py diff --git a/demdata-cms/src/taccsite_cms/custom_app_settings.py b/example_cms/src/taccsite_cms/custom_app_settings.py similarity index 100% rename from demdata-cms/src/taccsite_cms/custom_app_settings.py rename to example_cms/src/taccsite_cms/custom_app_settings.py diff --git a/example_cms/src/taccsite_cms/secrets.default.py b/example_cms/src/taccsite_cms/secrets.default.py new file mode 100644 index 00000000..0ea29773 --- /dev/null +++ b/example_cms/src/taccsite_cms/secrets.default.py @@ -0,0 +1,19 @@ +# SECRET SETTINGS VALUES. +# (LOCAL TEST INSTANCE) + +######################## +# DATABASE SETTINGS +######################## + +from taccsite_cms.settings import DATABASES + +DATABASES = { + 'default': { + 'ENGINE': DATABASES['default']['ENGINE'], + 'PORT': DATABASES['default']['PORT'], + 'NAME': DATABASES['default']['NAME'], + 'USER': DATABASES['default']['USER'], + 'PASSWORD': DATABASES['default']['PASSWORD'], + 'HOST': 'example_cms_postgres' + } +} diff --git a/example_cms/src/taccsite_cms/settings_custom.py b/example_cms/src/taccsite_cms/settings_custom.py new file mode 100644 index 00000000..081a43c0 --- /dev/null +++ b/example_cms/src/taccsite_cms/settings_custom.py @@ -0,0 +1,76 @@ +# CUSTOM SETTINGS VALUES. +# TACC WMA CMS SITE: +# *.PROJECT_DOMAIN.TACC.UTEXAS.EDU + +######################## +# DJANGO CMS SETTINGS +######################## + +# CMS_TEMPLATES = ( +# ('standard.html', 'Standard'), +# ('fullwidth.html', 'Full Width'), + +# # Portal homepage placeholder +# ('home_portal.html', 'Standard Portal Homepage'), + +# # Portal guide pages +# ('guide.html', 'Guide'), +# ('guides/getting_started.tam.html', 'Guide: Getting Started'), +# # ('guides/getting_started.v2.html', 'Guide: Getting Started'), +# ('guides/data_transfer.html', 'Guide: Data Transfer'), +# ('guides/data_transfer.globus.html', 'Guide: Globus Data Transfer'), +# ('guides/portal_technology.html', 'Guide: Portal Technology Stack'), +# ) + +######################## +# DJANGO (EMAIL) +######################## + +# Set on server, NOT here +# https://confluence.tacc.utexas.edu/x/coR9E +# EMAIL_BACKEND = "..." +# EMAIL_HOST = "..." +# DEFAULT_FROM_EMAIL = "..." + +######################## +# TACC: BRANDING +######################## + +# from taccsite_cms.settings import TACC_BRANDING, UTEXAS_BRANDING, NSF_BRANDING +# +# _CUSTOM_BRANDING = [ +# "example", +# "example_cms/img/org_logos/example-logo.png", +# "", +# "https://example.com", +# "_blank", +# "Example Logo", +# "anonymous", +# "True" +# ] + +# BRANDING = [ TACC_BRANDING, UTEXAS_BRANDING, NSF_BRANDING, _CUSTOM_BRANDING ] + +######################## +# TACC: LOGOS +######################## + +LOGO = [ + "example", + "example_cms/img/org_logos/portal.png", + "", + "/", + "_self", + "Placeholder Logo for CMS/Portal", + "anonymous", + "True" +] + +######################## +# TACC: PORTAL +######################## + +# Does this CMS site have a portal? +# INCLUDES_CORE_PORTAL = False +# INCLUDES_PORTAL_NAV = False +# INCLUDES_SEARCH_BAR = False diff --git a/demdata-cms/src/taccsite_cms/urls_custom.py b/example_cms/src/taccsite_cms/urls_custom.py similarity index 100% rename from demdata-cms/src/taccsite_cms/urls_custom.py rename to example_cms/src/taccsite_cms/urls_custom.py diff --git a/example_cms/src/taccsite_custom/matcssi_cms/__init__.py b/example_cms/src/taccsite_custom/matcssi_cms/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/favicons/favicon.ico b/example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/favicons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..533966ed9f6346e9428e7b34ca693b5dab0a6966 GIT binary patch literal 34494 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 W4Dx@^7z1z5SmxsaPGA3z5%^ys-eMU5 literal 0 HcmV?d00001 diff --git a/example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/org_logos/matcssi.png b/example_cms/src/taccsite_custom/matcssi_cms/static/matcssi_cms/img/org_logos/matcssi.png new file mode 100644 index 0000000000000000000000000000000000000000..4f98b17769c9fcdb9e660b757c87f3753c0af2c2 GIT binary patch literal 14074 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