WebDAV β ΡΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° HTTP, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π² RFC4918. WebDAV Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π² HTTP Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΄Π°Π»ΡΡΡ / ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΠΈΡ , ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠΎ-ΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅Π΅ Π½Π° FTP, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° ΡΠ΅ΡΠ΅Π²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠ° NFS ΠΈΠ»ΠΈ Samba. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΆΠ΅ Π²ΡΡΡΠ½ΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ.
ΠΠ°ΡΡΠΎΠΉΠΊΠ° WebDAV-ΡΠ΅ΡΠ²Π΅ΡΠ°
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΠΈΡΡ, Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½ΠΎ Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ Π΅ΡΠ΅ ΠΈ Π·Π°Π»ΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΏΠΎ WebDAV. ΠΡΠΈΠΌΠ΅ΠΌ Π·Π° ΡΠ°Π±ΠΎΡΡΡ ΡΠ΅ΠΎΡΠΈΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ubuntu, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄Π½ΡΡ Nginx Ρ ΠΏΡΠΈΠΊΡΡΡΠ΅Π½Π½ΡΠΌ ΠΊ Π½Π΅ΠΌΡ Letβs Encrypt.
ΠΠ°Π»Π΅Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ:
sudo apt install nginx-extras
ΠΡΠ°Π²ΠΈΠΌ /etc/nginx/sites-enabled/default ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
server {
charset UTF-8;
server_name afiskon.ru;
listen 127.0.0.1:443 ssl
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
root /home/afiskon/afiskon.ru;
location /public/ {
autoindex on;
}
index index.html index.htm;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:r all:r;
client_max_body_size 100m;
create_full_put_path on;
limit_except GET {
auth_basic “Restricted”;
auth_basic_user_file /home/afiskon/.webdav_htpasswd;
}
}
}
Π£ Π²Π°Ρ ΠΏΡΡΠΈ Π²ΡΡΠ΄ Π»ΠΈ Π±ΡΠ΄ΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ. Π€Π°ΠΉΠ»Ρ Π±ΡΠ΄ΡΡ ΠΆΠΈΡΡ Π³Π΄Π΅-ΡΠΎ Π² /var/www/html.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΠΉΠ» Ρ Π»ΠΎΠ³ΠΈΠ½Π°ΠΌΠΈ-ΠΏΠ°ΡΠΎΠ»ΡΠΌΠΈ:
cd /home/afiskon/
htpasswd -c .webdav_htpasswd afiskon
chown afiskon:www-data .webdav_htpasswd
chmod 740 .webdav_htpasswd
ΠΠ°ΠΆΠ½ΠΎ! ΠΠ΅ ΠΊΠ»Π°Π΄ΠΈΡΠ΅ ΡΠ°ΠΉΠ» ΡΡΠ΄Π°, Π³Π΄Π΅ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ WebDAV. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅Π³ΠΎ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎΡΠΊΡ Π² Π½Π°ΡΠ°Π»Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°.
Π£Π±Π΅Π΄ΠΈΠΌΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠ°Π²Π°:
sudo chown -R afiskon:www-data ./afiskon.ru/
sudo chmod -R 775 ./afiskon.ru/
ΠΡΠΎΡΠΈΠΌ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³:
sudo service nginx reload
ΠΠΎΡ ΠΈ Π²ΡΡ Π½Π°ΡΡΠΎΠΉΠΊΠ°!
Π Π°Π±ΠΎΡΠ° Ρ WebDAV ΡΠ΅ΡΠ΅Π· curl
ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
curl -v -X OPTIONS –user afiskon https://afiskon.ru
ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² Π² XML:
curl -v -X PROPFIND –user afiskon https://afiskon.ru/
ΠΠ°Π³ΡΡΠ·ΠΈΡΡ ΡΠ°ΠΉΠ»:
curl -v -T file.txt –user afiskon https://afiskon.ru/
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»:
curl -v -X MOVE –header ‘Destination: https://afiskon.ru/new.txt’ \
–user afiskon https://afiskon.ru/old.txt
Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ:
curl -v -X MKCOL –user afiskon https://afiskon.ru/new-dir/
Π£Π΄Π°Π»ΠΈΡΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³:
curl -v -X DELETE –user afiskon https://afiskon.ru/some-dir/
curl -v -X DELETE –user afiskon https://afiskon.ru/some-file.txt
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΎΡΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ WebDAV Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π΄Π°ΠΆΠ΅ Π½Π° bash.
Π Π°Π±ΠΎΡΠ° Ρ WebDAV Π½Π° Python
ΠΠΎ Π½Π° bash ΠΌΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠΈΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠΊΡΠΈΠΏΡΠΎΠ²ΡΠΌ ΡΠ·ΡΠΊΠΎΠΌ. ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π½Π΅ Π·Π°ΡΠΎΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π»ΠΈΡΠ½ΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ virtualenv.
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ webdavclient3:
pip3 install webdavclient3
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
$ python3
>>> from webdav3.client import Client
>>> options = {
… ‘webdav_hostname’: ‘https://afiskon.ru’,
… ‘webdav_login’: ‘afiskon’,
… ‘webdav_password’: ‘s3cr3t’
… }
>>> client = Client(options)
ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ:
>>> client.list()
[‘file1.txt’, ‘file2.txt’ ‘dir1/’, ‘dir2/’]
ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΡΠ°ΠΉΠ»Ρ ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Ρ:
>>> client.info(‘file1.txt’)
{‘created’: ‘2020-01-23T12:34:56Z’, ‘name’: ‘file1.txt’, ‘size’: β
‘123456’, ‘modified’: ‘Thu, 23 Jan 2020 12:34:56 GMT’, ‘etag’: ”}
>>> client.is_dir(‘file1.txt’)
False
ΠΠ°Π»ΠΈΡΡ ΡΠ°ΠΉΠ» Π½Π° ΡΠ΅ΡΠ²Π΅Ρ:
>>> client.upload_sync(local_path=’/tmp/x.txt’, remote_path=’x.txt’)
Π‘ΠΊΠ°ΡΠ°ΡΡ ΡΠ°ΠΉΠ» Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°:
>>> client.download_sync(local_path=’/tmp/x.txt’, remote_path=’x.txt’)
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ:
>>> client.move(remote_path_from=’old.txt’, remote_path_to=’new.txt’)
Π‘ΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ:
>>> client.mkdir(‘new-dir’)
True
Π£Π΄Π°Π»ΠΈΡΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ:
>>> client.clean(‘new-dir/’)
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠ΅ΠΉ, Π½Π° ΠΊΠΎΠ½ΡΠ΅ Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ»ΡΡ.
ΠΠ΅ΡΠΊΡΠΎΠΏ-ΠΊΠ»ΠΈΠ΅Π½ΡΡ
Π MacOS ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ WebDAV ΡΠ΅ΡΠ΅Π· Finder. ΠΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠΈΡ ΡΡΡΠΎΠΊ ΠΎΠ½ ΡΠΌΠ΅Π» ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΡΠΌΠ°ΠΆΠΈΠ²Π°Π».
ΠΠ°ΠΊ Π΄ΠΎΡΡΠΎΠΉΠ½ΡΡ Π·Π°ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Cyberduck. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΌΠ΅Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Ρ WebDAV, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Ρ FTP, SFTP, S3, Google Drive, Dropbox ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌ Π΅ΡΠ΅. Cyberduck ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΠ΄ Windows ΠΈ MacOS. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ duck. ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΅ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ Linux. ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΠΎΠΌΡ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠ΅ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΆΠ΅ΡΡΠΊΠΈΠΉ Π΄ΠΈΡΠΊ, Π΅ΡΡΡ Π²Π°ΡΠΈΠ°ΡΠΈΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Mountain Duck, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π·Π° Π΄Π΅Π½ΡΠ³ΠΈ.
ΠΡΠ»ΠΈ Cyberduck Π²Π°ΠΌ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄ΠΎΡΠ΅Π», ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ Π² Π»ΠΈΡΠ΅ Transmit. ΠΠ°ΡΠ°Π΅ΠΌΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΏΠΎΠ΄ Linux Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π½Π° Arch Linux Wiki.
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, Ρ ΠΈΡ ΠΎΡΠΎΠ±ΠΎ Π½Π΅ ΠΈΠ·ΡΡΠ°Π». ΠΠ°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½Π½ΡΠΌ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Ρ WebDAV ΡΡΡΠ΄Π½ΠΎ ΡΠΎΡΠ΅Π²Π½ΠΎΠ²Π°ΡΡΡΡ Π² ΠΏΡΠΎΡΡΠΎΡΠ΅. WebDAV ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠΏΠΎΠΌΠΎΠΉΠΊΡ Π½Π° Raspberry Pi. ΠΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΠΉΡ. ΠΠΎ ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΈΡΡ Π½Π° Π½Π΅ΠΌ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΠΈΡΡ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ Π² GitHub Actions. Π ΠΎΠ±ΡΠ΅ΠΌ, Π·Π²ΡΡΠΈΡ ΠΊΠ°ΠΊ ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π΅ΡΠΆΠ°ΡΡ Π½Π° Π²ΠΎΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ.
Π ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ Π»ΠΈ Π²Ρ WebDAV? ΠΡΠ»ΠΈ Π΄Π°, ΡΠΎ Π² ΠΊΠ°ΠΊΠΈΡ Π·Π°Π΄Π°ΡΠ°Ρ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅?
Π‘Π²Π΅ΠΆΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