apache - 如何正确配置具有自动续订的 certbot?

标签 apache docker

我在学习 Docker所以如果这个问题听起来很傻,我很抱歉。无论如何,我的目标是创建一个 LAMP在一个地方处理所有数据库的容器,而且我想为许多站点设置多个虚拟主机。对于我想使用的每个站点 certbot需要 SSL 证书。
为此,我写了以下 docker-compose.yaml :

version: "3"

services:
  web:
    image: webdevops/php-apache:alpine-php7
    ports:
      - "80:80"
    volumes:
      - ./www:/app
      - ./php.ini:/opt/docker/etc/php/php.ini
      - ./sites-available:/opt/docker/etc/httpd/vhost.common.d
  
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports: 
      - "8088:80"

  certbot:
    image: webdevops/certbot
    volumes:
      - ./etc/letsencrypt:/etc/letsencrypt
在第一个服务中,我声明 Apacheweb ,我正在使用 alpine图片由 webdevops 创建, here the documentation .我绑定(bind)端口80 ,所以我可以访问Apache外部没有指定自定义端口。
volumes我添加了 www 部分包含 php 的文件夹脚本。
我还指定了一个自定义 php.ini覆盖默认 php设置。然后,作为 volumes 的最后一部分我试图挂载我在文件夹 sites-available 中创建的所有虚拟主机在 vhost.common.d目录。
然后我有 certbot容器作为我的 docker-compose 的最后一部分文件,我想做以下事情:
  • 如何为我实际存储在安装为 Web 容器卷的站点可用文件夹中的子域申请证书?
  • 如何设置 cron 作业或类似自动更新所有证书的任务?
  • 如何将获得的证书存储在卷中?
  • 最佳答案

    我承认,docker 有时很难将所有适当的部分拼凑在一起,话虽如此,我的回答并不完整,但希望能让你更进一步。
    以下将创建一个证书(注意 --dry-run ,强烈建议您使用它来进行测试,否则您将受到限制)

    docker run -it --rm \
        -v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
        -v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
        -v /vol/to/the/web/root:/data/letsencrypt \
        certbot/certbot certonly \
        --noninteractive \
        --webroot --webroot-path=/data/letsencrypt \
        -d sub.domain.com \
        --dry-run
    
    -v /docker-volumes/etc/letsencrypt:/etc/letsencrypt这是存储证书本身所必需的-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt不是必需的,但如果您想查看日志消息-v /vol/to/the/web/root:/data/letsencrypt您需要授予对 Web 根目录的访问权限,以便 certbot 可以创建 .well-known dir 并进行检查,这是一个棘手的问题,因为您需要链接/使用与 Web 容器 web-root vol 相同的位置--noninteractivecertbot 将绕过向您提问--webroot --webroot-path=/data/letsencrypt告诉 certbot 在哪里可以找到 webroot(例如在它自己的容器中)
    虽然不在上面的命令中,但如果提示输入电子邮件地址,您可以添加以下内容以帮助创建证书,不确定是否是必需的--email [email_address] --agree-tos --no-eff-email要记住的事情:
  • --dry-run 中运行 certbot否则,您将受到限制
  • certbot将需要对主机的 http 访问,您的 vhost 声明不应重定向或拒绝对 http 请求的访问,至少到 .well-known目录
  • 您需要在您的虚拟主机中添加适当的 SSL 选项,我认为 certbot 可以自动执行此操作,但我自己没有使用过。
  • 然后你需要像这样重新加载 apache /etc/init.d/apache2 reload
  • 删除 -it何时/如果您在 cron
  • 中运行
  • 探索将证书创建和更新封装在 shell 脚本中

  • 虽然我知道这不是“答案”,但希望其中一些有所帮助。

    关于apache - 如何正确配置具有自动续订的 certbot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64186169/

    相关文章:

    apache - 这些重写规则的 IIS 等价物是什么?

    php - 更新了 php,现在 phpmyadmin 出现问题

    python - 如何将 python 连接到使用 docker 运行的 cassandra

    docker - 带有Docker的Serilog Seq Sink无法捕获事件

    python - 来自 Django 的开发服务器端口绑定(bind)错误的 ptvsd 远程调试

    php.ini session.cookie_domain - 放置什么?

    Java:ConnectException/无法找到或加载主类

    apache - 明显重写的 URL 重写(更改地址栏中的 URL)

    drupal - Vagrant:boot2docker:无法在本地找到图像 'drupal'

    bash - Docker不运行入口点脚本