Google Assistant Webserver in a Docker container

Thanks!
I got it up and running (sort of), but I cannot auth with google and I don’t know why. I added my model_id and and my project id to the docker run command, I have the client_secret.json in the correct folder (it also uses it when it tries to auth) but google rejects me:

**403.**  That’s an error.
Error: restricted_client
A native application:  project-*redacted*

What I find interesting is that the downloaded auth credentials client_id neither resembles my model id nor my project id - but I guess that’s normal.

Any ideas?

UPDATE: I had to finish the setup of my consent screen. After entering my token I get an error screen (I know the docs say that, but I feel it’s still not working). I cannot find the service in my Google Home app… any ideas?

Here’s my error after hitting authenticate:

500 Internal Server Error
The server encountered an unexpected condition which prevented it from fulfilling the request.

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 628, in respond
    self._do_respond(path_info)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 687, in _do_respond
    response.body = self.handler()
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/lib/encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cpdispatch.py", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "/oauth.py", line 46, in token
    self.oauth2.fetch_token(self.user_data['token_uri'], client_secret=self.user_data['client_secret'], code=token)
  File "/usr/local/lib/python3.5/dist-packages/requests_oauthlib/oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 415, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 432, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/errors.py", line 405, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad Request

It may help if you post your log as well. Unsure if yours look like mine but I’m stuck at the same step as you (seems like installation all happened according to plan yet isn’t working). Hopefully someone can help us out.

sudo docker logs -f gawebserver
[sudo] password for [redacted]: 
[Info] Start WebUI for handling oauth2
[29/May/2019:06:55:51] ENGINE Listening for SIGTERM.
[29/May/2019:06:55:51] ENGINE Listening for SIGHUP.
[29/May/2019:06:55:51] ENGINE Listening for SIGUSR1.
[29/May/2019:06:55:51] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.

