diff --git a/Makefile b/Makefile index 1134c14c5e..77441af067 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ stop.watchers stop.xqueue studio-restart studio-shell studio-static \ studio-update-db studio-watcher-shell update-db upgrade upgrade \ validate validate-lms-volume vnc-passwords xqueue_consumer-restart \ - xqueue_consumer-shell xqueue-restart xqueue-shell + xqueue_consumer-shell xqueue-restart xqueue-shell sites # Include options (configurable through options.local.mk) include options.mk @@ -33,6 +33,10 @@ include options.mk # You can use this file to configure your Devstack. It is ignored by git. -include options.local.mk # Prefix with hyphen to tolerate absence of file. +SITE_LMS=localhost:18000 +SITE_CMS=localhost:18010 +SITE_ECOMMERCE=localhost:18130 + # Include local makefile with additional targets. -include local.mk # Prefix with hyphen to tolerate absence of file. @@ -426,3 +430,8 @@ feature-toggle-state: ## Gather the state of feature toggles configured for vari selfcheck: ## check that the Makefile is well-formed @echo "The Makefile is well-formed." + +sites: + @echo $$SITE_LMS + @echo $$SITE_CMS + @echo $$SITE_ECOMMERCE \ No newline at end of file diff --git a/check.sh b/check.sh index e833b49188..29ce51a41e 100755 --- a/check.sh +++ b/check.sh @@ -63,12 +63,22 @@ fi if should_check lms; then echo "Checking LMS heartbeat:" + if [ -n "${SITE_LMS}" ]; then + SITE_LMS=$SITE_LMS + else + SITE_LMS=localhost:18000 + fi run_check lms_heartbeat lms \ - "curl --fail -L http://localhost:18000/heartbeat" + "curl --fail -L http://$SITE_LMS/heartbeat" echo "Checking Studio heartbeat:" + if [ -n "${SITE_CMS}" ]; then + SITE_CMS=$SITE_CMS + else + SITE_CMS=localhost:18010 + fi run_check studio_heartbeat lms \ - "curl --fail -L http://localhost:18010/heartbeat" + "curl --fail -L http://$SITE_CMS/heartbeat" echo "Validating LMS volume:" run_check lms_volume lms \ @@ -77,8 +87,13 @@ fi if should_check ecommerce; then echo "Checking ecommerce health:" + if [ -n "${SITE_ECOMMERCE}" ]; then + SITE_ECOMMERCE=$SITE_ECOMMERCE + else + SITE_ECOMMERCE=localhost:18130 + fi run_check ecommerce_heartbeat ecommerce \ - "curl --fail -L http://localhost:18130/health/" + "curl --fail -L http://$SITE_ECOMMERCE/health/" fi if should_check discovery; then diff --git a/docker-compose-host.yml b/docker-compose-host.yml index 3762f05efc..aa0772191b 100644 --- a/docker-compose-host.yml +++ b/docker-compose-host.yml @@ -25,6 +25,8 @@ services: - edxapp_node_modules:/edx/app/edxapp/edx-platform/node_modules - edxapp_uploads:/edx/var/edxapp/uploads - ${DEVSTACK_WORKSPACE}/src:/edx/src:cached + - ./edx-config/etc/lms.yml:/edx/etc/lms.yml + - ./edx-config/app/edxapp/edx-platform/lms/envs/devstack.py:/edx/app/edxapp/edx-platform/lms/envs/devstack.py edx_notes_api: volumes: - ${DEVSTACK_WORKSPACE}/edx-notes-api:/edx/app/edx_notes_api/edx_notes_api:cached @@ -36,6 +38,8 @@ services: - edxapp_node_modules:/edx/app/edxapp/edx-platform/node_modules - edxapp_uploads:/edx/var/edxapp/uploads - ${DEVSTACK_WORKSPACE}/src:/edx/src:cached + - ./edx-config/etc/studio.yml:/edx/etc/studio.yml + - ./edx-config/app/edxapp/edx-platform/cms/envs/devstack.py:/edx/app/edxapp/edx-platform/cms/envs/devstack.py forum: volumes: - ${DEVSTACK_WORKSPACE}/cs_comments_service:/edx/app/forum/cs_comments_service:cached diff --git a/docker-compose.yml b/docker-compose.yml index 9415dfd133..103bf406ba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -136,7 +136,7 @@ services: CACHE_LOCATION: edx.devstack.memcached:12211 DB_HOST: edx.devstack.mysql SOCIAL_AUTH_EDX_OIDC_URL_ROOT: http://edx.devstack.lms:18000/oauth2 - ENABLE_DJANGO_TOOLBAR: 1 + # ENABLE_DJANGO_TOOLBAR: ${ENABLE_DJANGO_TOOLBAR} DJANGO_WATCHMAN_TIMEOUT: 30 image: edxops/credentials:${OPENEDX_RELEASE:-latest} ports: @@ -155,7 +155,7 @@ services: tty: true environment: TEST_ELASTICSEARCH_URL: "http://edx.devstack.elasticsearch:9200" - ENABLE_DJANGO_TOOLBAR: 1 + # ENABLE_DJANGO_TOOLBAR: ${ENABLE_DJANGO_TOOLBAR} DJANGO_WATCHMAN_TIMEOUT: 30 image: edxops/discovery:${OPENEDX_RELEASE:-latest} ports: @@ -177,7 +177,8 @@ services: tty: true environment: DJANGO_WATCHMAN_TIMEOUT: 30 - ENABLE_DJANGO_TOOLBAR: 1 + # ENABLE_DJANGO_TOOLBAR: ${ENABLE_DJANGO_TOOLBAR} + image: edxops/ecommerce:${OPENEDX_RELEASE:-latest} ports: - "18130:18130" @@ -201,7 +202,7 @@ services: DB_PORT: "3306" DB_USER: "notes001" DJANGO_WATCHMAN_TIMEOUT: 30 - ENABLE_DJANGO_TOOLBAR: 1 + # ENABLE_DJANGO_TOOLBAR: ${ENABLE_DJANGO_TOOLBAR} ELASTICSEARCH_URL: "http://edx.devstack.elasticsearch:9200" forum: @@ -239,6 +240,7 @@ services: EDXAPP_TEST_MONGO_HOST: edx.devstack.mongo NO_PYTHON_UNINSTALL: 1 DJANGO_WATCHMAN_TIMEOUT: 30 + # ENABLE_DJANGO_TOOLBAR: ${ENABLE_DJANGO_TOOLBAR} image: edxops/edxapp:${OPENEDX_RELEASE:-latest} ports: - "18000:18000" @@ -268,7 +270,7 @@ services: DB_PORT: 3306 DB_USER: registrar001 DB_PASSWORD: password - LMS_HOST: http://localhost:18000 + LMS_HOST: http://${SITE_LMS} MEMCACHE_HOST: edx.devstack.memcached DJANGO_SETTINGS_MODULE: registrar.settings.devstack CELERY_ALWAYS_EAGER: 'false' @@ -299,7 +301,7 @@ services: DB_PORT: 3306 DB_USER: registrar001 DB_PASSWORD: password - LMS_HOST: http://localhost:18000 + LMS_HOST: http://${SITE_LMS} MEMCACHE_HOST: edx.devstack.memcached DJANGO_SETTINGS_MODULE: registrar.settings.devstack CELERY_BROKER_TRANSPORT: redis diff --git a/edx-config/app/edxapp/.gitignore b/edx-config/app/edxapp/.gitignore new file mode 100644 index 0000000000..9a1a4bac7a --- /dev/null +++ b/edx-config/app/edxapp/.gitignore @@ -0,0 +1,2 @@ +*.json +edxapp_env \ No newline at end of file diff --git a/edx-config/app/edxapp/cms.auth.json.example b/edx-config/app/edxapp/cms.auth.json.example new file mode 100644 index 0000000000..ce2b9fd470 --- /dev/null +++ b/edx-config/app/edxapp/cms.auth.json.example @@ -0,0 +1,207 @@ +{ + "AWS_ACCESS_KEY_ID": null, + "AWS_QUERYSTRING_AUTH": false, + "AWS_S3_CUSTOM_DOMAIN": "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)", + "AWS_SECRET_ACCESS_KEY": null, + "AWS_STORAGE_BUCKET_NAME": "SET-ME-PLEASE (ex. bucket-name)", + "BRANCH_IO_KEY": "", + "CELERY_BROKER_PASSWORD": "celery", + "CELERY_BROKER_USER": "celery", + "CELERY_TIMEZONE": "UTC", + "CONTENTSTORE": { + "ADDITIONAL_OPTIONS": {}, + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "PRIMARY", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.contentstore.mongo.MongoContentStore", + "OPTIONS": { + "auth_source": "", + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "ssl": false, + "user": "edxapp" + } + }, + "CREDIT_PROVIDER_SECRET_KEYS": {}, + "DATABASES": { + "default": { + "ATOMIC_REQUESTS": true, + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + }, + "read_replica": { + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + }, + "student_module_history": { + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp_csmh", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + } + }, + "DEFAULT_FILE_STORAGE": "django.core.files.storage.FileSystemStorage", + "DJFS": { + "directory_root": "/edx/var/edxapp/django-pyfs/static/django-pyfs", + "type": "osfs", + "url_root": "/static/django-pyfs" + }, + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "PRIMARY", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ECOMMERCE_API_SIGNING_KEY": "lms-secret", + "EMAIL_HOST_PASSWORD": "", + "EMAIL_HOST_USER": "", + "ENTERPRISE_SERVICE_WORKER_USERNAME": "enterprise_worker", + "EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST": [], + "FACEBOOK_API_VERSION": "v2.1", + "FACEBOOK_APP_ID": "FACEBOOK_APP_ID", + "FACEBOOK_APP_SECRET": "FACEBOOK_APP_SECRET", + "FERNET_KEYS": [ + "DUMMY KEY CHANGE BEFORE GOING TO PRODUCTION" + ], + "GOOGLE_ANALYTICS_ACCOUNT": null, + "MODULESTORE": { + "default": { + "ENGINE": "xmodule.modulestore.mixed.MixedModuleStore", + "OPTIONS": { + "mappings": {}, + "stores": [ + { + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "PRIMARY", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.modulestore.split_mongo.split_draft.DraftVersioningModuleStore", + "NAME": "split", + "OPTIONS": { + "default_class": "xmodule.hidden_module.HiddenDescriptor", + "fs_root": "/edx/var/edxapp/data", + "render_template": "edxmako.shortcuts.render_to_string" + } + }, + { + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "PRIMARY", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.modulestore.mongo.DraftMongoModuleStore", + "NAME": "draft", + "OPTIONS": { + "default_class": "xmodule.hidden_module.HiddenDescriptor", + "fs_root": "/edx/var/edxapp/data", + "render_template": "edxmako.shortcuts.render_to_string" + } + } + ] + } + } + }, + "PARSE_KEYS": {}, + "PROCTORING_BACKENDS": { + "DEFAULT": "null", + "null": {} + }, + "SECRET_KEY": "DUMMY KEY ONLY FOR TO DEVSTACK", + "SEGMENT_KEY": null, + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY": "", + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY_DICT": {}, + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT": "", + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT_DICT": {}, + "SWIFT_AUTH_URL": null, + "SWIFT_AUTH_VERSION": null, + "SWIFT_KEY": null, + "SWIFT_REGION_NAME": null, + "SWIFT_TEMP_URL_DURATION": 1800, + "SWIFT_TEMP_URL_KEY": null, + "SWIFT_TENANT_ID": null, + "SWIFT_TENANT_NAME": null, + "SWIFT_USERNAME": null, + "SWIFT_USE_TEMP_URLS": false, + "XQUEUE_INTERFACE": { + "basic_auth": [ + "edx", + "edx" + ], + "django_auth": { + "password": "password", + "username": "lms" + }, + "url": "http://edx.devstack.xqueue:18040" + }, + "YOUTUBE_API_KEY": "PUT_YOUR_API_KEY_HERE", + "ZENDESK_API_KEY": "", + "ZENDESK_GROUP_ID_MAPPING": {}, + "ZENDESK_OAUTH_ACCESS_TOKEN": "", + "ZENDESK_USER": "" +} \ No newline at end of file diff --git a/edx-config/app/edxapp/cms.env.json.example b/edx-config/app/edxapp/cms.env.json.example new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edx-config/app/edxapp/edx-platform/cms/envs/devstack.py b/edx-config/app/edxapp/edx-platform/cms/envs/devstack.py new file mode 100644 index 0000000000..28c86c6903 --- /dev/null +++ b/edx-config/app/edxapp/edx-platform/cms/envs/devstack.py @@ -0,0 +1,215 @@ +""" +Specific overrides to the base prod settings to make development easier. +""" + + +import logging +from os.path import abspath, dirname, join + +from .production import * # pylint: disable=wildcard-import, unused-wildcard-import + +# Don't use S3 in devstack, fall back to filesystem +del DEFAULT_FILE_STORAGE +COURSE_IMPORT_EXPORT_STORAGE = 'django.core.files.storage.FileSystemStorage' +USER_TASKS_ARTIFACT_STORAGE = COURSE_IMPORT_EXPORT_STORAGE + +DEBUG = True +USE_I18N = True +DEFAULT_TEMPLATE_ENGINE['OPTIONS']['debug'] = DEBUG +SITE_NAME = 'localhost:8001' +HTTPS = 'off' + +CMS_BASE = 'studio.dev.dipsims.xyz' + +################################ LOGGERS ###################################### + + +# Disable noisy loggers +for pkg_name in ['track.contexts', 'track.middleware']: + logging.getLogger(pkg_name).setLevel(logging.CRITICAL) + +# Docker does not support the syslog socket at /dev/log. Rely on the console. +LOGGING['handlers']['local'] = LOGGING['handlers']['tracking'] = { + 'class': 'logging.NullHandler', +} + +LOGGING['loggers']['tracking']['handlers'] = ['console'] + +################################ EMAIL ######################################## + +EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' +EMAIL_FILE_PATH = '/edx/src/ace_messages/' + +################################# LMS INTEGRATION ############################# + +LMS_BASE = 'localhost:18000' +LMS_ROOT_URL = 'http://{}'.format(LMS_BASE) +FEATURES['PREVIEW_LMS_BASE'] = "preview." + LMS_BASE + +########################### PIPELINE ################################# + +# Skip packaging and optimization in development +PIPELINE['PIPELINE_ENABLED'] = False +STATICFILES_STORAGE = 'openedx.core.storage.DevelopmentStorage' + +# Revert to the default set of finders as we don't want the production pipeline +STATICFILES_FINDERS = [ + 'openedx.core.djangoapps.theming.finders.ThemeFilesFinder', + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +] + +# Load development webpack donfiguration +WEBPACK_CONFIG_PATH = 'webpack.dev.config.js' + +############################ PYFS XBLOCKS SERVICE ############################# +# Set configuration for Django pyfilesystem + +DJFS = { + 'type': 'osfs', + 'directory_root': 'cms/static/djpyfs', + 'url_root': '/static/djpyfs', +} + +################################# CELERY ###################################### + +# By default don't use a worker, execute tasks as if they were local functions +CELERY_ALWAYS_EAGER = True + +################################ DEBUG TOOLBAR ################################ + +INSTALLED_APPS += ['debug_toolbar'] + +MIDDLEWARE.append('debug_toolbar.middleware.DebugToolbarMiddleware') +INTERNAL_IPS = ('127.0.0.1',) + +DEBUG_TOOLBAR_PANELS = ( + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.profiling.ProfilingPanel', +) + +DEBUG_TOOLBAR_CONFIG = { + # Profile panel is incompatible with wrapped views + # See https://github.com/jazzband/django-debug-toolbar/issues/792 + 'DISABLE_PANELS': ( + 'debug_toolbar.panels.profiling.ProfilingPanel', + ), + 'SHOW_TOOLBAR_CALLBACK': 'cms.envs.devstack.should_show_debug_toolbar', +} + + +def should_show_debug_toolbar(request): + # We always want the toolbar on devstack unless running tests from another Docker container + if os.environ.get('ENABLE_DJANGO_TOOLBAR', False): + return True + return False + + +################################ MILESTONES ################################ +FEATURES['MILESTONES_APP'] = True + + +################################ ENTRANCE EXAMS ################################ +FEATURES['ENTRANCE_EXAMS'] = True + +################################ COURSE LICENSES ################################ +FEATURES['LICENSING'] = True +# Needed to enable licensing on video modules +XBLOCK_SETTINGS.update({'VideoBlock': {'licensing_enabled': True}}) + +################################ SEARCH INDEX ################################ +FEATURES['ENABLE_COURSEWARE_INDEX'] = False +FEATURES['ENABLE_LIBRARY_INDEX'] = False +SEARCH_ENGINE = "search.elastic.ElasticSearchEngine" + +################################ COURSE DISCUSSIONS ########################### +FEATURES['ENABLE_DISCUSSION_SERVICE'] = True + +################################ CREDENTIALS ########################### +CREDENTIALS_SERVICE_USERNAME = 'credentials_worker' + +########################## Certificates Web/HTML View ####################### +FEATURES['CERTIFICATES_HTML_VIEW'] = True + +########################## AUTHOR PERMISSION ####################### +FEATURES['ENABLE_CREATOR_GROUP'] = False + +################### FRONTEND APPLICATION PUBLISHER URL ################### +FEATURES['FRONTEND_APP_PUBLISHER_URL'] = 'http://localhost:18400' + +################################# DJANGO-REQUIRE ############################### + +# Whether to run django-require in debug mode. +REQUIRE_DEBUG = DEBUG + +########################### OAUTH2 ################################# +JWT_AUTH.update({ + 'JWT_ISSUER': '{}/oauth2'.format(LMS_ROOT_URL), + 'JWT_ISSUERS': [{ + 'AUDIENCE': 'lms-key', + 'ISSUER': '{}/oauth2'.format(LMS_ROOT_URL), + 'SECRET_KEY': 'lms-secret', + }], + 'JWT_SECRET_KEY': 'lms-secret', + 'JWT_AUDIENCE': 'lms-key', + 'JWT_PUBLIC_SIGNING_JWK_SET': ( + '{"keys": [{"kid": "devstack_key", "e": "AQAB", "kty": "RSA", "n": "smKFSYowG6nNUAdeqH1jQQnH1PmIHphzBmwJ5vRf1vu' + '48BUI5VcVtUWIPqzRK_LDSlZYh9D0YFL0ZTxIrlb6Tn3Xz7pYvpIAeYuQv3_H5p8tbz7Fb8r63c1828wXPITVTv8f7oxx5W3lFFgpFAyYMmROC' + '4Ee9qG5T38LFe8_oAuFCEntimWxN9F3P-FJQy43TL7wG54WodgiM0EgzkeLr5K6cDnyckWjTuZbWI-4ffcTgTZsL_Kq1owa_J2ngEfxMCObnzG' + 'y5ZLcTUomo4rZLjghVpq6KZxfS6I1Vz79ZsMVUWEdXOYePCKKsrQG20ogQEkmTf9FT_SouC6jPcHLXw"}]}' + ), + + # TODO Remove this once CMS redirects to LMS for Login + 'JWT_PRIVATE_SIGNING_JWK': ( + '{"e": "AQAB", "d": "RQ6k4NpRU3RB2lhwCbQ452W86bMMQiPsa7EJiFJUg-qBJthN0FMNQVbArtrCQ0xA1BdnQHThFiUnHcXfsTZUwmwvTu' + 'iqEGR_MI6aI7h5D8vRj_5x-pxOz-0MCB8TY8dcuK9FkljmgtYvV9flVzCk_uUb3ZJIBVyIW8En7n7nV7JXpS9zey1yVLld2AbRG6W5--Pgqr9J' + 'CI5-bLdc2otCLuen2sKyuUDHO5NIj30qGTaKUL-OW_PgVmxrwKwccF3w5uGNEvMQ-IcicosCOvzBwdIm1uhdm9rnHU1-fXz8VLRHNhGVv7z6mo' + 'ghjNI0_u4smhUkEsYeshPv7RQEWTdkOQ", "n": "smKFSYowG6nNUAdeqH1jQQnH1PmIHphzBmwJ5vRf1vu48BUI5VcVtUWIPqzRK_LDSlZYh' + '9D0YFL0ZTxIrlb6Tn3Xz7pYvpIAeYuQv3_H5p8tbz7Fb8r63c1828wXPITVTv8f7oxx5W3lFFgpFAyYMmROC4Ee9qG5T38LFe8_oAuFCEntimW' + 'xN9F3P-FJQy43TL7wG54WodgiM0EgzkeLr5K6cDnyckWjTuZbWI-4ffcTgTZsL_Kq1owa_J2ngEfxMCObnzGy5ZLcTUomo4rZLjghVpq6KZxfS' + '6I1Vz79ZsMVUWEdXOYePCKKsrQG20ogQEkmTf9FT_SouC6jPcHLXw", "q": "7KWj7l-ZkfCElyfvwsl7kiosvi-ppOO7Imsv90cribf88Dex' + 'cO67xdMPesjM9Nh5X209IT-TzbsOtVTXSQyEsy42NY72WETnd1_nAGLAmfxGdo8VV4ZDnRsA8N8POnWjRDwYlVBUEEeuT_MtMWzwIKU94bzkWV' + 'nHCY5vbhBYLeM", "p": "wPkfnjavNV1Hqb5Qqj2crBS9HQS6GDQIZ7WF9hlBb2ofDNe2K2dunddFqCOdvLXr7ydRcK51ZwSeHjcjgD1aJkHA' + '9i1zqyboxgd0uAbxVDo6ohnlVqYLtap2tXXcavKm4C9MTpob_rk6FBfEuq4uSsuxFvCER4yG3CYBBa4gZVU", "kid": "devstack_key", "' + 'kty": "RSA"}' + ), +}) + +# pylint: enable=unicode-format-string + +IDA_LOGOUT_URI_LIST = [ + 'http://localhost:18130/logout/', # ecommerce + 'http://localhost:18150/logout/', # credentials +] + +############################### BLOCKSTORE ##################################### +BLOCKSTORE_API_URL = "http://edx.devstack.blockstore:18250/api/v1/" + +##################################################################### + +# pylint: disable=wrong-import-order, wrong-import-position +from openedx.core.djangoapps.plugins import constants as plugin_constants, plugin_settings + +plugin_settings.add_plugins(__name__, plugin_constants.ProjectType.CMS, plugin_constants.SettingsType.DEVSTACK) + + +OPENAPI_CACHE_TIMEOUT = 0 + +##################################################################### +# Lastly, run any migrations, if needed. +MODULESTORE = convert_module_store_setting_if_needed(MODULESTORE) + +# Dummy secret key for dev +SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd' + +############################################################################### +# See if the developer has any local overrides. +if os.path.isfile(join(dirname(abspath(__file__)), 'private.py')): + from .private import * # pylint: disable=import-error,wildcard-import \ No newline at end of file diff --git a/edx-config/app/edxapp/edx-platform/lms/envs/devstack.py b/edx-config/app/edxapp/edx-platform/lms/envs/devstack.py new file mode 100644 index 0000000000..2c541c48b7 --- /dev/null +++ b/edx-config/app/edxapp/edx-platform/lms/envs/devstack.py @@ -0,0 +1,399 @@ +""" +Specific overrides to the base prod settings to make development easier. +""" + + +# Silence noisy logs +import logging +from os.path import abspath, dirname, join + +from corsheaders.defaults import default_headers as corsheaders_default_headers + +# pylint: enable=unicode-format-string +##################################################################### +from openedx.core.djangoapps.plugins import constants as plugin_constants +from openedx.core.djangoapps.plugins import plugin_settings + +from .production import * # pylint: disable=wildcard-import, unused-wildcard-import + +# Don't use S3 in devstack, fall back to filesystem +del DEFAULT_FILE_STORAGE +MEDIA_ROOT = "/edx/var/edxapp/uploads" +ORA2_FILEUPLOAD_BACKEND = 'django' + + +DEBUG = True +USE_I18N = True +DEFAULT_TEMPLATE_ENGINE['OPTIONS']['debug'] = True +LMS_BASE = 'dev.dipsims.xyz' +CMS_BASE = 'studio.dev.dipsims.xyz' +SITE_NAME = LMS_BASE + +# By default don't use a worker, execute tasks as if they were local functions +CELERY_ALWAYS_EAGER = True +HTTPS = 'off' + +LMS_ROOT_URL = 'http://{}'.format(LMS_BASE) +LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL +ENTERPRISE_API_URL = '{}/enterprise/api/v1/'.format(LMS_INTERNAL_ROOT_URL) +IDA_LOGOUT_URI_LIST = [ + 'http://localhost:18130/logout/', # ecommerce + 'http://localhost:18150/logout/', # credentials + 'http://localhost:18381/logout/', # discovery +] + +################################ LOGGERS ###################################### + +LOG_OVERRIDES = [ + ('track.contexts', logging.CRITICAL), + ('track.middleware', logging.CRITICAL), + ('lms.djangoapps.discussion.django_comment_client.utils', logging.CRITICAL), +] +for log_name, log_level in LOG_OVERRIDES: + logging.getLogger(log_name).setLevel(log_level) + +# Docker does not support the syslog socket at /dev/log. Rely on the console. +LOGGING['handlers']['local'] = LOGGING['handlers']['tracking'] = { + 'class': 'logging.NullHandler', +} + +LOGGING['loggers']['tracking']['handlers'] = ['console'] + +################################ EMAIL ######################################## + +EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' +EMAIL_FILE_PATH = '/edx/src/ace_messages/' + +############################ PYFS XBLOCKS SERVICE ############################# +# Set configuration for Django pyfilesystem + +DJFS = { + 'type': 'osfs', + 'directory_root': 'lms/static/djpyfs', + 'url_root': '/static/djpyfs', +} + +################################ DEBUG TOOLBAR ################################ + +INSTALLED_APPS += ['debug_toolbar'] +MIDDLEWARE += [ + 'lms.djangoapps.discussion.django_comment_client.utils.QueryCountDebugMiddleware', + 'debug_toolbar.middleware.DebugToolbarMiddleware', +] + +INTERNAL_IPS = ('127.0.0.1',) + +DEBUG_TOOLBAR_PANELS = ( + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + # ProfilingPanel has been intentionally removed for default devstack.py + # runtimes for performance reasons. If you wish to re-enable it in your + # local development environment, please create a new settings file + # that imports and extends devstack.py. +) + +DEBUG_TOOLBAR_CONFIG = { + 'SHOW_TOOLBAR_CALLBACK': 'lms.envs.devstack.should_show_debug_toolbar', +} + + +def should_show_debug_toolbar(request): + # We always want the toolbar on devstack unless running tests from another Docker container + if os.environ.get('ENABLE_DJANGO_TOOLBAR', False): + return True + return False + +########################### PIPELINE ################################# + +PIPELINE['PIPELINE_ENABLED'] = False +STATICFILES_STORAGE = 'openedx.core.storage.DevelopmentStorage' + +# Revert to the default set of finders as we don't want the production pipeline +STATICFILES_FINDERS = [ + 'openedx.core.djangoapps.theming.finders.ThemeFilesFinder', + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +] + +# Disable JavaScript compression in development +PIPELINE['JS_COMPRESSOR'] = None + +# Whether to run django-require in debug mode. +REQUIRE_DEBUG = DEBUG + +PIPELINE['SASS_ARGUMENTS'] = '--debug-info' + +# Load development webpack donfiguration +WEBPACK_CONFIG_PATH = 'webpack.dev.config.js' + +########################### VERIFIED CERTIFICATES ################################# + +FEATURES['AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING'] = True +FEATURES['ENABLE_PAYMENT_FAKE'] = True + +CC_PROCESSOR_NAME = 'CyberSource2' +CC_PROCESSOR = { + 'CyberSource2': { + "PURCHASE_ENDPOINT": '/shoppingcart/payment_fake/', + "SECRET_KEY": 'abcd123', + "ACCESS_KEY": 'abcd123', + "PROFILE_ID": 'edx', + } +} + +########################### External REST APIs ################################# +FEATURES['ENABLE_OAUTH2_PROVIDER'] = True +FEATURES['ENABLE_MOBILE_REST_API'] = True +FEATURES['ENABLE_VIDEO_ABSTRACTION_LAYER_API'] = True + +########################## SECURITY ####################### +FEATURES['ENABLE_MAX_FAILED_LOGIN_ATTEMPTS'] = False +FEATURES['SQUELCH_PII_IN_LOGS'] = False +FEATURES['PREVENT_CONCURRENT_LOGINS'] = False + +########################### Milestones ################################# +FEATURES['MILESTONES_APP'] = True + +########################### Milestones ################################# +FEATURES['ORGANIZATIONS_APP'] = True + +########################### Entrance Exams ################################# +FEATURES['ENTRANCE_EXAMS'] = True + +################################ COURSE LICENSES ################################ +FEATURES['LICENSING'] = True + + +########################## Courseware Search ####################### +FEATURES['ENABLE_COURSEWARE_SEARCH'] = False +FEATURES['ENABLE_COURSEWARE_SEARCH_FOR_COURSE_STAFF'] = True +SEARCH_ENGINE = 'search.elastic.ElasticSearchEngine' + + +########################## Dashboard Search ####################### +FEATURES['ENABLE_DASHBOARD_SEARCH'] = False + + +########################## Certificates Web/HTML View ####################### +FEATURES['CERTIFICATES_HTML_VIEW'] = True + + +########################## Course Discovery ####################### +LANGUAGE_MAP = {'terms': {lang: display for lang, display in ALL_LANGUAGES}, 'name': 'Language'} +COURSE_DISCOVERY_MEANINGS = { + 'org': { + 'name': 'Organization', + }, + 'modes': { + 'name': 'Course Type', + 'terms': { + 'honor': 'Honor', + 'verified': 'Verified', + }, + }, + 'language': LANGUAGE_MAP, +} + +FEATURES['ENABLE_COURSE_DISCOVERY'] = False +# Setting for overriding default filtering facets for Course discovery +# COURSE_DISCOVERY_FILTERS = ["org", "language", "modes"] +FEATURES['COURSES_ARE_BROWSEABLE'] = True +HOMEPAGE_COURSE_MAX = 9 + +# Software secure fake page feature flag +FEATURES['ENABLE_SOFTWARE_SECURE_FAKE'] = True + +# Setting for the testing of Software Secure Result Callback +VERIFY_STUDENT["SOFTWARE_SECURE"] = { + "API_ACCESS_KEY": "BBBBBBBBBBBBBBBBBBBB", + "API_SECRET_KEY": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", +} +DISABLE_ACCOUNT_ACTIVATION_REQUIREMENT_SWITCH = "verify_student_disable_account_activation_requirement" + +# Skip enrollment start date filtering +SEARCH_SKIP_ENROLLMENT_START_DATE_FILTERING = True + + +########################## Shopping cart ########################## +FEATURES['ENABLE_SHOPPING_CART'] = True +FEATURES['STORE_BILLING_INFO'] = True +FEATURES['ENABLE_PAID_COURSE_REGISTRATION'] = True +FEATURES['ENABLE_COSMETIC_DISPLAY_PRICE'] = True + +######################### Program Enrollments ##################### +FEATURES['ENABLE_ENROLLMENT_RESET'] = True + +######################### New Courseware MFE ##################### +FEATURES['ENABLE_COURSEWARE_MICROFRONTEND'] = True + +########################## Third Party Auth ####################### + +if FEATURES.get('ENABLE_THIRD_PARTY_AUTH') and 'third_party_auth.dummy.DummyBackend' not in AUTHENTICATION_BACKENDS: + AUTHENTICATION_BACKENDS = ['third_party_auth.dummy.DummyBackend'] + list(AUTHENTICATION_BACKENDS) + +############## ECOMMERCE API CONFIGURATION SETTINGS ############### +ECOMMERCE_PUBLIC_URL_ROOT = 'http://ecommerce.dev.dipsims.xyz' +ECOMMERCE_API_URL = 'http://edx.devstack.ecommerce:18130/api/v2' + +############## Comments CONFIGURATION SETTINGS ############### +COMMENTS_SERVICE_URL = 'http://edx.devstack.forum:4567' + +############## Credentials CONFIGURATION SETTINGS ############### +CREDENTIALS_INTERNAL_SERVICE_URL = 'http://edx.devstack.credentials:18150' +CREDENTIALS_PUBLIC_SERVICE_URL = 'http://localhost:18150' + +############################### BLOCKSTORE ##################################### +BLOCKSTORE_API_URL = "http://edx.devstack.blockstore:18250/api/v1/" + +###################### Cross-domain requests ###################### +FEATURES['ENABLE_CORS_HEADERS'] = True +CORS_ALLOW_CREDENTIALS = True +CORS_ORIGIN_WHITELIST = () +CORS_ORIGIN_ALLOW_ALL = True +CORS_ALLOW_HEADERS = corsheaders_default_headers + ( + 'use-jwt-cookie', +) + +LOGIN_REDIRECT_WHITELIST = [CMS_BASE] + +###################### JWTs ###################### +JWT_AUTH.update({ + 'JWT_AUDIENCE': 'lms-key', + 'JWT_ISSUER': '{}/oauth2'.format(LMS_ROOT_URL), + 'JWT_ISSUERS': [{ + 'AUDIENCE': 'lms-key', + 'ISSUER': '{}/oauth2'.format(LMS_ROOT_URL), + 'SECRET_KEY': 'lms-secret', + }], + 'JWT_SECRET_KEY': 'lms-secret', + 'JWT_SIGNING_ALGORITHM': 'RS512', + 'JWT_PRIVATE_SIGNING_JWK': ( + '{"e": "AQAB", "d": "RQ6k4NpRU3RB2lhwCbQ452W86bMMQiPsa7EJiFJUg-qBJthN0FMNQVbArtrCQ0xA1BdnQHThFiUnHcXfsTZUwmwvTu' + 'iqEGR_MI6aI7h5D8vRj_5x-pxOz-0MCB8TY8dcuK9FkljmgtYvV9flVzCk_uUb3ZJIBVyIW8En7n7nV7JXpS9zey1yVLld2AbRG6W5--Pgqr9J' + 'CI5-bLdc2otCLuen2sKyuUDHO5NIj30qGTaKUL-OW_PgVmxrwKwccF3w5uGNEvMQ-IcicosCOvzBwdIm1uhdm9rnHU1-fXz8VLRHNhGVv7z6mo' + 'ghjNI0_u4smhUkEsYeshPv7RQEWTdkOQ", "n": "smKFSYowG6nNUAdeqH1jQQnH1PmIHphzBmwJ5vRf1vu48BUI5VcVtUWIPqzRK_LDSlZYh' + '9D0YFL0ZTxIrlb6Tn3Xz7pYvpIAeYuQv3_H5p8tbz7Fb8r63c1828wXPITVTv8f7oxx5W3lFFgpFAyYMmROC4Ee9qG5T38LFe8_oAuFCEntimW' + 'xN9F3P-FJQy43TL7wG54WodgiM0EgzkeLr5K6cDnyckWjTuZbWI-4ffcTgTZsL_Kq1owa_J2ngEfxMCObnzGy5ZLcTUomo4rZLjghVpq6KZxfS' + '6I1Vz79ZsMVUWEdXOYePCKKsrQG20ogQEkmTf9FT_SouC6jPcHLXw", "q": "7KWj7l-ZkfCElyfvwsl7kiosvi-ppOO7Imsv90cribf88Dex' + 'cO67xdMPesjM9Nh5X209IT-TzbsOtVTXSQyEsy42NY72WETnd1_nAGLAmfxGdo8VV4ZDnRsA8N8POnWjRDwYlVBUEEeuT_MtMWzwIKU94bzkWV' + 'nHCY5vbhBYLeM", "p": "wPkfnjavNV1Hqb5Qqj2crBS9HQS6GDQIZ7WF9hlBb2ofDNe2K2dunddFqCOdvLXr7ydRcK51ZwSeHjcjgD1aJkHA' + '9i1zqyboxgd0uAbxVDo6ohnlVqYLtap2tXXcavKm4C9MTpob_rk6FBfEuq4uSsuxFvCER4yG3CYBBa4gZVU", "kid": "devstack_key", "' + 'kty": "RSA"}' + ), + 'JWT_PUBLIC_SIGNING_JWK_SET': ( + '{"keys": [{"kid": "devstack_key", "e": "AQAB", "kty": "RSA", "n": "smKFSYowG6nNUAdeqH1jQQnH1PmIHphzBmwJ5vRf1vu' + '48BUI5VcVtUWIPqzRK_LDSlZYh9D0YFL0ZTxIrlb6Tn3Xz7pYvpIAeYuQv3_H5p8tbz7Fb8r63c1828wXPITVTv8f7oxx5W3lFFgpFAyYMmROC' + '4Ee9qG5T38LFe8_oAuFCEntimWxN9F3P-FJQy43TL7wG54WodgiM0EgzkeLr5K6cDnyckWjTuZbWI-4ffcTgTZsL_Kq1owa_J2ngEfxMCObnzG' + 'y5ZLcTUomo4rZLjghVpq6KZxfS6I1Vz79ZsMVUWEdXOYePCKKsrQG20ogQEkmTf9FT_SouC6jPcHLXw"}]}' + ), +}) +plugin_settings.add_plugins(__name__, plugin_constants.ProjectType.LMS, plugin_constants.SettingsType.DEVSTACK) + + +######################### Django Rest Framework ######################## + +REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'] += ( + 'rest_framework.renderers.BrowsableAPIRenderer', +) + +OPENAPI_CACHE_TIMEOUT = 0 + +##################################################################### +# Lastly, run any migrations, if needed. +MODULESTORE = convert_module_store_setting_if_needed(MODULESTORE) + +SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd' + +EDXNOTES_INTERNAL_API = 'http://edx.devstack.edxnotesapi:18120/api/v1' +EDXNOTES_CLIENT_NAME = 'edx_notes_api-backend-service' + +############## Settings for Microfrontends ######################### +LEARNING_MICROFRONTEND_URL = 'http://localhost:2000' +ACCOUNT_MICROFRONTEND_URL = 'http://localhost:1997' + +############## Docker based devstack settings ####################### + +FEATURES.update({ + 'AUTOMATIC_AUTH_FOR_TESTING': True, + 'ENABLE_DISCUSSION_SERVICE': True, + 'SHOW_HEADER_LANGUAGE_SELECTOR': True, + 'ENABLE_ENTERPRISE_INTEGRATION': False, +}) + +ENABLE_MKTG_SITE = os.environ.get('ENABLE_MARKETING_SITE', False) +MARKETING_SITE_ROOT = os.environ.get('MARKETING_SITE_ROOT', 'http://localhost:8080') + +MKTG_URLS = { + 'ABOUT': '/about', + 'ACCESSIBILITY': '/accessibility', + 'AFFILIATES': '/affiliate-program', + 'BLOG': '/blog', + 'CAREERS': '/careers', + 'CONTACT': '/support/contact_us', + 'COURSES': '/course', + 'DONATE': '/donate', + 'ENTERPRISE': '/enterprise', + 'FAQ': '/student-faq', + 'HONOR': '/edx-terms-service', + 'HOW_IT_WORKS': '/how-it-works', + 'MEDIA_KIT': '/media-kit', + 'NEWS': '/news-announcements', + 'PRESS': '/press', + 'PRIVACY': '/edx-privacy-policy', + 'ROOT': MARKETING_SITE_ROOT, + 'SCHOOLS': '/schools-partners', + 'SITE_MAP': '/sitemap', + 'TRADEMARKS': '/trademarks', + 'TOS': '/edx-terms-service', + 'TOS_AND_HONOR': '/edx-terms-service', + 'WHAT_IS_VERIFIED_CERT': '/verified-certificate', +} + +ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = {} + +CREDENTIALS_SERVICE_USERNAME = 'credentials_worker' + +COURSE_CATALOG_API_URL = 'http://edx.devstack.discovery:18381/api/v1/' + +# Uncomment the lines below if you'd like to see SQL statements in your devstack LMS log. +# LOGGING['handlers']['console']['level'] = 'DEBUG' +# LOGGING['loggers']['django.db.backends'] = {'handlers': ['console'], 'level': 'DEBUG', 'propagate': False} + +SYSTEM_WIDE_ROLE_CLASSES = os.environ.get("SYSTEM_WIDE_ROLE_CLASSES", SYSTEM_WIDE_ROLE_CLASSES) +SYSTEM_WIDE_ROLE_CLASSES.extend(['system_wide_roles.SystemWideRoleAssignment']) + +if FEATURES['ENABLE_ENTERPRISE_INTEGRATION']: + SYSTEM_WIDE_ROLE_CLASSES.extend(['enterprise.SystemWideEnterpriseUserRoleAssignment']) + +# List of enterprise customer uuids to exclude from transition to use of enterprise-catalog +ENTERPRISE_CUSTOMERS_EXCLUDED_FROM_CATALOG = () + +##################################################################### +# See if the developer has any local overrides. +if os.path.isfile(join(dirname(abspath(__file__)), 'private.py')): + from .private import * # pylint: disable=import-error,wildcard-import + +########################## THEMING ####################### +# If you want to enable theming in devstack, uncomment this section and add any relevant +# theme directories to COMPREHENSIVE_THEME_DIRS + +# We have to import the private method here because production.py calls +# derive_settings('lms.envs.production') which runs _make_mako_template_dirs with +# the settings from production, which doesn't include these theming settings. Thus, +# the templating engine is unable to find the themed templates because they don't exist +# in it's path. Re-calling derive_settings doesn't work because the settings was already +# changed from a function to a list, and it can't be derived again. + +# from .common import _make_mako_template_dirs +# ENABLE_COMPREHENSIVE_THEMING = True +# COMPREHENSIVE_THEME_DIRS = [ +# "/edx/app/edxapp/edx-platform/themes/" +# ] +# TEMPLATES[1]["DIRS"] = _make_mako_template_dirs +# derive_settings(__name__) \ No newline at end of file diff --git a/edx-config/app/edxapp/edxapp_env.example b/edx-config/app/edxapp/edxapp_env.example new file mode 100644 index 0000000000..ad89a949bd --- /dev/null +++ b/edx-config/app/edxapp/edxapp_env.example @@ -0,0 +1,14 @@ +# Ansible managed +export SKIP_WS_MIGRATIONS="1" +export STUDIO_CFG="/edx/etc/studio.yml" +export REVISION_CFG="/edx/etc/revisions.yml" +export SELENIUM_HOST="edx.devstack.firefox" +export BOTO_CONFIG="/edx/app/edxapp/.boto" +export SELENIUM_PORT="4444" + +export PATH="/edx/app/edxapp/venvs/edxapp/bin:/edx/app/edxapp/edx-platform/bin:/edx/app/edxapp/edx-platform/node_modules/.bin:/edx/app/edxapp/nodeenvs/edxapp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +export CONFIG_ROOT="/edx/app/edxapp" +export LANG="en_US.UTF-8" +export LMS_CFG="/edx/etc/lms.yml" +export SELENIUM_BROWSER="firefox" +export EDX_PLATFORM_SETTINGS="devstack_docker" \ No newline at end of file diff --git a/edx-config/app/edxapp/lms.auth.json.example b/edx-config/app/edxapp/lms.auth.json.example new file mode 100644 index 0000000000..e2527a869f --- /dev/null +++ b/edx-config/app/edxapp/lms.auth.json.example @@ -0,0 +1,236 @@ +{ + "ACE_CHANNEL_SAILTHRU_API_KEY": "", + "ACE_CHANNEL_SAILTHRU_API_SECRET": "", + "ANALYTICS_API_KEY": "", + "AWS_ACCESS_KEY_ID": null, + "AWS_QUERYSTRING_AUTH": false, + "AWS_S3_CUSTOM_DOMAIN": "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)", + "AWS_SECRET_ACCESS_KEY": null, + "AWS_STORAGE_BUCKET_NAME": "SET-ME-PLEASE (ex. bucket-name)", + "BRANCH_IO_KEY": "", + "CC_PROCESSOR": { + "CyberSource": { + "MERCHANT_ID": "", + "ORDERPAGE_VERSION": "7", + "PURCHASE_ENDPOINT": "", + "SERIAL_NUMBER": "", + "SHARED_SECRET": "" + }, + "CyberSource2": { + "ACCESS_KEY": "", + "PROFILE_ID": "", + "PURCHASE_ENDPOINT": "", + "SECRET_KEY": "" + } + }, + "CC_PROCESSOR_NAME": "CyberSource2", + "CELERY_BROKER_PASSWORD": "celery", + "CELERY_BROKER_USER": "celery", + "CELERY_TIMEZONE": "UTC", + "CONTENTSTORE": { + "ADDITIONAL_OPTIONS": {}, + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "SECONDARY_PREFERRED", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.contentstore.mongo.MongoContentStore", + "OPTIONS": { + "auth_source": "", + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "ssl": false, + "user": "edxapp" + } + }, + "CREDIT_PROVIDER_SECRET_KEYS": {}, + "DATABASES": { + "default": { + "ATOMIC_REQUESTS": true, + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + }, + "read_replica": { + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + }, + "student_module_history": { + "CONN_MAX_AGE": 0, + "ENGINE": "django.db.backends.mysql", + "HOST": "edx.devstack.mysql", + "NAME": "edxapp_csmh", + "OPTIONS": {}, + "PASSWORD": "password", + "PORT": "3306", + "USER": "edxapp001" + } + }, + "DEFAULT_FILE_STORAGE": "django.core.files.storage.FileSystemStorage", + "DJFS": { + "directory_root": "/edx/var/edxapp/django-pyfs/static/django-pyfs", + "type": "osfs", + "url_root": "/static/django-pyfs" + }, + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "SECONDARY_PREFERRED", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ECOMMERCE_API_SIGNING_KEY": "lms-secret", + "EDX_API_KEY": "PUT_YOUR_API_KEY_HERE", + "EMAIL_HOST_PASSWORD": "", + "EMAIL_HOST_USER": "", + "ENTERPRISE_SERVICE_WORKER_USERNAME": "enterprise_worker", + "EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST": [], + "FACEBOOK_API_VERSION": "v2.1", + "FACEBOOK_APP_ID": "FACEBOOK_APP_ID", + "FACEBOOK_APP_SECRET": "FACEBOOK_APP_SECRET", + "FERNET_KEYS": [ + "DUMMY KEY CHANGE BEFORE GOING TO PRODUCTION" + ], + "GOOGLE_ANALYTICS_ACCOUNT": null, + "GOOGLE_ANALYTICS_LINKEDIN": "", + "GOOGLE_ANALYTICS_TRACKING_ID": "", + "MODULESTORE": { + "default": { + "ENGINE": "xmodule.modulestore.mixed.MixedModuleStore", + "OPTIONS": { + "mappings": {}, + "stores": [ + { + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "SECONDARY_PREFERRED", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.modulestore.split_mongo.split_draft.DraftVersioningModuleStore", + "NAME": "split", + "OPTIONS": { + "default_class": "xmodule.hidden_module.HiddenDescriptor", + "fs_root": "/edx/var/edxapp/data", + "render_template": "edxmako.shortcuts.render_to_string" + } + }, + { + "DOC_STORE_CONFIG": { + "authsource": "", + "collection": "modulestore", + "connectTimeoutMS": 2000, + "db": "edxapp", + "host": [ + "edx.devstack.mongo" + ], + "password": "password", + "port": 27017, + "read_preference": "PRIMARY", + "replicaSet": "", + "socketTimeoutMS": 3000, + "ssl": false, + "user": "edxapp" + }, + "ENGINE": "xmodule.modulestore.mongo.DraftMongoModuleStore", + "NAME": "draft", + "OPTIONS": { + "default_class": "xmodule.hidden_module.HiddenDescriptor", + "fs_root": "/edx/var/edxapp/data", + "render_template": "edxmako.shortcuts.render_to_string" + } + } + ] + } + } + }, + "OPTIMIZELY_PROJECT_ID": null, + "PROCTORING_BACKENDS": { + "DEFAULT": "null", + "null": {} + }, + "PROFILE_IMAGE_SECRET_KEY": "placeholder_secret_key", + "SECRET_KEY": "DUMMY KEY ONLY FOR TO DEVSTACK", + "SEGMENT_KEY": null, + "SOCIAL_AUTH_OAUTH_SECRETS": "", + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY": "", + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY_DICT": {}, + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT": "", + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT_DICT": {}, + "SWIFT_AUTH_URL": null, + "SWIFT_AUTH_VERSION": null, + "SWIFT_KEY": null, + "SWIFT_REGION_NAME": null, + "SWIFT_TEMP_URL_DURATION": 1800, + "SWIFT_TEMP_URL_KEY": null, + "SWIFT_TENANT_ID": null, + "SWIFT_TENANT_NAME": null, + "SWIFT_USERNAME": null, + "SWIFT_USE_TEMP_URLS": false, + "TRACKING_SEGMENTIO_WEBHOOK_SECRET": "", + "VERIFY_STUDENT": { + "DAYS_GOOD_FOR": 365, + "EXPIRING_SOON_WINDOW": 28 + }, + "XQUEUE_INTERFACE": { + "basic_auth": [ + "edx", + "edx" + ], + "django_auth": { + "password": "password", + "username": "lms" + }, + "url": "http://edx.devstack.xqueue:18040" + }, + "YOUTUBE_API_KEY": "PUT_YOUR_API_KEY_HERE", + "ZENDESK_API_KEY": "", + "ZENDESK_GROUP_ID_MAPPING": {}, + "ZENDESK_OAUTH_ACCESS_TOKEN": "", + "ZENDESK_USER": "" +} \ No newline at end of file diff --git a/edx-config/app/edxapp/lms.env.json.example b/edx-config/app/edxapp/lms.env.json.example new file mode 100644 index 0000000000..008836deef --- /dev/null +++ b/edx-config/app/edxapp/lms.env.json.example @@ -0,0 +1,454 @@ +{ + "ACCOUNT_MICROFRONTEND_URL": null, + "ACE_CHANNEL_DEFAULT_EMAIL": "django_email", + "ACE_CHANNEL_SAILTHRU_DEBUG": true, + "ACE_CHANNEL_SAILTHRU_TEMPLATE_NAME": null, + "ACE_CHANNEL_TRANSACTIONAL_EMAIL": "django_email", + "ACE_ENABLED_CHANNELS": [ + "django_email" + ], + "ACE_ENABLED_POLICIES": [ + "bulk_email_optout" + ], + "ACE_ROUTING_KEY": "edx.lms.core.default", + "ACTIVATION_EMAIL_SUPPORT_LINK": "", + "AFFILIATE_COOKIE_NAME": "dev_affiliate_id", + "ALTERNATE_WORKER_QUEUES": "cms", + "ANALYTICS_API_URL": "http://localhost:18100", + "ANALYTICS_DASHBOARD_NAME": "Your Platform Name Here Insights", + "ANALYTICS_DASHBOARD_URL": "http://localhost:18110/courses", + "API_ACCESS_FROM_EMAIL": "api-requests@example.com", + "API_ACCESS_MANAGER_EMAIL": "api-access@example.com", + "API_DOCUMENTATION_URL": "http://course-catalog-api-guide.readthedocs.io/en/latest/", + "AUDIT_CERT_CUTOFF_DATE": null, + "AUTH_DOCUMENTATION_URL": "http://course-catalog-api-guide.readthedocs.io/en/latest/authentication/index.html", + "AUTH_PASSWORD_VALIDATORS": [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" + }, + { + "NAME": "util.password_policy_validators.MinimumLengthValidator", + "OPTIONS": { + "min_length": 2 + } + }, + { + "NAME": "util.password_policy_validators.MaximumLengthValidator", + "OPTIONS": { + "max_length": 75 + } + } + ], + "AWS_SES_REGION_ENDPOINT": "email.us-east-1.amazonaws.com", + "AWS_SES_REGION_NAME": "us-east-1", + "BASE_COOKIE_DOMAIN": "localhost", + "BLOCKSTORE_API_URL": "http://localhost:18250/api/v1", + "BLOCKSTORE_PUBLIC_URL_ROOT": "http://localhost:18250", + "BLOCK_STRUCTURES_SETTINGS": { + "COURSE_PUBLISH_TASK_DELAY": 30, + "PRUNING_ACTIVE": false, + "TASK_DEFAULT_RETRY_DELAY": 30, + "TASK_MAX_RETRIES": 5 + }, + "BUGS_EMAIL": "bugs@example.com", + "BULK_EMAIL_DEFAULT_FROM_EMAIL": "no-reply@example.com", + "BULK_EMAIL_EMAILS_PER_TASK": 500, + "BULK_EMAIL_LOG_SENT_EMAILS": false, + "BULK_EMAIL_ROUTING_KEY_SMALL_JOBS": "edx.lms.core.default", + "CACHES": { + "celery": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "celery", + "LOCATION": [ + "edx.devstack.memcached:11211" + ], + "TIMEOUT": "7200" + }, + "configuration": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "1001c6274ca4", + "LOCATION": [ + "edx.devstack.memcached:11211" + ] + }, + "course_structure_cache": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "course_structure", + "LOCATION": [ + "edx.devstack.memcached:11211" + ], + "TIMEOUT": "7200" + }, + "default": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "default", + "LOCATION": [ + "edx.devstack.memcached:11211" + ], + "VERSION": "1" + }, + "general": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "general", + "LOCATION": [ + "edx.devstack.memcached:11211" + ] + }, + "mongo_metadata_inheritance": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "mongo_metadata_inheritance", + "LOCATION": [ + "edx.devstack.memcached:11211" + ], + "TIMEOUT": 300 + }, + "staticfiles": { + "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", + "KEY_FUNCTION": "util.memcache.safe_key", + "KEY_PREFIX": "1001c6274ca4_general", + "LOCATION": [ + "edx.devstack.memcached:11211" + ] + } + }, + "CAS_ATTRIBUTE_CALLBACK": "", + "CAS_EXTRA_LOGIN_PARAMS": "", + "CAS_SERVER_URL": "", + "CELERY_BROKER_HOSTNAME": "localhost", + "CELERY_BROKER_TRANSPORT": "amqp", + "CELERY_BROKER_USE_SSL": false, + "CELERY_BROKER_VHOST": "", + "CELERY_EVENT_QUEUE_TTL": null, + "CELERY_QUEUES": [ + "edx.lms.core.default", + "edx.lms.core.high", + "edx.lms.core.high_mem" + ], + "CERTIFICATE_TEMPLATE_LANGUAGES": { + "en": "English", + "es": "Espa\u00f1ol" + }, + "CERT_QUEUE": "certificates", + "CMS_BASE": "edx.devstack.studio:18010", + "CODE_JAIL": { + "limits": { + "CPU": 1, + "FSIZE": 1048576, + "PROXY": 0, + "REALTIME": 3, + "VMEM": 536870912 + }, + "python_bin": "/edx/app/edxapp/venvs/edxapp-sandbox/bin/python", + "user": "sandbox" + }, + "COMMENTS_SERVICE_KEY": "password", + "COMMENTS_SERVICE_URL": "http://localhost:18080", + "COMPREHENSIVE_THEME_DIRS": [ + "" + ], + "COMPREHENSIVE_THEME_LOCALE_PATHS": [], + "CONTACT_EMAIL": "info@example.com", + "CONTACT_MAILING_ADDRESS": "SET-ME-PLEASE", + "CORS_ORIGIN_ALLOW_ALL": false, + "CORS_ORIGIN_WHITELIST": [], + "COURSES_WITH_UNSAFE_CODE": [], + "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_exists", + "COURSE_CATALOG_API_URL": "http://localhost:8008/api/v1", + "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_exists", + "CREDENTIALS_INTERNAL_SERVICE_URL": "http://localhost:8005", + "CREDENTIALS_PUBLIC_SERVICE_URL": "http://localhost:8005", + "CREDIT_HELP_LINK_URL": "", + "CROSS_DOMAIN_CSRF_COOKIE_DOMAIN": "", + "CROSS_DOMAIN_CSRF_COOKIE_NAME": "", + "CSRF_COOKIE_SECURE": false, + "CSRF_TRUSTED_ORIGINS": [], + "DASHBOARD_COURSE_LIMIT": null, + "DATA_DIR": "/edx/var/edxapp", + "DEFAULT_COURSE_VISIBILITY_IN_CATALOG": "both", + "DEFAULT_FEEDBACK_EMAIL": "feedback@example.com", + "DEFAULT_FILE_STORAGE": "django.core.files.storage.FileSystemStorage", + "DEFAULT_FROM_EMAIL": "registration@example.com", + "DEFAULT_JWT_ISSUER": { + "AUDIENCE": "lms-key", + "ISSUER": "http://edx.devstack.lms:18000/oauth2", + "SECRET_KEY": "lms-secret" + }, + "DEFAULT_MOBILE_AVAILABLE": false, + "DEFAULT_SITE_THEME": "", + "DEPRECATED_ADVANCED_COMPONENT_TYPES": [], + "ECOMMERCE_API_URL": "http://localhost:8002/api/v2", + "ECOMMERCE_PUBLIC_URL_ROOT": "http://localhost:8002", + "EDXMKTG_USER_INFO_COOKIE_NAME": "edx-user-info", + "EDXNOTES_INTERNAL_API": "http://edx.devstack.edx_notes_api:18120/api/v1", + "EDXNOTES_PUBLIC_API": "http://localhost:18120/api/v1", + "EDX_PLATFORM_REVISION": "master", + "ELASTIC_SEARCH_CONFIG": [ + { + "host": "edx.devstack.elasticsearch", + "port": 9200, + "use_ssl": false + } + ], + "EMAIL_BACKEND": "django.core.mail.backends.smtp.EmailBackend", + "EMAIL_HOST": "localhost", + "EMAIL_PORT": 25, + "EMAIL_USE_TLS": false, + "ENABLE_COMPREHENSIVE_THEMING": false, + "ENTERPRISE_API_URL": "http://edx.devstack.lms:18000/enterprise/api/v1", + "ENTERPRISE_COURSE_ENROLLMENT_AUDIT_MODES": [ + "audit", + "honor" + ], + "ENTERPRISE_CUSTOMER_SUCCESS_EMAIL": "customersuccess@edx.org", + "ENTERPRISE_ENROLLMENT_API_URL": "http://edx.devstack.lms:18000/api/enrollment/v1/", + "ENTERPRISE_INTEGRATIONS_EMAIL": "enterprise-integrations@edx.org", + "ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS": {}, + "ENTERPRISE_SUPPORT_URL": "", + "ENTERPRISE_TAGLINE": "", + "EXTRA_MIDDLEWARE_CLASSES": [], + "FEATURES": { + "AUTH_USE_OPENID_PROVIDER": true, + "AUTOMATIC_AUTH_FOR_TESTING": false, + "CUSTOM_COURSES_EDX": false, + "ENABLE_COMBINED_LOGIN_REGISTRATION": true, + "ENABLE_CORS_HEADERS": false, + "ENABLE_COUNTRY_ACCESS": false, + "ENABLE_CREDIT_API": false, + "ENABLE_CREDIT_ELIGIBILITY": false, + "ENABLE_CROSS_DOMAIN_CSRF_COOKIE": false, + "ENABLE_CSMH_EXTENDED": true, + "ENABLE_DISCUSSION_HOME_PANEL": true, + "ENABLE_DISCUSSION_SERVICE": true, + "ENABLE_EDXNOTES": true, + "ENABLE_ENROLLMENT_RESET": false, + "ENABLE_GRADE_DOWNLOADS": true, + "ENABLE_INSTRUCTOR_ANALYTICS": false, + "ENABLE_MKTG_SITE": false, + "ENABLE_MOBILE_REST_API": false, + "ENABLE_OAUTH2_PROVIDER": false, + "ENABLE_PUBLISHER": false, + "ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES": true, + "ENABLE_SPECIAL_EXAMS": false, + "ENABLE_SYSADMIN_DASHBOARD": false, + "ENABLE_THIRD_PARTY_AUTH": true, + "ENABLE_VIDEO_UPLOAD_PIPELINE": false, + "PREVIEW_LMS_BASE": "preview.localhost:18000", + "SHOW_FOOTER_LANGUAGE_SELECTOR": false, + "SHOW_HEADER_LANGUAGE_SELECTOR": false + }, + "FEEDBACK_SUBMISSION_EMAIL": "", + "FILE_UPLOAD_STORAGE_BUCKET_NAME": "SET-ME-PLEASE (ex. bucket-name)", + "FILE_UPLOAD_STORAGE_PREFIX": "submissions_attachments", + "FINANCIAL_REPORTS": { + "BUCKET": null, + "ROOT_PATH": "sandbox", + "STORAGE_TYPE": "localfs" + }, + "FOOTER_ORGANIZATION_IMAGE": "images/logo.png", + "GITHUB_REPO_ROOT": "/edx/var/edxapp/data", + "GIT_REPO_DIR": "/edx/var/edxapp/course_repos", + "GOOGLE_SITE_VERIFICATION_ID": "", + "GRADES_DOWNLOAD": { + "BUCKET": "", + "ROOT_PATH": "", + "STORAGE_CLASS": "django.core.files.storage.FileSystemStorage", + "STORAGE_KWARGS": { + "location": "/tmp/edx-s3/grades" + }, + "STORAGE_TYPE": "" + }, + "HELP_TOKENS_BOOKS": { + "course_author": "http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course", + "learner": "http://edx.readthedocs.io/projects/open-edx-learner-guide" + }, + "HTTPS": "on", + "ICP_LICENSE": null, + "ICP_LICENSE_INFO": {}, + "IDA_LOGOUT_URI_LIST": [], + "ID_VERIFICATION_SUPPORT_LINK": "", + "JWT_AUTH": { + "JWT_AUDIENCE": "lms-key", + "JWT_AUTH_COOKIE_HEADER_PAYLOAD": "edx-jwt-cookie-header-payload", + "JWT_AUTH_COOKIE_SIGNATURE": "edx-jwt-cookie-signature", + "JWT_AUTH_REFRESH_COOKIE": "edx-jwt-refresh-cookie", + "JWT_ISSUER": "http://edx.devstack.lms:18000/oauth2", + "JWT_ISSUERS": [ + { + "AUDIENCE": "lms-key", + "ISSUER": "http://edx.devstack.lms:18000/oauth2", + "SECRET_KEY": "lms-secret" + } + ], + "JWT_PRIVATE_SIGNING_JWK": "None", + "JWT_PUBLIC_SIGNING_JWK_SET": "", + "JWT_SECRET_KEY": "lms-secret", + "JWT_SIGNING_ALGORITHM": null + }, + "JWT_EXPIRATION": 30, + "JWT_ISSUER": "http://edx.devstack.lms:18000/oauth2", + "JWT_PRIVATE_SIGNING_KEY": null, + "LANGUAGE_CODE": "en", + "LANGUAGE_COOKIE": "openedx-language-preference", + "LEARNER_PORTAL_URL_ROOT": "https://learner-portal-edx.devstack.lms:18000", + "LEARNING_MICROFRONTEND_URL": null, + "LMS_BASE": "edx.devstack.lms:18000", + "LMS_INTERNAL_ROOT_URL": "http://edx.devstack.lms:18000", + "LMS_ROOT_URL": "http://edx.devstack.lms:18000", + "LOCAL_LOGLEVEL": "INFO", + "LOGGING_ENV": "sandbox", + "LOGIN_REDIRECT_WHITELIST": [], + "LOG_DIR": "/edx/var/log/edx", + "LTI_AGGREGATE_SCORE_PASSBACK_DELAY": 900, + "LTI_USER_EMAIL_DOMAIN": "lti.example.com", + "MAILCHIMP_NEW_USER_LIST_ID": null, + "MAINTENANCE_BANNER_TEXT": "Sample banner message", + "MEDIA_ROOT": "/edx/var/edxapp/media/", + "MEDIA_URL": "/media/", + "MICROSITE_CONFIGURATION": {}, + "MICROSITE_ROOT_DIR": "/edx/app/edxapp/edx-microsite", + "MKTG_URLS": {}, + "MKTG_URL_LINK_MAP": {}, + "MOBILE_STORE_URLS": {}, + "OAUTH_DELETE_EXPIRED": true, + "OAUTH_ENFORCE_SECURE": false, + "OAUTH_EXPIRE_CONFIDENTIAL_CLIENT_DAYS": 365, + "OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS": 30, + "ORA2_FILE_PREFIX": "default_env-default_deployment/ora2", + "ORDER_HISTORY_MICROFRONTEND_URL": null, + "PAID_COURSE_REGISTRATION_CURRENCY": [ + "usd", + "$" + ], + "PARENTAL_CONSENT_AGE_LIMIT": 13, + "PARTNER_SUPPORT_EMAIL": "", + "PASSWORD_POLICY_COMPLIANCE_ROLLOUT_CONFIG": { + "ENFORCE_COMPLIANCE_ON_LOGIN": false + }, + "PASSWORD_RESET_SUPPORT_LINK": "", + "PAYMENT_SUPPORT_EMAIL": "billing@example.com", + "PDF_RECEIPT_BILLING_ADDRESS": "Enter your receipt billing\naddress here.\n", + "PDF_RECEIPT_COBRAND_LOGO_PATH": "", + "PDF_RECEIPT_DISCLAIMER_TEXT": "ENTER YOUR RECEIPT DISCLAIMER TEXT HERE.\n", + "PDF_RECEIPT_FOOTER_TEXT": "Enter your receipt footer text here.\n", + "PDF_RECEIPT_LOGO_PATH": "", + "PDF_RECEIPT_TAX_ID": "00-0000000", + "PDF_RECEIPT_TAX_ID_LABEL": "fake Tax ID", + "PDF_RECEIPT_TERMS_AND_CONDITIONS": "Enter your receipt terms and conditions here.\n", + "PLATFORM_DESCRIPTION": "Your Platform Description Here", + "PLATFORM_FACEBOOK_ACCOUNT": "http://www.facebook.com/YourPlatformFacebookAccount", + "PLATFORM_NAME": "Your Platform Name Here", + "PLATFORM_TWITTER_ACCOUNT": "@YourPlatformTwitterAccount", + "POLICY_CHANGE_GRADES_ROUTING_KEY": "edx.lms.core.default", + "PRESS_EMAIL": "press@example.com", + "PROCTORING_SETTINGS": {}, + "PROFILE_IMAGE_BACKEND": { + "class": "openedx.core.storage.OverwriteStorage", + "options": { + "base_url": "/media/profile-images/", + "location": "/edx/var/edxapp/media/profile-images/" + } + }, + "PROFILE_IMAGE_MAX_BYTES": 1048576, + "PROFILE_IMAGE_MIN_BYTES": 100, + "PROFILE_IMAGE_SIZES_MAP": { + "full": 500, + "large": 120, + "medium": 50, + "small": 30 + }, + "PROFILE_MICROFRONTEND_URL": null, + "PROGRAM_CERTIFICATES_ROUTING_KEY": "edx.lms.core.default", + "PROGRAM_MANAGER_MICROFRONTEND_URL": null, + "RECALCULATE_GRADES_ROUTING_KEY": "edx.lms.core.default", + "REGISTRATION_EXTRA_FIELDS": { + "city": "hidden", + "confirm_email": "hidden", + "country": "required", + "gender": "optional", + "goals": "optional", + "honor_code": "required", + "level_of_education": "optional", + "mailing_address": "hidden", + "terms_of_service": "hidden", + "year_of_birth": "optional" + }, + "RETIRED_EMAIL_DOMAIN": "retired.invalid", + "RETIRED_EMAIL_PREFIX": "retired__user_", + "RETIRED_USERNAME_PREFIX": "retired__user_", + "RETIRED_USER_SALTS": [ + "OVERRIDE ME WITH A RANDOM VALUE", + "ROTATE SALTS BY APPENDING NEW VALUES" + ], + "RETIREMENT_SERVICE_WORKER_USERNAME": "retirement_worker", + "RETIREMENT_STATES": [ + "PENDING", + "ERRORED", + "ABORTED", + "COMPLETE" + ], + "SERVER_EMAIL": "devops@example.com", + "SESSION_COOKIE_DOMAIN": "", + "SESSION_COOKIE_NAME": "sessionid", + "SESSION_COOKIE_SECURE": false, + "SESSION_SAVE_EVERY_REQUEST": false, + "SITE_NAME": "localhost", + "SOCIAL_MEDIA_FOOTER_URLS": {}, + "SOCIAL_SHARING_SETTINGS": { + "CERTIFICATE_FACEBOOK": false, + "CERTIFICATE_TWITTER": false, + "CUSTOM_COURSE_URLS": false, + "DASHBOARD_FACEBOOK": false, + "DASHBOARD_TWITTER": false + }, + "STATIC_ROOT_BASE": "/edx/var/edxapp/staticfiles", + "STATIC_URL_BASE": "/static/", + "STUDIO_NAME": "Studio", + "STUDIO_SHORT_NAME": "Studio", + "SUPPORT_SITE_LINK": "", + "SYSLOG_SERVER": "", + "SYSTEM_WIDE_ROLE_CLASSES": [], + "TECH_SUPPORT_EMAIL": "technical@example.com", + "TIME_ZONE": "America/New_York", + "UNIVERSITY_EMAIL": "university@example.com", + "USERNAME_REPLACEMENT_WORKER": "OVERRIDE THIS WITH A VALID USERNAME", + "VIDEO_CDN_URL": { + "EXAMPLE_COUNTRY_CODE": "http://example.com/edx/video?s3_url=" + }, + "VIDEO_IMAGE_MAX_AGE": 31536000, + "VIDEO_IMAGE_SETTINGS": { + "DIRECTORY_PREFIX": "video-images/", + "STORAGE_KWARGS": { + "base_url": "/media/", + "location": "/edx/var/edxapp/media/" + }, + "VIDEO_IMAGE_MAX_BYTES": 2097152, + "VIDEO_IMAGE_MIN_BYTES": 2048 + }, + "VIDEO_TRANSCRIPTS_MAX_AGE": 31536000, + "VIDEO_TRANSCRIPTS_SETTINGS": { + "DIRECTORY_PREFIX": "video-transcripts/", + "STORAGE_KWARGS": { + "base_url": "/media/", + "location": "/edx/var/edxapp/media/" + }, + "VIDEO_TRANSCRIPTS_MAX_BYTES": 3145728 + }, + "VIDEO_UPLOAD_PIPELINE": { + "BUCKET": "", + "ROOT_PATH": "" + }, + "WIKI_ENABLED": true, + "WRITABLE_GRADEBOOK_URL": null, + "XBLOCK_FS_STORAGE_BUCKET": null, + "XBLOCK_FS_STORAGE_PREFIX": null, + "XBLOCK_SETTINGS": {}, + "X_FRAME_OPTIONS": "DENY", + "ZENDESK_CUSTOM_FIELDS": {}, + "ZENDESK_URL": "" +} \ No newline at end of file diff --git a/edx-config/etc/.gitignore b/edx-config/etc/.gitignore new file mode 100644 index 0000000000..ad30bfec28 --- /dev/null +++ b/edx-config/etc/.gitignore @@ -0,0 +1 @@ +*.yml \ No newline at end of file diff --git a/edx-config/etc/lms.yml.example b/edx-config/etc/lms.yml.example new file mode 100644 index 0000000000..4c5b540abf --- /dev/null +++ b/edx-config/etc/lms.yml.example @@ -0,0 +1,599 @@ +ACCOUNT_MICROFRONTEND_URL: null +ACE_CHANNEL_DEFAULT_EMAIL: django_email +ACE_CHANNEL_SAILTHRU_API_KEY: '' +ACE_CHANNEL_SAILTHRU_API_SECRET: '' +ACE_CHANNEL_SAILTHRU_DEBUG: true +ACE_CHANNEL_SAILTHRU_TEMPLATE_NAME: null +ACE_CHANNEL_TRANSACTIONAL_EMAIL: django_email +ACE_ENABLED_CHANNELS: +- django_email +ACE_ENABLED_POLICIES: +- bulk_email_optout +ACE_ROUTING_KEY: edx.lms.core.default +ACTIVATION_EMAIL_SUPPORT_LINK: '' +AFFILIATE_COOKIE_NAME: dev_affiliate_id +ALTERNATE_WORKER_QUEUES: cms +ANALYTICS_API_KEY: '' +ANALYTICS_API_URL: http://localhost:18100 +ANALYTICS_DASHBOARD_NAME: ITF Learning Insights +ANALYTICS_DASHBOARD_URL: http://localhost:18110/courses +API_ACCESS_FROM_EMAIL: api-requests@example.com +API_ACCESS_MANAGER_EMAIL: api-access@example.com +API_DOCUMENTATION_URL: http://course-catalog-api-guide.readthedocs.io/en/latest/ +AUDIT_CERT_CUTOFF_DATE: null +AUTH_DOCUMENTATION_URL: http://course-catalog-api-guide.readthedocs.io/en/latest/authentication/index.html +AUTH_PASSWORD_VALIDATORS: +- NAME: django.contrib.auth.password_validation.UserAttributeSimilarityValidator +- NAME: util.password_policy_validators.MinimumLengthValidator + OPTIONS: + min_length: 2 +- NAME: util.password_policy_validators.MaximumLengthValidator + OPTIONS: + max_length: 75 +AWS_ACCESS_KEY_ID: null +AWS_QUERYSTRING_AUTH: false +AWS_S3_CUSTOM_DOMAIN: SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com) +AWS_SECRET_ACCESS_KEY: null +AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com +AWS_SES_REGION_NAME: us-east-1 +AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) +BASE_COOKIE_DOMAIN: dev.dipsims.xyz +BLOCKSTORE_API_URL: http://localhost:18250/api/v1 +BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250 +BLOCK_STRUCTURES_SETTINGS: + COURSE_PUBLISH_TASK_DELAY: 30 + PRUNING_ACTIVE: false + TASK_DEFAULT_RETRY_DELAY: 30 + TASK_MAX_RETRIES: 5 +BRANCH_IO_KEY: '' +BUGS_EMAIL: bugs@example.com +BULK_EMAIL_DEFAULT_FROM_EMAIL: no-reply@example.com +BULK_EMAIL_EMAILS_PER_TASK: 500 +BULK_EMAIL_LOG_SENT_EMAILS: false +BULK_EMAIL_ROUTING_KEY_SMALL_JOBS: edx.lms.core.default +CACHES: + celery: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: celery + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: '7200' + configuration: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: 1001c6274ca4 + LOCATION: + - edx.devstack.memcached:11211 + course_structure_cache: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: course_structure + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: '7200' + default: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: default + LOCATION: + - edx.devstack.memcached:11211 + VERSION: '1' + general: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: general + LOCATION: + - edx.devstack.memcached:11211 + mongo_metadata_inheritance: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: mongo_metadata_inheritance + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: 300 + staticfiles: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: 1001c6274ca4_general + LOCATION: + - edx.devstack.memcached:11211 +CAS_ATTRIBUTE_CALLBACK: '' +CAS_EXTRA_LOGIN_PARAMS: '' +CAS_SERVER_URL: '' +CC_PROCESSOR: + CyberSource: + MERCHANT_ID: '' + ORDERPAGE_VERSION: '7' + PURCHASE_ENDPOINT: '' + SERIAL_NUMBER: '' + SHARED_SECRET: '' + CyberSource2: + ACCESS_KEY: '' + PROFILE_ID: '' + PURCHASE_ENDPOINT: '' + SECRET_KEY: '' +CC_PROCESSOR_NAME: CyberSource2 +CELERY_BROKER_HOSTNAME: localhost +CELERY_BROKER_PASSWORD: celery +CELERY_BROKER_TRANSPORT: amqp +CELERY_BROKER_USER: celery +CELERY_BROKER_USE_SSL: false +CELERY_BROKER_VHOST: '' +CELERY_EVENT_QUEUE_TTL: null +CELERY_QUEUES: +- edx.lms.core.default +- edx.lms.core.high +- edx.lms.core.high_mem +CELERY_TIMEZONE: UTC +CERTIFICATE_TEMPLATE_LANGUAGES: + en: English + es: Español +CERT_QUEUE: certificates +CMS_BASE: studio.dev.dipsims.xyz +CODE_JAIL: + limits: + CPU: 1 + FSIZE: 1048576 + PROXY: 0 + REALTIME: 3 + VMEM: 536870912 + python_bin: /edx/app/edxapp/venvs/edxapp-sandbox/bin/python + user: sandbox +COMMENTS_SERVICE_KEY: password +COMMENTS_SERVICE_URL: http://localhost:18080 +COMPREHENSIVE_THEME_DIRS: +- '' +COMPREHENSIVE_THEME_LOCALE_PATHS: [] +CONTACT_EMAIL: info@example.com +CONTACT_MAILING_ADDRESS: SET-ME-PLEASE +CONTENTSTORE: + ADDITIONAL_OPTIONS: {} + DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: SECONDARY_PREFERRED + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.contentstore.mongo.MongoContentStore + OPTIONS: + auth_source: '' + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + ssl: false + user: edxapp +CORS_ORIGIN_ALLOW_ALL: false +CORS_ORIGIN_WHITELIST: [] +COURSES_WITH_UNSAFE_CODE: [] +COURSE_ABOUT_VISIBILITY_PERMISSION: see_exists +COURSE_CATALOG_API_URL: http://localhost:8008/api/v1 +COURSE_CATALOG_VISIBILITY_PERMISSION: see_exists +CREDENTIALS_INTERNAL_SERVICE_URL: http://localhost:8005 +CREDENTIALS_PUBLIC_SERVICE_URL: http://localhost:8005 +CREDIT_HELP_LINK_URL: '' +CREDIT_PROVIDER_SECRET_KEYS: {} +CROSS_DOMAIN_CSRF_COOKIE_DOMAIN: '' +CROSS_DOMAIN_CSRF_COOKIE_NAME: '' +CSRF_COOKIE_SECURE: false +CSRF_TRUSTED_ORIGINS: [] +DASHBOARD_COURSE_LIMIT: null +DATABASES: + default: + ATOMIC_REQUESTS: true + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 + read_replica: + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 + student_module_history: + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp_csmh + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 +DATA_DIR: /edx/var/edxapp +DEFAULT_COURSE_VISIBILITY_IN_CATALOG: both +DEFAULT_FEEDBACK_EMAIL: feedback@example.com +DEFAULT_FILE_STORAGE: django.core.files.storage.FileSystemStorage +DEFAULT_FROM_EMAIL: registration@example.com +DEFAULT_JWT_ISSUER: + AUDIENCE: lms-key + ISSUER: http://edx.devstack.lms:18000/oauth2 + SECRET_KEY: lms-secret +DEFAULT_MOBILE_AVAILABLE: false +DEFAULT_SITE_THEME: '' +DEPRECATED_ADVANCED_COMPONENT_TYPES: [] +DJFS: + directory_root: /edx/var/edxapp/django-pyfs/static/django-pyfs + type: osfs + url_root: /static/django-pyfs +DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: SECONDARY_PREFERRED + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp +ECOMMERCE_API_SIGNING_KEY: lms-secret +ECOMMERCE_API_URL: http://localhost:8002/api/v2 +ECOMMERCE_PUBLIC_URL_ROOT: http://localhost:8002 +EDXMKTG_USER_INFO_COOKIE_NAME: edx-user-info +EDXNOTES_INTERNAL_API: http://edx.devstack.edx_notes_api:18120/api/v1 +EDXNOTES_PUBLIC_API: http://localhost:18120/api/v1 +EDX_API_KEY: PUT_YOUR_API_KEY_HERE +EDX_PLATFORM_REVISION: master +ELASTIC_SEARCH_CONFIG: +- host: edx.devstack.elasticsearch + port: 9200 + use_ssl: false +EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend +EMAIL_HOST: localhost +EMAIL_HOST_PASSWORD: '' +EMAIL_HOST_USER: '' +EMAIL_PORT: 25 +EMAIL_USE_TLS: false +ENABLE_COMPREHENSIVE_THEMING: false +ENTERPRISE_API_URL: http://edx.devstack.lms:18000/enterprise/api/v1 +ENTERPRISE_COURSE_ENROLLMENT_AUDIT_MODES: +- audit +- honor +ENTERPRISE_CUSTOMER_SUCCESS_EMAIL: customersuccess@edx.org +ENTERPRISE_ENROLLMENT_API_URL: http://edx.devstack.lms:18000/api/enrollment/v1/ +ENTERPRISE_INTEGRATIONS_EMAIL: enterprise-integrations@edx.org +ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS: {} +ENTERPRISE_SERVICE_WORKER_USERNAME: enterprise_worker +ENTERPRISE_SUPPORT_URL: '' +ENTERPRISE_TAGLINE: '' +EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST: [] +EXTRA_MIDDLEWARE_CLASSES: [] +FACEBOOK_API_VERSION: v2.1 +FACEBOOK_APP_ID: FACEBOOK_APP_ID +FACEBOOK_APP_SECRET: FACEBOOK_APP_SECRET +FEATURES: + AUTH_USE_OPENID_PROVIDER: true + AUTOMATIC_AUTH_FOR_TESTING: false + CUSTOM_COURSES_EDX: false + ENABLE_COMBINED_LOGIN_REGISTRATION: true + ENABLE_CORS_HEADERS: false + ENABLE_COUNTRY_ACCESS: false + ENABLE_CREDIT_API: false + ENABLE_CREDIT_ELIGIBILITY: false + ENABLE_CROSS_DOMAIN_CSRF_COOKIE: false + ENABLE_CSMH_EXTENDED: true + ENABLE_DISCUSSION_HOME_PANEL: true + ENABLE_DISCUSSION_SERVICE: true + ENABLE_EDXNOTES: true + ENABLE_ENROLLMENT_RESET: false + ENABLE_GRADE_DOWNLOADS: true + ENABLE_INSTRUCTOR_ANALYTICS: false + ENABLE_MKTG_SITE: false + ENABLE_MOBILE_REST_API: false + ENABLE_OAUTH2_PROVIDER: false + ENABLE_PUBLISHER: false + ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES: true + ENABLE_SPECIAL_EXAMS: false + ENABLE_SYSADMIN_DASHBOARD: false + ENABLE_THIRD_PARTY_AUTH: true + ENABLE_VIDEO_UPLOAD_PIPELINE: false + PREVIEW_LMS_BASE: preview.localhost:18000 + SHOW_FOOTER_LANGUAGE_SELECTOR: false + SHOW_HEADER_LANGUAGE_SELECTOR: false +FEEDBACK_SUBMISSION_EMAIL: '' +FERNET_KEYS: +- DUMMY KEY CHANGE BEFORE GOING TO PRODUCTION +FILE_UPLOAD_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) +FILE_UPLOAD_STORAGE_PREFIX: submissions_attachments +FINANCIAL_REPORTS: + BUCKET: null + ROOT_PATH: sandbox + STORAGE_TYPE: localfs +FOOTER_ORGANIZATION_IMAGE: images/logo.png +GITHUB_REPO_ROOT: /edx/var/edxapp/data +GIT_REPO_DIR: /edx/var/edxapp/course_repos +GOOGLE_ANALYTICS_ACCOUNT: null +GOOGLE_ANALYTICS_LINKEDIN: '' +GOOGLE_ANALYTICS_TRACKING_ID: '' +GOOGLE_SITE_VERIFICATION_ID: '' +GRADES_DOWNLOAD: + BUCKET: '' + ROOT_PATH: '' + STORAGE_CLASS: django.core.files.storage.FileSystemStorage + STORAGE_KWARGS: + location: /tmp/edx-s3/grades + STORAGE_TYPE: '' +HELP_TOKENS_BOOKS: + course_author: http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course + learner: http://edx.readthedocs.io/projects/open-edx-learner-guide +HTTPS: 'on' +ICP_LICENSE: null +ICP_LICENSE_INFO: {} +IDA_LOGOUT_URI_LIST: [] +ID_VERIFICATION_SUPPORT_LINK: '' +JWT_AUTH: + JWT_AUDIENCE: lms-key + JWT_AUTH_COOKIE_HEADER_PAYLOAD: edx-jwt-cookie-header-payload + JWT_AUTH_COOKIE_SIGNATURE: edx-jwt-cookie-signature + JWT_AUTH_REFRESH_COOKIE: edx-jwt-refresh-cookie + JWT_ISSUER: http://edx.devstack.lms:18000/oauth2 + JWT_ISSUERS: + - AUDIENCE: lms-key + ISSUER: http://edx.devstack.lms:18000/oauth2 + SECRET_KEY: lms-secret + JWT_PRIVATE_SIGNING_JWK: None + JWT_PUBLIC_SIGNING_JWK_SET: '' + JWT_SECRET_KEY: lms-secret + JWT_SIGNING_ALGORITHM: null +JWT_EXPIRATION: 30 +JWT_ISSUER: http://edx.devstack.lms:18000/oauth2 +JWT_PRIVATE_SIGNING_KEY: null +LANGUAGE_CODE: en +LANGUAGE_COOKIE: openedx-language-preference +LEARNER_PORTAL_URL_ROOT: https://learner-portal-edx.devstack.lms:18000 +LEARNING_MICROFRONTEND_URL: null +LMS_BASE: edx.devstack.lms:18000 +LMS_INTERNAL_ROOT_URL: http://edx.devstack.lms:18000 +LMS_ROOT_URL: http://edx.devstack.lms:18000 +LOCAL_LOGLEVEL: INFO +LOGGING_ENV: sandbox +LOGIN_REDIRECT_WHITELIST: [] +LOG_DIR: /edx/var/log/edx +LTI_AGGREGATE_SCORE_PASSBACK_DELAY: 900 +LTI_USER_EMAIL_DOMAIN: lti.example.com +MAILCHIMP_NEW_USER_LIST_ID: null +MAINTENANCE_BANNER_TEXT: Sample banner message +MEDIA_ROOT: /edx/var/edxapp/media/ +MEDIA_URL: /media/ +MICROSITE_CONFIGURATION: {} +MICROSITE_ROOT_DIR: /edx/app/edxapp/edx-microsite +MKTG_URLS: {} +MKTG_URL_LINK_MAP: {} +MOBILE_STORE_URLS: {} +MODULESTORE: + default: + ENGINE: xmodule.modulestore.mixed.MixedModuleStore + OPTIONS: + mappings: {} + stores: + - DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: SECONDARY_PREFERRED + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.modulestore.split_mongo.split_draft.DraftVersioningModuleStore + NAME: split + OPTIONS: + default_class: xmodule.hidden_module.HiddenDescriptor + fs_root: /edx/var/edxapp/data + render_template: edxmako.shortcuts.render_to_string + - DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: PRIMARY + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.modulestore.mongo.DraftMongoModuleStore + NAME: draft + OPTIONS: + default_class: xmodule.hidden_module.HiddenDescriptor + fs_root: /edx/var/edxapp/data + render_template: edxmako.shortcuts.render_to_string +OAUTH_DELETE_EXPIRED: true +OAUTH_ENFORCE_SECURE: false +OAUTH_EXPIRE_CONFIDENTIAL_CLIENT_DAYS: 365 +OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS: 30 +OPTIMIZELY_PROJECT_ID: null +ORA2_FILE_PREFIX: default_env-default_deployment/ora2 +ORDER_HISTORY_MICROFRONTEND_URL: null +PAID_COURSE_REGISTRATION_CURRENCY: +- usd +- $ +PARENTAL_CONSENT_AGE_LIMIT: 13 +PARTNER_SUPPORT_EMAIL: '' +PASSWORD_POLICY_COMPLIANCE_ROLLOUT_CONFIG: + ENFORCE_COMPLIANCE_ON_LOGIN: false +PASSWORD_RESET_SUPPORT_LINK: '' +PAYMENT_SUPPORT_EMAIL: billing@example.com +PDF_RECEIPT_BILLING_ADDRESS: 'Enter your receipt billing + + address here. + + ' +PDF_RECEIPT_COBRAND_LOGO_PATH: '' +PDF_RECEIPT_DISCLAIMER_TEXT: 'ENTER YOUR RECEIPT DISCLAIMER TEXT HERE. + + ' +PDF_RECEIPT_FOOTER_TEXT: 'Enter your receipt footer text here. + + ' +PDF_RECEIPT_LOGO_PATH: '' +PDF_RECEIPT_TAX_ID: 00-0000000 +PDF_RECEIPT_TAX_ID_LABEL: fake Tax ID +PDF_RECEIPT_TERMS_AND_CONDITIONS: 'Enter your receipt terms and conditions here. + + ' +PLATFORM_DESCRIPTION: Your Platform Description Here +PLATFORM_FACEBOOK_ACCOUNT: http://www.facebook.com/YourPlatformFacebookAccount +PLATFORM_NAME: ITF edX +PLATFORM_TWITTER_ACCOUNT: '@YourPlatformTwitterAccount' +POLICY_CHANGE_GRADES_ROUTING_KEY: edx.lms.core.default +PRESS_EMAIL: press@example.com +PROCTORING_BACKENDS: + DEFAULT: 'null' + 'null': {} +PROCTORING_SETTINGS: {} +PROFILE_IMAGE_BACKEND: + class: openedx.core.storage.OverwriteStorage + options: + base_url: /media/profile-images/ + location: /edx/var/edxapp/media/profile-images/ +PROFILE_IMAGE_MAX_BYTES: 1048576 +PROFILE_IMAGE_MIN_BYTES: 100 +PROFILE_IMAGE_SECRET_KEY: placeholder_secret_key +PROFILE_IMAGE_SIZES_MAP: + full: 500 + large: 120 + medium: 50 + small: 30 +PROFILE_MICROFRONTEND_URL: null +PROGRAM_CERTIFICATES_ROUTING_KEY: edx.lms.core.default +PROGRAM_MANAGER_MICROFRONTEND_URL: null +RECALCULATE_GRADES_ROUTING_KEY: edx.lms.core.default +REGISTRATION_EXTRA_FIELDS: + city: hidden + confirm_email: hidden + country: required + gender: optional + goals: optional + honor_code: required + level_of_education: optional + mailing_address: hidden + terms_of_service: hidden + year_of_birth: optional +RETIRED_EMAIL_DOMAIN: retired.invalid +RETIRED_EMAIL_PREFIX: retired__user_ +RETIRED_USERNAME_PREFIX: retired__user_ +RETIRED_USER_SALTS: +- OVERRIDE ME WITH A RANDOM VALUE +- ROTATE SALTS BY APPENDING NEW VALUES +RETIREMENT_SERVICE_WORKER_USERNAME: retirement_worker +RETIREMENT_STATES: +- PENDING +- ERRORED +- ABORTED +- COMPLETE +SECRET_KEY: DUMMY KEY ONLY FOR TO DEVSTACK +SEGMENT_KEY: null +SERVER_EMAIL: devops@example.com +SESSION_COOKIE_DOMAIN: '' +SESSION_COOKIE_NAME: sessionid +SESSION_COOKIE_SECURE: false +SESSION_SAVE_EVERY_REQUEST: false +SITE_NAME: localhost +SOCIAL_AUTH_OAUTH_SECRETS: '' +SOCIAL_AUTH_SAML_SP_PRIVATE_KEY: '' +SOCIAL_AUTH_SAML_SP_PRIVATE_KEY_DICT: {} +SOCIAL_AUTH_SAML_SP_PUBLIC_CERT: '' +SOCIAL_AUTH_SAML_SP_PUBLIC_CERT_DICT: {} +SOCIAL_MEDIA_FOOTER_URLS: {} +SOCIAL_SHARING_SETTINGS: + CERTIFICATE_FACEBOOK: false + CERTIFICATE_TWITTER: false + CUSTOM_COURSE_URLS: false + DASHBOARD_FACEBOOK: false + DASHBOARD_TWITTER: false +STATIC_ROOT_BASE: /edx/var/edxapp/staticfiles +STATIC_URL_BASE: /static/ +STUDIO_NAME: Studio +STUDIO_SHORT_NAME: Studio +SUPPORT_SITE_LINK: '' +SWIFT_AUTH_URL: null +SWIFT_AUTH_VERSION: null +SWIFT_KEY: null +SWIFT_REGION_NAME: null +SWIFT_TEMP_URL_DURATION: 1800 +SWIFT_TEMP_URL_KEY: null +SWIFT_TENANT_ID: null +SWIFT_TENANT_NAME: null +SWIFT_USERNAME: null +SWIFT_USE_TEMP_URLS: false +SYSLOG_SERVER: '' +SYSTEM_WIDE_ROLE_CLASSES: [] +TECH_SUPPORT_EMAIL: technical@example.com +TIME_ZONE: America/New_York +TRACKING_SEGMENTIO_WEBHOOK_SECRET: '' +UNIVERSITY_EMAIL: university@example.com +USERNAME_REPLACEMENT_WORKER: OVERRIDE THIS WITH A VALID USERNAME +VERIFY_STUDENT: + DAYS_GOOD_FOR: 365 + EXPIRING_SOON_WINDOW: 28 +VIDEO_CDN_URL: + EXAMPLE_COUNTRY_CODE: http://example.com/edx/video?s3_url= +VIDEO_IMAGE_MAX_AGE: 31536000 +VIDEO_IMAGE_SETTINGS: + DIRECTORY_PREFIX: video-images/ + STORAGE_KWARGS: + base_url: /media/ + location: /edx/var/edxapp/media/ + VIDEO_IMAGE_MAX_BYTES: 2097152 + VIDEO_IMAGE_MIN_BYTES: 2048 +VIDEO_TRANSCRIPTS_MAX_AGE: 31536000 +VIDEO_TRANSCRIPTS_SETTINGS: + DIRECTORY_PREFIX: video-transcripts/ + STORAGE_KWARGS: + base_url: /media/ + location: /edx/var/edxapp/media/ + VIDEO_TRANSCRIPTS_MAX_BYTES: 3145728 +VIDEO_UPLOAD_PIPELINE: + BUCKET: '' + ROOT_PATH: '' +WIKI_ENABLED: true +WRITABLE_GRADEBOOK_URL: null +XBLOCK_FS_STORAGE_BUCKET: null +XBLOCK_FS_STORAGE_PREFIX: null +XBLOCK_SETTINGS: {} +XQUEUE_INTERFACE: + basic_auth: + - edx + - edx + django_auth: + password: password + username: lms + url: http://edx.devstack.xqueue:18040 +X_FRAME_OPTIONS: DENY +YOUTUBE_API_KEY: PUT_YOUR_API_KEY_HERE +ZENDESK_API_KEY: '' +ZENDESK_CUSTOM_FIELDS: {} +ZENDESK_GROUP_ID_MAPPING: {} +ZENDESK_OAUTH_ACCESS_TOKEN: '' +ZENDESK_URL: '' +ZENDESK_USER: '' \ No newline at end of file diff --git a/edx-config/etc/studio.yml.example b/edx-config/etc/studio.yml.example new file mode 100644 index 0000000000..6bf487b342 --- /dev/null +++ b/edx-config/etc/studio.yml.example @@ -0,0 +1,493 @@ +ACTIVATION_EMAIL_SUPPORT_LINK: '' +AFFILIATE_COOKIE_NAME: dev_affiliate_id +ALTERNATE_WORKER_QUEUES: lms +ANALYTICS_DASHBOARD_NAME: ITF Learning Insights +ANALYTICS_DASHBOARD_URL: http://localhost:18110/courses +AUTH_PASSWORD_VALIDATORS: +- NAME: django.contrib.auth.password_validation.UserAttributeSimilarityValidator +- NAME: util.password_policy_validators.MinimumLengthValidator + OPTIONS: + min_length: 2 +- NAME: util.password_policy_validators.MaximumLengthValidator + OPTIONS: + max_length: 75 +AWS_ACCESS_KEY_ID: null +AWS_QUERYSTRING_AUTH: false +AWS_S3_CUSTOM_DOMAIN: SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com) +AWS_SECRET_ACCESS_KEY: null +AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com +AWS_SES_REGION_NAME: us-east-1 +AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) +BASE_COOKIE_DOMAIN: dev.dipsims.xyz +BLOCKSTORE_API_URL: http://localhost:18250/api/v1 +BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250 +BLOCK_STRUCTURES_SETTINGS: + COURSE_PUBLISH_TASK_DELAY: 30 + PRUNING_ACTIVE: false + TASK_DEFAULT_RETRY_DELAY: 30 + TASK_MAX_RETRIES: 5 +BRANCH_IO_KEY: '' +BUGS_EMAIL: bugs@example.com +BULK_EMAIL_DEFAULT_FROM_EMAIL: no-reply@example.com +BULK_EMAIL_EMAILS_PER_TASK: 500 +BULK_EMAIL_LOG_SENT_EMAILS: false +CACHES: + celery: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: celery + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: '7200' + configuration: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: 1001c6274ca4 + LOCATION: + - edx.devstack.memcached:11211 + course_structure_cache: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: course_structure + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: '7200' + default: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: default + LOCATION: + - edx.devstack.memcached:11211 + VERSION: '1' + general: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: general + LOCATION: + - edx.devstack.memcached:11211 + mongo_metadata_inheritance: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: mongo_metadata_inheritance + LOCATION: + - edx.devstack.memcached:11211 + TIMEOUT: 300 + staticfiles: + BACKEND: django.core.cache.backends.memcached.MemcachedCache + KEY_FUNCTION: util.memcache.safe_key + KEY_PREFIX: 1001c6274ca4_general + LOCATION: + - edx.devstack.memcached:11211 +CAS_ATTRIBUTE_CALLBACK: '' +CAS_EXTRA_LOGIN_PARAMS: '' +CAS_SERVER_URL: '' +CELERY_BROKER_HOSTNAME: localhost +CELERY_BROKER_PASSWORD: celery +CELERY_BROKER_TRANSPORT: amqp +CELERY_BROKER_USER: celery +CELERY_BROKER_USE_SSL: false +CELERY_BROKER_VHOST: '' +CELERY_EVENT_QUEUE_TTL: null +CELERY_QUEUES: +- edx.cms.core.default +- edx.cms.core.high +CELERY_TIMEZONE: UTC +CERTIFICATE_TEMPLATE_LANGUAGES: + en: English + es: Español +CERT_QUEUE: certificates +CMS_BASE: studio.dev.dipsims.xyz +CODE_JAIL: + limits: + CPU: 1 + FSIZE: 1048576 + PROXY: 0 + REALTIME: 3 + VMEM: 536870912 + python_bin: /edx/app/edxapp/venvs/edxapp-sandbox/bin/python + user: sandbox +COMMENTS_SERVICE_KEY: password +COMMENTS_SERVICE_URL: http://localhost:18080 +COMPREHENSIVE_THEME_DIRS: +- '' +COMPREHENSIVE_THEME_LOCALE_PATHS: [] +CONTACT_EMAIL: info@example.com +CONTENTSTORE: + ADDITIONAL_OPTIONS: {} + DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: PRIMARY + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.contentstore.mongo.MongoContentStore + OPTIONS: + auth_source: '' + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + ssl: false + user: edxapp +CORS_ORIGIN_ALLOW_ALL: false +CORS_ORIGIN_WHITELIST: [] +COURSES_WITH_UNSAFE_CODE: [] +COURSE_ABOUT_VISIBILITY_PERMISSION: see_exists +COURSE_CATALOG_API_URL: http://localhost:8008/api/v1 +COURSE_CATALOG_VISIBILITY_PERMISSION: see_exists +COURSE_IMPORT_EXPORT_BUCKET: '' +CREDENTIALS_INTERNAL_SERVICE_URL: http://localhost:8005 +CREDENTIALS_PUBLIC_SERVICE_URL: http://localhost:8005 +CREDIT_PROVIDER_SECRET_KEYS: {} +CROSS_DOMAIN_CSRF_COOKIE_DOMAIN: '' +CROSS_DOMAIN_CSRF_COOKIE_NAME: '' +CSRF_COOKIE_SECURE: false +CSRF_TRUSTED_ORIGINS: [] +DASHBOARD_COURSE_LIMIT: null +DATABASES: + default: + ATOMIC_REQUESTS: true + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 + read_replica: + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 + student_module_history: + CONN_MAX_AGE: 0 + ENGINE: django.db.backends.mysql + HOST: edx.devstack.mysql + NAME: edxapp_csmh + OPTIONS: {} + PASSWORD: password + PORT: '3306' + USER: edxapp001 +DATA_DIR: /edx/var/edxapp +DEFAULT_COURSE_VISIBILITY_IN_CATALOG: both +DEFAULT_FEEDBACK_EMAIL: feedback@example.com +DEFAULT_FILE_STORAGE: django.core.files.storage.FileSystemStorage +DEFAULT_FROM_EMAIL: registration@example.com +DEFAULT_JWT_ISSUER: + AUDIENCE: lms-key + ISSUER: http://dev.dipsims.xyz/oauth2 + SECRET_KEY: lms-secret +DEFAULT_MOBILE_AVAILABLE: false +DEFAULT_SITE_THEME: '' +DEPRECATED_ADVANCED_COMPONENT_TYPES: [] +DJFS: + directory_root: /edx/var/edxapp/django-pyfs/static/django-pyfs + type: osfs + url_root: /static/django-pyfs +DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: PRIMARY + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp +ECOMMERCE_API_SIGNING_KEY: lms-secret +ECOMMERCE_API_URL: http://localhost:8002/api/v2 +ECOMMERCE_PUBLIC_URL_ROOT: http://localhost:8002 +EDXMKTG_USER_INFO_COOKIE_NAME: edx-user-info +EDX_PLATFORM_REVISION: master +ELASTIC_SEARCH_CONFIG: +- host: edx.devstack.elasticsearch + port: 9200 + use_ssl: false +EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend +EMAIL_HOST: localhost +EMAIL_HOST_PASSWORD: '' +EMAIL_HOST_USER: '' +EMAIL_PORT: 25 +EMAIL_USE_TLS: false +ENABLE_COMPREHENSIVE_THEMING: false +ENTERPRISE_API_URL: http://dev.dipsims.xyz/enterprise/api/v1 +ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS: {} +ENTERPRISE_SERVICE_WORKER_USERNAME: enterprise_worker +EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST: [] +EXTRA_MIDDLEWARE_CLASSES: [] +FACEBOOK_API_VERSION: v2.1 +FACEBOOK_APP_ID: FACEBOOK_APP_ID +FACEBOOK_APP_SECRET: FACEBOOK_APP_SECRET +FEATURES: + AUTH_USE_OPENID_PROVIDER: true + AUTOMATIC_AUTH_FOR_TESTING: false + CUSTOM_COURSES_EDX: false + ENABLE_COMBINED_LOGIN_REGISTRATION: true + ENABLE_CORS_HEADERS: false + ENABLE_COUNTRY_ACCESS: false + ENABLE_CREDIT_API: false + ENABLE_CREDIT_ELIGIBILITY: false + ENABLE_CROSS_DOMAIN_CSRF_COOKIE: false + ENABLE_CSMH_EXTENDED: true + ENABLE_DISCUSSION_HOME_PANEL: true + ENABLE_DISCUSSION_SERVICE: true + ENABLE_EDXNOTES: true + ENABLE_ENROLLMENT_RESET: false + ENABLE_GRADE_DOWNLOADS: true + ENABLE_INSTRUCTOR_ANALYTICS: false + ENABLE_MKTG_SITE: false + ENABLE_MOBILE_REST_API: false + ENABLE_OAUTH2_PROVIDER: false + ENABLE_PUBLISHER: false + ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES: true + ENABLE_SPECIAL_EXAMS: false + ENABLE_SYSADMIN_DASHBOARD: false + ENABLE_THIRD_PARTY_AUTH: true + ENABLE_VIDEO_UPLOAD_PIPELINE: false + PREVIEW_LMS_BASE: preview.dev.dispsims.xyz + SHOW_FOOTER_LANGUAGE_SELECTOR: false + SHOW_HEADER_LANGUAGE_SELECTOR: false +FEEDBACK_SUBMISSION_EMAIL: '' +FERNET_KEYS: +- DUMMY KEY CHANGE BEFORE GOING TO PRODUCTION +FILE_UPLOAD_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) +FILE_UPLOAD_STORAGE_PREFIX: submissions_attachments +FINANCIAL_REPORTS: + BUCKET: null + ROOT_PATH: sandbox + STORAGE_TYPE: localfs +FOOTER_ORGANIZATION_IMAGE: images/logo.png +GITHUB_REPO_ROOT: /edx/var/edxapp/data +GIT_REPO_EXPORT_DIR: /edx/var/edxapp/export_course_repos +GOOGLE_ANALYTICS_ACCOUNT: null +GRADES_DOWNLOAD: + BUCKET: '' + ROOT_PATH: '' + STORAGE_CLASS: django.core.files.storage.FileSystemStorage + STORAGE_KWARGS: + location: /tmp/edx-s3/grades + STORAGE_TYPE: '' +HELP_TOKENS_BOOKS: + course_author: http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course + learner: http://edx.readthedocs.io/projects/open-edx-learner-guide +ICP_LICENSE: null +ICP_LICENSE_INFO: {} +IDA_LOGOUT_URI_LIST: [] +ID_VERIFICATION_SUPPORT_LINK: '' +JWT_AUTH: + JWT_AUDIENCE: lms-key + JWT_AUTH_COOKIE_HEADER_PAYLOAD: edx-jwt-cookie-header-payload + JWT_AUTH_COOKIE_SIGNATURE: edx-jwt-cookie-signature + JWT_AUTH_REFRESH_COOKIE: edx-jwt-refresh-cookie + JWT_ISSUER: http://dev.dipsims.xyz/oauth2 + JWT_ISSUERS: + - AUDIENCE: lms-key + ISSUER: http://dev.dipsims.xyz/oauth2 + SECRET_KEY: lms-secret + JWT_PRIVATE_SIGNING_JWK: None + JWT_PUBLIC_SIGNING_JWK_SET: '' + JWT_SECRET_KEY: lms-secret + JWT_SIGNING_ALGORITHM: null +JWT_EXPIRATION: 30 +JWT_ISSUER: http://dev.dipsims.xyz/oauth2 +JWT_PRIVATE_SIGNING_KEY: null +LANGUAGE_CODE: en +LANGUAGE_COOKIE: openedx-language-preference +LEARNER_PORTAL_URL_ROOT: https://learner-portal-edx.devstack.lms:18000 +LMS_BASE: edx.devstack.lms:18000 +LMS_INTERNAL_ROOT_URL: http://dev.dipsims.xyz +LMS_ROOT_URL: http://dev.dipsims.xyz +LOCAL_LOGLEVEL: INFO +LOGGING_ENV: sandbox +LOGIN_REDIRECT_WHITELIST: [] +LOG_DIR: /edx/var/log/edx +MAINTENANCE_BANNER_TEXT: Sample banner message +MEDIA_ROOT: /edx/var/edxapp/media/ +MEDIA_URL: /media/ +MICROSITE_CONFIGURATION: {} +MICROSITE_ROOT_DIR: /edx/app/edxapp/edx-microsite +MKTG_URLS: {} +MKTG_URL_LINK_MAP: {} +MOBILE_STORE_URLS: {} +MODULESTORE: + default: + ENGINE: xmodule.modulestore.mixed.MixedModuleStore + OPTIONS: + mappings: {} + stores: + - DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: PRIMARY + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.modulestore.split_mongo.split_draft.DraftVersioningModuleStore + NAME: split + OPTIONS: + default_class: xmodule.hidden_module.HiddenDescriptor + fs_root: /edx/var/edxapp/data + render_template: edxmako.shortcuts.render_to_string + - DOC_STORE_CONFIG: + authsource: '' + collection: modulestore + connectTimeoutMS: 2000 + db: edxapp + host: + - edx.devstack.mongo + password: password + port: 27017 + read_preference: PRIMARY + replicaSet: '' + socketTimeoutMS: 3000 + ssl: false + user: edxapp + ENGINE: xmodule.modulestore.mongo.DraftMongoModuleStore + NAME: draft + OPTIONS: + default_class: xmodule.hidden_module.HiddenDescriptor + fs_root: /edx/var/edxapp/data + render_template: edxmako.shortcuts.render_to_string +ORA2_FILE_PREFIX: default_env-default_deployment/ora2 +PARSE_KEYS: {} +PARTNER_SUPPORT_EMAIL: '' +PASSWORD_POLICY_COMPLIANCE_ROLLOUT_CONFIG: + ENFORCE_COMPLIANCE_ON_LOGIN: false +PASSWORD_RESET_SUPPORT_LINK: '' +PAYMENT_SUPPORT_EMAIL: billing@example.com +PLATFORM_DESCRIPTION: Your Platform Description Here +PLATFORM_FACEBOOK_ACCOUNT: http://www.facebook.com/YourPlatformFacebookAccount +PLATFORM_NAME: ITF Learning +PLATFORM_TWITTER_ACCOUNT: '@YourPlatformTwitterAccount' +POLICY_CHANGE_GRADES_ROUTING_KEY: edx.lms.core.default +PRESS_EMAIL: press@example.com +PROCTORING_BACKENDS: + DEFAULT: 'null' + 'null': {} +PROCTORING_SETTINGS: {} +REGISTRATION_EXTRA_FIELDS: + city: hidden + confirm_email: hidden + country: required + gender: optional + goals: optional + honor_code: required + level_of_education: optional + mailing_address: hidden + terms_of_service: hidden + year_of_birth: optional +RETIRED_EMAIL_DOMAIN: retired.invalid +RETIRED_EMAIL_PREFIX: retired__user_ +RETIRED_USERNAME_PREFIX: retired__user_ +RETIRED_USER_SALTS: +- OVERRIDE ME WITH A RANDOM VALUE +- ROTATE SALTS BY APPENDING NEW VALUES +RETIREMENT_SERVICE_WORKER_USERNAME: retirement_worker +RETIREMENT_STATES: +- PENDING +- ERRORED +- ABORTED +- COMPLETE +SECRET_KEY: DUMMY KEY ONLY FOR TO DEVSTACK +SEGMENT_KEY: null +SERVER_EMAIL: devops@example.com +SESSION_COOKIE_DOMAIN: '' +SESSION_COOKIE_NAME: sessionid +SESSION_COOKIE_SECURE: false +SESSION_SAVE_EVERY_REQUEST: false +SITE_NAME: localhost +SOCIAL_AUTH_SAML_SP_PRIVATE_KEY: '' +SOCIAL_AUTH_SAML_SP_PRIVATE_KEY_DICT: {} +SOCIAL_AUTH_SAML_SP_PUBLIC_CERT: '' +SOCIAL_AUTH_SAML_SP_PUBLIC_CERT_DICT: {} +SOCIAL_MEDIA_FOOTER_URLS: {} +SOCIAL_SHARING_SETTINGS: + CERTIFICATE_FACEBOOK: false + CERTIFICATE_TWITTER: false + CUSTOM_COURSE_URLS: false + DASHBOARD_FACEBOOK: false + DASHBOARD_TWITTER: false +STATIC_ROOT_BASE: /edx/var/edxapp/staticfiles +STATIC_URL_BASE: /static/ +STUDIO_NAME: Studio +STUDIO_SHORT_NAME: Studio +SUPPORT_SITE_LINK: '' +SWIFT_AUTH_URL: null +SWIFT_AUTH_VERSION: null +SWIFT_KEY: null +SWIFT_REGION_NAME: null +SWIFT_TEMP_URL_DURATION: 1800 +SWIFT_TEMP_URL_KEY: null +SWIFT_TENANT_ID: null +SWIFT_TENANT_NAME: null +SWIFT_USERNAME: null +SWIFT_USE_TEMP_URLS: false +SYSLOG_SERVER: '' +SYSTEM_WIDE_ROLE_CLASSES: [] +TECH_SUPPORT_EMAIL: technical@example.com +TIME_ZONE: America/New_York +UNIVERSITY_EMAIL: university@example.com +USERNAME_REPLACEMENT_WORKER: OVERRIDE THIS WITH A VALID USERNAME +VIDEO_IMAGE_MAX_AGE: 31536000 +VIDEO_IMAGE_SETTINGS: + DIRECTORY_PREFIX: video-images/ + STORAGE_KWARGS: + base_url: /media/ + location: /edx/var/edxapp/media/ + VIDEO_IMAGE_MAX_BYTES: 2097152 + VIDEO_IMAGE_MIN_BYTES: 2048 +VIDEO_TRANSCRIPTS_MAX_AGE: 31536000 +VIDEO_TRANSCRIPTS_SETTINGS: + DIRECTORY_PREFIX: video-transcripts/ + STORAGE_KWARGS: + base_url: /media/ + location: /edx/var/edxapp/media/ + VIDEO_TRANSCRIPTS_MAX_BYTES: 3145728 +VIDEO_UPLOAD_PIPELINE: + BUCKET: '' + ROOT_PATH: '' +WIKI_ENABLED: true +XBLOCK_FS_STORAGE_BUCKET: null +XBLOCK_FS_STORAGE_PREFIX: null +XBLOCK_SETTINGS: {} +XQUEUE_INTERFACE: + basic_auth: + - edx + - edx + django_auth: + password: password + username: lms + url: http://edx.devstack.xqueue:18040 +X_FRAME_OPTIONS: DENY +YOUTUBE_API_KEY: PUT_YOUR_API_KEY_HERE +ZENDESK_API_KEY: '' +ZENDESK_CUSTOM_FIELDS: {} +ZENDESK_GROUP_ID_MAPPING: {} +ZENDESK_OAUTH_ACCESS_TOKEN: '' +ZENDESK_URL: '' +ZENDESK_USER: '' \ No newline at end of file diff --git a/local.mk.example b/local.mk.example new file mode 100644 index 0000000000..b08cfcb836 --- /dev/null +++ b/local.mk.example @@ -0,0 +1,4 @@ +SITE_LMS=dev.dipsims.xyz +SITE_CMS=studio.dev.dipsims.xyz +SITE_ECOMMERCE=ecommerce.dev.dipsims.xyz +ENABLE_DJANGO_TOOLBAR=0 \ No newline at end of file diff --git a/provision-credentials.sh b/provision-credentials.sh index 32fccdaf61..4b41c4be7b 100755 --- a/provision-credentials.sh +++ b/provision-credentials.sh @@ -18,7 +18,7 @@ echo -e "${GREEN}Creating super-user for ${name}...${NC}" docker exec -t edx.devstack.${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(\"edx\", \"edx@example.com\", \"edx\") if not User.objects.filter(username=\"edx\").exists() else None" | python /edx/app/$1/$1/manage.py shell' -- "$name" echo -e "${GREEN}Configuring site for ${name}...${NC}" -docker exec -t edx.devstack.${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/ && ./manage.py create_or_update_site --site-id=1 --site-domain=localhost:18150 --site-name="Open edX" --platform-name="Open edX" --company-name="Open edX" --lms-url-root=http://localhost:18000 --catalog-api-url=http://edx.devstack.discovery:18381/api/v1/ --tos-url=http://localhost:18000/tos --privacy-policy-url=http://localhost:18000/privacy --homepage-url=http://localhost:18000 --certificate-help-url=http://localhost:18000/faq --records-help-url=http://localhost:18000/faq --theme-name=openedx' +docker exec -t edx.devstack.${name} bash -c "source /edx/app/credentials/credentials_env && cd /edx/app/credentials/ && ./manage.py create_or_update_site --site-id=1 --site-domain=localhost:18150 --site-name="Open edX" --platform-name=\"Open edX\" --company-name="Open edX" --lms-url-root=http://$SITE_LMS --catalog-api-url=http://edx.devstack.discovery:18381/api/v1/ --tos-url=http://$SITE_LMS/tos --privacy-policy-url=http://$SITE_LMS/privacy --homepage-url=http://$SITE_LMS --certificate-help-url=http://$SITE_LMS/faq --records-help-url=http://$SITE_LMS/faq --theme-name=openedx" ./provision-ida-user.sh ${name} ${name} ${port} diff --git a/provision-ecommerce.sh b/provision-ecommerce.sh index c1680fab02..65dbbf9242 100755 --- a/provision-ecommerce.sh +++ b/provision-ecommerce.sh @@ -4,6 +4,6 @@ ./provision-ida.sh ecommerce ecommerce 18130 # Configure ecommerce -docker exec -t edx.devstack.ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_or_update_site --site-id=1 --site-domain=localhost:18130 --partner-code=edX --partner-name="Open edX" --lms-url-root=http://edx.devstack.lms:18000 --lms-public-url-root=http://localhost:18000 --client-side-payment-processor=cybersource --payment-processors=cybersource,paypal --sso-client-id=ecommerce-sso-key --sso-client-secret=ecommerce-sso-secret --backend-service-client-id=ecommerce-backend-service-key --backend-service-client-secret=ecommerce-backend-service-secret --from-email staff@example.com --discovery_api_url=http://edx.devstack.discovery:18381/api/v1/' +docker exec -t edx.devstack.ecommerce bash -c "source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_or_update_site --site-id=1 --site-domain=$SITE_ECOMMERCE --partner-code=edX --partner-name=\"Open edX\" --lms-url-root=http://edx.devstack.lms:18000 --lms-public-url-root=http://$SITE_LMS --client-side-payment-processor=cybersource --payment-processors=cybersource,paypal --sso-client-id=ecommerce-sso-key --sso-client-secret=ecommerce-sso-secret --backend-service-client-id=ecommerce-backend-service-key --backend-service-client-secret=ecommerce-backend-service-secret --from-email staff@example.com --discovery_api_url=http://edx.devstack.discovery:18381/api/v1/" docker exec -t edx.devstack.ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py oscar_populate_countries --initial-only' docker exec -t edx.devstack.ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_demo_data --partner=edX'