使用 docker-compose 和 nginx 的现代 Kimai 设置

这是我用于运行多个生产 kimai 实例的设置。在我的示例中,我在 /opt/kimai-mydomain 中创建文件。文件夹名称并不关键,但有助于区分多个独立的 kimai 实例。

首先,让我们创建 /opt/kimai-mydomain/docker-compose.yml。你不需要修改此文件中的任何内容,因为每个相关配置都使用环境变量从 .env 加载。

我们还添加了 Traefik 的配置,以防你想使用 Traefik 作为反向代理而不是 nginx。 (在这种情况下,你可以删除 ports 部分,因为 Traefik 将处理端口转发)。有关 Traefik 设置的详细信息,请参见使用 Lets Encrypt Cloudflare DNS-01 & TLS-ALPN-01 & HTTP-01 挑战的简单 Traefik docker-compose 设置

docker-compose.yml
services:
  mariadb:
    image: mariadb:latest
    environment:
      - MYSQL_DATABASE=kimai
      - MYSQL_USER=kimai
      - MYSQL_PASSWORD=${MARIADB_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
    volumes:
      - ./mariadb_data:/var/lib/mysql
    command: --default-storage-engine innodb
    restart: unless-stopped
    healthcheck:
      test: mysqladmin -p${MARIADB_ROOT_PASSWORD} ping -h localhost
      interval: 20s
      start_period: 10s
      timeout: 10s
      retries: 3

  kimai:
    image: kimai/kimai2:apache-debian-master-prod
    environment:
      - APP_ENV=prod
      - TRUSTED_HOSTS=localhost,${HOSTNAME}
      - ADMINMAIL=${KIMAI_ADMIN_EMAIL}
      - ADMINPASS=${KIMAI_ADMIN_PASSWORD}
      - DATABASE_URL=mysql://kimai:${MARIADB_PASSWORD}@mariadb/kimai
    volumes:
      - ./kimai_var:/opt/kimai/var
    ports:
      - '17919:8001'
    depends_on:
      - mariadb
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.kimai.rule=Host(`kimai.mydomain.com`)"
      - "traefik.http.routers.kimai.entrypoints=websecure"
      - "traefik.http.routers.kimai.tls.certResolver=alpn-ec384"
      - "traefik.http.services.kimai.loadbalancer.server.port=8001"

现在我们将在 /opt/kimai-mydomain/.env 中创建配置:

.env.example
MARIADB_ROOT_PASSWORD=eishi5Pae3chai1Aeth2wiuCh7Ahhi
MARIADB_PASSWORD=su1aesheereithubo0iedootaeRooT
KIMAI_ADMIN_PASSWORD=toiWaeShaiz5Yeifohngu6chunuo6C
KIMAI_ADMIN_EMAIL=email@mydomain.com
HOSTNAME=kimai.mydomain.com

.env 生成随机密码!不要在 .env 中保留默认密码!

你还需要正确设置 KIMAI_ADMIN_EMAILHOSTNAME

我们现在可以创建 kimai 数据目录并设置正确的权限:

create_kimai_dirs.sh
mkdir -p kimai_var
chown -R 33:33 kimai_var

33 是容器内 www-data 用户的用户 ID 和组 ID)

最近版本的 kimai 将在首次启动时自动将 kimai 安装到数据库。

现在我们可以使用 TechOverflow 的方法创建一个自动启动 Kimai 的 systemd 服务,来自在 10 秒内为你的 docker-compose 项目创建 systemd 服务

create_systemd_service.sh
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdin

现在我们只需要为你的 Kimai 域名的反向代理创建 nginx 配置(除非你使用 Traefik - Traefik 配置已包含在 docker-compose.yml 中)。配置没有什么特别需要注意的,因此我将展示我的配置作为你可以复制粘贴的示例。

kimai_nginx.conf
server {
    server_name  kimai.mydomain.com;

    location / {
        proxy_pass http://localhost:17919/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_redirect default;
    }

    listen [::]:443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/kimai.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/kimai.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

}
server {
    if ($host = kimai.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name  kimai.mydomain.com;

    listen [::]:80; # managed by Certbot
    return 404; # managed by Certbot
}

设置配置后 - 我总是建议使用 Let’s Encrypt 设置 TLS,即使是测试设置,打开浏览器并转到你的 Kimai 域名,例如 https://kimai.mydomain.com。你可以使用 .env 中指定的 KIMAI_ADMIN_EMAILKIMAI_ADMIN_PASSWORD 直接登录 kimai。

Traefik 将自动为你设置 TLS。


Check out similar posts by category: Container, Docker