Skip to content

Commit f8b4b86

Browse files
committed
update readme, add simple example for docker and kubernetes
1 parent 86f529f commit f8b4b86

File tree

10 files changed

+222
-0
lines changed

10 files changed

+222
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# SFTP
22

3+
**Forked from atmoz to make it easier to setup on kubernetes. also add fail2ban. merges in PRs to fix a number of issues**
4+
35
![Docker Automated build](https://img.shields.io/docker/automated/atmoz/sftp.svg) ![Docker Build Status](https://img.shields.io/docker/build/atmoz/sftp.svg) ![Docker Stars](https://img.shields.io/docker/stars/atmoz/sftp.svg) ![Docker Pulls](https://img.shields.io/docker/pulls/atmoz/sftp.svg)
46

57
![OpenSSH logo](https://raw.githubusercontent.com/atmoz/sftp/master/openssh.png "Powered by OpenSSH")
@@ -35,6 +37,8 @@ This is an automated build linked with the [debian](https://hub.docker.com/_/deb
3537

3638
# Examples
3739

40+
to run the example in this project `./examples/docker-run.sh`
41+
3842
## Simplest docker run example
3943

4044
```

examples/dock-run.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
3+
# run this from the root project
4+
5+
# docker build -t yakworks/sftp .
6+
7+
docker run --name sftp --rm --cap-add=SYS_ADMIN -p 30022:22 \
8+
-v $(pwd)/examples/users.conf:/etc/sftp/users.conf \
9+
-v $(pwd)/examples/sftp-data:/sftp-data \
10+
yakworks/sftp

examples/sftp-data/test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test file

examples/users.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# user:pass:uid:gid - if gid is 27 is sudo/admin, 100 is user.
2+
# admin will get data mounted and user with get data/user/%u mounted
3+
foo:FuB4r:1001:27
4+
bar:FuB4r:1002:27
5+
cust:FuB4r:1003:100
6+
cust2:FuB4r:1004:100

kubernetes/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# K8s
2+
3+
Example on how to setup
4+
if setting up for prod run `./scripts/keygen.sh` to create new keys and replace whats in secret-host-keys.yml
5+
6+
kubectl create namespace sftp
7+
kubectl create -f secret-user-conf.yml
8+
kubectl create -f secret-host-keys.yml
9+
kubectl create -f sftp-deploy.yml
10+
11+
clean up
12+
kubectl delete secret sftp-user-conf --namespace=sftp || true
13+
kubectl delete secret sftp-host-keys --namespace=sftp || true
14+
kubectl delete service sftp --namespace=sftp || true
15+
kubectl delete deployment sftp --namespace=sftp || true

kubernetes/secret-host-keys.yml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
name: sftp-host-keys
5+
namespace: sftp
6+
type: Opaque
7+
stringData:
8+
# This is a sample. generate you own keys as these are not secure and are now public
9+
# scripts/keygen.sh can make new keys, keep them private and safe
10+
ssh_host_ed25519_key: |
11+
-----BEGIN OPENSSH PRIVATE KEY-----
12+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
13+
QyNTUxOQAAACDB5Z284hLtSd55Pul4d41HsRJOY+LIYyMlc0pvHiBpNQAAAJhiND1WYjQ9
14+
VgAAAAtzc2gtZWQyNTUxOQAAACDB5Z284hLtSd55Pul4d41HsRJOY+LIYyMlc0pvHiBpNQ
15+
AAAECC+YCk6jbhGK1yK4U5UtrYbsd1/95+wditLavq5ja8lMHlnbziEu1J3nk+6Xh3jUex
16+
Ek5j4shjIyVzSm8eIGk1AAAAEXJvb3RAYzUxZWM2YTExYTkzAQIDBA==
17+
-----END OPENSSH PRIVATE KEY-----
18+
ssh_host_ed25519_key.pub: |
19+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMHlnbziEu1J3nk+6Xh3jUexEk5j4shjIyVzSm8eIGk1 root@c51ec6a11a93
20+
ssh_host_rsa_key: |
21+
-----BEGIN RSA PRIVATE KEY-----
22+
MIIJKAIBAAKCAgEArpN+a6Wrs7TCfydsl8AvmqpDUnJOcn88IpDbjFxpXL0mE/ez
23+
OzMTsY6Omkr9voeW6IIk5eiepmXl9WiqkBFolUmo87Eg738PPuVNj2yMtZXCAFZB
24+
RbuCB01/oBDf8vlYEADq+Ef3GFMDnuBjLSzA1zSxxCLy6qj3VPk0LUtfgkld4PBz
25+
382nBV+N1AAlzLEUGXiK6t9cTvypdyKlmIbuMt+VmGCiyYtgghq86KKrHd4jTiwX
26+
ztKJqPs5oEB5pkrJ203Y6XJf9L9vGNI9rS5nr9NV1fG886TonLhZVKAQRdPsti6W
27+
E/VfX+XxPgLtGo6XD9qoaptk8mbKvfAoPwgAw7yrBk+RTnbiefj2MaBnsgSaBKMl
28+
dSLsCPmOenLJSbDOj8s9+ekrFNB5D9hKJJI+qlcoqQ/iT1LGay00if9jGtzTJvT8
29+
98t3kNZ5yNswklgBcoF777EHYD+0CBDiULqrso0LBMSuxrLxZkR6xNtmvSkawbkj
30+
+W/jUMdbBHetn/zCLMz7V0+4KMvTmDibXEhisRgC3x1M8bi+h+BqRqYTZYL18CFI
31+
ufQmsZpsKRpFqBxu7Q2oBvnQXfm3pMHxfEKdHmfgwFySQDsOaca1WnpE9SownC0F
32+
tiQRkT2cEcU/7/xKJIJWwUQtwSUUzicF348t6RzjhNS5xrxtNYTRsKlVQ+0CAwEA
33+
AQKCAgAvvYH66ilUUYBGyX822IWsJBeY+k1dnlHRmg+QCM1/YPKCz2AiNkuSaMuy
34+
ggN2ERpBpyV0AfMwyfji7aaHE1uoR6Z+TdgV5odCye415JduKPAOq4faC/b5DEZ0
35+
fWjgxzM/3SBkmTmHW1xIHFDCz9REhdJ/Mpd/eIl6oVOVd2E8/ddAZkEp2NFt9L2S
36+
ViAAJAS9GmvS4xYZO5sUS1NBrNSC8QW1z+d0ejsAGVPDwohM+Kxq+j/gfU7L+Te/
37+
DSK3SQh+goFpBbAb/CXjgcsACwqr2H1Grn7fmh9KjFdRfxw0HEpFX+QGvTlBvl4E
38+
eURh2NCSs1cPIEOwzk9vNber1QJwEPs78CQY9KK2lBY053O0zeckY3BLAvzLukPa
39+
bYDlw8xE1MjUBegtwi0wHrLFTwfMQ3MtqkF8hkC+mE90FBjySYCptQ1+7svPnbbC
40+
zr6bG6vG3t760PJGxfm9xuRuqbUu+W8oEP2KvOdizlKynUSySNKHaZth66OJtLI9
41+
sD8VluIJhMKA7xn5sTt9tFOtCe8CoQ99fk05fVOad5+AbtMKhtk1fungR8QlvKtS
42+
p9KflF+QmMT2D4p0mGNXTOc3Sw3sECAaRqIvMRrH0jLm9hQ4sGl03vMeQykxW8r2
43+
Cfmv+JifP7wNI3zx5SNx8aTUHDhD2SDF2JnPvBpc2VJeG/RqeQKCAQEA2yQuZ6t+
44+
tbTnKnBcRabOmkBEOX4ara30ChnCKPun7Jl5u0dBFQHqEDOvkZEX36hv1zfIBTq1
45+
ewQLHu2WXOFzySmcGfj53CIFmkO9Ul/bNn+P7aguw4abPx+jJKKDkr6En2FOdgoU
46+
hiVgED8un5yCLmaMznUwV1C+L0/L6pbHyyz1yA0WKbUJ80qRdVU17yO/R1KBLRzR
47+
/SQqGJ8LlFdRQqE+LP2aLAFTxK2Mj304s5464Q29ieZ8BssCOI333YIOBMSIoDwl
48+
WvMrTJxdW+sO059pTdlkIcgzbADSQcHTSlHoJm2AeVOh94R5zx5PzJl/0WwiBoUK
49+
PgCWKRo9gALQmwKCAQEAy/BrIH2qJfi0ct1aM6KEQpzpUGsRZATDgDBJ/tmOKJ/O
50+
4kJqkeEuCAVZtQppbtXyHlwbupcMfapdpBab0ospDk5zFz+zI5p5ITVwC2i6pA00
51+
YzwW3LB0NSqcDO2lPn9hxVntnPupXp5DFkzixLLlgpAX1RLlOJrz1jzWpAwMTXiG
52+
09mh8X2jae5CReWZJDGm/nQbzkRpD0OFlkkaAtuvUj8092qW2/6p5ocOUCSE6DaV
53+
xcq6C8ZI3kU6vqk/2xqP+OQh7XeW5no/sP7VDUdvBzPZE3QCYqBgv0olMFzqo7v1
54+
gTPjsfB4kRretl5hYPw6McZOXA1dTkHBrFjs+MbyFwKCAQA1kT6WsOEkYbgwM48a
55+
p4/RPOxwcVbsJZ2F6o3/nqSJvWp4UQ6jp/gjRb8hAiqnzXCpV0VZoeRC0dY2FTWw
56+
NpwrDDTQVIAfQ2HDN9PLkwru43e3TGlB+mFwqLckeWVYNaINo6eeSxCBShmVXxxy
57+
f7uCxCafQR4z+dTDk+nwyjLEg5UA9dH5F/v6sLulxtKMRly3fn99G5JpIrH3mskl
58+
1cJTWz7rmIJbR2fGp/W4DZASuBcEdGtkjia7Mly0nl98khIDMFeFc65d8RsgewiH
59+
M4pISKthEEbdyyZmvDypPkv72tG4swO4pKzu6D8uVeaDyPHpq1kV5ud+CH6sRXHL
60+
HOUJAoIBAGBQV9eNYZjzPw1sWpg+LWZkQo/3MMxir43PwHJ6fnfTGVqj8T6Z8Spa
61+
lIY6t5Zftiv+Zh4WDhEfL4A6KTci/63BAPu+2rR61LAJU7Qfrt2hWtdu3oE1WHxv
62+
dilo5nyAnkUc9moINHH6Hkbe4s3wixHBSXAYr2avT28jZl8tTXYc8NgGVUP+iPmT
63+
S3tFNrDwPiS34xXkGxXZVrKmLYGiDMe0ECi1DzAwsj6sE+dnh9k/RjaWSo0bBPjs
64+
CxVWS1EH12y9GQTUUNDidUf64dWWoent45wbUrEPewF8W9neV/Yh4400W1mC7v3g
65+
icPpCOZL2JP/SqyQpzs5NOVXTfsjwdsCggEBALQ74jyWUyLJroHHegSivuTHVRlT
66+
9S2GKH4YItTiy74bLjP1oSY+rIEYrhqiJmJ/Y4z6dve2kPZuLHW2nm92lSo+kg7f
67+
f0kap9jcS1DfwmsCiBIaVqcl6/uAUNiAeAbKBkJ0Y5+TpFNyiTT2i0a+idKG+mS5
68+
DrW0+fbIL2yJKFlDcZ8Fsgf5ckUFL4y4aLD0I503gp03Co84L2zJTzxjE1I9juer
69+
QAp1Gt2IWqad1hhU3cgwLKSjCrAtgTkjPDsm9hcoc6OWASwoz8ax1bg9IUG9ONbA
70+
CgVsC+oR7tFu+3X14Uaj92HG7/mtmiJ6vl0SAfeM2G4rRNIGAZhRveAjAgo=
71+
-----END RSA PRIVATE KEY-----
72+
ssh_host_rsa_key.pub: |
73+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCuk35rpauztMJ/J2yXwC+aqkNSck5yfzwikNuMXGlcvSYT97M7MxOxjo6aSv2+h5bogiTl6J6mZeX1aKqQEWiVSajzsSDvfw8+5U2PbIy1lcIAVkFFu4IHTX+gEN/y+VgQAOr4R/cYUwOe4GMtLMDXNLHEIvLqqPdU+TQtS1+CSV3g8HPfzacFX43UACXMsRQZeIrq31xO/Kl3IqWYhu4y35WYYKLJi2CCGrzooqsd3iNOLBfO0omo+zmgQHmmSsnbTdjpcl/0v28Y0j2tLmev01XV8bzzpOicuFlUoBBF0+y2LpYT9V9f5fE+Au0ajpcP2qhqm2TyZsq98Cg/CADDvKsGT5FOduJ5+PYxoGeyBJoEoyV1IuwI+Y56cslJsM6Pyz356SsU0HkP2Eokkj6qVyipD+JPUsZrLTSJ/2Ma3NMm9Pz3y3eQ1nnI2zCSWAFygXvvsQdgP7QIEOJQuquyjQsExK7GsvFmRHrE22a9KRrBuSP5b+NQx1sEd62f/MIszPtXT7goy9OYOJtcSGKxGALfHUzxuL6H4GpGphNlgvXwIUi59CaxmmwpGkWoHG7tDagG+dBd+bekwfF8Qp0eZ+DAXJJAOw5pxrVaekT1KjCcLQW2JBGRPZwRxT/v/EokglbBRC3BJRTOJwXfjy3pHOOE1LnGvG01hNGwqVVD7Q== root@c51ec6a11a93

kubernetes/secret-user-conf.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
name: sftp-user-conf
5+
namespace: sftp
6+
type: Opaque
7+
stringData:
8+
users.conf: |
9+
# user:pass:uid:gid - if gid is 27 is sudo/admin, 100 is user.
10+
# admin will get data mounted and user with get data/user/%u mounted
11+
foo:F**B4r:1001:27
12+
bar:F**B4r:1002:27
13+
cust:F**B4r:1003:100
14+
cust2:F**B4r:1004:100

kubernetes/sftp-deploy.yml

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
kind: Service
2+
apiVersion: v1
3+
metadata:
4+
name: sftp
5+
namespace: sftp
6+
labels:
7+
ops: sftp
8+
spec:
9+
# type: NodePort
10+
type: LoadBalancer
11+
ports:
12+
- name: ssh
13+
port: 30022
14+
targetPort: 22
15+
# nodePort: 30022
16+
selector:
17+
ops: sftp
18+
19+
---
20+
21+
kind: Deployment
22+
apiVersion: apps/v1beta2
23+
metadata:
24+
name: sftp
25+
namespace: sftp
26+
labels:
27+
ops: sftp
28+
spec:
29+
# how many pods and indicate which strategy we want for rolling update
30+
replicas: 1
31+
minReadySeconds: 10
32+
selector:
33+
matchLabels:
34+
ops: sftp
35+
template:
36+
metadata:
37+
labels:
38+
ops: sftp
39+
spec:
40+
#secrets and config
41+
volumes:
42+
- name: sftp-host-keys
43+
secret:
44+
secretName: sftp-host-keys
45+
defaultMode: 0600
46+
- name: sftp-user-conf
47+
secret:
48+
secretName: sftp-user-conf
49+
defaultMode: 0600
50+
- name: sftp-lbs-vol
51+
persistentVolumeClaim:
52+
claimName: sftp-lbs
53+
# - name: sftp-data
54+
# hostPath:
55+
# path: "/sftp-data"
56+
# type: DirectoryOrCreate
57+
containers:
58+
#the sftp server itself
59+
- name: sftp
60+
image: yakworks/sftp:latest
61+
imagePullPolicy: Always
62+
ports:
63+
- containerPort: 22
64+
securityContext:
65+
privileged: true
66+
capabilities:
67+
add: ["SYS_ADMIN"]
68+
volumeMounts:
69+
- mountPath: /etc/ssh/ssh_host_ed25519_key
70+
name: sftp-host-keys
71+
subPath: ssh_host_ed25519_key
72+
readOnly: true
73+
- mountPath: /etc/ssh/ssh_host_ed25519_key.pub
74+
name: sftp-host-keys
75+
subPath: ssh_host_ed25519_key.pub
76+
readOnly: true
77+
- mountPath: /etc/ssh/ssh_host_rsa_key
78+
name: sftp-host-keys
79+
subPath: ssh_host_rsa_key
80+
readOnly: true
81+
- mountPath: /etc/ssh/ssh_host_rsa_key.pub
82+
name: sftp-host-keys
83+
subPath: ssh_host_rsa_key.pub
84+
readOnly: true
85+
- mountPath: /etc/sftp/users.conf
86+
name: sftp-user-conf
87+
subPath: users.conf
88+
- mountPath: /sftp-data
89+
name: sftp-lbs-vol
90+
# - mountPath: /data
91+
# name: sftp-data

scripts/build.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
docker build -t yakworks/sftp .
3+
docker push yakworks/sftp

scripts/keygen.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
mkdir keys
3+
# runs the image and copies the keys out to use
4+
docker run -it --rm -v $(pwd):/workdir yakworks/sftp \
5+
cp /etc/ssh/ssh_host_ed25519_key* /etc/ssh/ssh_host_rsa_key* /workdir/keys

0 commit comments

Comments
 (0)