[29/May/2019:06:55:51] ENGINE Started monitor thread 'Autoreloader'.
[29/May/2019:06:55:51] ENGINE Serving on http://0.0.0.0:9324
[29/May/2019:06:55:51] ENGINE Bus STARTED
192.168.1.200 - - [29/May/2019:06:56:09] "GET / HTTP/1.1" 200 712 "" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
[29/May/2019:06:56:25] HTTP 
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 628, in respond
    self._do_respond(path_info)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 687, in _do_respond
    response.body = self.handler()
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/lib/encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cpdispatch.py", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "/oauth.py", line 46, in token
    self.oauth2.fetch_token(self.user_data['token_uri'], client_secret=self.user_data['client_secret'], code=token)
  File "/usr/local/lib/python3.5/dist-packages/requests_oauthlib/oauth2_session.py", line 244, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 411, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 379, in parse_token_response
    validate_token_parameters(params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 386, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/errors.py", line 415, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad Request
[29/May/2019:06:56:25] HTTP 
Request Headers:
  Remote-Addr: [redacted]
  ACCEPT-LANGUAGE: en-US,en;q=0.9
  COOKIE: _ga=[redacted]; _gid=[redacted]
  ACCEPT-ENCODING: gzip, deflate
  ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
  HOST: [redacted]:9324
  USER-AGENT: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
  CONNECTION: keep-alive
  CACHE-CONTROL: max-age=0
  REFERER: http://[redacted]:9324/
  UPGRADE-INSECURE-REQUESTS: 1
192.168.1.200 - - [29/May/2019:06:56:25] "GET /token?token=[redacted] HTTP/1.1" 500 2479 "http://[redacted]:9324/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
[29/May/2019:06:56:30] ENGINE SystemExit raised: shutting down HTTP server
[29/May/2019:06:56:30] ENGINE Bus STOPPING
[29/May/2019:06:56:30] ENGINE HTTP Server cherrypy._cpwsgi_server.CPWSGIServer(('0.0.0.0', 9324)) shut down
[29/May/2019:06:56:30] ENGINE Stopped thread 'Autoreloader'.
[29/May/2019:06:56:30] ENGINE Bus STOPPED
[29/May/2019:06:56:30] ENGINE Bus EXITING
[29/May/2019:06:56:30] ENGINE Bus EXITED
[29/May/2019:06:56:30] ENGINE Waiting for child threads to terminate...
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm_hw.c:1713:(_snd_pcm_hw_open) Invalid value for card
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default

I got this error if I’m not using dummy mic or a USB mic. And the container restarts again and again.
Make sure your .asound file in the container is setting correctly. You can find it in the /root dir after you get in the container. Restart the container after editing the .asound file.
To get in a container run:

docker container exec -it <container_name> /bin/bash

If the container can’t start, set the .asound file in the host(raspberry pi) and then copy it into your container. Restart your container.

docker cp .asound <container_name>:/root/.asound

Try to download OAuth 2.0 Credentials file from Google again.
Or do the registration again.
BTW, I’m using the same Google project of the AndBobsYourUncle’s addon, so I do the OAuth steps in https://www.home-assistant.io/addons/google_assistant/ once. But I think this is not important.

The container does not restart for me, although I haven’t set up a mic. I also tried reloading the file and did the registration again. No luck. Btw, the link for entering the token/accessing the URL does not work anymore after I entered the token (if that is any useful information). I’m on vacation til next week, will try to fix it when im back.

This worked for me btw. The broadcast works fine although I’ll be using tts instead in my automations. I was hoping to get command to work but I’m consistently getting “Sorry, I don’t know how to help with that yet.” or “Sorry, I don’t understand.” notes in my activity log for phrases that, when I say them to the assistant, work completely fine. Shouldn’t anything I can say to GA also work through the add-on?

Sorry for the noob question but I still don’t really understand how docker works, nor Hass.io’s infrastructure.

Can I use this with Hass.io? If yes, could you write up more detailed information?

Sorry for the bump!
I still have no idea how I use the dockerfile in Hass.io.

Anyone can help?

I wasn’t able to eliminate the “Broadcast from” that prepends any message, but here is what I was able to do.

I used another Google account (the same one I share my location with for the Google Maps Location Sharing component) to setup authorization for this webserver per the instructions and in my case I changed the user first name on https://myaccount.google.com/u/1/personal-info for this account to be my house number spelled out in text, i.e. - “thirty nine forty” although you could change it “your house” or “God” or whatever.

I then added the new account as an account on my Android phone.

I then loaded up the Google Home app and switched to the new account and did the voice training by changing my voice a bit. IDK if this part matters, but so far no issues.

Finally, using the Google Home app and my new user account I navigated to Account>Settings>Assistant and located the new device that had been added by this process. I clicked on this new device and set the address to my home address and chose the default output to a group I’d already created of all of my Google audio devices, ie - Google Homes and Chromecast audios per the instructions for this component. (Step 3 of the First Run section).

Strangely, at this point, I could see the broadcast in the Docker log, but nothing was actually being broadcast.

I then again clicked on the new device that had been been created in the GH app (the same one as in the step above) and I deleted it.

I tried another broadcast and it actually worked.

Now when I use this notify component, eg - notify.ga_broadcast {"message":"Hello you."}

The broadcast message is: “Broadcast from thirty nine forty. Hello you.”

While it’s not as great as not having the “Broadcast from” at the beginning of each message, for me, it’s the next best thing.

I wish I had recorded my steps to do all of this, but I didn’t so the above is all from memory and I haven’t yet had the nerve to retry it for fear of breaking it. In reality though, it isn’t that difficult so hopefully this will help someone else who’s using this really cool webserver for notifications.

1 Like

Hi! I would also be interested in trying to use this application in hass.io with portainer. Did you then manage to do it? I’ll try myself in the next days… :crossed_fingers:t3:

A question about this package: did I understand correctly that:

  1. it provides Google Assistant on the host machine, with hotword “Ok Google”
  2. it is “castable”, meaning that app like spotify can see the host machine as a device to send the audio to.
  3. And, additionally, can it be added to a Speaker group within the Google Home app?

I am sorry for my noob questions!

Thanks,
Francesco

Hi,

I’m trying to set up the application and after running the docker run command, the docker container immediately exits (I confirm this with docker ps -a ) without any output. When running docker events in the background to see more info, I get this output:

2019-08-29T16:11:45.200062466+02:00 container create 4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356 (image=robwolff3/ga-webserver, name=gawebserver)
4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356

2019-08-29T16:11:45.502792885+02:00 network connect fbf910b6257585325b4c9ede0e902fdd43f7d69cd85e4d021f15e33c8014b138 (container=4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356, name=bridge, type=bridge)

2019-08-29T16:11:46.861398538+02:00 container start 4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356 (image=robwolff3/ga-webserver, name=gawebserver)

2019-08-29T16:11:47.078032080+02:00 container die 4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356 (exitCode=1, image=robwolff3/ga-webserver, name=gawebserver)

2019-08-29T16:11:47.610913892+02:00 network disconnect fbf910b6257585325b4c9ede0e902fdd43f7d69cd85e4d021f15e33c8014b138 (container=4e8650f5116ed8384021aa185375148850799252b56f5679c6afde457449d356, name=bridge, type=bridge)

Did anyone have the same problem? Or does anyone know how to solve this?

UPDATE: nevermind, I was running on raspberry pi so I had to modify the dockerfile like ryan4559 said, now it doesn’t exit immediately.

UPDATE2: Afterwards I ran into the same problem as ciB , where after going through the steps on <local_ip>:9324 I get the error “invalid grant” and the docker container keeps restarting with this as output of “docker logs -f /gawebserver” :

[Info] Start WebUI for handling oauth2
[29/Aug/2019:19:54:46] ENGINE Listening for SIGTERM.
[29/Aug/2019:19:54:46] ENGINE Listening for SIGHUP.
[29/Aug/2019:19:54:46] ENGINE Listening for SIGUSR1.
[29/Aug/2019:19:54:46] ENGINE Bus STARTING
CherryPy Checker:
The Application mounted at '' has an empty config.

[29/Aug/2019:19:54:46] ENGINE Started monitor thread 'Autoreloader'.
[29/Aug/2019:19:54:47] ENGINE Serving on http://0.0.0.0:9324
[29/Aug/2019:19:54:47] ENGINE Bus STARTED
192.168.0.216 - - [29/Aug/2019:19:54:56] "GET / HTTP/1.1" 200 714 "" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
[29/Aug/2019:19:55:20] HTTP 
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 628, in respond
    self._do_respond(path_info)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cprequest.py", line 687, in _do_respond
    response.body = self.handler()
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/lib/encoding.py", line 219, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/cherrypy/_cpdispatch.py", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "/oauth.py", line 46, in token
    self.oauth2.fetch_token(self.user_data['token_uri'], client_secret=self.user_data['client_secret'], code=token)
  File "/usr/local/lib/python3.5/dist-packages/requests_oauthlib/oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 421, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 431, in parse_token_response
    validate_token_parameters(params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 438, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/usr/local/lib/python3.5/dist-packages/oauthlib/oauth2/rfc6749/errors.py", line 405, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad Request
[29/Aug/2019:19:55:20] HTTP 
Request Headers:
  ACCEPT-ENCODING: gzip, deflate
  UPGRADE-INSECURE-REQUESTS: 1
  REFERER: http://192.168.0.123:9324/
  CONNECTION: keep-alive
  HOST: 192.168.0.123:9324
  USER-AGENT: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36
  Remote-Addr: 192.168.0.216
  ACCEPT-LANGUAGE: en-US,en;q=0.9
  CACHE-CONTROL: max-age=0
  COOKIE: Squeezebox-player=cc%3Acc%3A09%3A1c%3A42%3Adc
  ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
192.168.0.216 - - [29/Aug/2019:19:55:20] "GET /token?token=4%2FqgE2mnSjHIuBhd1UWxKkuLu_5v7ycLQ2alLswF_iRgCMdp_lLcYxyHM HTTP/1.1" 500 2479 "http://192.168.0.123:9324/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
[29/Aug/2019:19:55:25] ENGINE SystemExit raised: shutting down HTTP server
[29/Aug/2019:19:55:25] ENGINE Bus STOPPING
[29/Aug/2019:19:55:25] ENGINE HTTP Server cherrypy._cpwsgi_server.CPWSGIServer(('0.0.0.0', 9324)) shut down
[29/Aug/2019:19:55:25] ENGINE Stopped thread 'Autoreloader'.
[29/Aug/2019:19:55:25] ENGINE Bus STOPPED
[29/Aug/2019:19:55:25] ENGINE Bus EXITING
[29/Aug/2019:19:55:25] ENGINE Bus EXITED
[29/Aug/2019:19:55:25] ENGINE Waiting for child threads to terminate...
ALSA lib pcm.c:8382:(snd_pcm_set_params) Sample format not available for CAPTURE: Invalid argument
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm.c:8382:(snd_pcm_set_params) Sample format not available for CAPTURE: Invalid argument
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default
ALSA lib pcm.c:8382:(snd_pcm_set_params) Sample format not available for CAPTURE: Invalid argument
[FATAL:audio_input_stream.cc(47)] Input device could not be opened: default

To me it looks like something is wrong with the .asoundrc file I’ve put into the container, because I have no idea what this file should contain so I copied the first one I could find online, this is the content:

pcm.!default {
    type hw
    card 1
}

ctl.!default {
    type hw           
    card 1
}

I took card 1 because I guess it indicates which audio card to take, so since I’m using a dummy audio driver, and by issuing "cat /proc/asound/cards I got :

 0 [ALSA           ]: bcm2835_alsa - bcm2835 ALSA
                      bcm2835 ALSA
 1 [Dummy          ]: Dummy - Dummy
                      Dummy 1

I assume the card in .asoundrc should be 1.

Can anybody tell me if I’m doing the right things here?

Thank you in advance!

Hi all

{UPDATE FIXED}
I should have edited the user as it was going to root rather than my user.

Now though i have another issue

Fairly new to Docker compose, but i followed the documentation and got most of it working however when i run docker-compose up i get this error…

[Error] You need initialize GoogleAssistant with a client secret json!

I have started again twice recreating the project on google and replaceing the Oauth json file
I thought i had stuffed up the folder creations but I double checked all look ok

The only thing im confused in the documentation is this part

Lastly change the volume to mount your config and assistant directories to /config and /root/.config/google-assistant-library/assistant`

What do i do here ? In the docker-compose.yml seems this are already redirecting ?

thankyou

Has anyone got this working with a rest_command in HA?
I am getting timeouts on the webserver almost every time when I use the notify.ga_command, so wanted to convet to a rest_command so I could get the response and retry if failed, but can’t seem to get it to work. I have tried this, but doesn’t work, I just get “This is a Test” response, like I would with no message.

kitchen_radio_p1:
  url: http://192.168.1.10:5000/command
  method: GET
  payload: '{"message":"Play Country 93 on Kitchen Speaker"}'
  content_type:  'application/json'

I get the same thing did you ever fix this?

Replying to myself I have tried everything and this will not work. I am using it inside of a VM, but the host linux ubuntu 18.0 has a dummy sound card, which passes to the other dummy soundcard, it works, but much like the above soon I authenticate restart loop with exit code 139. Offically not wasting more time. I really wish that chromecasts, and hass could itself be a google home and then have a service that pipes to a baked in gawebserver.

Also I dont understand why the sdk cannot pipe music to another device… “Play X on Kitchen Speakers” really should NOT need a mic and speakers. But I guess it routes the sound and doesn’t actually initiate it there. I dont know the SDK/Google Assistant Libraries that well. But all in all this has been a very missed feature of mine since I have a whole home audio system basically in everyroom of my house. But cannot start spotify on any of them why? Well because when it goes idle it wont work. Yes SpotCast component is a workaround but having a broadcast function that doesn’t spot music would be great.

Anywho if anyone gets it working please reply to my thread, I’ve subscribed to it as well!

Just installed via docker on intel NUC with ubuntu 16 LT.

ran sudo modprobe snd-dummy before installing the docker, and not had any problems.

Question - why running docker in the VM?

Because its a Dell R710 server in a rack running Windows 2016, I do not want to install linux. Plus it keeps the apps and ports all separated. And if something corrupts its very easy to restore a VM vs bare metal. Also NUC is great but would be underpowered for my applications. Plex, Python webscrapers, ML datasets, etc.

fair enough.

Did you got this fixed? Got the same error:

403. That’s an error.

Error: restricted_client

I stopped using the addon, so I dont think so :smiley: