У меня есть 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/
, который выжирает весь гиг оперативки и забивает своп:
В то время как на других провайдерах никакого 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: доступен