Caddy als Bestandsoverdracht service

Een technische blog waarin we uitleggen hoe je een export van server A naar server B kan uitvoeren met Caddy als service.

https://caddyserver.com/

De uitdaging

Voor project Foo moest een export van server A naar server B.

En dat we uit veiligheidsoverweging niet toestaan om een password login te doen.

Dus dat secure copy niet kan.

stappers@nodeA:~
$ scp projectFoo.export nodeB.lan42:
The authenticity of host 'nodeB.lan42 (192.0.2.25)' can't be established.
ECDSA key fingerprint is SHA256:I5qi1mCBPWJwYX1QSvzSMD+koVStuamiTgosJNKoJec.
Weet u zeker dat u wilt doorgaan met verbinden (ja/nee)? ja
Waarschuwing: Permanent toegevoegd 'nodeB.lan42,192.0.2.25' (ECDSA) aan de lijst van bekende hosts.
Welkom bij nodeB!
stappers@nodeB.lan42: Toestemming geweigerd (publickey).
verbroken verbinding
stappers@nodeA:~
$

Onderweg naar oplossing

Dan maar via de aanwezige webserver.
Ik had nginx verwacht, maar kom daar Caddy tegen.
Na overwegingen daar mee verder gegaan.

stappers@nodeA:~
$ sudo ss -ltp | grep nginx
stappers@nodeA:~
$ sudo ss -ltp | less
...
# op webserver port luistert process met naam "caddy"
...
stappers@nodeA:~
$

Manual page niet beschikbaar, wel een help tekst:

stappers@nodeA:~
$ caddy --help
[ERROR] eerste argument moet een subcommando zijn; zie 'caddy help
stappers@nodeA:~
$ caddy help
Caddy is een uitbreidbaar serverplatform.

gebruik:
caddy  []

commando's:
Aanpassen Past een configuratie aan naar Caddy's eigen JSON
build-info Druk informatie af over deze build
environ Prints het milieu
file-server Start een productie-klare file server op
fmt Formats een Caddyfile
hash-password Hashes een wachtwoord en schrijft base64
help Toont help voor een Caddy subcommando
list-modules Toont de geïnstalleerde Caddy modules
reload Verandert de configuratie van de lopende Caddy instantie
reverse-proxy Een snelle en productie-klare reverse proxy
run Start het Caddy proces en blokkeert voor onbepaalde tijd
start Starts the Caddy process in the background and then returns
stop Gracefully stops a started Caddy process
trust Installs a CA certificate into local trust stores
untrust Untrusts a locally-trusted CA certificate
validate Tests whether a configuration file is valid
version Prints the version

Use 'caddy help ' for more information about a command.

Full documentation is available at:
https://caddyserver.com/docs/command-line
stappers@nodeA:~
$

En dan is file server wel veelbelovend.

stappers@nodeA:~
$ caddy help file-server
A simple but production-ready file server. Useful for quick deployments,
demos, and development.

The listener's socket address can be customized with the --listen flag.

If a domain name is specified with --domain, the default listener address
will be changed to the HTTPS port and the server will use HTTPS. If using
a public domain, ensure A/AAAA records are properly configured before
using this option.

If --browse is enabled, requests for folders without an index file will
respond with a file listing.

usage:
caddy file-server [--domain ] [--root ] [--listen ] [--browse] [--access-log]

flags:
-access-log
Enable the access log
-browse
Enable directory browsing
-domain string
Domain name at which to serve the files
-listen string
The address to which to bind the listener
-root string
The path to the root of the site
-templates
Enable template rendering

Full documentation is available at:
https://caddyserver.com/docs/command-line
stappers@nodeA:~
$

De webserver opgestart om de huidige directory te laten serveren.

stappers@nodeA:~
$ caddy file-server --listen 192.0.2.24:1857 --root $PWD --browse
2020/10/14 17:01:17.196 WARN admin admin endpoint disabled
2020/10/14 17:01:17.196 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0xc00037eee0"}
2020/10/14 17:01:17.197 INFO tls cleaned up storage units
2020/10/14 17:01:17.197 INFO autosaved config {"file": "/home/stappers/.config/caddy/autosave.json"}
2020/10/14 19:01:17 Caddy 2 serving static files on 192.0.2.24:1857

Op de andere server de export opgehaald.
En een checksum berekening gedaan.

stappers@nodeB:~
$ wget https://nodeA.lan42:1857/projectFoo.export
--2020-10-14 19:01:21-- https://nodeA.lan42:1857/projectFoo.export
Resolving nodeA.lan42 (nodeA.lan42)... 192.0.2.24
Connecting to nodeA.lan42 (nodeA.lan42)|192.0.2.24|:1857... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2608012773 (2.4G) [application/gzip]
Saving to: ‘projectFoo.export’

projectFoo.export 100%[================================>] 2.43G 112MB/s in 22s

2020-10-14 19:01:44 (112 MB/s) - ‘projectFoo.export’ saved [2608012773/2608012773]

stappers@nodeB:~
$ md5sum projectFoo.export
ae49f17f951206f51dc36f6f42b3d0ef projectFoo.export
stappers@nodeB:~
$

Terug naar server A. caddy gestopt met behulp van Control-C.
En ook checksum berekend over het origineel.

^C2020/10/14 17:02:45.074 INFO shutting down {"signal": "SIGINT"}
2020/10/14 17:02:45.574 INFO tls.cache.maintenance stopped background certificate maintenance {"cache": "0xc00037eee0"}
2020/10/14 17:02:45.574 INFO shutdown done {"signal": "SIGINT"}
stappers@nodeA:~
$ md5sum projectFoo.export
ae49f17f951206f51dc36f6f42b3d0ef projectFoo.export
stappers@nodeA:~
$

Ja, dat is dezelfde checksum, project Foo kon verder op server B.

Zonder caddy had de document_root van de webserver eerst opgezocht moeten worden
en de export in die document_root gezet moeten worden voordat de wget kon gebeuren.

Bijkomende voordelen:

  • projectFoo.export heeft nooit in document_root gelegen, hoeft daar dus ook niet opgeruimd te worden.
  • projectFoo.export is niet door een gewone webserver aan de wereld getoond.

Auteur: Geert Stappers (DevOps Engineer, Hendrikx ITC)