Сбой развертывания CSS Django + Tailwind на железной дороге из-за ошибок синтаксического анализа Procfile

Я пытаюсь развернуть приложение Django со скомпилированным Tailwind CSS на Railway, но продолжаю получать ошибки при разборе Procfile. Процесс сборки работает нормально (Tailwind успешно компилируется), но на этапе синтаксического анализа Procfile происходит сбой развертывания.

Сообщение об ошибке

Nixpacks build failed
Error: Reading Procfile
Caused by:
found unknown escape character at line 1 column 44, while parsing a quoted scalar

Мои настройки

Структура проекта:

Jobflow/
├── manage.py
├── Procfile
├── requirements.txt
├── package.json
├── tailwind.config.js
├── static/
│   └── css/
│       ├── input.css
│       └── output.css (generated)
├── Jobflow/
│   ├── settings.py
│   ├── wsgi.py
│   └── urls.py
└── JobFlow_app/
    ├── models.py
    ├── views.py
    └── templates/

Текущее содержимое Procfile:

web: python manage.py runserver 0.0.0.0:$PORT

requirements.txt:

Django==4.2
python-decouple==3.8
gunicorn==21.2.0
whitenoise==6.6.0
psycopg2-binary==2.9.9
Pillow==10.1.0
dj-database-url==2.1.0

скрипты package.json:

{
  "scripts": {
    "build-css": "npx tailwindcss -i ./static/css/input.css -o ./static/css/output.css --watch",
    "build-css-prod": "npx tailwindcss -i ./static/css/input.css -o ./static/css/output.css --minify",
    "dev": "npm run build-css",
    "build": "npm run build-css-prod"
  },
  "devDependencies": {
    "tailwindcss": "^3.4.0"
  }
}

Что работает

Компиляция Tailwind CSS - Логи сборки показывают:

> npx tailwindcss -i ./static/css/input.css -o ./static/css/output.css --minify
Rebuilding...
Done in 417ms.

Установка зависимостей Python - Нет ошибок при установке pip
Статическая структура файла - Все файлы находятся в нужных местах

Что я пробовал

1. Различные форматы файлов Procfile:

web: gunicorn Jobflow.wsgi:application --bind 0.0.0.0:$PORT
web: gunicorn Jobflow.wsgi --bind 0.0.0.0:$PORT
web: python -m gunicorn Jobflow.wsgi:application --bind 0.0.0.0:$PORT
web: python manage.py runserver 0.0.0.0:$PORT

2. Способы создания файла:

# Using echo command
echo "web: python manage.py runserver 0.0.0.0:$PORT" > Procfile

# Using here document
cat > Procfile << 'EOF'
web: python manage.py runserver 0.0.0.0:$PORT
EOF
  • Создание вручную в VS Code

3. Конфигурация железной дороги:

  • Пробовал с railway.toml и без него
  • Пробовал с nixpacks.toml и без него
  • Добавлена база данных PostgreSQL
  • Заданы переменные окружения (SECRET_KEY, DEBUG=False и т.д.)

Журналы сборки (успешные части)

[stage-0 6/12] RUN npm ci ✔ 2 sec
[stage-0 8/12] RUN npm run build
> jobflow@1.0.0 build
> npm run build-css-prod
> npx tailwindcss -i ./static/css/input.css -o ./static/css/output.css --minify
Rebuilding...
Done in 417ms. ✔ 1 sec

Что я пробовал и ожидаемые результаты

1. Стандартное развертывание Gunicorn

Попытка:

web: gunicorn Jobflow.wsgi:application --bind 0.0.0.0:$PORT

Ожидается: Стандартное производственное развертывание Django с помощью Gunicorn
Результат: ошибка gunicorn: команда не найдена

2. Сервер разработки Django

Попытка:

web: python manage.py runserver 0.0.0.0:$PORT

Ожидается: Должно сработать, так как Django определенно установлен
Результат: Та же ошибка синтаксического анализа - обнаружен неизвестный escape-символ в строке 1 столбца 44

3. Опробованные методы создания файлов

Способ А - Команда Echo:

echo "web: python manage.py runserver 0.0.0.0:$PORT" > Procfile

Метод B - Вот документ:

cat > Procfile << 'EOF'
web: python manage.py runserver 0.0.0.0:$PORT
EOF

Метод C - Ручное создание в VS Code:

  • Создан новый файл с точным именем Procfile (без расширения)
  • Содержимое введено вручную: web: python manage.py runserver 0.0.0.0:$PORT
  • Сохранено в кодировке UTF-8

Результат: Все методы показывают одну и ту же ошибку: найден неизвестный escape-символ в строке 1 столбца 44

4. Тестирование переменных порта

Пробовал другой синтаксис ПОРТА:

$PORT (standard)
${PORT} (bash expansion)  
8000 (hardcoded for testing)

Результат: Все варианты по-прежнему показывают ошибку синтаксического анализа в столбце 44

Окружающая среда

  • Платформа: Железнодорожная
  • Система сборки: Пакеты Nixpacks
  • Версия для Django: 4.2
  • Версия Python: 3.11 ( (по умолчанию)
  • Локальная разработка: Windows 11, работает отлично

Вопросы

  1. Почему синтаксический анализатор Procfile в Railway считает, что в моем файле есть escape-символы, когда мой файл содержит обычный текст?
  2. Есть ли какой-то специфичный для железной дороги формат Procfile, который я должен использовать?
  3. Может ли проблема быть связана с наличием зависимостей как Node.js (для Tailwind), так и Python?
  4. Как правильно развернуть Django + Tailwind CSS на железной дороге?

Тайна

  • Столбец 44 будет находиться вокруг переменной $PORT в моем Procfile
  • Но я перепробовал все возможные варианты и методы создания файлов
  • Точно такой же формат Procfile работает и для других разработчиков в Railway
  • Локальная разработка отлично работает с той же настройкой Django

Это говорит о том, что в моей настройке есть что-то специфическое, что приводит к сбою синтаксического анализа Procfile в Railway.

есть ли у вас файл .toml для ваших nixpacks?

Преобразуйте ваши Procfile окончания строк в LF (в стиле Unix) вместо CRLF (в стиле Windows). В VS Code: откройте Procfile, нажмите CRLF в правом нижнем углу, измените на LF, затем сохраните. Это исправляет ошибку "неизвестный escape-символ" в Railway.

Вернуться на верх