Closed reyman closed 8 years ago
Until version 1.3.9-*
the environment variables have to be in format like ZULIP_SETTINGS_*
. The format SETTING_*
is used in 1.3.10
+ but due to a PR at the zulip project that is still pending merge, I couldn't release 1.3.10
yet.
What docker image version are you using?
I have problem with dev version to find the good value for docker-compose.yml
, so i return to 1.3.9, with ZULIP_SETTINGS_*
The dev version isn't supposed to be working ;)
I'm currently working on releasing the 1.3.10 version soon.
Great, so i try to reinstall when 1.3.10 is out :) It's more a question about documentation but we can use any existing image of postgres image for link with zulip ?
@reyman Could you please test again with image dev-1.3.10
? If you encounter any bugs please report them here.
The image is currently building, in about 20 minutes the image should be built and you can test it.
Ok, i have this error on docker-compose up :
database_1 | Initializing datadir...
zulip_1 | /sbin/entrypoint.sh: line 61: =/etc/zulip/settings.py: No such file or directory
zulip_zulip_1 exited with code 1
@reyman I pushed a fix for that error. In about 20 minutes you can repull and try again. Thanks for testing it!
I try to repull the image dev-1.3.10, but it say to me that image "is up to date"; Building is finished ?
@reyman The Image build process on quay.io is stuck. Can you try with the docker hub image? https://hub.docker.com/r/galexrt/zulip/
@Galexrt another error at launch :
zulip_1 | === Begin Initial Configuration Phase ===
zulip_1 | Preparing and linking the uploads folder ...
zulip_1 | Prepared and linked the uploads directory.
zulip_1 | Executing nginx configuration ...
zulip_1 | Nginx configuration succeeded.
zulip_1 | Exectuing certificates configuration...
zulip_1 | Certificates configuration succeeded.
zulip_1 | Setting Zulip secrets ...
zulip_1 | Secrets already generated.
zulip_1 | Secret found for "rabbitmq_password".
zulip_1 | Secret found for "email_password".
zulip_1 | Zulip secrets configuration succeeded.
zulip_1 | Setting database configuration ...
zulip_1 | Setting key "DATABASES", type "array" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | sed: can't read /usr/local/bin/process_fts_updates: No such file or directory
zulip_zulip_1 exited with code 2
@reyman Sorry, for the late response, I looked into the problem and I just pushed the fix. The image should be built in about 45 minutes.
Thanks for testing! :)
Please report back if it's working or there are other issues.
Hum, i have another error :
zulip_1 | Empty var for key "EXTERNAL_HOST".
zulip_1 | Empty var for key "EMAIL_HOST".
zulip_1 | Empty var for key "AUTH_LDAP_BIND_DN".
zulip_1 | Empty var for key "NOREPLY_EMAIL_ADDRESS".
zulip_1 | Empty var for key "AUTH_LDAP_SERVER_URI".
zulip_1 | Empty var for key "ZULIP_ADMINISTRATOR".
zulip_1 | Empty var for key "REDIS_HOST".
zulip_1 | Empty var for key "AUTH_LDAP_BIND_PASSWORD".
zulip_1 | Empty var for key "RABBITMQ_HOST".
zulip_1 | Empty var for key "EMAIL_HOST_USER".
zulip_1 | Empty var for key "DEFAULT_FROM_EMAIL".
zulip_1 | Empty var for key "MEMCACHED_LOCATION".
zulip_1 | Empty var for key "AUTH_LDAP_APPEND_DOMAIN".
zulip_1 | Empty var for key "ADMIN_DOMAIN".
database_1 | Initializing certdir...
database_1 | Initializing logdir...
database_1 | Initializing rundir...
database_1 | Setting resolv ACLs...
zulip_1 | Error: You must set EXTERNAL_HOST in /etc/zulip/settings.py.
zulip_zulip_1 exited with code 1
My settings are set in docker-compose.yml :
SETTING_MEMCACHED_LOCATION: "memcached:11211"
SETTING_RABBITMQ_HOST: "rabbitmq"
SETTING_REDIS_HOST: "redis"
SETTING_EXTERNAL_HOST: "team.comnmodel.org"
SETTING_ZULIP_ADMINISTRATOR: "rey@gmail.com"
SETTING_ADMIN_DOMAIN: "comnmodel.org"
SETTING_NOREPLY_EMAIL_ADDRESS: "noreply@comnmodel.org"
SETTING_DEFAULT_FROM_EMAIL: "Zulip <noreply@comnmodel.org>"
SETTING_EMAIL_HOST: "smtp.gmail.com"
SETTING_EMAIL_HOST_USER: "rey@gmail.com"
@reyman I fixed this bug now. Image should be built in about 30 minutes.
Thanks for testing!
Another
zulip_1 | === Begin Initial Configuration Phase ===
zulip_1 | Preparing and linking the uploads folder ...
zulip_1 | Prepared and linked the uploads directory.
zulip_1 | Executing nginx configuration ...
zulip_1 | Nginx configuration succeeded.
zulip_1 | Exectuing certificates configuration...
zulip_1 | Certificates configuration succeeded.
zulip_1 | Setting Zulip secrets ...
zulip_1 | Secrets already generated.
zulip_1 | Secret found for "rabbitmq_password".
zulip_1 | Secret found for "email_password".
zulip_1 | Zulip secrets configuration succeeded.
zulip_1 | Setting database configuration ...
zulip_1 | Setting key "DATABASES", type "array" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Database configuration succeeded.
zulip_1 | Setting caches configuration ...
zulip_1 | Setting key "MEMCACHED_LOCATION", type "string" in file "/etc/zulip/settings.py".
zulip_1 | Caches configuration succeeded.
zulip_1 | Activating authentication backends ...
database_1 | Initializing logdir...
zulip_1 | Setting key "AUTHENTICATION_BACKENDS", type "array" in file "/etc/zulip/settings.py".
zulip_1 | Adding authentication backend "ZulipLDAPAuthBackend".
zulip_1 | Authentication backend activation succeeded.
zulip_1 | Setting LDAP settings if set ...
zulip_1 | Setting key "AUTH_LDAP_USER_SEARCH", type "array" in file "/etc/zulip/settings.py".
zulip_1 | LDAP settings set.
zulip_1 | Executing Zulip configuration ...
zulip_1 | No FILE given for setConfigurationValue.
database_1 | Initializing rundir...
database_1 | Setting resolv ACLs...
zulip_zulip_1 exited with code 1
@reyman I pushed another fix. As always image should be built in about 25-30 minutes.
Another, problem of file permission it seems :
zulip_1 | FILE=/etc/zulip/settings.py: ERROR: cannot open `FILE=/etc/zulip/settings.py' (No such file or directory)
zulip_zulip_1 exited with code 1
@reyman Could you please post more output of the last error you got.
@Galexrt yes
Attaching to zulip_redis_1, zulip_memcached_1, zulip_rabbitmq_1, zulip_database_1, zulip_zulip_1
redis_1 | Starting redis-server...
redis_1 | _._
redis_1 | _.-``__ ''-._
redis_1 | _.-`` `. `_. ''-._ Redis 2.8.4 (00000000/0) 64 bit
redis_1 | .-`` .-```. ```\/ _.,_ ''-._
redis_1 | ( ' , .-` | `, ) Running in stand alone mode
redis_1 | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
redis_1 | | `-._ `._ / _.-' | PID: 1
redis_1 | `-._ `-._ `-./ _.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' | http://redis.io
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' |
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | `-._ `-.__.-' _.-'
redis_1 | `-._ _.-'
redis_1 | `-.__.-'
redis_1 |
redis_1 | [1] 09 Mar 14:05:15.744 # Server started, Redis version 2.8.4
redis_1 | [1] 09 Mar 14:05:15.744 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overco
mmit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | [1] 09 Mar 14:05:15.744 * DB loaded from disk: 0.000 seconds
redis_1 | [1] 09 Mar 14:05:15.744 * The server is now ready to accept connections on port 6379
redis_1 | [1] 09 Mar 14:05:15.744 * The server is now ready to accept connections at /var/run/redis/redis.sock
database_1 | Initializing datadir...
database_1 | Initializing datadir...
zulip_1 | === Begin Initial Configuration Phase ===
zulip_1 | Preparing and linking the uploads folder ...
zulip_1 | Prepared and linked the uploads directory.
zulip_1 | Executing nginx configuration ...
zulip_1 | Nginx configuration succeeded.
zulip_1 | Exectuing certificates configuration...
zulip_1 | Certificates configuration succeeded.
zulip_1 | Setting Zulip secrets ...
zulip_1 | Secrets already generated.
zulip_1 | Secret found for "rabbitmq_password".
zulip_1 | Secret found for "email_password".
zulip_1 | Zulip secrets configuration succeeded.
zulip_1 | Setting database configuration ...
zulip_1 | Setting key "DATABASES", type "array" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Database configuration succeeded.
zulip_1 | Setting caches configuration ...
zulip_1 | Setting key "MEMCACHED_LOCATION", type "string" in file "/etc/zulip/settings.py".
zulip_1 | Caches configuration succeeded.
zulip_1 | Activating authentication backends ...
zulip_1 | Setting key "AUTHENTICATION_BACKENDS", type "array" in file "/etc/zulip/settings.py".
zulip_1 | Adding authentication backend "ZulipLDAPAuthBackend".
zulip_1 | Authentication backend activation succeeded.
zulip_1 | Setting LDAP settings if set ...
zulip_1 | Setting key "AUTH_LDAP_USER_SEARCH", type "array" in file "/etc/zulip/settings.py".
zulip_1 | LDAP settings set.
zulip_1 | Executing Zulip configuration ...
zulip_1 | Setting key "EXTERNAL_HOST", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "EMAIL_HOST", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "AUTH_LDAP_BIND_DN", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "NOREPLY_EMAIL_ADDRESS", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "AUTH_LDAP_SERVER_URI", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "ZULIP_ADMINISTRATOR", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "REDIS_HOST", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "AUTH_LDAP_BIND_PASSWORD", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "RABBITMQ_HOST", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "EMAIL_HOST_USER", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "DEFAULT_FROM_EMAIL", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "MEMCACHED_LOCATION", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | Setting key "AUTH_LDAP_APPEND_DOMAIN", type "string" in file "/home/zulip/deployments/current/zproject/settings.py".
zulip_1 | FILE=/etc/zulip/settings.py: ERROR: cannot open `FILE=/etc/zulip/settings.py' (No such file or directory)
zulip_zulip_1 exited with code 1
Can you add the environment variable DEBUG=true
to your docker-compose.yml
, so it hopefully shows me more output.
@reyman This should finally fix the problem. Could you please test it again now? Image should be built in about 25 minutes.
@reyman I fixed some some other bugs with the latest commit. Image is built in about 45 minutes.
@Galexrt another error :
zulip_1 | Running migrations:
zulip_1 | Rendering model states... DONE
zulip_1 | Applying zerver.0006_zerver_userprofile_email_upper_idx... OK
zulip_1 | Applying zerver.0007_userprofile_is_bot_active_indexes... OK
zulip_1 | Applying zerver.0008_preregistrationuser_upper_email_idx... OK
zulip_1 | Creating Zulip cache and third_party_api_results tables ...
zulip_1 | Cache table 'third_party_api_results' already exists.
zulip_1 | Initializing Zulip Voyager database ...
database_1 | ERROR: duplicate key value violates unique constraint "zerver_realm_domain_key"
database_1 | DETAIL: Key (domain)=(zulip.com) already exists.
database_1 | STATEMENT: INSERT INTO "zerver_realm" ("domain", "name", "restricted_to_domain", "invite_required", "invite_by_admins_only", "mandatory_topics", "sho
w_digest_email", "name_changes_disabled", "date_created", "notifications_stream_id", "deactivated") VALUES ('zulip.com', NULL, true, false, false, false, true, fals
e, '2016-03-09T14:57:42.000417+00:00'::timestamptz, NULL, false) RETURNING "zerver_realm"."id"
zulip_1 | Traceback (most recent call last):
zulip_1 | File "/home/zulip/deployments/current/manage.py", line 24, in <module>
zulip_1 | execute_from_command_line(sys.argv)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
zulip_1 | utility.execute()
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute
zulip_1 | self.fetch_command(subcommand).run_from_argv(self.argv)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 393, in run_from_argv
zulip_1 | self.execute(*args, **cmd_options)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 444, in execute
zulip_1 | output = self.handle(*args, **options)
zulip_1 | File "/home/zulip/deployments/2016-03-09-14-24-05/zerver/management/commands/initialize_voyager_db.py", line 39, in handle
zulip_1 | Realm.objects.create(domain="zulip.com")
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
zulip_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 348, in create
zulip_1 | obj.save(force_insert=True, using=self.db)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 710, in save
zulip_1 | force_update=force_update, update_fields=update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 738, in save_base
zulip_1 | updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 822, in _save_table
zulip_1 | result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 861, in _do_insert
zulip_1 | using=using, raw=raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
zulip_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 922, in _insert
zulip_1 | return query.get_compiler(using=using).execute_sql(return_id)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 986, in execute_sql
zulip_1 | cursor.execute(sql, params)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
zulip_1 | return self.cursor.execute(sql, params)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__
zulip_1 | six.reraise(dj_exc_type, dj_exc_value, traceback)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
zulip_1 | return self.cursor.execute(sql, params)
zulip_1 | File "/home/zulip/deployments/2016-03-09-14-24-05/zerver/lib/db.py", line 23, in execute
zulip_1 | return wrapper_execute(self, super(TimeTrackingCursor, self).execute, query, vars)
zulip_1 | File "/home/zulip/deployments/2016-03-09-14-24-05/zerver/lib/db.py", line 11, in wrapper_execute
zulip_1 | return action(sql, params)
zulip_1 | django.db.utils.IntegrityError: duplicate key value violates unique constraint "zerver_realm_domain_key"
zulip_1 | DETAIL: Key (domain)=(zulip.com) already exists.
zulip_1 |
zulip_1 | Zulip first start init failed in "initialize_voyager_db" exit code 0. Exiting.
zulip_zulip_1 exited with code 0
@reyman Could you please provide the full logs of the new error as a gist?
@reyman I finally found the source of all these errors. Zulip is now based on latest Zulip master and not on a specific version tag. This should fix most errors you had.
@reyman I finally found the source of all these errors. Zulip is now based on latest Zulip master and not on a specific version tag. This should fix most errors you had.
@Galexrt Great :) I continue to pull from sudo docker pull galexrt/zulip:dev-1.3.10
?
@reyman It seems that I now fixed the errors and bugs. Please repull the latest image and test again.
Thanks for providing help in testing it!
Yes, you can continue to pull from dev-1.3.10. Until I can finally release a stable v1.3.10. Thanks for testing!
@Galexrt There is some problem with existing value in table it seems :
zulip_1 | + echo 'Initializing Zulip Voyager database ...'
zulip_1 | + su zulip -c '/home/zulip/deployments/current/manage.py initialize_voyager_db'
zulip_1 | Initializing Zulip Voyager database ...
database_1 | ERROR: duplicate key value violates unique constraint "zerver_realm_domain_key"
database_1 | DETAIL: Key (domain)=(zulip.com) already exists.
database_1 | STATEMENT: INSERT INTO "zerver_realm" ("domain", "name", "restricted_to_domain", "invite_required", "invite_by_admins_only", "mandatory_topics",
"show_digest_email", "name_changes_disabled", "date_created", "notifications_stream_id", "deactivated") VALUES ('zulip.com', NULL, true, false, false, false,
true, false, '2016-03-10T16:32:32.941785+00:00'::timestamptz, NULL, false) RETURNING "zerver_realm"."id"
zulip_1 | Traceback (most recent call last):
zulip_1 | File "/home/zulip/deployments/current/manage.py", line 24, in <module>
zulip_1 | execute_from_command_line(sys.argv)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
zulip_1 | utility.execute()
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute
zulip_1 | self.fetch_command(subcommand).run_from_argv(self.argv)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 393, in run_from_argv
zulip_1 | self.execute(*args, **cmd_options)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 444, in execute
zulip_1 | output = self.handle(*args, **options)
zulip_1 | File "/home/zulip/deployments/2016-03-09-16-29-00/zerver/management/commands/initialize_voyager_db.py", line 39, in handle
zulip_1 | Realm.objects.create(domain="zulip.com")
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
zulip_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 348, in create
zulip_1 | obj.save(force_insert=True, using=self.db)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 710, in save
zulip_1 | force_update=force_update, update_fields=update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 738, in save_base
zulip_1 | updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 822, in _save_table
zulip_1 | result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 861, in _do_insert
zulip_1 | using=using, raw=raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
zulip_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 348, in create
zulip_1 | obj.save(force_insert=True, using=self.db)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 710, in save
zulip_1 | force_update=force_update, update_fields=update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 738, in save_base
zulip_1 | updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 822, in _save_table
zulip_1 | result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 861, in _do_insert
zulip_1 | using=using, raw=raw)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
zulip_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 922, in _insert
zulip_1 | return query.get_compiler(using=using).execute_sql(return_id)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 986, in execute_sql
zulip_1 | cursor.execute(sql, params)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
zulip_1 | return self.cursor.execute(sql, params)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__
zulip_1 | six.reraise(dj_exc_type, dj_exc_value, traceback)
zulip_1 | File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
zulip_1 | return self.cursor.execute(sql, params)
zulip_1 | File "/home/zulip/deployments/2016-03-09-16-29-00/zerver/lib/db.py", line 23, in execute
zulip_1 | return wrapper_execute(self, super(TimeTrackingCursor, self).execute, query, vars)
zulip_1 | File "/home/zulip/deployments/2016-03-09-16-29-00/zerver/lib/db.py", line 11, in wrapper_execute
zulip_1 | return action(sql, params)
zulip_1 | django.db.utils.IntegrityError: duplicate key value violates unique constraint "zerver_realm_domain_key"
zulip_1 | DETAIL: Key (domain)=(zulip.com) already exists.
zulip_1 |
zulip_1 | + RETURN_CODE=1
zulip_1 | + [[ 1 != 0 ]]
zulip_1 | + echo 'Zulip first start init failed in "initialize_voyager_db" exit code 1. Exiting.'
zulip_1 | + exit 1
zulip_1 | Zulip first start init failed in "initialize_voyager_db" exit code 1. Exiting.
@reyman Could you please enter the container using docker exec
and post content of the /etc/zulip/settings.py
and /home/zulip/deployments/current/zproject/settings.py
without sensitive data?
Hum i cannot test before tonigh or tomorow (no ssh in train 😀) but the container failed to start so im not sûre i can make à docker exec on it.
Le jeu. 10 mars 2016 17:47, Alexander Trost notifications@github.com a écrit :
@reyman https://github.com/reyman Could you please enter the container using docker exec and post content of the /etc/zulip/settings.py and /home/zulip/deployments/current/zproject/settings.py without sensitive data?
— Reply to this email directly or view it on GitHub https://github.com/Galexrt/docker-zulip/issues/61#issuecomment-194946608 .
@reyman No problem. But you can use docker cp
to get the files out of the container ;)
Thanks for the help!
Sorry for the delay
settings from /etc/zulip/settings.py
# Settings for Zulip Voyager
### MANDATORY SETTINGS
#
# These settings MUST be set in production. In a development environment,
# sensible default values will be used.
# The user-accessible Zulip hostname for this installation, e.g.
# zulip.example.com
EXTERNAL_HOST = 'zulip.example.com'
# The email address for the person or team who maintain the Zulip
# Voyager installation. Will also get support emails. (e.g. zulip-admin@example.com)
ZULIP_ADMINISTRATOR = 'zulip-admin@example.com'
# The domain for your organization, e.g. example.com
ADMIN_DOMAIN = 'example.com'
# Enable at least one of the following authentication backends.
AUTHENTICATION_BACKENDS = (
# 'zproject.backends.EmailAuthBackend', # Email and password; see SMTP setup below
# 'zproject.backends.ZulipRemoteUserBackend', # Local SSO
# 'zproject.backends.GoogleMobileOauth2Backend', # Google Apps, setup below
# 'zproject.backends.ZulipLDAPAuthBackend', # LDAP, setup below
)
# Google Oauth requires a bit of configuration; you will need to go to
# do the following:
#
# (1) Visit https://console.developers.google.com, setup an
# Oauth2 client ID that allows redirects to
# e.g. https://zulip.example.com/accounts/login/google/done/.
#
# (2) Then click into the APIs and Auth section (in the sidebar on the
# left side of the page), APIs, then under "Social APIs" click on
# "Google+ API" and click the button to enable the API.
#
# (3) put your client secret as "google_oauth2_client_secret" in
# zulip-secrets.conf, and your client ID right here:
# GOOGLE_OAUTH2_CLIENT_ID=<your client ID from Google>
# If you are using the ZulipRemoteUserBackend authentication backend,
# set this to your domain (e.g. if REMOTE_USER is "username" and the
# corresponding email address is "username@example.com", set
# SSO_APPEND_DOMAIN = "example.com")
SSO_APPEND_DOMAIN = None
# Configure the outgoing SMTP server below. For testing, you can skip
# sending emails entirely by commenting out EMAIL_HOST, but you will
# want to configure this to support email address confirmation emails,
# missed message emails, onboarding follow-up emails, etc. To
# configure SMTP, you will need to complete the following steps:
#
# (1) Fill out the outgoing email sending configuration below.
#
# (2) Put the SMTP password for EMAIL_HOST_USER in
# /etc/zulip/zulip-secrets.conf as email_password.
#
# (3) If you are using a gmail account to send outgoing email, you
# will likely need to read this Google support answer and configure
# that account as "less secure":
# https://support.google.com/mail/answer/14257.
#
# A common problem is hosting providers that block outgoing SMTP traffic.
#
# With the exception of reading EMAIL_HOST_PASSWORD from
# email_password in the Zulip secrets file, Zulip uses Django's
# standard EmailBackend, so if you're having issues, you may want to
# search for documentation on using your email provider with Django.
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = ''
EMAIL_PORT = 587
EMAIL_USE_TLS = True
# The email From address to be used for automatically generated emails
DEFAULT_FROM_EMAIL = "Zulip <zulip@example.com>"
# The noreply address to be used as Reply-To for certain generated emails.
# Messages sent to this address should not be delivered anywhere.
NOREPLY_EMAIL_ADDRESS = "noreply@example.com"
# A list of strings representing the host/domain names that this
# Django site can serve. You should reset it to be a list of
# domains/IP addresses for your site. This is a security measure to
# prevent an attacker from poisoning caches and triggering password
# reset emails with links to malicious hosts by submitting requests
# with a fake HTTP Host header. You must include 'localhost' here.
ALLOWED_HOSTS = ['*']
### OPTIONAL SETTINGS
# Controls whether session cookies expire when the browser closes
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# Session cookie expiry in seconds after the last page load
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # 2 weeks
# Controls whether or not there is a feedback button in the UI.
ENABLE_FEEDBACK = False
# By default, the feedback button will submit feedback to the Zulip
# developers. If you set FEEDBACK_EMAIL to be an email address
# (e.g. ZULIP_ADMINISTRATOR), feedback sent by your users will instead
# be sent to that email address.
FEEDBACK_EMAIL = ZULIP_ADMINISTRATOR
# Controls whether or not error reports are sent to Zulip. Error
# reports are used to improve the quality of the product and do not
# include message contents; please contact Zulip support with any
# questions.
ERROR_REPORTING = True
# Controls whether or not Zulip will provide inline image preview when
# a link to an image is referenced in a message.
INLINE_IMAGE_PREVIEW = True
# By default, files uploaded by users and user avatars are stored
# directly on the Zulip server. If file storage in Amazon S3 is
# desired, you can configure that as follows:
#
# (1) Set s3_key and s3_secret_key in /etc/zulip/zulip-secrets.conf to
# be the S3 access and secret keys that you want to use, and setting
# the S3_AUTH_UPLOADS_BUCKET and S3_AVATAR_BUCKET to be the S3 buckets
# you've created to store file uploads and user avatars, respectively.
# Then restart Zulip (scripts/restart-zulip).
#
# (2) Edit /etc/nginx/sites-available/zulip-enterprise to comment out
# the nginx configuration for /user_uploads and /user_avatars (see
# https://github.com/zulip/zulip/issues/291 for discussion of a better
# solution that won't be automatically reverted by the Zulip upgrade
# script), and then restart nginx.
LOCAL_UPLOADS_DIR = "/home/zulip/uploads"
#S3_AUTH_UPLOADS_BUCKET = ""
#S3_AVATAR_BUCKET = ""
# Maximum allowed size of uploaded files, in megabytes. DO NOT SET
# ABOVE 80MB. The file upload implementation doesn't support chunked
# uploads, so browsers will crash if you try uploading larger files.
MAX_FILE_UPLOAD_SIZE = 25
# Controls whether name changes are completely disabled for this installation
# This is useful in settings where you're syncing names from an integrated LDAP/Active Directory
NAME_CHANGES_DISABLED = False
# Controls whether users who have not uploaded an avatar will receive an avatar
# from gravatar.com.
ENABLE_GRAVATAR = True
# To override the default avatar image if ENABLE_GRAVATAR is False, place your
# custom default avatar image at /home/zulip/local-static/default-avatar.png
# and uncomment the following line.
#DEFAULT_AVATAR_URI = '/local-static/default-avatar.png'
# To access an external postgres database you should define the host name in
# REMOTE_POSTGRES_HOST, you can define the password in the secrets file in the
# property postgres_password, and the SSL connection mode in REMOTE_POSTGRES_SSLMODE
# Different options are:
# disable: I don't care about security, and I don't want to pay the overhead of encryption.
# allow: I don't care about security, but I will pay the overhead of encryption if the server insists on it.
# prefer: I don't care about encryption, but I wish to pay the overhead of encryption if the server supports it.
# require: I want my data to be encrypted, and I accept the overhead. I trust that the network will make sure I always connect to the server I want.
# verify-ca: I want my data encrypted, and I accept the overhead. I want to be sure that I connect to a server that I trust.
# verify-full: I want my data encrypted, and I accept the overhead. I want to be sure that I connect to a server I trust, and that it's the one I specify.
#REMOTE_POSTGRES_HOST = 'dbserver.example.com'
#REMOTE_POSTGRES_SSLMODE = 'require'
### TWITTER INTEGRATION
# Zulip supports showing inline Tweet previews when a tweet is linked
# to in a message. To support this, Zulip must have access to the
# Twitter API via OAuth. To obtain the various access tokens needed
# below, you must register a new application under your Twitter
# account by doing the following:
#
# 1. Log in to http://dev.twitter.com.
# 2. In the menu under your username, click My Applications. From this page, create a new application.
# 3. Click on the application you created and click "create my access token".
# 4. Fill in the values for twitter_consumer_key, twitter_consumer_secret, twitter_access_token_key,
# and twitter_access_token_secret in /etc/zulip/zulip-secrets.conf.
### EMAIL GATEWAY INTEGRATION
# The Email gateway integration supports sending messages into Zulip
# by sending an email. This is useful for receiving notifications
# from third-party services that only send outgoing notifications via
# email. Once this integration is configured, each stream will have
# an email address documented on the stream settings page an emails
# sent to that address will be delivered into the stream.
#
# There are two ways to configure email mirroring in Zulip:
# 1. Local delivery: A MTA runs locally and passes mail directly to Zulip
# 2. Polling: Checks an IMAP inbox every minute for new messages.
#
# The local delivery configuration is preferred for production because
# it supports nicer looking email addresses and has no cron delay,
# while the polling mechanism is better for testing/developing this
# feature because it doesn't require a public-facing IP/DNS setup.
#
# The main email mirror setting is the email address pattern, where
# you specify the email address format you'd like the integration to
# use. It should be one of the following:
# %s@zulip.example.com (for local delivery)
# username+%s@example.com (for polling if EMAIL_GATEWAY_LOGIN=username@example.com)
EMAIL_GATEWAY_PATTERN = ""
#
# If you are using local delivery, EMAIL_GATEWAY_PATTERN is all you need
# to change in this file. You will also need to enable the Zulip postfix
# configuration to support local delivery by adding
# , zulip::postfix_localmail
# to puppet_classes in /etc/zulip/zulip.conf and then running
# `scripts/zulip-puppet-apply -f` to do the installation.
#
# If you are using polling, you will need to setup an IMAP email
# account dedicated to Zulip email gateway messages. The model is
# that users will send emails to that account via an address of the
# form username+%s@example.com (which is what you will set as
# EMAIL_GATEWAY_PATTERN); your email provider should deliver those
# emails to the username@example.com inbox. Then you run in a cron
# job `./manage.py email-mirror` (see puppet/zulip/files/cron.d/email-mirror),
# which will check that inbox and batch-process any new messages.
#
# You will need to configure authentication for the email mirror
# command to access the IMAP mailbox below and in zulip-secrets.conf.
#
# The IMAP login; username here and password as email_gateway_login in
# zulip-secrets.conf.
EMAIL_GATEWAY_LOGIN = ""
# The IMAP server & port to connect to
EMAIL_GATEWAY_IMAP_SERVER = ""
EMAIL_GATEWAY_IMAP_PORT = 993
# The IMAP folder name to check for emails. All emails sent to EMAIL_GATEWAY_PATTERN above
# must be delivered to this folder
EMAIL_GATEWAY_IMAP_FOLDER = "INBOX"
### LDAP integration configuration
# Zulip supports retrieving information about users via LDAP, and
# optionally using LDAP as an authentication mechanism.
#
# In either configuration, you will need to do the following:
#
# * Fill in the LDAP configuration options below so that Zulip can
# connect to your LDAP server
#
# * Setup the mapping between email addresses (used as login names in
# Zulip) and LDAP usernames. There are two supported ways to setup
# the username mapping:
#
# (A) If users' email addresses are in LDAP, set
# LDAP_APPEND_DOMAIN = None
# AUTH_LDAP_USER_SEARCH to lookup users by email address
#
# (B) If LDAP only has usernames but email addresses are of the form
# username@example.com, you should set:
# LDAP_APPEND_DOMAIN = example.com and
# AUTH_LDAP_USER_SEARCH to lookup users by username
#
# You can quickly test whether your configuration works by running:
# ./manage.py query_ldap username@example.com
# From the root of your Zulip installation; if your configuration is working
# that will output the full name for your user.
#
# -------------------------------------------------------------
#
# If you are using LDAP for authentication, you will need to enable
# the zproject.backends.ZulipLDAPAuthBackend auth backend in
# AUTHENTICATION_BACKENDS above. After doing so, you should be able
# to login to Zulip by entering your email address and LDAP password
# on the Zulip login form.
#
# If you are using LDAP to populate names in Zulip, once you finish
# configuring this integration, you will need to run:
# ./manage.py sync_ldap_user_data
# To sync names for existing users; you may want to run this in a cron
# job to pick up name changes made on your LDAP server.
import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
# URI of your LDAP server. If set, LDAP is used to prepopulate a user's name in
# Zulip. Example: "ldaps://ldap.example.com"
AUTH_LDAP_SERVER_URI = ""
# This DN will be used to bind to your server. If unset, anonymous
# binds are performed. If set, you need to specify the password as
# 'auth_ldap_bind_password' in zulip-secrets.conf.
AUTH_LDAP_BIND_DN = ""
# Specify the search base and the property to filter on that corresponds to the
# username.
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
ldap.SCOPE_SUBTREE, "(uid=%(user)s)")
# If the value of a user's "uid" (or similar) property is not their email
# address, specify the domain to append here.
LDAP_APPEND_DOMAIN = None
# This map defines how to populate attributes of a Zulip user from LDAP.
AUTH_LDAP_USER_ATTR_MAP = {
# Populate the Django user's name from the LDAP directory.
"full_name": "cn",
}
CAMO_URI = ''
# RabbitMQ configuration
#
# By default, Zulip connects to rabbitmq running locally on the machine,
# but Zulip also supports connecting to RabbitMQ over the network;
# to use a remote RabbitMQ instance, set RABBITMQ_HOST here.
# RABBITMQ_HOST = "localhost"
# To use another rabbitmq user than the default 'zulip', set RABBITMQ_USERNAME here.
# RABBITMQ_USERNAME = 'zulip'
# Memcached configuration
#
# By default, Zulip connects to memcached running locally on the machine,
# but Zulip also supports connecting to memcached over the network;
# to use a remote Memcached instance, set MEMCACHED_LOCATION here.
# Format HOST:PORT
# MEMCACHED_LOCATION = 127.0.0.1:11211
# Redis configuration
#
# By default, Zulip connects to redis running locally on the machine,
# but Zulip also supports connecting to redis over the network;
# to use a remote RabbitMQ instance, set REDIS_HOST here.
# REDIS_HOST = '127.0.0.1'
# For a different redis port set the REDIS_PORT here.
# REDIS_PORT = 6379
# Controls whether Zulip will rate-limit user requests.
# RATE_LIMITING = True
AUTHENTICATION_BACKENDS = ('zproject.backends.ZulipLDAPAuthBackend',)
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=Users,dc=comnmodel,dc=org",ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
REDIS_HOST = 'redis'
RABBITMQ_HOST = 'rabbitmq'
MEMCACHED_LOCATION = 'memcached:11211'
ADMIN_DOMAIN = 'comnmodel.org'
(END)
And the other :
from __future__ import absolute_import
# Django settings for zulip project.
########################################################################
# Here's how settings for the Zulip project work:
#
# * settings.py contains non-site-specific and settings configuration
# for the Zulip Django app.
# * settings.py imports local_settings.py, and any site-specific configuration
# belongs there. The template for local_settings.py is local_settings_template.py
########################################################################
import os
import platform
import time
import sys
import six.moves.configparser
from zerver.lib.db import TimeTrackingConnection
########################################################################
# INITIAL SETTINGS
########################################################################
config_file = six.moves.configparser.RawConfigParser()
config_file.read("/etc/zulip/zulip.conf")
# Whether this instance of Zulip is running in a production environment.
PRODUCTION = config_file.has_option('machine', 'deploy_type')
DEVELOPMENT = not PRODUCTION
secrets_file = six.moves.configparser.RawConfigParser()
if PRODUCTION:
secrets_file.read("/etc/zulip/zulip-secrets.conf")
else:
secrets_file.read("zproject/dev-secrets.conf")
def get_secret(key):
if secrets_file.has_option('secrets', key):
return secrets_file.get('secrets', key)
return None
# Make this unique, and don't share it with anybody.
SECRET_KEY = get_secret("secret_key")
# A shared secret, used to authenticate different parts of the app to each other.
SHARED_SECRET = get_secret("shared_secret")
# We use this salt to hash a user's email into a filename for their user-uploaded
# avatar. If this salt is discovered, attackers will only be able to determine
# that the owner of an email account has uploaded an avatar to Zulip, which isn't
# the end of the world. Don't use the salt where there is more security exposure.
AVATAR_SALT = get_secret("avatar_salt")
# SERVER_GENERATION is used to track whether the server has been
# restarted for triggering browser clients to reload.
SERVER_GENERATION = int(time.time())
if not 'DEBUG' in globals():
# Uncomment end of next line to test JS/CSS minification.
DEBUG = DEVELOPMENT # and platform.node() != 'your-machine'
TEMPLATE_DEBUG = DEBUG
if DEBUG:
INTERNAL_IPS = ('127.0.0.1',)
# Detect whether we're running as a queue worker; this impacts the logging configuration.
if len(sys.argv) > 2 and sys.argv[0].endswith('manage.py') and sys.argv[1] == 'process_queue':
IS_WORKER = True
else:
IS_WORKER = False
# This is overridden in test_settings.py for the test suites
TEST_SUITE = False
# The new user tutorial is enabled by default, but disabled for client tests.
TUTORIAL_ENABLED = True
# Import variables like secrets from the local_settings file
# Import local_settings after determining the deployment/machine type
if PRODUCTION:
from .local_settings import *
else:
# For the Dev VM environment, we use the same settings as the
# sample local_settings.py file, with a few exceptions.
from .local_settings_template import *
EXTERNAL_HOST = 'localhost:9991'
ALLOWED_HOSTS = ['localhost']
AUTHENTICATION_BACKENDS = ('zproject.backends.DevAuthBackend',)
# Add some of the below if you're testing other backends
# AUTHENTICATION_BACKENDS = ('zproject.backends.EmailAuthBackend',
# 'zproject.backends.GoogleMobileOauth2Backend',)
EXTERNAL_URI_SCHEME = "http://"
EMAIL_GATEWAY_PATTERN = "%s@" + EXTERNAL_HOST
ADMIN_DOMAIN = "zulip.com"
NOTIFICATION_BOT = "notification-bot@zulip.com"
ERROR_BOT = "error-bot@zulip.com"
NEW_USER_BOT = "new-user-bot@zulip.com"
EMAIL_GATEWAY_BOT = "emailgateway@zulip.com"
########################################################################
# DEFAULT VALUES FOR SETTINGS
########################################################################
# For any settings that are not defined in local_settings.py,
# we want to initialize them to sane default
DEFAULT_SETTINGS = {'TWITTER_CONSUMER_KEY': '',
'TWITTER_CONSUMER_SECRET': '',
'TWITTER_ACCESS_TOKEN_KEY': '',
'TWITTER_ACCESS_TOKEN_SECRET': '',
'EMAIL_GATEWAY_PATTERN': '',
'EMAIL_GATEWAY_EXAMPLE': '',
'EMAIL_GATEWAY_BOT': None,
'EMAIL_GATEWAY_LOGIN': None,
'EMAIL_GATEWAY_PASSWORD': None,
'EMAIL_GATEWAY_IMAP_SERVER': None,
'EMAIL_GATEWAY_IMAP_PORT': None,
'EMAIL_GATEWAY_IMAP_FOLDER': None,
'MANDRILL_API_KEY': '',
'S3_KEY': '',
'S3_SECRET_KEY': '',
'S3_BUCKET': '',
'S3_AVATAR_BUCKET': '',
'LOCAL_UPLOADS_DIR': None,
'MAX_FILE_UPLOAD_SIZE': 25,
'DROPBOX_APP_KEY': '',
'ERROR_REPORTING': True,
'JWT_AUTH_KEYS': {},
'NAME_CHANGES_DISABLED': False,
'DEPLOYMENT_ROLE_NAME': "",
'RABBITMQ_HOST': 'localhost',
'RABBITMQ_USERNAME': 'zulip',
'MEMCACHED_LOCATION': '127.0.0.1:11211',
'RATE_LIMITING': True,
'REDIS_HOST': '127.0.0.1',
'REDIS_PORT': 6379,
# The following bots only exist in non-VOYAGER installs
'ERROR_BOT': None,
'NEW_USER_BOT': None,
'NAGIOS_STAGING_SEND_BOT': None,
'NAGIOS_STAGING_RECEIVE_BOT': None,
'APNS_CERT_FILE': None,
'ANDROID_GCM_API_KEY': None,
'INITIAL_PASSWORD_SALT': None,
'FEEDBACK_BOT': 'feedback@zulip.com',
'FEEDBACK_BOT_NAME': 'Zulip Feedback Bot',
'API_SUPER_USERS': set(),
'ADMINS': '',
'INLINE_IMAGE_PREVIEW': True,
'CAMO_URI': '',
'ENABLE_FEEDBACK': PRODUCTION,
'FEEDBACK_EMAIL': None,
'ENABLE_GRAVATAR': True,
'DEFAULT_AVATAR_URI': '/static/images/default-avatar.png',
'AUTH_LDAP_SERVER_URI': "",
'EXTERNAL_URI_SCHEME': "https://",
'ZULIP_COM': False,
'ZULIP_COM_STAGING': False,
'STATSD_HOST': '',
'REMOTE_POSTGRES_HOST': '',
'REMOTE_POSTGRES_SSLMODE': '',
'GOOGLE_CLIENT_ID': '',
'DBX_APNS_CERT_FILE': None,
}
for setting_name, setting_val in DEFAULT_SETTINGS.iteritems():
if not setting_name in vars():
vars()[setting_name] = setting_val
# These are the settings that we will check that the user has filled in for
# production deployments before starting the app. It consists of a series
# of pairs of (setting name, default value that it must be changed from)
REQUIRED_SETTINGS = [("EXTERNAL_HOST", "zulip.example.com"),
("ZULIP_ADMINISTRATOR", "zulip-admin@example.com"),
("ADMIN_DOMAIN", "example.com"),
# SECRET_KEY doesn't really need to be here, in
# that we set it automatically, but just in
# case, it seems worth having in this list
("SECRET_KEY", ""),
("AUTHENTICATION_BACKENDS", ()),
("NOREPLY_EMAIL_ADDRESS", "noreply@example.com"),
("DEFAULT_FROM_EMAIL", "Zulip <zulip@example.com>"),
("ALLOWED_HOSTS", "*"),
]
if ADMINS == "":
ADMINS = (("Zulip Administrator", ZULIP_ADMINISTRATOR),)
MANAGERS = ADMINS
# Voyager is a production zulip server that is not zulip.com or
# staging.zulip.com VOYAGER is the standalone all-on-one-server
# production deployment model for based on the original Zulip
# ENTERPRISE implementation. We expect most users of the open source
# project will be using VOYAGER=True in production.
VOYAGER = PRODUCTION and not ZULIP_COM
########################################################################
# STANDARD DJANGO SETTINGS
########################################################################
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/New_York'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
# The ID, as an integer, of the current site in the django_site database table.
# This is used so that application data can hook into specific site(s) and a
# single database can manage content for multiple sites.
#
# We set this site's domain to 'zulip.com' in populate_db.
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
DEPLOY_ROOT = os.path.join(os.path.realpath(os.path.dirname(__file__)), '..')
TEMPLATE_DIRS = ( os.path.join(DEPLOY_ROOT, 'templates'), )
LOCALE_PATHS = ( os.path.join(DEPLOY_ROOT, 'locale'), )
# Make redirects work properly behind a reverse proxy
USE_X_FORWARDED_HOST = True
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
if PRODUCTION:
# Template caching is a significant performance win in production.
TEMPLATE_LOADERS = (
('django.template.loaders.cached.Loader',
TEMPLATE_LOADERS),
)
MIDDLEWARE_CLASSES = (
# Our logging middleware should be the first middleware item.
'zerver.middleware.TagRequests',
'zerver.middleware.LogRequests',
'zerver.middleware.JsonErrorHandler',
'zerver.middleware.RateLimitMiddleware',
'zerver.middleware.FlushDisplayRecipientCache',
'django.middleware.common.CommonMiddleware',
'zerver.middleware.SessionHostDomainMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
ANONYMOUS_USER_ID = None
AUTH_USER_MODEL = "zerver.UserProfile"
TEST_RUNNER = 'zerver.lib.test_runner.Runner'
ROOT_URLCONF = 'zproject.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'zproject.wsgi.application'
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.staticfiles',
'confirmation',
'guardian',
'pipeline',
'zerver',
]
if not VOYAGER:
INSTALLED_APPS += [
'analytics',
'zilencer',
]
# Base URL of the Tornado server
# We set it to None when running backend tests or populate_db.
# We override the port number when running frontend tests.
TORNADO_SERVER = 'http://localhost:9993'
RUNNING_INSIDE_TORNADO = False
########################################################################
# DATABASE CONFIGURATION
########################################################################
DATABASES = {"default": {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'zulip',
'USER': 'zulip',
'PASSWORD': '', # Authentication done via certificates
'HOST': '', # Host = '' => connect through a local socket
'SCHEMA': 'zulip',
'CONN_MAX_AGE': 600,
'OPTIONS': {
'connection_factory': TimeTrackingConnection
},
},
}
if DEVELOPMENT:
LOCAL_DATABASE_PASSWORD = get_secret("local_database_password")
DATABASES["default"].update({
'PASSWORD': LOCAL_DATABASE_PASSWORD,
'HOST': 'localhost'
})
elif REMOTE_POSTGRES_HOST != '':
DATABASES['default'].update({
'HOST': REMOTE_POSTGRES_HOST,
})
if get_secret("postgres_password") is not None:
DATABASES['default'].update({
'PASSWORD': get_secret("postgres_password"),
})
if REMOTE_POSTGRES_SSLMODE != '':
DATABASES['default']['OPTIONS']['sslmode'] = REMOTE_POSTGRES_SSLMODE
else:
DATABASES['default']['OPTIONS']['sslmode'] = 'verify-full'
#######################################################################
# RABBITMQ CONFIGURATION
########################################################################
USING_RABBITMQ = True
RABBITMQ_PASSWORD = get_secret("rabbitmq_password")
########################################################################
# CACHING CONFIGURATION
########################################################################
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': MEMCACHED_LOCATION,
'TIMEOUT': 3600
},
'database': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'third_party_api_results',
# Basically never timeout. Setting to 0 isn't guaranteed
# to work, see https://code.djangoproject.com/ticket/9595
'TIMEOUT': 2000000000,
'OPTIONS': {
'MAX_ENTRIES': 100000000,
'CULL_FREQUENCY': 10,
}
},
}
########################################################################
# REDIS-BASED RATE LIMITING CONFIGURATION
########################################################################
RATE_LIMITING_RULES = [
(60, 100), # 100 requests max every minute
]
########################################################################
# SECURITY SETTINGS
########################################################################
# Tell the browser to never send our cookies without encryption, e.g.
# when executing the initial http -> https redirect.
#
# Turn it off for local testing because we don't have SSL.
if PRODUCTION:
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
try:
# For get_updates hostname sharding.
domain = config_file.get('django', 'cookie_domain')
SESSION_COOKIE_DOMAIN = '.' + domain
CSRF_COOKIE_DOMAIN = '.' + domain
except six.moves.configparser.Error:
# Failing here is OK
pass
# Prevent Javascript from reading the CSRF token from cookies. Our code gets
# the token from the DOM, which means malicious code could too. But hiding the
# cookie will slow down some attackers.
CSRF_COOKIE_PATH = '/;HttpOnly'
CSRF_FAILURE_VIEW = 'zerver.middleware.csrf_failure'
if DEVELOPMENT:
# Use fast password hashing for creating testing users when not
# PRODUCTION. Saves a bunch of time.
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher'
)
# Also we auto-generate passwords for the default users which you
# can query using ./manage.py print_initial_password
INITIAL_PASSWORD_SALT = get_secret("initial_password_salt")
########################################################################
# API/BOT SETTINGS
########################################################################
if "EXTERNAL_API_PATH" not in vars():
EXTERNAL_API_PATH = EXTERNAL_HOST + "/api"
EXTERNAL_API_URI = EXTERNAL_URI_SCHEME + EXTERNAL_API_PATH
S3_KEY = get_secret("s3_key")
S3_SECRET_KEY = get_secret("s3_secret_key")
# GCM tokens are IP-whitelisted; if we deploy to additional
# servers you will need to explicitly add their IPs here:
# https://cloud.google.com/console/project/apps~zulip-android/apiui/credential
ANDROID_GCM_API_KEY = get_secret("android_gcm_api_key")
GOOGLE_OAUTH2_CLIENT_SECRET = get_secret('google_oauth2_client_secret')
DROPBOX_APP_KEY = get_secret("dropbox_app_key")
MAILCHIMP_API_KEY = get_secret("mailchimp_api_key")
# This comes from our mandrill accounts page
MANDRILL_API_KEY = get_secret("mandrill_api_key")
# Twitter API credentials
# Secrecy not required because its only used for R/O requests.
# Please don't make us go over our rate limit.
TWITTER_CONSUMER_KEY = get_secret("twitter_consumer_key")
TWITTER_CONSUMER_SECRET = get_secret("twitter_consumer_secret")
TWITTER_ACCESS_TOKEN_KEY = get_secret("twitter_access_token_key")
TWITTER_ACCESS_TOKEN_SECRET = get_secret("twitter_access_token_secret")
# These are the bots that Zulip sends automated messages as.
INTERNAL_BOTS = [ {'var_name': 'NOTIFICATION_BOT',
'email_template': 'notification-bot@%s',
'name': 'Notification Bot'},
{'var_name': 'EMAIL_GATEWAY_BOT',
'email_template': 'emailgateway@%s',
'name': 'Email Gateway'},
{'var_name': 'NAGIOS_SEND_BOT',
'email_template': 'nagios-send-bot@%s',
'name': 'Nagios Send Bot'},
{'var_name': 'NAGIOS_RECEIVE_BOT',
'email_template': 'nagios-receive-bot@%s',
'name': 'Nagios Receive Bot'},
{'var_name': 'WELCOME_BOT',
'email_template': 'welcome-bot@%s',
'name': 'Welcome Bot'} ]
INTERNAL_BOT_DOMAIN = "zulip.com"
# Set the realm-specific bot names
for bot in INTERNAL_BOTS:
if not bot['var_name'] in vars():
bot_email = bot['email_template'] % (INTERNAL_BOT_DOMAIN,)
vars()[bot['var_name'] ] = bot_email
if EMAIL_GATEWAY_BOT not in API_SUPER_USERS:
API_SUPER_USERS.add(EMAIL_GATEWAY_BOT)
if EMAIL_GATEWAY_PATTERN != "":
EMAIL_GATEWAY_EXAMPLE = EMAIL_GATEWAY_PATTERN % ("support+abcdefg",)
DEPLOYMENT_ROLE_KEY = get_secret("deployment_role_key")
if PRODUCTION:
FEEDBACK_TARGET="https://zulip.com/api"
else:
FEEDBACK_TARGET="http://localhost:9991/api"
########################################################################
# STATSD CONFIGURATION
########################################################################
# Statsd is not super well supported; if you want to use it you'll need
# to set STATSD_HOST and STATSD_PREFIX.
if STATSD_HOST != '':
INSTALLED_APPS += ['django_statsd']
STATSD_PORT = 8125
STATSD_CLIENT = 'django_statsd.clients.normal'
########################################################################
# CAMO HTTPS CACHE CONFIGURATION
########################################################################
if CAMO_URI != '':
# This needs to be synced with the Camo installation
CAMO_KEY = get_secret("camo_key")
########################################################################
# STATIC CONTENT AND MINIFICATION SETTINGS
########################################################################
STATIC_URL = '/static/'
# ZulipStorage is a modified version of PipelineCachedStorage,
# and, like that class, it inserts a file hash into filenames
# to prevent the browser from using stale files from cache.
#
# Unlike PipelineStorage, it requires the files to exist in
# STATIC_ROOT even for dev servers. So we only use
# ZulipStorage when not DEBUG.
# This is the default behavior from Pipeline, but we set it
# here so that urls.py can read it.
PIPELINE = not DEBUG
if DEBUG:
STATICFILES_STORAGE = 'pipeline.storage.PipelineStorage'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
if PIPELINE:
STATIC_ROOT = 'prod-static/serve'
else:
STATIC_ROOT = 'static/'
else:
STATICFILES_STORAGE = 'zerver.storage.ZulipStorage'
STATICFILES_FINDERS = (
'zerver.finders.ZulipFinder',
)
if PRODUCTION:
STATIC_ROOT = '/home/zulip/prod-static'
else:
STATIC_ROOT = 'prod-static/serve'
# We want all temporary uploaded files to be stored on disk.
FILE_UPLOAD_MAX_MEMORY_SIZE = 0
STATICFILES_DIRS = ['static/']
STATIC_HEADER_FILE = 'zerver/static_header.txt'
# To use minified files in dev, set PIPELINE = True. For the full
# cache-busting behavior, you must also set DEBUG = False.
#
# You will need to run update-prod-static after changing
# static files.
PIPELINE_CSS = {
'activity': {
'source_filenames': ('styles/activity.css',),
'output_filename': 'min/activity.css'
},
'portico': {
'source_filenames': (
'third/zocial/zocial.css',
'styles/portico.css',
'styles/pygments.css',
'styles/thirdparty-fonts.css',
'styles/fonts.css',
),
'output_filename': 'min/portico.css'
},
# Two versions of the app CSS exist because of QTBUG-3467
'app-fontcompat': {
'source_filenames': (
'third/bootstrap-notify/css/bootstrap-notify.css',
'third/spectrum/spectrum.css',
'styles/zulip.css',
'styles/pygments.css',
'styles/thirdparty-fonts.css',
# We don't want fonts.css on QtWebKit, so its omitted here
),
'output_filename': 'min/app-fontcompat.css'
},
'app': {
'source_filenames': (
'third/bootstrap-notify/css/bootstrap-notify.css',
'third/spectrum/spectrum.css',
'third/jquery-perfect-scrollbar/css/perfect-scrollbar.css',
'styles/zulip.css',
'styles/pygments.css',
'styles/thirdparty-fonts.css',
'styles/fonts.css',
),
'output_filename': 'min/app.css'
},
'common': {
'source_filenames': (
'third/bootstrap/css/bootstrap.css',
'third/bootstrap/css/bootstrap-btn.css',
'third/bootstrap/css/bootstrap-responsive.css',
),
'output_filename': 'min/common.css'
},
}
JS_SPECS = {
'common': {
'source_filenames': (
'third/jquery/jquery-1.7.2.js',
'third/underscore/underscore.js',
'js/blueslip.js',
'third/bootstrap/js/bootstrap.js',
'js/common.js',
),
'output_filename': 'min/common.js'
},
'signup': {
'source_filenames': (
'js/signup.js',
'third/jquery-validate/jquery.validate.js',
),
'output_filename': 'min/signup.js'
},
'initial_invite': {
'source_filenames': (
'third/jquery-validate/jquery.validate.js',
'js/initial_invite.js',
),
'output_filename': 'min/initial_invite.js'
},
'api': {
'source_filenames': ('js/api.js',),
'output_filename': 'min/api.js'
},
'app_debug': {
'source_filenames': ('js/debug.js',),
'output_filename': 'min/app_debug.js'
},
'app': {
'source_filenames': [
'third/bootstrap-notify/js/bootstrap-notify.js',
'third/html5-formdata/formdata.js',
'third/jquery-validate/jquery.validate.js',
'third/jquery-form/jquery.form.js',
'third/jquery-filedrop/jquery.filedrop.js',
'third/jquery-caret/jquery.caret.1.02.js',
'third/xdate/xdate.dev.js',
'third/spin/spin.js',
'third/jquery-mousewheel/jquery.mousewheel.js',
'third/jquery-throttle-debounce/jquery.ba-throttle-debounce.js',
'third/jquery-idle/jquery.idle.js',
'third/jquery-autosize/jquery.autosize.js',
'third/jquery-perfect-scrollbar/js/perfect-scrollbar.js',
'third/lazyload/lazyload.js',
'third/spectrum/spectrum.js',
'third/winchan/winchan.js',
'third/sockjs/sockjs-0.3.4.js',
'third/handlebars/handlebars.runtime.js',
'third/marked/lib/marked.js',
'templates/compiled.js',
'js/feature_flags.js',
'js/loading.js',
'js/util.js',
'js/dict.js',
'js/localstorage.js',
'js/channel.js',
'js/setup.js',
'js/muting.js',
'js/muting_ui.js',
'js/viewport.js',
'js/rows.js',
'js/unread.js',
'js/stream_list.js',
'js/filter.js',
'js/narrow.js',
'js/reload.js',
'js/compose_fade.js',
'js/fenced_code.js',
'js/echo.js',
'js/socket.js',
'js/compose.js',
'js/stream_color.js',
'js/admin.js',
'js/stream_data.js',
'js/subs.js',
'js/message_edit.js',
'js/condense.js',
'js/resize.js',
'js/floating_recipient_bar.js',
'js/ui.js',
'js/click_handlers.js',
'js/scroll_bar.js',
'js/gear_menu.js',
'js/copy_and_paste.js',
'js/popovers.js',
'js/typeahead_helper.js',
'js/search_suggestion.js',
'js/search.js',
'js/composebox_typeahead.js',
'js/navigate.js',
'js/hotkey.js',
'js/favicon.js',
'js/notifications.js',
'js/hashchange.js',
'js/invite.js',
'js/message_list_view.js',
'js/message_list.js',
'js/message_flags.js',
'js/alert_words.js',
'js/alert_words_ui.js',
'js/people.js',
'js/message_store.js',
'js/server_events.js',
'js/zulip.js',
'js/activity.js',
'js/colorspace.js',
'js/timerender.js',
'js/tutorial.js',
'js/templates.js',
'js/avatar.js',
'js/settings.js',
'js/tab_bar.js',
'js/emoji.js',
'js/referral.js',
'js/custom_markdown.js',
'js/bot_data.js',
# JS bundled by webpack is also included here if PIPELINE setting is true
],
'output_filename': 'min/app.js'
},
'activity': {
'source_filenames': (
'third/sorttable/sorttable.js',
),
'output_filename': 'min/activity.js'
},
# We also want to minify sockjs separately for the sockjs iframe transport
'sockjs': {
'source_filenames': ('third/sockjs/sockjs-0.3.4.js',),
'output_filename': 'min/sockjs-0.3.4.min.js'
},
}
if PIPELINE:
JS_SPECS['app']['source_filenames'].append('js/bundle.js')
app_srcs = JS_SPECS['app']['source_filenames']
PIPELINE_JS = {} # Now handled in tools/minify-js
PIPELINE_JS_COMPRESSOR = None
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.yui.YUICompressor'
PIPELINE_YUI_BINARY = '/usr/bin/env yui-compressor'
########################################################################
# LOGGING SETTINGS
########################################################################
ZULIP_PATHS = [
("SERVER_LOG_PATH", "/var/log/zulip/server.log"),
("ERROR_FILE_LOG_PATH", "/var/log/zulip/errors.log"),
("MANAGEMENT_LOG_PATH", "/var/log/zulip/manage.log"),
("WORKER_LOG_PATH", "/var/log/zulip/workers.log"),
("PERSISTENT_QUEUE_FILENAME", "/home/zulip/tornado/event_queues.pickle"),
("JSON_PERSISTENT_QUEUE_FILENAME", "/home/zulip/tornado/event_queues.json"),
("EMAIL_MIRROR_LOG_PATH", "/var/log/zulip/email-mirror.log"),
("EMAIL_DELIVERER_LOG_PATH", "/var/log/zulip/email-deliverer.log"),
("LDAP_SYNC_LOG_PATH", "/var/log/zulip/sync_ldap_user_data.log"),
("QUEUE_ERROR_DIR", "/var/log/zulip/queue_error"),
("STATS_DIR", "/home/zulip/stats"),
("DIGEST_LOG_PATH", "/var/log/zulip/digest.log"),
]
# The Event log basically logs most significant database changes,
# which can be useful for debugging.
if VOYAGER:
EVENT_LOG_DIR = None
else:
ZULIP_PATHS.append(("EVENT_LOG_DIR", "/home/zulip/logs/event_log"))
for (var, path) in ZULIP_PATHS:
if DEVELOPMENT:
# if DEVELOPMENT, store these files in the Zulip checkout
path = os.path.basename(path)
vars()[var] = path
ZULIP_WORKER_TEST_FILE = '/tmp/zulip-worker-test-file'
if IS_WORKER:
FILE_LOG_PATH = WORKER_LOG_PATH
else:
FILE_LOG_PATH = SERVER_LOG_PATH
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'default': {
'format': '%(asctime)s %(levelname)-8s %(message)s'
}
},
'filters': {
'ZulipLimiter': {
'()': 'zerver.lib.logging_util.ZulipLimiter',
},
'EmailLimiter': {
'()': 'zerver.lib.logging_util.EmailLimiter',
},
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'nop': {
'()': 'zerver.lib.logging_util.ReturnTrue',
},
'require_really_deployed': {
'()': 'zerver.lib.logging_util.RequireReallyDeployed',
},
},
'handlers': {
'zulip_admins': {
'level': 'ERROR',
'class': 'zerver.handlers.AdminZulipHandler',
# For testing the handler delete the next line
'filters': ['ZulipLimiter', 'require_debug_false', 'require_really_deployed'],
'formatter': 'default'
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'default'
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'default',
'filename': FILE_LOG_PATH,
'when': 'D',
'interval': 7,
'backupCount': 100000000,
},
'errors_file': {
'level': 'WARNING',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'default',
'filename': ERROR_FILE_LOG_PATH,
'when': 'D',
'interval': 7,
'backupCount': 100000000,
},
},
'loggers': {
'': {
'handlers': ['console', 'file', 'errors_file'],
'level': 'INFO',
'propagate': False,
},
'django': {
'handlers': (['zulip_admins'] if ERROR_REPORTING else [])
+ ['console', 'file', 'errors_file'],
'level': 'INFO',
'propagate': False,
},
'zulip.requests': {
'handlers': ['console', 'file', 'errors_file'],
'level': 'INFO',
'propagate': False,
},
'zulip.queue': {
'handlers': ['console', 'file', 'errors_file'],
'level': 'WARNING',
'propagate': False,
},
'zulip.management': {
'handlers': ['file', 'errors_file'],
'level': 'INFO',
'propagate': False,
},
'requests': {
'handlers': ['console', 'file', 'errors_file'],
'level': 'WARNING',
'propagate': False,
},
## Uncomment the following to get all database queries logged to the console
# 'django.db': {
# 'handlers': ['console'],
# 'level': 'DEBUG',
# 'propagate': False,
# },
}
}
TEMPLATE_CONTEXT_PROCESSORS = (
'zerver.context_processors.add_settings',
'zerver.context_processors.add_metrics',
)
ACCOUNT_ACTIVATION_DAYS=7
LOGIN_REDIRECT_URL='/'
# Client-side polling timeout for get_events, in milliseconds.
# We configure this here so that the client test suite can override it.
# We already kill the connection server-side with heartbeat events,
# but it's good to have a safety. This value should be greater than
# (HEARTBEAT_MIN_FREQ_SECS + 10)
POLL_TIMEOUT = 90 * 1000
# iOS App IDs
ZULIP_IOS_APP_ID = 'com.zulip.Zulip'
DBX_IOS_APP_ID = 'com.dropbox.Zulip'
########################################################################
# SSO AND LDAP SETTINGS
########################################################################
USING_APACHE_SSO = ('zproject.backends.ZulipRemoteUserBackend' in AUTHENTICATION_BACKENDS)
if (len(AUTHENTICATION_BACKENDS) == 1 and
AUTHENTICATION_BACKENDS[0] == "zproject.backends.ZulipRemoteUserBackend"):
HOME_NOT_LOGGED_IN = "/accounts/login/sso"
ONLY_SSO = True
else:
HOME_NOT_LOGGED_IN = '/login'
ONLY_SSO = False
AUTHENTICATION_BACKENDS += ('guardian.backends.ObjectPermissionBackend',)
AUTHENTICATION_BACKENDS += ('zproject.backends.ZulipDummyBackend',)
POPULATE_PROFILE_VIA_LDAP = bool(AUTH_LDAP_SERVER_URI)
if POPULATE_PROFILE_VIA_LDAP and \
not 'zproject.backends.ZulipLDAPAuthBackend' in AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS += ('zproject.backends.ZulipLDAPUserPopulator',)
else:
POPULATE_PROFILE_VIA_LDAP = 'zproject.backends.ZulipLDAPAuthBackend' in AUTHENTICATION_BACKENDS or POPULATE_PROFILE_VIA_LDAP
########################################################################
# EMAIL SETTINGS
########################################################################
# If an email host is not specified, fail silently and gracefully
if not EMAIL_HOST and PRODUCTION:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
elif DEVELOPMENT:
# In the dev environment, emails are printed to the run-dev.py console.
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
else:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST_PASSWORD = get_secret('email_password')
if "EMAIL_GATEWAY_PASSWORD" not in vars():
EMAIL_GATEWAY_PASSWORD = get_secret('email_gateway_password')
if "AUTH_LDAP_BIND_PASSWORD" not in vars():
AUTH_LDAP_BIND_PASSWORD = get_secret('auth_ldap_bind_password')
########################################################################
# MISC SETTINGS
########################################################################
if PRODUCTION:
# Filter out user data
DEFAULT_EXCEPTION_REPORTER_FILTER = 'zerver.filters.ZulipExceptionReporterFilter'
# This is a debugging option only
PROFILE_ALL_REQUESTS = False
CROSS_REALM_BOT_EMAILS = set(('feedback@zulip.com', 'notification-bot@zulip.com'))
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'zulip',
'USER': 'zulip',
'PASSWORD': 'zulip',
'HOST': 'database',
'PORT': '5432',
'SCHEMA': 'zulip',
'CONN_MAX_AGE': 600,
'OPTIONS': {
'connection_factory': TimeTrackingConnection,
'sslmode': 'prefer',
},
},
}
EXTERNAL_HOST = 'team.comnmodel.org'
EMAIL_HOST = 'smtp.gmail.com'
AUTH_LDAP_BIND_DN = 'cn=admin,dc=comnmodel,dc=org'
NOREPLY_EMAIL_ADDRESS = 'noreply@comnmodel.org'
AUTH_LDAP_SERVER_URI = 'ldap.comnmodel.org'
ZULIP_ADMINISTRATOR = 'rey@gmail.com'
AUTH_LDAP_BIND_PASSWORD = 'xxx'
EMAIL_HOST_USER = 'rey@gmail.com'
DEFAULT_FROM_EMAIL = 'Zulip <noreply@comnmodel.org>'
AUTH_LDAP_APPEND_DOMAIN = 'None'
@reyman I think I now know what one of the problems is.
Could you show what files are listed (with ls -ahl
option) in your data mount on your host, then I can tell you need to do to fix your problem, that the entrypoint always tries to create the database default data.
Other bugs I found (will fix):
Yeah, the file into /data
➜ /data ls -ahl /data
total 12K
drwxr-xr-x 3 root root 4,0K janv. 13 18:27 .
drwxr-xr-x 23 root root 4,0K févr. 28 23:29 ..
drwxr-xr-x 4 root root 4,0K janv. 13 18:56 slapd
Is this your host data mount folder or the container one? (the host data mount folder with the zulip, postgresql, etc. folder in it.)
Run ls -ahl *
in your hosts mount folder.
This is my host folder (vps /data)
And the docker-compose.yml volumes points to it?
Taken from the default docker-compose.yml
volumes:
- "/opt/docker/zulip/zulip:/data:rw"
Then your host mount directory would be /opt/docker/zulip/zulip
, did you change the directory?
You're right, here the content :
➜ ~ sudo ls -ahl /opt/docker/zulip/zulip
total 24K
drwxr-xr-x 5 root root 4,0K mars 6 00:28 .
drwxr-xr-x 5 root root 4,0K mars 5 23:57 ..
drwxr-xr-x 2 root root 4,0K mars 5 23:57 backups
drwxr-xr-x 2 root root 4,0K mars 6 00:28 certs
drwxr-xr-x 2 reyman reyman 4,0K mars 5 23:57 uploads
-rw-r--r-- 1 root root 609 mars 6 00:28 zulip-secrets.conf
Create a file at /opt/docker/zulip/zulip
named .initiated
and try again. That should fix your problem.
I have one error :
zulip_1 | 2016-03-13 18:37:48,940 INFO exited: zulip-postsetup-create_user (exit status 127; not e
xpected)
@reyman I'm going to fix the postsetup user creation script returning a bad return code. But so that you know, this isn't a "real"/bad error.
Thanks for helping me test it! :)
I pushed a small change for this, as it should now not show this as an error anymore.
Yes, i retry later.
When i launch sudo docker-compose up
, how can i get the hand after execution without closing ?
Add -d
to the docker-compose -d up
.
Yeah, it works :)
Juste, when i log, i have this error
Forbidden (403)
CSRF verification failed. Request aborted.
Do you run Zulip behind a proxy?
On Mon, Mar 14, 2016, 4:48 PM Rey notifications@github.com wrote:
Yeah, it works :)
Juste, when i log, i have this error
Forbidden (403) CSRF verification failed. Request aborted.
— Reply to this email directly or view it on GitHub https://github.com/Galexrt/docker-zulip/issues/61#issuecomment-196376890 .
Hum @Galexrt, yeah, Zulip run using the nginx docker nginx proxy image osixia/openldap
2d9c16de8669 jwilder/nginx-proxy "/app/docker-entrypoi" 2 weeks ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
I configure using the option given in the doc.
VIRTUAL_HOST: "team.comnmodel.org"
VIRTUAL_PROTO: "https"
VIRTUAL_PORT: "443"
Could you try running zulip on different ports without the proxy? Because this seems to be related to a missing header (maybe with the proxy).
@reyman Could you please open a new issue for this new error?
Hi, I have some problem with settings of docker compose in dev version. I'm waiting release to retry.
But i have also some problem with 1.3.9 and postgres role :
And later
The gist : https://gist.github.com/reyman/4d5a8910a3c7c6217025
I need to remove old volume ? If zulip user and db exist, why not reuse it ?