You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**One batch, many destinations.** Declare endpoints in YAML; add or remove
29
27
one without touching code. Every endpoint uploads in its own goroutine.
30
-
-**Three protocols, one model:**`ftp`, `ftps` (explicit AUTH TLS), and
31
-
`sftp` (password or private-key auth, host keys checked against
32
-
`~/.ssh/known_hosts`).
33
-
-**Verification on by default.** Every upload's remote size is checked
34
-
against the local file to catch truncation. Disable with `--no-verify`.
28
+
-**Three protocols:**`ftp`, `ftps` (explicit AUTH TLS), and `sftp` (password
29
+
or private-key auth, host keys from `~/.ssh/known_hosts`).
30
+
-**Verification on by default.** After each upload ramify compares the remote
31
+
size against the local file to catch truncation. Disable with `--no-verify`.
35
32
-**Retries with reconnect.** A fixed number of attempts per file with a
36
33
fixed delay, each attempt reconnecting from scratch. Configurable globally
37
34
and per endpoint.
38
35
-**Fail-fast preflight** (`--dry-run`): connect, authenticate, and prove the
39
36
target directory is writable with a self-deleting probe file, without
40
-
touching the files you are actually sending.
37
+
touching the files you are sending.
41
38
-**Automation-friendly output:** quiet / default / verbose text, or
42
-
newline-delimited JSON (`--json`), with meaningful exit codes and errors
43
-
always on stderr even under `--quiet`.
39
+
newline-delimited JSON (`--json`), with meaningful exit codes and errors on
40
+
stderr even under `--quiet`.
44
41
-**Secrets via env vars:**`${ENV_VAR}` interpolation in any config field,
45
42
resolved at load time. Literal values still allowed.
46
-
-**Zero runtime dependencies:** one static binary, no daemon, no config
47
-
server.
43
+
-**Zero runtime dependencies:** one static binary, no daemon.
48
44
49
45
## Install
50
46
@@ -90,14 +86,14 @@ amd64 and arm64 are built for every release; each archive is listed in
90
86
```
91
87
92
88
Positional arguments may be files or directories, mixed freely. Directories
93
-
expand **non-recursively**: every regular file is included; subdirectories and
94
-
dotfiles are skipped. Two inputs that would land under the same remote name
95
-
(same basename) are rejected up front.
89
+
expand **non-recursively**: ramify takes every regular file and skips
90
+
subdirectories and dotfiles. Two inputs sharing a basename would land under the
91
+
same remote name, so ramify rejects them up front.
96
92
97
93
## Configuration
98
94
99
95
Config is a YAML file with a list of `endpoints` plus optional global policy
100
-
defaults. Every policy key can be overridden per endpoint.
96
+
defaults. Any endpoint can override any policy key.
101
97
102
98
```yaml
103
99
endpoints:
@@ -125,7 +121,7 @@ endpoints:
125
121
# Global policy defaults (each overridable per endpoint):
126
122
attempts: 3# total tries per file
127
123
retry_delay: 2s
128
-
connect_timeout: 30s# bounds the whole connect + login, not just the TCP dial
124
+
connect_timeout: 30s# bounds the whole connect + login, TCP dial included
129
125
stall_timeout: 5m# fail a transfer idle this long; 0 disables
130
126
max_consecutive_connect_failures: 3# write an endpoint off after this many connect failures in a row
131
127
```
@@ -140,29 +136,29 @@ max_consecutive_connect_failures: 3 # write an endpoint off after this many co
140
136
| `port` | all | Optional; defaults to the protocol's standard port. |
141
137
| `username` | all | Required. |
142
138
| `password` | ftp, ftps, sftp | Required for ftp/ftps. For sftp, an alternative or complement to `private_key`. |
143
-
| `private_key` | sftp | Path to an SSH private key (`~` expanded). If both this and `password` are set, the key wins and `password` is used only as its passphrase when the key is encrypted. |
139
+
| `private_key` | sftp | Path to an SSH private key (`~` expanded). Set both this and `password` and the key wins; `password` then serves as the passphrase for an encrypted key. |
144
140
| `overwrite` | all | `delete-first` (default) deletes any existing remote file first; `direct` uploads straight over it. |
145
141
| `insecure_skip_verify` | ftps | Disables TLS certificate verification. For self-signed / test servers only; never use against a production endpoint. |
146
142
147
143
### Policy fields (global or per-endpoint)
148
144
149
145
| Field | Default | Meaning |
150
146
|---|---|---|
151
-
| `attempts` | `3` | Total tries per file before it is counted as failed. |
147
+
| `attempts` | `3` | Total tries per file before ramify counts it as failed. |
| `stall_timeout` | `5m` | Fails a transfer that makes no forward progress for this long. `0` disables. |
155
-
| `max_consecutive_connect_failures` | `3` | After this many connect failures in a row, the endpoint's remaining files are skipped as unreachable instead of each retrying. |
151
+
| `max_consecutive_connect_failures` | `3` | After this many connect failures in a row, ramify skips the endpoint's remaining files as unreachable instead of retrying each one. |
156
152
157
153
### Secrets
158
154
159
-
`${ENV_VAR}`interpolation works in any string field and is resolved when the
160
-
config loads. A referenced variable that is unset is a load-time error, so a
161
-
typo surfaces immediately instead of as a confusing auth failure mid-run.
155
+
`${ENV_VAR}`interpolation works in any string field, resolved when the config
156
+
loads. An unset variable is a load-time error, so you catch a typo before the
157
+
run starts rather than as a confusing auth failure mid-run.
162
158
163
-
Literal secrets are allowed but discouraged. Because a config file can hold
164
-
plaintext credentials, `ramify` prints a warning if the file is readable by
165
-
group or others; `chmod 600 stocks.yml` and keep it out of version control.
159
+
Literal secrets work but invite leaks. `ramify` warns when the config file is
160
+
readable by group or others; `chmod 600 stocks.yml` and keep it out of version
0 commit comments