diff --git a/entrypoint.sh b/entrypoint.sh
index fd12ae6..fc6325f 100755
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -1,16 +1,15 @@
 #!/bin/ash
 
 export SIMPLE_SETTINGS=${SIMPLE_SETTINGS:-sf_notifier.settings.production}
-export SF_NOTIFIER_ALERT_ID_HASH_FUNC=${SF_NOTIFIER_ALERT_ID_HASH_FUNC:-sha256}
-export SF_NOTIFIER_ADD_LINKS=${SF_NOTIFIER_ADD_LINKS:-False}
+export LOGPATH=/var/log/sf-notifier/sfnotifier.log
 
 WORKERS=${SF_NOTIFIER_WORKERS:-4}
 BUFFER=${SF_NOTIFIER_BUFFER_SIZE:-32768}
 PORT=${SF_NOTIFIER_APP_PORT:-5000}
-LOGPATH=/var/log/sf-notifier
 
-mkdir -p $LOGPATH
-chown -R 1000:1000 $LOGPATH
+mkdir -p `dirname $LOGPATH`
+touch $LOGPATH
+chown -R 1000:1000 `dirname $LOGPATH`
 
 uwsgi -p ${WORKERS} \
     --uid 1000 \
@@ -20,4 +19,5 @@
     --callable app_dispatch \
     --buffer-size=${BUFFER} \
     --max-worker-lifetime 300 \
-    --master
+    --master \
+    --req-logger=file:${LOGPATH}
diff --git a/sf_notifier/helpers.py b/sf_notifier/helpers.py
index 9715545..6965b70 100644
--- a/sf_notifier/helpers.py
+++ b/sf_notifier/helpers.py
@@ -66,3 +66,9 @@
         fields.append(_format_description(alert, add_links))
         fields.append(alert['labels'])
     return fields, action
+
+
+def is_true(name):
+    if isinstance(name, str):
+        return name.lower() == 'true'
+    return name is True
diff --git a/sf_notifier/salesforce/client.py b/sf_notifier/salesforce/client.py
index 4403528..cf2f4c6 100644
--- a/sf_notifier/salesforce/client.py
+++ b/sf_notifier/salesforce/client.py
@@ -36,6 +36,8 @@
     'organization_id': 'organizationId',
     'environment_id': 'environment_id',
     'sandbox_enabled': 'domain',
+    'feed_enabled': 'feed_enabled',
+    'hash_func': 'hash_func',
 }
 
 ALLOWED_HASHING = ('md5', 'sha256')
@@ -82,43 +84,47 @@
             'sf_error_count': Counter('sf_error_count', 'sf-notifier'),
             'sf_request_count': Counter('sf_request_count', 'sf-notifier')
         }
-        self.config = self._validate_config(config)
-        self.hash_func = self._hash_func()
-        self.environment = self.config.pop('environment_id')
         self._registered_alerts = TTLCache(maxsize=2048, ttl=300)
+
+        self.config = self._validate_config(config)
+        self.hash_func = self._hash_func(self.config.pop('hash_func'))
+        self.feed_enabled = self.config.pop('feed_enabled')
+
+        self.environment = self.config.pop('environment_id')
         self.sf = None
         self.session = Session()
         self.auth()
 
     @staticmethod
-    def _hash_func():
-        name = os.environ.get('SF_NOTIFIER_ALERT_ID_HASH_FUNC', 'sha256')
+    def _hash_func(name):
         if name in ALLOWED_HASHING:
             return getattr(hashlib, name)
+        msg = ('Invalid hashing function "{}".'
+               'Switching to default "sha256".').format(name)
+        logger.warn(msg)
         return hashlib.sha256
 
     @staticmethod
     def _validate_config(config):
         kwargs = {}
 
-        for param, field in CONFIG_FIELD_MAP.items():
-            setting_var = param.upper()
-            env_var = 'SFDC_{}'.format(setting_var)
-            kwargs[field] = os.environ.get(
-                env_var, config.get(setting_var))
+        for param, value in config.items():
+            field = CONFIG_FIELD_MAP.get(param.lower())
+            if field is None:
+                env_var = 'SFDC_{}'.format(param)
+                msg = ('Invalid config: missing "{}" field or "{}" environment'
+                       ' variable.').format(field, env_var)
+                logger.error(msg)
+                raise SfNotifierError(msg)
+
+            kwargs[field] = value
 
             if field == 'domain':
-                if kwargs[field] in ['true', 'True', True]:
+                if value:
                     kwargs[field] = 'test'
                 else:
                     del kwargs[field]
-                continue
 
-            if kwargs[field] is None:
-                msg = ('Invalid config: missing "{}" field or "{}" environment'
-                       ' variable.').format(param, env_var)
-                logger.error(msg)
-                raise SfNotifierError(msg)
         return kwargs
 
     def _auth(self, config):
