Задать вопрос
Kenya-West
@Kenya-West
Обычный Кеня

Как найти фантомный бинарник Caddy, который мне не нужен?

У меня есть Caddy - он в Docker, раскатанный через Ansible. Конфиги приведены, но сильно на вопрос не влияют, можете не читать.

Плейбук

---
- name: Install Caddy with Docker
  hosts: all
  become: true
  vars_files:
    - '{{ inventory_dir }}/vars/vars.yaml'
  vars:
    caddy_dir: caddy

  tasks:
  # Validate fiels and folders exist
  - name: Ensure ~/caddy directory exists
    file:
      path: "/home/{{ standard_user }}/{{ caddy_dir }}/"
      state: directory
      mode: '0775'
  - name: Ensure ~/caddy/caddy_data directory exists
    file:
      path: "/home/{{ standard_user }}/{{ caddy_dir }}/caddy_data"
      state: directory
      mode: '0775'
  - name: Ensure ~/caddy/config directory exists
    file:
      path: "/home/{{ standard_user }}/{{ caddy_dir }}/config"
      state: directory
      mode: '0775'
  - name: Ensure ~/caddy/logs directory exists
    file:
      path: "/home/{{ standard_user }}/{{ caddy_dir }}/logs"
      state: directory
      mode: '0775'
  - name: Ensure ~/caddy/static directory exists
    file:
      path: "/home/{{ standard_user }}/{{ caddy_dir }}/static"
      state: directory
      mode: '0777'
  # Stop and down if it was up
  - name: Check status of Docker Compose services
    command: docker compose ps
    args:
      chdir: "/home/{{ standard_user }}/{{ caddy_dir }}/"
    register: docker_compose_status
    ignore_errors: yes
  - name: Stop Caddy service because it is running
    command: docker compose down caddy
    args:
      chdir: "/home/{{ standard_user }}/{{ caddy_dir }}/"
    when: "'caddy' in docker_compose_status.stdout"
    ignore_errors: yes
  - name: Pull new Caddy release service if it was running
    command: docker compose pull caddy
    args:
      chdir: "/home/{{ standard_user }}/{{ caddy_dir }}/"
    when: "'caddy' in docker_compose_status.stdout"
    ignore_errors: yes
  # Copy files
  - name: Copy all files from local root assets/caddy to remote ~/caddy
    copy:
      src: "{{ inventory_dir }}/assets/caddy/{{ item.sourcename }}"
      dest: "/home/{{ standard_user }}/{{ caddy_dir }}/{{ item.destname }}"
    loop:
      - sourcename: "docker-compose.yml"
        destname: "docker-compose.yml"
      - sourcename: ".env-{{ inventory_hostname }}"
        destname: ".env"
    register: copy_files_root
  - name: Copy all files from local root assets/caddy to remote ~/caddy/config
    copy:
      src: "{{ item }}"
      dest: "/home/{{ standard_user }}/{{ caddy_dir }}/config/{{ item | basename }}"
    with_fileglob:
      - "{{ inventory_dir }}/assets/caddy/config/Caddyfile"
    register: copy_files_config
  - name: Copy all files from local root assets/caddy/static to remote ~/caddy/static
    copy:
      src: "{{ item }}"
      dest: "/home/{{ standard_user }}/{{ caddy_dir }}/static/{{ item | basename }}"
    with_fileglob:
      - "{{ inventory_dir }}/assets/caddy/static/index.html"
    register: copy_files_config
  # Network existing check
  - name: Ensure Docker network 'caddy' exists with specific settings
    docker_network:
      name: caddy
      driver: bridge
      state: present
  # Up the service
  - name: Run docker compose up for Caddy
    command: docker compose up caddy -d
    args:
      chdir: "/home/{{ standard_user }}/{{ caddy_dir }}/"
    register: docker_compose_up
  - name: Wait for 3 seconds after starting docker compose
    pause:
      seconds: 3
    when: docker_compose_up.changed
  - name: Check if Caddy service is running correctly
    command: docker compose ps caddy
    args:
      chdir: "/home/{{ standard_user }}/{{ caddy_dir }}/"
    register: docker_ps
    failed_when: "'Up' not in docker_ps.stdout"
    when: docker_compose_up.changed


docker-compose.yml

version: "3.8"
services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    container_name: caddy
    ports:
      - 80:80
      - 443:443
      - "443:443/udp"
    environment:
      - CADDY_INGRESS_NETWORKS=caddy
      - CADDY_DOCKER_CADDYFILE_PATH=/config/Caddyfile
    env_file:
      - .env
    networks:
      - caddy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./config/Caddyfile:/config/Caddyfile
      - ./logs:/var/log/caddy
      - ./static:/var/www/public
      - caddy-data:/data
      - caddy-certs:/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory
    restart: unless-stopped

networks:
  caddy:
    external: true

volumes:
  caddy-data: {}
  caddy-certs: {}



После раскатки на очередную VPS у провайдера GCore обнаружил, что CPU начинает жрать все 100%. Проверил вывод btop и обнаружил, что существует ещё один caddy в неком /bin/, который выжирает весь гиг оперативки и забивает своп:

665b1ba4d796b956167194.png

В то время как на других провайдерах никакого Caddy в btop нет, есть только Docker'овские процессы.

Вопрос: Как мне найти бинарник Caddy?

Я пробовал:
1. ll /proc/<PID>/exe | rg caddy - выдает /usr/bin/
2. pwdx <PID> | rg caddy - выдаёт /
3. lsof -p <PID> | rg caddy - выдаёт /bin/

Во всех путях, от рута или от юзера, или от суперюзера - ответ отрицательный, бинарника нет. Проверял через ls -la, в т. ч. sudo. В apt list его нет.
Но он продолжает жрать 100% процессора и всю оставшуюся RAM.
В то время как у других хостеров всё супергуд, жрут 80 МБ ОЗУ без фантомных захардкоженных бинарей и не вякают.

Окружение:
- Host: G-Core
- IP address: публичный статический расово белый
- OS: Ubuntu 22.04
- Shell: Bash
- Основное окружение: обычный user
- Docker: есть, работает от обычного user
- Root user: доступен
  • Вопрос задан
  • 1333 просмотра
Подписаться 3 Простой 4 комментария
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
Так он у вас в докере , а вы смотрите на хосте
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Noizefan
@Noizefan
убей процесс, посмотри переродится ли, раз нет его по путям
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
У меня lsof показывает среди прочих файлов и сам бинарник

$ lsof -p PID
Ответ написан
Комментировать
@rPman
Попробуй посмотреть в /proc/$pid там куча файлов, описывающих процесс
Ответ написан
Комментировать
@Gamelot
Программист php
ну, может его не ставили через apt. иногда на образах идет предустановленное ПО от провайдера, которое стартует через автозагрузку системы.

я бы попробовал помучить утилиту ps. что-то типа ps -aux | grep caddy
хотя, может в ней путь и не будет прописан к файлу. чисто название процесса
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы