Гид по технологиям

Публикация из Visual Studio по FTP и пост‑сборки

6 min read Development Обновлено 01 Dec 2025
Публикация из Visual Studio по FTP и пост‑сборки
Публикация из Visual Studio по FTP и пост‑сборки

Visual Studio. Снимок интерфейса Visual Studio с возможностью публикации проекта.

Краткое содержание

  • Публикация через FTP/FTPS
  • Настройка профиля публикации в Visual Studio
  • Пост‑сборочные скрипты для нестандартных проектов
  • Примеры PowerShell и WinSCP
  • Безопасность, альтернативы и тесты приёмки

Публикация через FTP

FTP — старый протокол и сам по себе не безопасен. При использовании для деплоя строго рекомендуем FTPS (FTP поверх TLS) или SFTP/SSH. Если сервер поддерживает FTPS — включите шифрование и отключите обычный (нешифрованный) FTP.

Важно: выделяйте FTP‑пользователей в chroot или аналогичную изоляцию, чтобы минимизировать права доступа к файловой системе.

Когда подходит

  • Веб‑приложение размещается на хостинге с FTP/FTPS доступом.
  • Требуется простая загрузка файлов без CI.

Когда не подходит

  • Для микросервисов, контейнеров или облачных сервисов лучше использовать Docker Registry, Azure App Service, или CI/CD.
  • Для библиотек и классовых проектов встроенная публикация часто недоступна.

Полезно: настройте FTPS на сервере и убедитесь, что пассивный режим и порт‑диапазон корректно проброшены через брандмауэр.

Настройка Visual Studio

Под пунктом Build у решения должна быть кнопка Publish. Если её нет — переходите сразу к варианту с пост‑сборочными скриптами.

Опция Publish в Visual Studio, пример экрана выбора публикации решения.

Создайте новый профиль публикации или отредактируйте существующий. Выберите FTPS Server, хотя доступны и Azure, Docker, Folder, IIS Web Deploy — используйте то, что подходит вам.

Выбор FTPS Server или альтернатив: Azure, Docker, папка, IIS Web Deploy.

Заполните параметры соединения: URL/хост, путь на сервере, имя пользователя и пароль. Проверьте настройки TLS/сертификата, если используется самоподписанный сертификат — добавьте исключение на стороне клиента или загрузите сертификат в доверенные.

Форма ввода данных сервера FTPS: адрес, путь, логин и пароль.

Нажмите Publish — после сборки вы увидите лог в консоли. Если что‑то пошло не так, Visual Studio покажет ошибку или лог файл для отладки.

Пост‑сборочные скрипты для других типов приложений

Если проект не поддерживает встроенную публикацию (например, class library), используйте post‑build события.

Правый клик по проекту → Properties → вкладка Build Events. Там можно добавить команду, которая выполнится после сборки. Это командная строка (cmd), поэтому для запуска PowerShell явно вызовите PowerShell.

Правый клик по проекту, открыть Properties для настройки Build Events.

Если скрипт лежит в корне проекта, а пост‑сборка выполняется из папки вывода (обычно bin/Release), вам может понадобиться подняться на несколько директорий вверх, например:

cd ..\..\..\
PowerShell -ExecutionPolicy Bypass -File .\scripts\deploy.ps1

Обратите внимание на блок из исходной инструкции:

......

Это указывает, что путь может требовать корректировок под структуру проекта.

Настройте триггер запуска: всегда, при успешной сборке или при изменении сборки. Для рестартов серверов выбирайте запуск только при обновлении сборки; в остальных случаях — при успешной сборке.

Окно редактирования переменных Post‑Build с перечнем доступных макросов.

Примеры: PowerShell Remoting и WinSCP

PowerShell не имеет встроенного FTP‑клиента, но есть варианты:

  1. Перемещение по SSH с помощью PowerShell Remoting (на Linux):
$s = New-PSSession -HostName 123.123.123.123 -UserName ubuntu
Copy-Item .example.txt /home/ubuntu -ToSession $s
Remove-PSSession $s
  1. WinSCP .NET assembly — работает для FTP/FTPS/SFTP и удобна в скриптах на PowerShell:
Add-Type -Path 'WinSCPnet.dll'
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.ParseUrl('ftp://username:password@example.com/')
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)
$session.PutFiles('c:\source\*', '/destination/').Check()
$session.Dispose()

Подсказка: храните креденшелы в защищённом хранилище, не в скриптах. Для CI используйте секреты среды.

Безопасность и соответствие

Важно:

  • Никогда не храните пароли в репозитории в явном виде.
  • Используйте секреты CI, Windows Credential Store или Azure Key Vault.
  • Предпочитайте FTPS (TLS) или SFTP (SSH) вместо plain FTP.
  • Настройте права доступа на сервере минимально необходимыми (чтение/запись только в target‑папку).

GDPR/конфиденциальность: если вы выкладываете данные пользователей, убедитесь, что сервер и транспорт соответствуют требованиям по защите данных и что логирование не сохраняет PII в явном виде.

Альтернативные подходы

  • CI/CD: GitHub Actions, Azure Pipelines, GitLab CI — для автоматических деплоев в контейнеры или облако.
  • Docker Registry и контейнеризация для микросервисов.
  • Rsync/SSH для синхронизации на Linux‑серверах.
  • FTP клиент на стороне сервера при необходимости ручного деплоя.

Когда использовать альтернативы: если требуется роллбэк, контроль версий деплоев, канареечные релизы или интеграция с тестами — CI/CD предпочтительнее.

Методология быстрого внедрения (мини‑метод)

  1. Оцените поддержку публикации в проекте (Project Type).
  2. Если поддерживается — создайте профиль FTPS и протестируйте вручную.
  3. Если не поддерживается — напишите post‑build скрипт и фиктивный профиль publish, чтобы автоматизировать.
  4. Храните секреты отдельно и проверяйте прохождение деплоя в логах.
  5. Напишите тест приёмки и регрессии для проверки результата на целевом сервере.

Контрольные списки по ролям

Разработчик:

  • Проверил профиль публикации локально.
  • Настроил post‑build для автоматизации при необходимости.
  • Не хранит пароли в репо.

DevOps:

  • Выделил пользователя FTP с chroot.
  • Настроил FTPS или SFTP и пробросил порты.
  • Настроил хранение секретов.

QA:

  • Протестировал деплой на стенде.
  • Проверил доступность приложения после публикации.

Критерии приёмки

  • Файлы из bin/Release корректно загрузились в целевую директорию.
  • Приложение запускается и проходит smoke‑тесты (HTTP 200 на главной странице).
  • В логах отсутствуют ошибки публикации.
  • Секреты не попали в публичные логи или репозиторий.

Примеры тестов и кейсы приёмки

Тест 1 — Базовая загрузка:

  • Действие: опубликовать сборку через профиль FTPS.
  • Ожидаемый результат: все артефакты присутствуют на сервере, приложение отвечает.

Тест 2 — Перезапуск сервиса:

  • Действие: пост‑сборочный скрипт перезапускает службу на сервере.
  • Ожидаемый результат: служба корректно рестартует, состояние приложения стабильно.

Тест 3 — Отказоустойчивость:

  • Действие: остановить FTPS на время деплоя.
  • Ожидаемый результат: сборка не ломает артефакты, лог ошибки информативен.

Шаблон скрипта деплоя (cheat sheet)

Простой post‑build скрипт deploy.ps1:

param([string]$buildOutput = '$(TargetDir)')
# Используйте секреты среды для логина
$ftpUrl = $env:DEPLOY_URL
$ftpUser = $env:DEPLOY_USER
$ftpPass = $env:DEPLOY_PASS
Add-Type -Path 'WinSCPnet.dll'
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Ftp
$sessionOptions.HostName = $ftpUrl
$sessionOptions.UserName = $ftpUser
$sessionOptions.Password = $ftpPass
$sessionOptions.FtpSecure = [WinSCP.FtpSecure]::Explicit
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)
$session.PutFiles((Join-Path $buildOutput '*'), '/wwwroot/').Check()
$session.Dispose()

Настройте переменные окружения в CI или в системном менеджере служб.

Таблица совместимости и ограничения

  • ASP.NET Core: встроенная поддержка publish, Azure и Docker.
  • Class Library: публикация не поддерживается — используйте post‑build и упаковку NuGet.
  • Desktop Apps: зависит от типа; часто применяют MSI/zip и разворачивают вручную.

Когда это ломается: распространённые ошибки

  • Сервер отклоняет соединение — проверьте порт, режим пассив/актив и TLS.
  • Пароли в скриптах — уязвимость безопасности.
  • Путь загрузки неверен — проверьте root/relative пути.
  • Быстрые перезапуски сервиса приводят к частичным деплойам — добавьте атомарность (загрузка в temp + переименование).

Резюме

Публикация из Visual Studio по FTP или FTPS — быстрый способ выкладывать артефакты, особенно для простых хостингов. Для проектов, которые не поддерживают встроенную публикацию, используйте post‑build скрипты, PowerShell Remoting или WinSCP. Всегда применяйте шифрование, храните секреты безопасно и добавляйте проверки приёмки.

Важно: для профессионального деплоя рекомендуем рассмотреть CI/CD и контейнеризацию — это упрощает версионирование, откаты и автоматическое тестирование.

Спасибо: если хотите, могу подготовить пример рабочего YAML для GitHub Actions, который заменит FTP на безопасный SFTP/SSH деплой или покажет, как хранить секреты в GitHub Secrets.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Учебные видео Meet Windows 11 — быстрое знакомство
Windows

Учебные видео Meet Windows 11 — быстрое знакомство

Второй администратор в Windows — быстро и безопасно
Windows

Второй администратор в Windows — быстро и безопасно

Как записывать звонки Skype в Windows
Инструкции

Как записывать звонки Skype в Windows

Развёртывание шрифтов через SCCM
IT

Развёртывание шрифтов через SCCM

Как Google отслеживает ваши данные и как его остановить
Конфиденциальность

Как Google отслеживает ваши данные и как его остановить

Как смотреть NBC Sports без кабеля
Стриминг

Как смотреть NBC Sports без кабеля