Это происходит потому, что разрешения проверяются на каждом уровне, чтобы добраться до каталога, а не только до целевого каталога. Вы можете дать пользователю или группе разрешение на проход в каталог без возможности доступа к тому, что находится внутри него, установив бит execute для этого пользователя или группы без установки битов read или write.
Например:
chmod 710 /home/$USER
chmod 710 /home/edent/Dropbox
chmod 750 /home/edent/Dropbox/Foo
Но чтобы это сработало, вам нужно, чтобы группа для всех этих уровней была www-data
. Это несколько неаккуратно, поскольку изменение группы вашего домашнего каталога только для одного конкретного сценария может вступить в конфликт с другими вещами, которые вы захотите сделать позже.
Если у вас есть root на хосте, более аккуратным решением будет использование bind mount. В /etc/fstab
добавьте что-то вроде:
/home/edent/Dropbox/foo /var/www/html/foo none bind 0 0
Это заставит каталог Dropbox отображаться в каталоге /var/www/html
, независимо от любых других разрешений файловой системы. Теперь вам нужно беспокоиться только о разрешениях файлов внутри этого каталога, а не в иерархии над ним. Это можно рассматривать как суперсимлинк, который может охватывать файловые системы.
Например, я использую это на машине с небольшим SSD-диском для /
, а все мои большие медиафайлы находятся на отдельном большом диске. Я создаю видимость того, что эти медиафайлы находятся в моем домашнем каталоге с помощью:
/media/bigdrive/media /home/me/media none bind 0 0
Вы можете развернуть свой код из репозитория git с помощью rsync
. Файл, например. exclude-rsync.txt
может содержать все файлы и каталоги (по одному в строке )вы не хотите развертывать в целевом объекте (также может быть новым каталогом ).
исключить -rsync.txt
.git
.gitignore
include/database.yml
команда rsync
rsync -avz --delete --exclude-from=exclude-rsync.txt. foo@192.168.0.123:/var/www/foobar/
Конвейеры CI/CD
С помощью gitlab, travis ci (и jenkins )вы можете определить конвейеры ci/cd обычно в файле yaml. Всякий раз, когда что-то отправляется в git (lab )или ветка объединяется с мастером, конвейер запускается автоматически. Для gitlab вы должны добавить файл с именем .gitlab-ci.yml
, и он может выглядеть так:
stages:
- deploy
deploy_production:
stage: deploy
environment: production
only:
- master@my_repo
before_script:
- yum -y install rsync
script:
- |
rsync -avz --delete --exclude-from=exclude-rsync.txt. foo@192.168.0.123:/var/www/foobar/
Но в более простом случае вы бы добавили файл оболочки, например. deploy.sh
имея в виду, что такие конвейеры существуют, и это может быть хорошей практикой.
#!/bin/bash
rsync -avz --delete --exclude-from=exclude-rsync.txt. foo@192.168.0.123:/var/www/foobar/