parent
1d674c2d6b
commit
0381f183cb
22 changed files with 430 additions and 0 deletions
@ -0,0 +1,100 @@ |
||||
--- |
||||
|
||||
# Version to deploy |
||||
sftpgo_version: 2.1.2 |
||||
# URL of the archive |
||||
sftpgo_archive_url: https://github.com/drakkan/sftpgo/releases/download/v{{ sftpgo_version }}/sftpgo_v{{ sftpgo_version }}_linux_x86_64.tar.xz |
||||
# Expected sha1 of the archive |
||||
sftpgo_archive_sha1: 6b9ea26c53d62b47eec3ad18afeb90b6651df10c |
||||
|
||||
# Should ansible handle upgrades ? If False, only initial install will be done |
||||
sftpgo_manage_upgrade: True |
||||
|
||||
# Root dir where sftpgo will be installed |
||||
sftpgo_root_dir: /opt/sftpgo |
||||
|
||||
# User account under which sftpgo will run |
||||
sftpgo_user: sftpgo |
||||
|
||||
# Database settings |
||||
sftpgo_db_server: "{{ mysql_server | default('localhost') }}" |
||||
sftpgo_db_port: 3306 |
||||
sftpgo_db_name: sftpgo |
||||
sftpgo_db_user: sftpgo |
||||
# If the password is not defined, a random one will be created and stored under {{ sftpgo_root_dir }}/meta/ansible_dbpass |
||||
# sftpgo_db_pass: S3cr3t. |
||||
|
||||
# You can restrict access per port. This can be a list of IP (or network in CIDR notation) |
||||
# Access will be controlled by iptables |
||||
sftpgo_src_ip: [] |
||||
sftpgo_sftp_src_ip: "{{ sftpgo_src_ip }}" |
||||
sftpgo_ftp_src_ip: "{{ sftpgo_src_ip }}" |
||||
sftpgo_webdav_src_ip: "{{ sftpgo_src_ip }}" |
||||
sftpgo_http_src_ip: "{{ sftpgo_src_ip }}" |
||||
|
||||
# Base configuration of the service |
||||
sftpgo_base_conf: |
||||
common: |
||||
upload_mode: 1 |
||||
setstat_mode: 1 |
||||
temp_path: "{{ sftpgo_root_dir }}/tmp" |
||||
max_total_connections: 500 |
||||
max_per_host_connections: 20 |
||||
defender: |
||||
enabled: True |
||||
ban_time: 5 |
||||
ban_time_increment: 50 |
||||
threshold: 20 |
||||
score_invalid: 10 |
||||
score_valid: 1 |
||||
score_limit_exceeded: 10 |
||||
observation_time: 10 |
||||
sftpd: |
||||
bindings: |
||||
port: 2022 |
||||
max_auth_tries: 4 |
||||
ftpd: |
||||
bindings: |
||||
port: 2021 |
||||
passive_port_range: |
||||
start: 50000 |
||||
end: 50200 |
||||
force_passive_ip: '' |
||||
disable_active_mode: True |
||||
webdavd: |
||||
bindings: |
||||
port: 2080 |
||||
prefix: /dav |
||||
proxy_allowed: [] |
||||
data_provider: |
||||
driver: mysql |
||||
name: "{{ sftpgo_db_name }}" |
||||
host: "{{ sftpgo_db_server }}" |
||||
port: "{{ sftpgo_db_port }}" |
||||
username: "{{ sftpgo_db_user }}" |
||||
password: "{{ sftpgo_db_pass }}" |
||||
track_quota: 1 |
||||
delayed_quota_update: 60 |
||||
pool_size: 5 |
||||
users_base_dir: "{{ sftpgo_root_dir }}/data/home/" |
||||
httpd: |
||||
bindings: |
||||
port: 8080 |
||||
address: '' |
||||
proxy_allowed: [] |
||||
enable_web_admin: True |
||||
enable_web_client: True |
||||
templates_path: "{{ sftpgo_root_dir }}/app/templates" |
||||
static_files_path: "{{ sftpgo_root_dir }}/app/static" |
||||
backups_path: "{{ sftpgo_root_dir }}/backup" |
||||
max_upload_file_size: 1048576000 |
||||
telemetry: |
||||
bind_port: 0 |
||||
|
||||
# You can override and/or add custom settings here. Same format as sftpgo_base_conf |
||||
# The extra conf will be merged on top of the base conf |
||||
sftpgo_extra_conf: {} |
||||
sftpgo_conf: "{{ sftpgo_base_conf | combine(sftpgo_extra_conf, recursive=True) }}" |
||||
|
||||
|
||||
|
@ -0,0 +1,4 @@ |
||||
--- |
||||
|
||||
- name: restart sftpgo |
||||
service: name=sftpgo state=restarted |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
dependencies: |
||||
- role: mysql_server |
||||
when: sftpgo_db_server in ['localhost','127.0.0.1'] |
@ -0,0 +1,10 @@ |
||||
--- |
||||
|
||||
- name: Compress previous version |
||||
command: tar cf {{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }}.tar.zst --use-compress-program=zstd ./ |
||||
args: |
||||
chdir: "{{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }}" |
||||
warn: False |
||||
environment: |
||||
ZSTD_CLEVEL: 10 |
||||
tags: sftpgo |
@ -0,0 +1,23 @@ |
||||
--- |
||||
|
||||
- name: Create the archive dir |
||||
file: path={{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }} state=directory |
||||
tags: sftpgo |
||||
|
||||
- name: Backup previous version |
||||
copy: src={{ sftpgo_root_dir }}/app dest={{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }}/ remote_src=True |
||||
tags: sftpgo |
||||
|
||||
- name: Archive the database |
||||
mysql_db: |
||||
state: dump |
||||
name: "{{ sftpgo_db_name }}" |
||||
target: "{{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }}/{{ sftpgo_db_name }}.sql.xz" |
||||
login_host: "{{ sftpgo_db_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ mysql_admin_pass }}" |
||||
quick: True |
||||
single_transaction: True |
||||
environment: |
||||
XZ_OPT: -T0 |
||||
tags: sftpgo |
@ -0,0 +1,9 @@ |
||||
--- |
||||
|
||||
- name: Remove tmp and obsolete files |
||||
file: path={{ item }} state=absent |
||||
loop: |
||||
- "{{ sftpgo_root_dir }}/archives/{{ sftpgo_current_version }}" |
||||
- "{{ sftpgo_root_dir }}/tmp/sftpgo_v{{ sftpgo_version }}_linux_x86_64.tar.xz" |
||||
- "{{ sftpgo_root_dir }}/tmp/{{ sftpgo_version }}" |
||||
tags: sftpgo |
@ -0,0 +1,12 @@ |
||||
--- |
||||
|
||||
- name: Deploy sftpgo config |
||||
template: src=sftpgo.yml.j2 dest={{ sftpgo_root_dir }}/etc/sftpgo.yml group={{ sftpgo_user }} mode=640 |
||||
notify: restart sftpgo |
||||
tags: sftpgo |
||||
|
||||
- name: Init or upgrade the database |
||||
command: "{{ sftpgo_root_dir }}/app/sftpgo --config-file {{ sftpgo_root_dir }}/etc/sftpgo.yml initprovider" |
||||
become_user: "{{ sftpgo_user }}" |
||||
when: sftpgo_install_mode != 'none' |
||||
tags: sftpgo |
@ -0,0 +1,29 @@ |
||||
--- |
||||
|
||||
- name: Create directories |
||||
file: path={{ sftpgo_root_dir }}/{{ item.dir }} state=directory owner={{ item.owner | default(omit) }} group={{ item.group | default(omit) }} mode={{ item.mode | default(omit) }} |
||||
loop: |
||||
- dir: / |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
- dir: meta |
||||
mode: 700 |
||||
- dir: archives |
||||
omde: 700 |
||||
- dir: tmp |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
- dir: etc |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
- dir: bin |
||||
- dir: data |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
- dir: data/home |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
- dir: backup |
||||
owner: "{{ sftpgo_user }}" |
||||
mode: 700 |
||||
tags: sftpgo |
@ -0,0 +1,28 @@ |
||||
--- |
||||
|
||||
- include_vars: "{{ item }}" |
||||
with_first_found: |
||||
- vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml |
||||
- vars/{{ ansible_os_family }}-{{ ansible_distribution_major_version }}.yml |
||||
- vars/{{ ansible_distribution }}.yml |
||||
- vars/{{ ansible_os_family }}.yml |
||||
tags: sftpgo |
||||
|
||||
- name: Detect installed version |
||||
block: |
||||
- import_tasks: ../includes/webapps_set_install_mode.yml |
||||
vars: |
||||
- root_dir: "{{ sftpgo_root_dir }}" |
||||
- version: "{{ sftpgo_version }}" |
||||
- set_fact: sftpgo_install_mode={{ (install_mode == 'upgrade' and not sftpgo_manage_upgrade) | ternary('none',install_mode) }} |
||||
- set_fact: sftpgo_current_version={{ current_version | default('') }} |
||||
tags: sftpgo |
||||
|
||||
- when: sftpgo_db_pass is not defined |
||||
name: Generate a random pass for the database |
||||
block: |
||||
- import_tasks: ../includes/get_rand_pass.yml |
||||
vars: |
||||
- pass_file: "{{ sftpgo_root_dir }}/meta/ansible_dbpass" |
||||
- set_fact: sftpgo_db_pass={{ rand_pass }} |
||||
tags: sftpgo |
@ -0,0 +1,71 @@ |
||||
--- |
||||
|
||||
- name: Install dependencies |
||||
package: |
||||
name: "{{ sftpgo_packages }}" |
||||
tags: sftpgo |
||||
|
||||
- name: Stop the service during upgrades |
||||
service: name=sftpgo state=stopped |
||||
when: sftpgo_install_mode == 'upgrade' |
||||
tags: sftpgo |
||||
|
||||
- when: sftpgo_install_mode != 'none' |
||||
block: |
||||
|
||||
- name: Download sftpgo |
||||
get_url: |
||||
url: "{{ sftpgo_archive_url }}" |
||||
dest: "{{ sftpgo_root_dir }}/tmp/" |
||||
checksum: sha1:{{ sftpgo_archive_sha1 }} |
||||
|
||||
- name: Create tmp dir |
||||
file: path={{ sftpgo_root_dir }}/tmp/{{ sftpgo_version }} state=directory |
||||
|
||||
- name: Extract sftpgo archive |
||||
unarchive: |
||||
src: "{{ sftpgo_root_dir }}/tmp/sftpgo_v{{ sftpgo_version }}_linux_x86_64.tar.xz" |
||||
dest: "{{ sftpgo_root_dir }}/tmp/{{ sftpgo_version }}" |
||||
remote_src: True |
||||
|
||||
- name: Install or update the app |
||||
synchronize: |
||||
src: "{{ sftpgo_root_dir }}/tmp/{{ sftpgo_version }}/{{ item }}" |
||||
dest: "{{ sftpgo_root_dir }}/app/" |
||||
compress: False |
||||
delete: True |
||||
loop: |
||||
- sftpgo |
||||
- templates |
||||
- static |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
notify: restart sftpgo |
||||
|
||||
tags: sftpgo |
||||
|
||||
- name: Install systemd unit |
||||
template: src=sftpgo.service.j2 dest=/etc/systemd/system/sftpgo.service |
||||
register: sftpgo_unit |
||||
tags: sftpgo |
||||
|
||||
- name: Reload systemd |
||||
systemd: daemon_reload=True |
||||
when: sftpgo_unit.changed |
||||
tags: sftpgo |
||||
|
||||
# Create MySQL database |
||||
- import_tasks: ../includes/webapps_create_mysql_db.yml |
||||
vars: |
||||
- db_name: "{{ sftpgo_db_name }}" |
||||
- db_user: "{{ sftpgo_db_user }}" |
||||
- db_server: "{{ sftpgo_db_server }}" |
||||
- db_port: "{{ sftpgo_db_port }}" |
||||
- db_pass: "{{ sftpgo_db_pass }}" |
||||
tags: sftpgo |
||||
|
||||
- name: Install backups hooks |
||||
template: src={{ item }}-backup.j2 dest=/etc/backup/{{ item }}.d/sftpgo mode=700 |
||||
loop: |
||||
- pre |
||||
- post |
||||
tags: sftpgo |
@ -0,0 +1,21 @@ |
||||
--- |
||||
|
||||
- name: Handle sftpgo ports in the firewall |
||||
iptables_raw: |
||||
name: "{{ item.name }}" |
||||
state: "{{ (item.src_ip | length > 0) | ternary('present','absent') }}" |
||||
rules: "-A INPUT -m state --state NEW -p tcp {{ item.port is string | ternary('--dport ' ~ item.port, '-m multiport --dports ' ~ item.port | join(',')) }} -s {{ item.src_ip | join(',') }} -j ACCEPT" |
||||
with_items: |
||||
- port: "{{ sftpgo_conf.sftpd.bindings.port }}" |
||||
name: sftpgo_sftp_port |
||||
src_ip: "{{ sftpgo_sftp_src_ip }}" |
||||
- port: "{{ [sftpgo_conf.ftpd.bindings.port,sftpgo_conf.ftpd.passive_port_range.start ~ ':' ~ sftpgo_conf.ftpd.passive_port_range.end] }}" |
||||
name: sftpgo_ftp_port |
||||
src_ip: "{{ sftpgo_ftp_src_ip }}" |
||||
- port: "{{ sftpgo_conf.webdavd.bindings.port }}" |
||||
name: sftpgo_webdav_port |
||||
src_ip: "{{ sftpgo_webdav_src_ip }}" |
||||
- port: "{{ sftpgo_conf.httpd.bindings.port }}" |
||||
name: sftpgo_http_port |
||||
src_ip: "{{ sftpgo_http_src_ip }}" |
||||
tags: firewall,sftpgo |
@ -0,0 +1,18 @@ |
||||
--- |
||||
|
||||
- include: user.yml |
||||
- include: directories.yml |
||||
- include: facts.yml |
||||
- include: archive_pre.yml |
||||
when: sftpgo_install_mode == 'upgrade' |
||||
- include: install.yml |
||||
- include: selinux.yml |
||||
when: ansible_selinux.status == 'enabled' |
||||
- include: conf.yml |
||||
- include: iptables.yml |
||||
when: iptables_manage | default(True) |
||||
- include: services.yml |
||||
- include: write_version.yml |
||||
- include: archive_post.yml |
||||
when: sftpgo_install_mode == 'upgrade' |
||||
- include: cleanup.yml |
@ -0,0 +1,15 @@ |
||||
--- |
||||
|
||||
- name: Set correct SELinux context |
||||
sefcontext: |
||||
target: "{{ sftpgo_root_dir }}/app/sftpgo" |
||||
setype: bin_t |
||||
state: present |
||||
register: sftpgo_selinux_context |
||||
tags: sftpgo |
||||
|
||||
- name: Restore correct SELinux context |
||||
command: restorecon {{ sftpgo_root_dir }}/app/sftpgo |
||||
when: sftpgo_selinux_context.changed |
||||
tags: sftpgo |
||||
|
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- name: Start and enable the service |
||||
service: name=sftpgo state=started enabled=True |
||||
tags: sftpgo |
@ -0,0 +1,10 @@ |
||||
--- |
||||
|
||||
- name: Create sftpgo user |
||||
user: |
||||
name: "{{ sftpgo_user }}" |
||||
comment: SFTPGO User account |
||||
home: "{{ sftpgo_root_dir }}" |
||||
system: True |
||||
shell: /sbin/nologin |
||||
tags: sftpgo |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- name: Write installed version |
||||
copy: content={{ sftpgo_version }} dest={{ sftpgo_root_dir }}/meta/ansible_version |
||||
tags: sftpgo |
@ -0,0 +1,5 @@ |
||||
#!/bin/bash |
||||
|
||||
set -eo pipefail |
||||
|
||||
rm -f {{ sftpgo_root_dir }}/backup/*.sql.zst {{ sftpgo_root_dir }}/backup/id_* |
@ -0,0 +1,16 @@ |
||||
#!/bin/bash |
||||
|
||||
set -eo pipefail |
||||
|
||||
/usr/bin/mysqldump \ |
||||
{% if sftpgo_db_server not in ['localhost', '127.0.0.1'] %} |
||||
--user={{ sftpgo_db_user | quote }} \ |
||||
--password={{ sftpgo_db_pass | quote }} \ |
||||
--host={{ sftpgo_db_server | quote }} \ |
||||
--port={{ sftpgo_db_port }} \ |
||||
{% endif %} |
||||
--quick --single-transaction \ |
||||
--add-drop-table {{ sftpgo_db_name }} | \ |
||||
zstd -c > {{ sftpgo_root_dir }}/backup/{{ sftpgo_db_name }}.sql.zst |
||||
|
||||
cp -a {{ sftpgo_root_dir }}/etc/id_* {{ sftpgo_root_dir }}/backup/ |
@ -0,0 +1,33 @@ |
||||
[Unit] |
||||
Description=SFTPGo Server |
||||
After=network.target mariadb.service mysqld.service postgresql.service |
||||
|
||||
[Service] |
||||
User={{ sftpgo_user }} |
||||
Group={{ sftpgo_user }} |
||||
Type=simple |
||||
WorkingDirectory={{ sftpgo_root_dir }}/data |
||||
ExecStart={{ sftpgo_root_dir }}/app/sftpgo --config-file={{ sftpgo_root_dir }}/etc/sftpgo.yml --config-dir={{ sftpgo_root_dir }}/etc --log-file-path='' serve |
||||
ExecReload=/bin/kill -s HUP $MAINPID |
||||
KillMode=mixed |
||||
Restart=always |
||||
StartLimitInterval=0 |
||||
RestartSec=10s |
||||
PrivateTmp=true |
||||
PrivateDevices=yes |
||||
ProtectSystem=strict |
||||
ReadWritePaths={{ sftpgo_root_dir }}/etc/ {{ sftpgo_root_dir }}/data/ |
||||
ProtectHome=yes |
||||
NoNewPrivileges=yes |
||||
ProtectKernelModules=yes |
||||
ProtectKernelTunables=yes |
||||
RestrictRealtime=yes |
||||
RestrictSUIDSGID=yes |
||||
UMask=077 |
||||
MemoryLimit=2048M |
||||
# Allow binding on privileged ports |
||||
CapabilityBoundingSet=CAP_NET_BIND_SERVICE |
||||
AmbientCapabilities=CAP_NET_BIND_SERVICE |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,3 @@ |
||||
--- |
||||
|
||||
{{ sftpgo_conf | to_nice_yaml(indent=2, width=1000) }} |
@ -0,0 +1,6 @@ |
||||
--- |
||||
|
||||
sftpgo_packages: |
||||
- tar |
||||
- zstd |
||||
- mariadb |
Loading…
Reference in new issue