diff --git a/config/settings/base.py b/config/settings/base.py
index 220919192487f2e61b1125e9a82515fa2f254a92..539c3179a2111928dfdc9315af2436c61f7ba91f 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -12,10 +12,6 @@ PROJECT_ROOT = join(BASE_DIR, "gracedb")
 # Other useful paths
 PROJECT_DATA_DIR = join(BASE_DIR, "..", "project_data")
 
-# Server hostname and FQDN
-SERVER_HOSTNAME = socket.gethostname()
-SERVER_FQDN = socket.getfqdn()
-
 # Unauthenticated access ------------------------------------------------------
 # This variable controls whether unauthenticated access is allowed *ANYWHERE*
 # on this service, except the home page, which is always public.
@@ -68,8 +64,7 @@ USE_TZ = True
 # Allow this site to be served on localhost, the FQDN of this server, and
 # hostname.ligo.org. Security measure for preventing cache poisoning and
 # stopping requests submitted with a fake HTTP Host header.
-ALLOWED_HOSTS = ['localhost', '127.0.0.1', SERVER_FQDN,
-    '{0}.ligo.org'.format(SERVER_HOSTNAME)]
+ALLOWED_HOSTS = ['localhost', '127.0.0.1']
 
 # Sessions settings -----------------------------------------------------------
 SESSION_COOKIE_AGE = 3600*23
@@ -99,20 +94,6 @@ LVALERT_OVERSEER_PORTS = {
     "lvalert-test.cgca.uwm.edu": 8001,
 }
 
-# Email settings --------------------------------------------------------------
-EMAIL_HOST = 'localhost'
-SERVER_EMAIL = 'GraceDB <gracedb@{fqdn}>'.format(fqdn=SERVER_FQDN)
-ALERT_EMAIL_FROM = SERVER_EMAIL
-ALERT_EMAIL_TO = []
-ALERT_EMAIL_BCC = []
-ALERT_TEST_EMAIL_FROM = SERVER_EMAIL
-ALERT_TEST_EMAIL_TO = []
-# EMBB email settings
-EMBB_MAIL_ADDRESS = 'embb@{fqdn}.ligo.org'.format(fqdn=SERVER_FQDN)
-EMBB_SMTP_SERVER = 'localhost'
-EMBB_MAIL_ADMINS = [admin[1] for admin in ADMINS]
-EMBB_IGNORE_ADDRESSES = ['Mailer-Daemon@{fqdn}'.format(fqdn=SERVER_FQDN)]
-
 # Access and authorization ----------------------------------------------------
 # Some proper names related to authorization
 LVC_GROUP = 'Communities:LSCVirgoLIGOGroupMembers'
diff --git a/config/settings/container.py b/config/settings/container.py
index 03ff8a9ace9d43a5b39d43a98681061c43e51c5f..778653b06caff910525b7a2977f75b2d7c288802 100644
--- a/config/settings/container.py
+++ b/config/settings/container.py
@@ -5,6 +5,7 @@ import os
 from django.core.exceptions import ImproperlyConfigured
 from .base import *
 
+# Get required variables from environment variables ---------------------------
 # Get database password from environment and check
 DB_PASSWORD = os.environ.get('DJANGO_DB_PASSWORD', None)
 if DB_PASSWORD is None:
@@ -15,12 +16,17 @@ SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', None)
 if SECRET_KEY is None:
     raise ImproperlyConfigured('Could not get secret key from envvars.')
 
+# Get primary FQDN
+SERVER_FQDN = os.environ.get('DJANGO_PRIMARY_FQDN', None)
+if SERVER_FQDN is None:
+    raise ImproperlyConfigured('Could not get FQDN from envvars.')
+
 # Get Twilio account information from environment
 # FIXME
 TWILIO_ACCOUNT_SID = os.environ.get('DJANGO_TWILIO_ACCOUNT_SID', 'abcd')
 TWILIO_AUTH_TOKEN = os.environ.get('DJANGO_TWILIO_AUTH_TOKEN', 'abcd')
 
