За годы работы накопилась коллекция граблей, на которые наступал я и мои коллеги. Вот топ ошибок конфигурации, которые заставляли тратить часы на дебаг, хотя исправление занимало 30 секунд.

1. Кавычки в переменных окружения

Было:

BASH
# .env файл
DATABASE_URL="postgresql://user:pass@localhost/db"
API_KEY='super-secret-key'
Нажмите, чтобы развернуть и увидеть больше

Проблема:

Node.js приложение читает переменные вместе с кавычками. База не подключается, API возвращает 401.

Решение:

BASH
# .env файл - БЕЗ кавычек!
DATABASE_URL=postgresql://user:pass@localhost/db
API_KEY=super-secret-key
Нажмите, чтобы развернуть и увидеть больше

Урок:

В .env файлах кавычки НЕ нужны (если это не Docker Compose).

2. YAML: пробелы vs табы

Было:

YAML
services:
  app:
    image: myapp:latest
	ports:  # <-- ТУТ ТАБ!
	  - "3000:3000"
Нажмите, чтобы развернуть и увидеть больше

Проблема:

PLAINTEXT
Error: yaml: line 4: found character that cannot start any token
Нажмите, чтобы развернуть и увидеть больше

Решение:

Настроить редактор показывать пробелы/табы. Использовать линтер.

Урок:

YAML не прощает табы. Только пробелы. Точка.

3. Nginx: точка с запятой

Было:

NGINX
server {
    listen 80;
    server_name example.com
    location / {
        proxy_pass http://backend:3000;
    }
}
Нажмите, чтобы развернуть и увидеть больше

Проблема:

PLAINTEXT
nginx: [emerg] unexpected "location"
Нажмите, чтобы развернуть и увидеть больше

Решение:

NGINX
server_name example.com;  # <- точка с запятой!
Нажмите, чтобы развернуть и увидеть больше

Урок:

В Nginx КАЖДАЯ директива заканчивается точкой с запятой.

4. Docker: контекст сборки

Было:

DOCKERFILE
COPY ../configs/app.conf /etc/app/
Нажмите, чтобы развернуть и увидеть больше

Проблема:

PLAINTEXT
COPY failed: forbidden path outside the build context
Нажмите, чтобы развернуть и увидеть больше

Решение:

BASH
# Собирать из родительской директории
docker build -f docker/Dockerfile .
Нажмите, чтобы развернуть и увидеть больше

Урок:

Docker не может копировать файлы выше контекста сборки.

5. Kubernetes: неймспейсы

Было:

BASH
kubectl apply -f deployment.yaml
kubectl get pods
# No resources found in default namespace.
Нажмите, чтобы развернуть и увидеть больше

Проблема:

Деплой создался в другом namespace, а ищем в default.

Решение:

BASH
kubectl get pods -A  # или --all-namespaces
# или
kubectl get pods -n production
Нажмите, чтобы развернуть и увидеть больше

Урок:

Всегда указывайте namespace явно или используйте -A для поиска.

6. Права доступа: 777 это не решение

Было:

BASH
chmod 777 /var/www/html -R  # "чтобы заработало"
Нажмите, чтобы развернуть и увидеть больше

Проблема:

Решение:

BASH
# Правильные права
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
chmod -R 644 /var/www/html/*.php
Нажмите, чтобы развернуть и увидеть больше

Урок:

Разберитесь с правами. 777 - это костыль, не решение.

7. Git: case sensitivity

Было:

BASH
# На Mac (case-insensitive)
mv Component.js component.js
git add .
git commit -m "rename file"
git push
Нажмите, чтобы развернуть и увидеть больше

Проблема:

На Linux (case-sensitive) сборка падает - файл не найден.

Решение:

BASH
git mv Component.js component.js
Нажмите, чтобы развернуть и увидеть больше

Урок:

Используйте git mv для переименования. Всегда.

8. SSL: забытый intermediate certificate

Было:

NGINX
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
Нажмите, чтобы развернуть и увидеть больше

Проблема:

Браузеры показывают предупреждение о безопасности.

Решение:

BASH
# Объединить сертификат с intermediate
cat cert.pem intermediate.pem > fullchain.pem
Нажмите, чтобы развернуть и увидеть больше
NGINX
ssl_certificate /etc/ssl/fullchain.pem;
Нажмите, чтобы развернуть и увидеть больше

Урок:

Всегда включайте intermediate certificates в цепочку.

9. Cron: окружение

Было:

CRON
0 2 * * * /home/user/backup.sh
Нажмите, чтобы развернуть и увидеть больше

backup.sh работает вручную, но не через cron.

Проблема:

У cron минимальное окружение. Нет PATH, нет переменных.

Решение:

CRON
PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
Нажмите, чтобы развернуть и увидеть больше

Урок:

В cron всегда указывайте полные пути и перенаправляйте вывод.

10. Redis: защита

Было:

CONF
# redis.conf
bind 0.0.0.0
protected-mode no
Нажмите, чтобы развернуть и увидеть больше

Проблема:

Redis доступен из интернета без пароля. Криптомайнеры говорят спасибо.

Решение:

CONF
bind 127.0.0.1 ::1
requirepass super-strong-password-here
Нажмите, чтобы развернуть и увидеть больше

Урок:

НИКОГДА не открывайте Redis/MongoDB/Elasticsearch в интернет без защиты.

Чек-лист против граблей

Бонус: универсальный дебаг

Когда ничего не помогает:

BASH
# 1. Проверить, что сервис слушает
ss -tlnp | grep :80

# 2. Проверить, что трафик доходит
tcpdump -i any port 80

# 3. Проверить DNS
dig example.com
nslookup example.com

# 4. Проверить сертификаты
openssl s_client -connect example.com:443

# 5. strace в крайнем случае
strace -f -e network nginx
Нажмите, чтобы развернуть и увидеть больше

Помните: большинство проблем - это опечатки или неправильные права. Начинайте с простого!

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D1%81%D1%82%D0%BE%D0%B8%D0%BB%D0%B8-%D0%BD%D0%B5%D1%80%D0%B2%D0%BE%D0%B2-%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%B8%D1%85-%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша