Как автоматически загружать измененные файлы на vps?
Имеется vps на ubuntu 18.04 с apache, имеется локально созданный php проект, проблема заключается в том, что я не знаю как лучше организовать отправку локально редактируемых файлов на удаленный сервер в процессе разработки. Знаю, что можно сделать деплой с помощью гита, например, но мне это кажется неудобным, так как если мне надо будет отредактировать буквально одно слово и проверить как отработает приложение, то на это будет создаваться отдельный коммит, что знатно засрет историю коммитов. Другой вариант - фтп, в phpstorm даже есть настройка деплоя с помощью фтп, но тут я столкнулся с другой проблемой. Во первых, после установки фтп на сервере, у меня появился отдельный юзер - ftpuser, то есть файлы созданные локально будут отправленны на сервер с владельцем ftpuser, и все директории так же должны принадлежать ему, отсюда следует, что мне нужно добавить основного юзера сервера, от которого запущены процессы apache и прочие и www-data в группу ftpuser, плюс выставить директориям права 775, а файлам 664, хотя по рекомендациям в интернете лучше ставить 755 и 644 соответственно, из-за чего мне и кажется, что весь этот подход костыльный. Короче подскажите как правильнее всего организовать эту пересылку файлов.
P. S. И да, локальная разработка на локальном сервере мне не подходит из-за специфики приложения.
Есть множество вариантов. На мой взгляд в качестве протокола наиболее удобно использовать ssh (sftp).
Вы не написали, в какой ОС вы работаете, но я просто упомяну, что чтобы не привязываться к IDE можно использовать, например, winscp(Windows) или lsyncd(linux) для live синхронизации кода.
В phpstorm, насколько я понимаю, наряду с ftp можно выбрать и sftp. Но нужно понимать, что переключении между ветками, когда код изменяется не через сохранение файла, а извне редактора он не будет синхронизирован с сервером. В таком случае для синхронизации всего кода удобно использовать rsync (что на linux, что на windows).
Насчет пользователя и прав - на мой взгляд, веб-сервер не должен иметь прав на запись к исходному коду. То есть нужно при создании инстанса на сервере создать структуру папок, где веб-сервер имеет права на запись только к runtime директориям. А синхронизируемый код - он должен быть доступен серверу только на чтение.
Отмечу, что я говорю именно об "девелоперском" инстансе, который нужен исключительно для текущей работы. Для инстансов, которые деплоятся автоматически из git ситуация с правами может быть иной и это отдельный вопрос.
> Знаю, что можно сделать деплой с помощью гита ...
Вы все правильно написали - это извращение использовать деплой из гита в процессе работы. Дело даже не в лишних коммитах - от них потом можно избавиться. А в совершенно лишних действиях, даже если их автоматизировать на синхронизацию будет уходить неоправданно много времени. Вместо долей секундны будут секунды. Деплой из гита удобно использовать для переноса уже готовых изменений, а не в процессе работы над ними.
Если есть вопросы - спрашивайте в комментариях, я дополню ответ.
Спасибо за развернутый ответ! Работаю в windows, про winscp не знал, посмотрю поподробнее. На счет "прав на запись к исходному коду" не совсем понял. На данном этапе у меня сервер может писать в корень веб-приложения и любые вложенные папки, а что такое рантайм директории не очень понимаю. И еще можно ли разъяснить про девелоперский и прочие инстансы, не силен в терминологии?:) Ну то есть сейчас мой сервер это и девелоп и прод, так как приложение больше делаю для себя
Под рантаймом я имею ввиду любые данные, которые создатся в процессе работы приложения (сайта). Например: различные логи, загруженные пользователеми файлы, файлы созданные сервером (допустим, какие-то отчеты, которые пользователь потом может скачать).
И вот веб-сервер должен иметь права на запись только к тем директориям, к которым необходимо. А к самому коду в идеале он не должен иметь прав на запись - только на чтение. Из соображений безопастности. Вообще, это очень упрощенно и не совсем верно, но это не тема твоего вопроса, так что углубляться не буду.
Под инстансом я понимаю экземпляр приложения. Они могут быть как на одном, так и на разных серверах. Даже в самом простом случае обычно есть боевой инстанс - основной, которым пользуются пользователи и девелоперский - в него разработчик вносит свои изменения и тут же их проверяет. часто он запущен локально на машине разработчика. А вообще их может быть много - боевой, копия боевого, тестовый, вплоть до того, что на каждую отдельную задачу отдельный инстанс. Зависит от конкретного workflow.
> Ну то есть сейчас мой сервер это и девелоп и прод, так как приложение больше делаю для себя
В таком случае, конечно, меньше смысла иметь несколько инстансов. Но он все равно есть. Хотя-бы в том, что ты можешь пользоваться приложением и спокойно модифицировать его параллельно, не ломая (изменяя) работающую версию.
> Работаю в windows, про winscp не знал, посмотрю поподробнее.
Я, возможно, не очень понятно изначально выразил свою мысль. Я хотел сказать, что если пользоваться функционалом синхронизации в phpStorm - тебе дополнительно нужен только rsync. winscp или lsyncd не нужны - они именно для live синхронизации, с чем вполне справится phpStorm. А rsync - для синхронизации изменений сделанных извне редактора. Например, при переключении между ветками.
Если же phpStorm чем-то не устраивает, тогда да - winscp. По удобству он проиграывает lsyncd, но с него проще начать. Запустить lsyncd на windows я пробовал b у меня были какие-то проблемы, но это было давно, время идет - может быть сейчас их уже не будет, учитывая что в Win10 завезли линуксовое ядро.
Ну во-вопервых не бойтесь множества коммитов какая разница (если Вы не из тех которые устанавливают громкость телевизора величине кратное 5) это очень удобно когда шторм подсвечивает изменения и вы в один клик можете вернуть старую версию того или иного куска кода или быстро посмотреть что было до ваших правок и не злоупотреблять комбинацией ctrl+z которая имеет свой лимит или же после выхода из шторма очищаться.
А во-вторых по поводу ФТП включите фтп-пользователя в группу или наооборот админа в одну группу с фтп-пользователем и настраивайте папки на группу.
Ну так вот сейчас я добавил админа и www-data (тоже юзер или процесс, точно не уверен) в группу к фтп пользователю, но тогда мне надо повысить права группы на директории и файлы, не опасно ли это? Дают ли какие-нибудь проблемы с безопасностью в перспективе права 775 и 664 вместо 755 и 644? Мне как новичку не видится особой угрозы, но я могу ошибаться, поэтому лучше подстраховаться мнением уже опытного коллеги. А насчет гита, вот изменю я одно слово в коде и как коммит такой обозвать? А потом же вся эта куча бесполезных по большей части коммитов утечет в репозиторий github, а если еще и при устройстве на работу дать ссылку на такую репу, то совсем со стыда сгореть можно:)
коммит можно назвать fix или hot fix))) в проектах где нет тестов ( а их огромное множество потому как за них никто не хочет платить) это нормальное явление.
по правам я думаю проблем не должно быть. Обычно публичные дирректории куда загружают документы и изображения часто выставляют в 777 и четко проверяют на тип загружаемых файлов чтоб это не были скрипты.
Ну и по хорошему надо пользоваться всякими деплоерами или ci потому как если заморачиваться по безопасности то если деплоить через гит а злоумышленник взломает сервер то можно лишиться гитовского репозитория
Работаю аналогично, использую NFS (network file system)
nfs на сервере работает от пользователя www-data
все файлы правлю и в режиме онлайн они в браузере доступны, очень удобно
Когда надо git - захожу на сервер по ssh и делаю коммит.
в качестве IDE использую sublime который умеет подсвечивать все изменения в гите