-# Database settings
+# Database settings -----------------------------------------------------------
 DATABASES = {
     'default' : {
         'NAME': 'gracedb',
@@ -35,4 +41,22 @@ DATABASES = {
     }
 }
 
+# Update allowed hosts from environment variables -----------------------------
+hosts_from_env = os.environ.get('DJANGO_ALLOWED_HOSTS', None)
+if hosts_from_env is not None:
+    ALLOWED_HOSTS += hosts_from_env.split(',')
+ALLOWED_HOSTS += [SERVER_FQDN]
 
+# Email settings - dependent on server hostname and FQDN ----------------------
+EMAIL_HOST = 'localhost'
+SERVER_EMAIL = 'GraceDB <gracedb@{fqdn}>'.format(fqdn=SERVER_FQDN)
+ALERT_EMAIL_FROM = SERVER_EMAIL
+ALERT_EMAIL_TO = []
+ALERT_EMAIL_BCC = []
+ALERT_TEST_EMAIL_FROM = SERVER_EMAIL
+ALERT_TEST_EMAIL_TO = []
+# EMBB email settings
+EMBB_MAIL_ADDRESS = 'embb@{fqdn}.ligo.org'.format(fqdn=SERVER_FQDN)
+EMBB_SMTP_SERVER = 'localhost'
+EMBB_MAIL_ADMINS = [admin[1] for admin in ADMINS]
+EMBB_IGNORE_ADDRESSES = ['Mailer-Daemon@{fqdn}'.format(fqdn=SERVER_FQDN)]
diff --git a/config/settings/vm.py b/config/settings/vm.py
index 7f823d3de4455771dedaf03d99ebb977834eefc5..cac36987809f666756bd5004fbeb6b0847043a5a 100644
--- a/config/settings/vm.py
+++ b/config/settings/vm.py
@@ -1,11 +1,12 @@
-# For running a VM that is provisioned by Puppet with
-# a secret.py file for secret settings
+# For running a VM that is provisioned by Puppet with a secret.py file
+# for secret settings
 
 # Get secret settings:
 # DEFAULT_DB_PASSWORD, DEFAULT_SECRET_KEY, TWILIO_ACCOUNT_SID,
 # TWILIO_AUTH_TOKEN
 from .base import *
 from .secret import *
+import socket
 
 # Nested dict of settings for all databases
 DATABASES = {
@@ -22,3 +23,23 @@ DATABASES = {
 
 # Secret key for a Django installation
 SECRET_KEY = DEFAULT_SECRET_KEY
+
+# Set up allowed hosts
+SERVER_FQDN = socket.getfqdn()
+SERVER_HOSTNAME = socket.gethostname()
+ALLOWED_HOSTS += [SERVER_FQDN, '{hostname}.ligo.org'.format(
+    hostname=SERVER_HOSTNAME)]
+
+# Email settings - dependent on server hostname and FQDN ----------------------
+EMAIL_HOST = 'localhost'
+SERVER_EMAIL = 'GraceDB <gracedb@{fqdn}>'.format(fqdn=SERVER_FQDN)
+ALERT_EMAIL_FROM = SERVER_EMAIL
+ALERT_EMAIL_TO = []
+ALERT_EMAIL_BCC = []
+ALERT_TEST_EMAIL_FROM = SERVER_EMAIL
+ALERT_TEST_EMAIL_TO = []
+# EMBB email settings
+EMBB_MAIL_ADDRESS = 'embb@{fqdn}.ligo.org'.format(fqdn=SERVER_FQDN)
+EMBB_SMTP_SERVER = 'localhost'
+EMBB_MAIL_ADMINS = [admin[1] for admin in ADMINS]
+EMBB_IGNORE_ADDRESSES = ['Mailer-Daemon@{fqdn}'.format(fqdn=SERVER_FQDN)]