Pri pokuse spustiť docker-compose s Nginx vo vnútri a nastavení TLS pre virtuálneho hostiteľa (subdoménu) sa objavila táto chyba:

nginx: [emerg] cannot load certificate "/etc/nginx/ssl/sub.peterbabic.com.cer":
BIO_new_file() failed (SSL: error:02001002:system library:fopen:
No such file or directory:fopen('/etc/nginx/ssl/sub.peterbabic.com.cer','r')
error:2006D080:BIO routines:BIO_new_file:no such file)

Skúšal som rôzne zmeny oprávnení a skupín v presvedčení, že docker používateľ nemá dostatočné privilégiá na prístup k súborom, keďže v súborovom systéme boli zreteľne prítomné.

Trvalo mi oveľa dlhšie vyriešiť to, ako by som chcel priznať. Po mnohých výsledkoch vyhľadávania, ktoré neposkytli žiadnu nápovedu o probléme, som našiel tento komentár, ktorý ma napokon naviedol správnym smerom.

Docker compose volumes #

Problém bol, že som inštruoval Nginx, aby pristupoval k certifikátom vygenerovaným pomocou acme.sh, ktoré sa nachádzali na hostiteľovi, ale neboli namontované kontajnerom, takže k nim nemohol pristupovať. Aká začiatočnícka chyba. Riešenie je na poslednom riadku v tomto výňatku zo súboru docker-compose.yml:

version: "3"
services:
  nginx:
    container_name: nginx-server
    image: nginx
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - /etc/nginx/ssl:/etc/nginx/ssl

Posledný riadok namontuje priečinok /etc/nginx/ssl/ z hostiteľa do kontajnera, takže Nginx tam môže pristupovať k certifikátom a povoliť TLS. Pre úplnosť, výňatok z odkazovaného súboru nginx.conf by mohol vyzerať takto:

server {
  listen 443 ssl http2;
  server_name sub.peterbabic.com;

  ssl_certificate     /etc/nginx/ssl/sub.peterbabic.com.cer;
  ssl_certificate_key /etc/nginx/ssl/sub.peterbabic.com.key;
  ssl_protocols       TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;
}

Toto je 75. príspevok #100daystooffload.