mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-29 22:24:26 +00:00 
			
		
		
		
	Hass.io Ingress (#519)
* Hass.io ingress * Update * Remove global vars * Fix * Fixes * Fixes * Upgrade base image to 1.5.1 * Lint
This commit is contained in:
		| @@ -6,21 +6,29 @@ | ||||
|  | ||||
| declare certfile | ||||
| declare keyfile | ||||
| declare port | ||||
| declare direct_port | ||||
| declare ingress_interface | ||||
| declare ingress_port | ||||
|  | ||||
| mkdir -p /var/log/nginx | ||||
|  | ||||
| # Enable SSL | ||||
| if bashio::config.true 'ssl'; then | ||||
|     rm /etc/nginx/nginx.conf | ||||
|     mv /etc/nginx/nginx-ssl.conf /etc/nginx/nginx.conf | ||||
| direct_port=$(bashio::addon.port 6052) | ||||
| if bashio::var.has_value "${direct_port}"; then | ||||
|     if bashio::config.true 'ssl'; then | ||||
|         certfile=$(bashio::config 'certfile') | ||||
|         keyfile=$(bashio::config 'keyfile') | ||||
|  | ||||
|     certfile=$(bashio::config 'certfile') | ||||
|     keyfile=$(bashio::config 'keyfile') | ||||
|         mv /etc/nginx/servers/direct-ssl.disabled /etc/nginx/servers/direct.conf | ||||
|         sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/servers/direct.conf | ||||
|         sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/servers/direct.conf | ||||
|     else | ||||
|         mv /etc/nginx/servers/direct.disabled /etc/nginx/servers/direct.conf | ||||
|     fi | ||||
|  | ||||
|     sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx.conf | ||||
|     sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx.conf | ||||
|     sed -i "s/%%port%%/${direct_port}/g" /etc/nginx/servers/direct.conf | ||||
| fi | ||||
|  | ||||
| port=$(bashio::config 'port') | ||||
| sed -i "s/%%port%%/${port}/g" /etc/nginx/nginx.conf | ||||
| ingress_port=$(bashio::addon.ingress_port) | ||||
| ingress_interface=$(bashio::addon.ip_address) | ||||
| sed -i "s/%%port%%/${ingress_port}/g" /etc/nginx/servers/ingress.conf | ||||
| sed -i "s/%%interface%%/${ingress_interface}/g" /etc/nginx/servers/ingress.conf | ||||
|   | ||||
| @@ -10,6 +10,6 @@ if bashio::config.has_value 'esphome_version'; then | ||||
|     esphome_version=$(bashio::config 'esphome_version') | ||||
|     full_url="https://github.com/esphome/esphome/archive/${esphome_version}.zip" | ||||
|     bashio::log.info "Installing esphome version '${esphome_version}' (${full_url})..." | ||||
|     pip2 install --no-cache-dir --no-binary :all: "${full_url}" \ | ||||
|     pip2 install -U --no-cache-dir "${full_url}" \ | ||||
|       || bashio::exit.nok "Failed installing esphome pinned version." | ||||
| fi | ||||
|   | ||||
							
								
								
									
										96
									
								
								docker/rootfs/etc/nginx/includes/mime.types
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								docker/rootfs/etc/nginx/includes/mime.types
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| types { | ||||
|     text/html                                        html htm shtml; | ||||
|     text/css                                         css; | ||||
|     text/xml                                         xml; | ||||
|     image/gif                                        gif; | ||||
|     image/jpeg                                       jpeg jpg; | ||||
|     application/javascript                           js; | ||||
|     application/atom+xml                             atom; | ||||
|     application/rss+xml                              rss; | ||||
|  | ||||
|     text/mathml                                      mml; | ||||
|     text/plain                                       txt; | ||||
|     text/vnd.sun.j2me.app-descriptor                 jad; | ||||
|     text/vnd.wap.wml                                 wml; | ||||
|     text/x-component                                 htc; | ||||
|  | ||||
|     image/png                                        png; | ||||
|     image/svg+xml                                    svg svgz; | ||||
|     image/tiff                                       tif tiff; | ||||
|     image/vnd.wap.wbmp                               wbmp; | ||||
|     image/webp                                       webp; | ||||
|     image/x-icon                                     ico; | ||||
|     image/x-jng                                      jng; | ||||
|     image/x-ms-bmp                                   bmp; | ||||
|  | ||||
|     font/woff                                        woff; | ||||
|     font/woff2                                       woff2; | ||||
|  | ||||
|     application/java-archive                         jar war ear; | ||||
|     application/json                                 json; | ||||
|     application/mac-binhex40                         hqx; | ||||
|     application/msword                               doc; | ||||
|     application/pdf                                  pdf; | ||||
|     application/postscript                           ps eps ai; | ||||
|     application/rtf                                  rtf; | ||||
|     application/vnd.apple.mpegurl                    m3u8; | ||||
|     application/vnd.google-earth.kml+xml             kml; | ||||
|     application/vnd.google-earth.kmz                 kmz; | ||||
|     application/vnd.ms-excel                         xls; | ||||
|     application/vnd.ms-fontobject                    eot; | ||||
|     application/vnd.ms-powerpoint                    ppt; | ||||
|     application/vnd.oasis.opendocument.graphics      odg; | ||||
|     application/vnd.oasis.opendocument.presentation  odp; | ||||
|     application/vnd.oasis.opendocument.spreadsheet   ods; | ||||
|     application/vnd.oasis.opendocument.text          odt; | ||||
|     application/vnd.openxmlformats-officedocument.presentationml.presentation | ||||
|                                                      pptx; | ||||
|     application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | ||||
|                                                      xlsx; | ||||
|     application/vnd.openxmlformats-officedocument.wordprocessingml.document | ||||
|                                                      docx; | ||||
|     application/vnd.wap.wmlc                         wmlc; | ||||
|     application/x-7z-compressed                      7z; | ||||
|     application/x-cocoa                              cco; | ||||
|     application/x-java-archive-diff                  jardiff; | ||||
|     application/x-java-jnlp-file                     jnlp; | ||||
|     application/x-makeself                           run; | ||||
|     application/x-perl                               pl pm; | ||||
|     application/x-pilot                              prc pdb; | ||||
|     application/x-rar-compressed                     rar; | ||||
|     application/x-redhat-package-manager             rpm; | ||||
|     application/x-sea                                sea; | ||||
|     application/x-shockwave-flash                    swf; | ||||
|     application/x-stuffit                            sit; | ||||
|     application/x-tcl                                tcl tk; | ||||
|     application/x-x509-ca-cert                       der pem crt; | ||||
|     application/x-xpinstall                          xpi; | ||||
|     application/xhtml+xml                            xhtml; | ||||
|     application/xspf+xml                             xspf; | ||||
|     application/zip                                  zip; | ||||
|  | ||||
|     application/octet-stream                         bin exe dll; | ||||
|     application/octet-stream                         deb; | ||||
|     application/octet-stream                         dmg; | ||||
|     application/octet-stream                         iso img; | ||||
|     application/octet-stream                         msi msp msm; | ||||
|  | ||||
|     audio/midi                                       mid midi kar; | ||||
|     audio/mpeg                                       mp3; | ||||
|     audio/ogg                                        ogg; | ||||
|     audio/x-m4a                                      m4a; | ||||
|     audio/x-realaudio                                ra; | ||||
|  | ||||
|     video/3gpp                                       3gpp 3gp; | ||||
|     video/mp2t                                       ts; | ||||
|     video/mp4                                        mp4; | ||||
|     video/mpeg                                       mpeg mpg; | ||||
|     video/quicktime                                  mov; | ||||
|     video/webm                                       webm; | ||||
|     video/x-flv                                      flv; | ||||
|     video/x-m4v                                      m4v; | ||||
|     video/x-mng                                      mng; | ||||
|     video/x-ms-asf                                   asx asf; | ||||
|     video/x-ms-wmv                                   wmv; | ||||
|     video/x-msvideo                                  avi; | ||||
| } | ||||
							
								
								
									
										16
									
								
								docker/rootfs/etc/nginx/includes/proxy_params.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								docker/rootfs/etc/nginx/includes/proxy_params.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| proxy_http_version 1.1; | ||||
| proxy_ignore_client_abort off; | ||||
| proxy_read_timeout 86400s; | ||||
| proxy_redirect off; | ||||
| proxy_send_timeout 86400s; | ||||
| proxy_max_temp_file_size 0; | ||||
|  | ||||
| proxy_set_header Accept-Encoding ""; | ||||
| proxy_set_header Connection $connection_upgrade; | ||||
| proxy_set_header Host $http_host; | ||||
| proxy_set_header Upgrade $http_upgrade; | ||||
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||
| proxy_set_header X-Forwarded-Proto $scheme; | ||||
| proxy_set_header X-NginX-Proxy true; | ||||
| proxy_set_header X-Real-IP $remote_addr; | ||||
| proxy_set_header Authorization ""; | ||||
							
								
								
									
										6
									
								
								docker/rootfs/etc/nginx/includes/server_params.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								docker/rootfs/etc/nginx/includes/server_params.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| root /dev/null; | ||||
| server_name $hostname; | ||||
|  | ||||
| add_header X-Content-Type-Options nosniff; | ||||
| add_header X-XSS-Protection "1; mode=block"; | ||||
| add_header X-Robots-Tag none; | ||||
							
								
								
									
										9
									
								
								docker/rootfs/etc/nginx/includes/ssl_params.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docker/rootfs/etc/nginx/includes/ssl_params.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| ssl_protocols TLSv1.2; | ||||
| ssl_prefer_server_ciphers on; | ||||
| ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; | ||||
| ssl_ecdh_curve secp384r1; | ||||
| ssl_session_timeout  10m; | ||||
| ssl_session_cache shared:SSL:10m; | ||||
| ssl_session_tickets off; | ||||
| ssl_stapling on; | ||||
| ssl_stapling_verify on; | ||||
| @@ -1,62 +0,0 @@ | ||||
| worker_processes  1; | ||||
| pid /var/run/nginx.pid; | ||||
| error_log stderr; | ||||
|  | ||||
| events { | ||||
|     worker_connections  1024; | ||||
| } | ||||
|  | ||||
| http { | ||||
|     access_log         stdout; | ||||
|     include            mime.types; | ||||
|     default_type       application/octet-stream; | ||||
|     sendfile           on; | ||||
|     keepalive_timeout  65; | ||||
|  | ||||
|     upstream esphome { | ||||
|         ip_hash; | ||||
|         server unix:/var/run/esphome.sock; | ||||
|     } | ||||
|     map $http_upgrade $connection_upgrade { | ||||
|         default upgrade; | ||||
|         ''      close; | ||||
|     } | ||||
|  | ||||
|     server { | ||||
|         server_name hassio.local; | ||||
|         listen %%port%% default_server ssl; | ||||
|         root /dev/null; | ||||
|  | ||||
|         ssl_certificate /ssl/%%certfile%%; | ||||
|         ssl_certificate_key /ssl/%%keyfile%%; | ||||
|         ssl_protocols TLSv1.2; | ||||
|         ssl_prefer_server_ciphers on; | ||||
|         ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; | ||||
|         ssl_ecdh_curve secp384r1; | ||||
|         ssl_session_timeout  10m; | ||||
|         ssl_session_cache shared:SSL:10m; | ||||
|         ssl_session_tickets off; | ||||
|         ssl_stapling on; | ||||
|         ssl_stapling_verify on; | ||||
|  | ||||
|         # Redirect http requests to https on the same port. | ||||
|         # https://rageagainstshell.com/2016/11/redirect-http-to-https-on-the-same-port-in-nginx/ | ||||
|         error_page 497 https://$http_host$request_uri; | ||||
|  | ||||
|         location / { | ||||
|             proxy_redirect off; | ||||
|             proxy_pass http://esphome; | ||||
|  | ||||
|             proxy_http_version 1.1; | ||||
|             proxy_set_header Upgrade $http_upgrade; | ||||
|             proxy_set_header Connection $connection_upgrade; | ||||
|             proxy_set_header Authorization ""; | ||||
|  | ||||
|             proxy_set_header X-Real-IP $remote_addr; | ||||
|             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||
|             proxy_set_header X-Forwarded-Proto $scheme; | ||||
|             proxy_set_header Host $http_host; | ||||
|             proxy_set_header X-NginX-Proxy true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,46 +1,33 @@ | ||||
| worker_processes  1; | ||||
| daemon off; | ||||
| user root; | ||||
| pid /var/run/nginx.pid; | ||||
| error_log stderr; | ||||
|  | ||||
| worker_processes 1; | ||||
| # Hass.io addon log | ||||
| error_log /proc/1/fd/1 error; | ||||
| events { | ||||
|     worker_connections  1024; | ||||
|     worker_connections 1024; | ||||
| } | ||||
|  | ||||
| http { | ||||
|     access_log         stdout; | ||||
|     include            mime.types; | ||||
|     default_type       application/octet-stream; | ||||
|     sendfile           on; | ||||
|     keepalive_timeout  65; | ||||
|     include /etc/nginx/includes/mime.types; | ||||
|     access_log stdout; | ||||
|     default_type application/octet-stream; | ||||
|     gzip on; | ||||
|     keepalive_timeout 65; | ||||
|     sendfile on; | ||||
|     server_tokens off; | ||||
|  | ||||
|     upstream esphome { | ||||
|         ip_hash; | ||||
|         server unix:/var/run/esphome.sock; | ||||
|     } | ||||
|     map $http_upgrade $connection_upgrade { | ||||
|         default upgrade; | ||||
|         ''      close; | ||||
|     } | ||||
|  | ||||
|     server { | ||||
|         server_name hassio.local; | ||||
|         listen %%port%% default_server; | ||||
|         root /dev/null; | ||||
|     # Use Hass.io supervisor as resolver | ||||
|     resolver 172.30.32.2; | ||||
|  | ||||
|         location / { | ||||
|             proxy_redirect off; | ||||
|             proxy_pass http://esphome; | ||||
|  | ||||
|             proxy_http_version 1.1; | ||||
|             proxy_set_header Upgrade $http_upgrade; | ||||
|             proxy_set_header Connection $connection_upgrade; | ||||
|             proxy_set_header Authorization ""; | ||||
|  | ||||
|             proxy_set_header X-Real-IP $remote_addr; | ||||
|             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||
|             proxy_set_header X-Forwarded-Proto $scheme; | ||||
|             proxy_set_header Host $http_host; | ||||
|             proxy_set_header X-NginX-Proxy true; | ||||
|         } | ||||
|     upstream esphome { | ||||
|         server unix:/var/run/esphome.sock; | ||||
|     } | ||||
|  | ||||
|     include /etc/nginx/servers/*.conf; | ||||
| } | ||||
|   | ||||
							
								
								
									
										17
									
								
								docker/rootfs/etc/nginx/servers/direct-ssl.disabled
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								docker/rootfs/etc/nginx/servers/direct-ssl.disabled
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| server { | ||||
|     listen %%port%% default_server ssl http2; | ||||
|  | ||||
|     include /etc/nginx/includes/server_params.conf; | ||||
| 	include /etc/nginx/includes/proxy_params.conf; | ||||
| 	include /etc/nginx/includes/ssl_params.conf; | ||||
| 	# Clear Hass.io Ingress header | ||||
| 	proxy_set_header X-Hassio-Ingress ""; | ||||
|  | ||||
| 	# Redirect http requests to https on the same port. | ||||
|     # https://rageagainstshell.com/2016/11/redirect-http-to-https-on-the-same-port-in-nginx/ | ||||
|     error_page 497 https://$http_host$request_uri; | ||||
|  | ||||
|     location / { | ||||
|         proxy_pass http://esphome; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										12
									
								
								docker/rootfs/etc/nginx/servers/direct.disabled
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								docker/rootfs/etc/nginx/servers/direct.disabled
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| server { | ||||
|     listen %%port%% default_server; | ||||
|  | ||||
|     include /etc/nginx/includes/server_params.conf; | ||||
|     include /etc/nginx/includes/proxy_params.conf; | ||||
|     # Clear Hass.io Ingress header | ||||
|     proxy_set_header X-Hassio-Ingress ""; | ||||
|  | ||||
|     location / { | ||||
|         proxy_pass http://esphome; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								docker/rootfs/etc/nginx/servers/ingress.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								docker/rootfs/etc/nginx/servers/ingress.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| server { | ||||
|     listen %%interface%%:%%port%% default_server; | ||||
|  | ||||
|     include /etc/nginx/includes/server_params.conf; | ||||
|     include /etc/nginx/includes/proxy_params.conf; | ||||
|     # Set Hass.io Ingress header | ||||
|     proxy_set_header X-Hassio-Ingress "YES"; | ||||
|  | ||||
|     location / { | ||||
|     	# Only allow from Hass.io supervisor | ||||
|         allow   172.30.32.2; | ||||
|         deny    all; | ||||
|  | ||||
|         proxy_pass http://esphome; | ||||
|     } | ||||
| } | ||||
| @@ -4,5 +4,11 @@ | ||||
| # Runs the NGINX proxy | ||||
| # ============================================================================== | ||||
|  | ||||
| bashio::log.info "Waiting for dashboard to come up..." | ||||
|  | ||||
| while [[ ! -S /var/run/esphome.sock ]]; do | ||||
|   sleep 0.5 | ||||
| done | ||||
|  | ||||
| bashio::log.info "Starting NGINX..." | ||||
| exec nginx -g "daemon off;" | ||||
| exec nginx | ||||
|   | ||||
		Reference in New Issue
	
	Block a user