# Jupyterhub in docker container not working with nginx reverse proxy

**URL:** <https://discourse.jupyter.org/t/jupyterhub-in-docker-container-not-working-with-nginx-reverse-proxy/5675>\
**Category:** JupyterHub\
**Created:** [August 19, 2020, 4:07pm UTC](https://discourse.jupyter.org/t/jupyterhub-in-docker-container-not-working-with-nginx-reverse-proxy/5675 "2020-08-19T16:07:36Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![abashkin](https://avatars.discourse-cdn.com/v4/letter/a/7ea924/32.png) [@abashkin](https://discourse.jupyter.org/u/abashkin)\
**Post date:** [August 19, 2020, 4:07pm UTC](https://discourse.jupyter.org/t/jupyterhub-in-docker-container-not-working-with-nginx-reverse-proxy/5675/1 "2020-08-19T16:07:36Z")

</div>

**Hello, I have started jupyterhub as a service in dockerswarm. Without nginx reverse proxy, it works without problems. When I configure nginx reverse proxy with the following configuration:**

server {

listen 80;

server\_name [jupyter.ifora.hse.ru](http://jupyter.ifora.hse.ru);

index index.html index.htm;

access\_log /var/log/nginx/jupyter.ifora.hse.ru-access.log ;  
error\_log /var/log/nginx/jupyter.ifora.hse.ru-error.log error;

location / {  
proxy\_pass [http://172.18.207.29:8000](http://172.18.207.29:8000/);  
proxy\_set\_header X-Real-IP $remote\_addr;  
proxy\_set\_header Host $host;  
proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;  
proxy\_set\_header Upgrade $http\_upgrade;  
proxy\_set\_header Connection $connection\_upgrade;  
}  
}

**The following messages begin to appear in the jupyterhub logs:**

upyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:35.840 JupyterHub log:181] 200 POST /hub/api/users/admin/activity ([admin@10.1.13.6](mailto:admin@10.1.13.6)) 17.07ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:40.132 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.28ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:40.136 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.63ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:40.263 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 37.34ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:55.101 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 0.97ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:55.106 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.66ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:25:55.134 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 24.86ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:10.103 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.43ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:10.126 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 1.28ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:10.170 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 38.67ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:25.102 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.14ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:25.107 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.89ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:25.147 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 35.87ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:40.126 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.22ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:40.130 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.92ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:40.162 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 27.79ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:55.103 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.56ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:55.108 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.86ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:26:55.141 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 27.69ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:10.103 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.84ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:10.111 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.74ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:10.145 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 30.30ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:25.129 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.23ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:25.133 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.77ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:25.253 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 27.17ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:40.101 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.09ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:40.106 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.69ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:40.143 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 32.72ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:55.101 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.08ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:55.105 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.81ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:27:55.136 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 27.47ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:10.228 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.71ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:10.234 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 1.13ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:10.267 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 28.57ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:25.101 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.28ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:25.106 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.97ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:25.140 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 30.08ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:40.101 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.76ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:40.108 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 1.94ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:40.145 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 32.96ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:55.100 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 0.88ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:55.109 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 0.92ms  
jupyter\_hub.1.vkcroo6bu1zt@swarm\_manager | [I 2020-08-18 12:28:55.150 JupyterHub log:181] 200 GET /hub/login (@172.18.207.29) 36.64ms

**After a few hours jupyterhub stops working and has the following error in its logs:**

[E 2020-08-19 11:03:55.159 JupyterHub log:181] 500 GET /hub/login (@172.18.207.29) 50.32ms  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [I 2020-08-19 11:04:10.102 JupyterHub log:181] 302 GET / -\> /hub/ (@172.18.207.29) 1.46ms  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [I 2020-08-19 11:04:10.127 JupyterHub log:181] 302 GET /hub/ -\> /hub/login (@172.18.207.29) 1.47ms  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [E 2020-08-19 11:04:10.136 JupyterHub web:1792] Uncaught exception GET /hub/login (172.18.207.29)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | HTTPServerRequest(protocol=‘http’, host=‘[jupyter.ifora.hse.ru](http://jupyter.ifora.hse.ru)’, method=‘GET’, uri=’/hub/login’, version=‘HTTP/1.1’, remote\_ip=‘172.18.207.29’)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | Traceback (most recent call last):  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/tornado/web.py”, line 1703, in \_execute  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | result = await result  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/login.py”, line 135, in get  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | self.finish(self.\_render(username=username))  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/nativeauthenticator/handlers.py”, line 151, in \_render  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | {‘next’: self.get\_argument(‘next’, ‘’)},  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py”, line 1160, in render\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | template = self.get\_template(name)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py”, line 1154, in get\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.settings[‘jinja2\_env’].get\_template(name)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 883, in get\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.\_load\_template(name, self.make\_globals(globals))  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 857, in \_load\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | template = self.loader.load(self, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [Previous line repeated 958 more times]  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 127, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | code = environment.compile(source, name, filename)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 628, in compile  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | source = self.\_parse(source, name, filename)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 539, in parse  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return Parser(self, source, name, encode\_filename(filename)).parse()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 937, in parse  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | result = nodes.Template(self.subparse(), lineno=1)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 919, in subparse  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | rv = self.parse\_statement()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 141, in parse\_statement  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return getattr(self, “parse” + self.stream.current.value)()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 279, in parse\_extends  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | node.template = self.parse\_expression()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 448, in parse\_expression  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.parse\_condexpr()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 453, in parse\_condexpr  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | expr1 = self.parse\_or()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 466, in parse\_or  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | left = self.parse\_and()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 475, in parse\_and  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | left = self.parse\_not()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 486, in parse\_not  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.parse\_compare()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 490, in parse\_compare  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | expr = self.parse\_math1()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 513, in parse\_math1  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | left = self.parse\_concat()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 524, in parse\_concat  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | args = [self.parse\_math2()]  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 534, in parse\_math2  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | left = self.parse\_pow()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 545, in parse\_pow  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | left = self.parse\_unary()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 563, in parse\_unary  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | node = self.parse\_primary()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 580, in parse\_primary  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | next(self.stream)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 387, in next  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | self.current = next(self.\_iter)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 660, in wrap  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | yield Token(lineno, token, value)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | RecursionError: maximum recursion depth exceeded  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager |  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [E 2020-08-19 11:04:10.175 JupyterHub web:1220] Uncaught exception in write\_error  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | Traceback (most recent call last):  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/tornado/web.py”, line 1218, in send\_error  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | self.write\_error(status\_code, \*\*kwargs)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py”, line 1244, in write\_error  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | html = self.render\_template(‘error.html’, \*\*ns)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py”, line 1160, in render\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | template = self.get\_template(name)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py”, line 1154, in get\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.settings[‘jinja2\_env’].get\_template(name)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 883, in get\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return self.\_load\_template(name, self.make\_globals(globals))  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 857, in \_load\_template  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | template = self.loader.load(self, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 426, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return loader.load(environment, name, globals)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [Previous line repeated 959 more times]  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/loaders.py”, line 127, in load  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | code = environment.compile(source, name, filename)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 628, in compile  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | source = self.\_parse(source, name, filename)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 539, in \_parse  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return Parser(self, source, name, encode\_filename(filename)).parse()  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/parser.py”, line 45, in init  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | self.stream = environment.\_tokenize(source, name, filename, state)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/environment.py”, line 573, in \_tokenize  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | stream = self.lexer.tokenize(source, name, filename, state)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 616, in tokenize  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | return TokenStream(self.wrap(stream, name, filename), name, filename)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 334, in init  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | next(self)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 387, in next  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | self.current = next(self.\_iter)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | File “/usr/local/lib/python3.6/dist-packages/jinja2/lexer.py”, line 660, in wrap  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | yield Token(lineno, token, value)  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | RecursionError: maximum recursion depth exceeded  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager |  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [E 2020-08-19 11:04:10.193 JupyterHub log:173] {  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “X-Forwarded-Host”: “[jupyter.ifora.hse.ru](http://jupyter.ifora.hse.ru)”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “X-Forwarded-Proto”: “http”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “X-Forwarded-Port”: “80”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “Referer”: “[http://172.18.207.37/hub/](http://172.18.207.37/hub/)”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “User-Agent”: “Go-http-client/1.1”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “Connection”: “close”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “X-Forwarded-For”: “172.18.207.29,::ffff:10.255.0.2”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “Host”: “[jupyter.ifora.hse.ru](http://jupyter.ifora.hse.ru)”,  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | “X-Real-Ip”: “172.18.207.29”  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | }  
jupyter\_hub.1.ry6cazaavyrc@swarm\_manager | [E 2020-08-19 11:04:10.193 JupyterHub log:181] 500 GET /hub/login (@172.18.207.29) 61.07ms

**Please help me solve the problem.**

**Dockerfile jupyterhub:**

FROM jupyterhub/jupyterhub:1.2

USER root

RUN pip install notebook  
RUN pip install --no-cache dockerspawner  
RUN pip3 install psycopg2-binary  
RUN pip install --no-cache jupyterhub-nativeauthenticator

**jupyterhub\_config.py:**

import os

#Определение переменной JPY\_DB\_PASSWORD для подключения к базе данных jupyter на сервере pg\_cluster\_01  
#f = open("/var/run/secrets/jupyterhub\_postgres\_pass", “r”)  
#os.environ[‘JPY\_DB\_PASSWORD’] = (f.read())

#Изменение рабочей директории пользователей в контейнере  
notebook\_dir = ‘/home/jovyan’  
c.SwarmSpawner.notebook\_dir = notebook\_dir

#Монтирование папки с хоста в папку home пользователей в контейнера  
def create\_dir\_hook(spawner):  
username = spawner.user.name # get the username  
volume\_path = os.path.join(’/home/data/jupyterhub\_data/’, username)  
if not os.path.exists(volume\_path):  
os.makedirs(volume\_path)  
os.chmod(volume\_path, 0o777)  
mounts\_user = [  
{‘type’: ‘bind’,  
‘source’: ‘/home/data/jupyterhub\_data/’ + username,  
‘target’: ‘/home/jovyan’, }  
]  
spawner.extra\_container\_spec = {  
‘mounts’: mounts\_user  
}

c.Spawner.pre\_spawn\_hook = create\_dir\_hook

#Определение пользователя admin  
c.Authenticator.admin\_users = {‘admin’}

#Автоматически создавать пользователя на сервере после добавления пользователя через панель управления jupyterhub  
c.LocalAuthenticator.create\_system\_users = True

#Подключение к базе данных postgresql

c.JupyterHub.db\_url = “postgresql://{}@{}:{}/{}”.format(  
os.environ[‘JPY\_DB\_USER’],  
os.environ[‘POSTGRES\_PORT\_5432\_TCP\_ADDR’],  
os.environ[‘POSTGRES\_PORT\_5432\_TCP\_PORT’],  
os.environ[‘JPY\_DB\_NAME’]  
)

#Использовать собственную аутентификацию jupiterhub  
c.JupyterHub.authenticator\_class = ‘nativeauthenticator.NativeAuthenticator’

#Сделать интерфейс jupyterlab по умолчанию  
c.SwarmSpawner.default\_url = ‘/lab’

#Использовать свой docker образ для серверов пользователей  
c.SwarmSpawner.image = ‘abashkin/jupyterhub\_singleuser:1.2’

c.ConfigurableHTTPProxy.should\_start = True  
#c.Spawner.default\_url = ‘/lab’  
c.JupyterHub.spawner\_class = ‘dockerspawner.SwarmSpawner’  
c.SwarmSpawner.network\_name = “jupyter\_jupyterhub-net”  
c.SwarmSpawner.extra\_host\_config = { ‘network\_mode’: “jupyter\_jupyterhub-net” }  
#c.SwarmSpawner.extra\_create\_kwargs.update({ ‘volume\_driver’: ‘local’ })  
c.SwarmSpawner.remove\_containers = True  
c.SwarmSpawner.debug = True  
c.JupyterHub.hub\_ip = ‘0.0.0.0’  
c.JupyterHub.hub\_port = 8081  
c.SwarmSpawner.host\_ip = “0.0.0.0”  
c.SwarmSpawner.extra\_placement\_spec = {  
‘constraints’: [‘node.hostname == cruncher\_01’],  
}

c.JupyterHub.port = 8000  
#c.JupyterHub.ssl\_key = os.environ[‘SSL\_KEY’]  
#c.JupyterHub.ssl\_cert = os.environ[‘SSL\_CERT’]

c.SwarmSpawner.http\_timeout = 300  
c.SwarmSpawner.start\_timeout = 300

**config docker swarm service:**

version: ‘3.7’

networks:  
jupyterhub-net:  
driver: overlay

configs:  
jupyterhub\_config:  
file: ./config/jupyterhub\_config.py

services:  
hub:  
image: [registry.ifora.hse.ru/jupyterhub:1.2](http://registry.ifora.hse.ru/jupyterhub:1.2)  
volumes:

- /var/run/docker.sock:/var/run/docker.sock  
environment:  
JPY\_DB\_USER: jupyter  
POSTGRES\_PORT\_5432\_TCP\_ADDR: 172.18.207.27  
POSTGRES\_PORT\_5432\_TCP\_PORT: 5432  
JPY\_DB\_NAME: jupyter  
configs:
- source: jupyterhub\_config  
target: /srv/jupyterhub/jupyterhub\_config.py  
deploy:  
replicas: 1  
restart\_policy:  
condition: any  
placement:  
constraints: [node.hostname == swarm\_manager]  
networks:
- jupyterhub-net  
ports:
- 8000:8000  
logging:  
driver: gelf  
options:  
gelf-address: “udp://172.18.207.46:12201”  
tag: “jupyter\_hub”