@@ -263,6 +269,7 @@
     @sf_auth_retry
     def _create_feed_item(self, subject, body, case_id):
         feed_item = {'Title': subject, 'ParentId': case_id, 'Body': body}
+        logger.debug('Creating feed item: {}.'.format(feed_item))
         return self.sf.FeedItem.create(feed_item)
 
     @sf_auth_retry
@@ -285,14 +292,15 @@
         error_code, case_id = self._create_case(subject, body,
                                                 labels, alert_id)
 
-        self._create_feed_item(subject, body, case_id)
-
         response = {'case_id': case_id, 'alert_id': alert_id}
 
         if error_code == 1:
             response['status'] = 'duplicate'
         else:
             response['status'] = 'created'
+
+        if self.feed_enabled:
+            self._create_feed_item(subject, body, case_id)
         return response
 
     def close_case(self, labels):
diff --git a/sf_notifier/settings/development.py b/sf_notifier/settings/development.py
index 876a671..a164977 100644
--- a/sf_notifier/settings/development.py
+++ b/sf_notifier/settings/development.py
@@ -1,5 +1,8 @@
 import os
 
+from ..helpers import is_true
+
+
 VERSION = 'development'
 
 LOGGING = {
@@ -25,7 +28,20 @@
     'CONFIGURE_LOGGING': True,
 }
 
-ADD_LINKS = os.environ.get('SF_NOTIFIER_ADD_LINKS',
-                           False) in ['true', 'True', True]
+ADD_LINKS = is_true(os.environ.get('SF_NOTIFIER_ADD_LINKS'))
 
-SF_CONFIG = {}
+SF_CONFIG = {
+    # Salesforce login params
+    'AUTH_URL': os.environ.get('SFDC_AUTH_URL', 'null'),
+    'USERNAME': os.environ.get('SFDC_USERNAME', 'null'),
+    'PASSWORD': os.environ.get('SFDC_PASSWORD', 'null'),
+    'ORGANIZATION_ID': os.environ.get('SFDC_ORGANIZATION_ID', 'null'),
+    'ENVIRONMENT_ID': os.environ.get('SFDC_ENVIRONMENT_ID', 'null'),
+    'SANDBOX_ENABLED': is_true(os.environ.get(
+        'SFDC_SANDBOX_ENABLED', 'False')),
+    # sf-notifier specific params
+    'FEED_ENABLED': is_true(os.environ.get(
+        'SF_NOTIFIER_FEED_ENABLED', 'True')),
+    'HASH_FUNC': os.environ.get(
+        'SF_NOTIFIER_ALERT_ID_HASH_FUNC', 'sha256'),
+}
diff --git a/sf_notifier/settings/production.py b/sf_notifier/settings/production.py
index e0450c8..6251daf 100644
--- a/sf_notifier/settings/production.py
+++ b/sf_notifier/settings/production.py
@@ -1,5 +1,8 @@
 import os
 
+from ..helpers import is_true
+
+
 VERSION = 'production'
 
 LOGGING = {
@@ -16,7 +19,8 @@
         'file': {
             'class': 'logging.handlers.RotatingFileHandler',
             'formatter': 'default',
-            'filename': '/var/log/sf-notifier/sfnotifier.log',
+            'filename': os.getenv('LOGPATH',
+                                  '/var/log/sf-notifier/sfnotifier.log'),
             'mode': 'a',
             'maxBytes': 10485760,
             'backupCount': 5
@@ -35,7 +39,20 @@
     'CONFIGURE_LOGGING': True,
 }
 
-ADD_LINKS = os.environ.get('SF_NOTIFIER_ADD_LINKS',
-                           False) in ['true', 'True', True]
+ADD_LINKS = is_true(os.environ.get('SF_NOTIFIER_ADD_LINKS'))
 
-SF_CONFIG = {}
+SF_CONFIG = {
+    # Salesforce login params
+    'AUTH_URL': os.environ.get('SFDC_AUTH_URL', 'null'),
+    'USERNAME': os.environ.get('SFDC_USERNAME', 'null'),
+    'PASSWORD': os.environ.get('SFDC_PASSWORD', 'null'),
+    'ORGANIZATION_ID': os.environ.get('SFDC_ORGANIZATION_ID', 'null'),
+    'ENVIRONMENT_ID': os.environ.get('SFDC_ENVIRONMENT_ID', 'null'),
+    'SANDBOX_ENABLED': is_true(os.environ.get(
+        'SFDC_SANDBOX_ENABLED', 'False')),
+    # sf-notifier specific params
+    'FEED_ENABLED': is_true(os.environ.get(
+        'SF_NOTIFIER_FEED_ENABLED', 'True')),
+    'HASH_FUNC': os.environ.get(
+        'SF_NOTIFIER_ALERT_ID_HASH_FUNC', 'sha256'),
+}
