aboutsummaryrefslogtreecommitdiff
path: root/roles/seafile_non_docker
diff options
context:
space:
mode:
authorKumar <kumar@kumardamani.xyz>2021-11-23 14:59:08 +0000
committerKumar Damani <me@kumardamani.net>2022-03-25 19:45:25 +0000
commita857eb82ec9c4a79ad5e41462e2ab82c2660982e (patch)
tree9ca51ddfb551322bd4d2fa3f949fa8898032632d /roles/seafile_non_docker
initial commit
Diffstat (limited to 'roles/seafile_non_docker')
-rw-r--r--roles/seafile_non_docker/README.md60
-rw-r--r--roles/seafile_non_docker/defaults/main.yaml10
-rw-r--r--roles/seafile_non_docker/handlers/main.yaml19
-rw-r--r--roles/seafile_non_docker/tasks/main.yaml220
-rw-r--r--roles/seafile_non_docker/templates/ccnet.conf.j22
-rw-r--r--roles/seafile_non_docker/templates/seafdav.conf.j26
-rw-r--r--roles/seafile_non_docker/templates/seafile.service.j214
-rw-r--r--roles/seafile_non_docker/templates/seahub.service.j214
8 files changed, 345 insertions, 0 deletions
diff --git a/roles/seafile_non_docker/README.md b/roles/seafile_non_docker/README.md
new file mode 100644
index 0000000..e806c13
--- /dev/null
+++ b/roles/seafile_non_docker/README.md
@@ -0,0 +1,60 @@
+# Ansible - Seafile
+
+## Example Playbook
+```
+# Direct Access: http://art-jr:8000/
+# Domain Access: http://kumardamani.xyz/files
+- hosts: compute
+ gather_facts: false
+ tags: 'seafile'
+ become: true
+ roles:
+ - role: seafile_non_docker
+ vars:
+ seafile_user_email: 'kumar@kumardamani.xyz'
+ seafile_user_password: '{{ vault_seafile_user_password }}'
+ seafile_domain: 'kumardamani.xyz'
+ seafile_data_dir: '{{ data_vol_hdd }}/seafile'
+```
+
+## Nginx Conf
+```
+ location /files/ {
+ proxy_pass http://127.0.0.1:8000;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Host $server_name;
+ proxy_set_header X-Forwarded-Proto https;
+ proxy_read_timeout 1200s;
+ # used for view/edit office file via Office Online Server
+ client_max_body_size 0;
+ error_log /var/log/nginx/seahub.error.log;
+ }
+ location /seafhttp/ {
+ rewrite ^/seafhttp(.*)$ $1 break;
+ proxy_pass http://127.0.0.1:8082;
+ client_max_body_size 0;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_connect_timeout 36000s;
+ proxy_read_timeout 36000s;
+ proxy_send_timeout 36000s;
+ send_timeout 36000s;
+ error_log /var/log/nginx/seafhttp.error.log;
+ }
+ location /seafmedia/ {
+ rewrite ^/seafmedia(.*)$ /media$1 break;
+ root /opt/seafile/seafile-server-latest/seahub;
+ }
+ location /seafdav/ {
+ proxy_pass http://127.0.0.1:8080;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Host $server_name;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_read_timeout 1200s;
+ client_max_body_size 0;
+ error_log /var/log/nginx/seafdav.error.log;
+ }
+```
diff --git a/roles/seafile_non_docker/defaults/main.yaml b/roles/seafile_non_docker/defaults/main.yaml
new file mode 100644
index 0000000..9df3048
--- /dev/null
+++ b/roles/seafile_non_docker/defaults/main.yaml
@@ -0,0 +1,10 @@
+# Default Values
+---
+
+# https://github.com/haiwen/seafile-rpi/releases
+seafile_version: '8.0.7'
+seafile_download_url: 'https://github.com/haiwen/seafile-rpi/releases/download/v{{ seafile_version }}/seafile-server-{{ seafile_version }}-buster-armv7l.tar.gz'
+
+seafile_install_dir: '/opt/seafile'
+seafile_data_dir: ''
+seafile_user_grp: '{{ ansible_user }}'
diff --git a/roles/seafile_non_docker/handlers/main.yaml b/roles/seafile_non_docker/handlers/main.yaml
new file mode 100644
index 0000000..73f755f
--- /dev/null
+++ b/roles/seafile_non_docker/handlers/main.yaml
@@ -0,0 +1,19 @@
+---
+
+- name: 'Restart nginx'
+ systemd:
+ name: 'nginx'
+ state: 'restarted'
+ listen: 'nginx_restart'
+
+- name: 'Restart Seafile'
+ systemd:
+ name: 'seafile'
+ state: 'restarted'
+ listen: 'seafile restart'
+
+- name: 'Restart Seahub'
+ systemd:
+ name: 'seahub'
+ state: 'restarted'
+ listen: 'seahub restart'
diff --git a/roles/seafile_non_docker/tasks/main.yaml b/roles/seafile_non_docker/tasks/main.yaml
new file mode 100644
index 0000000..597c389
--- /dev/null
+++ b/roles/seafile_non_docker/tasks/main.yaml
@@ -0,0 +1,220 @@
+# https://seafile.readthedocs.io/en/latest/config/seafile/seadav/#seafdav-configuration
+# https://manual.seafile.com/deploy/using_sqlite/
+# https://manual.seafile.com/deploy/using_sqlite/#setup-in-non-interactive-way
+# https://manual.seafile.com/deploy/deploy_with_nginx
+# https://manual.seafile.com/deploy/deploy_seahub_at_non-root_domain/
+# https://seafile.readthedocs.io/en/latest/installation/seafile/#enable-seafile-server-autostart-systemd
+---
+
+- name: 'install required apt packages'
+ apt:
+ name:
+ - 'libmemcached-dev'
+ - 'memcached'
+ - 'pwgen'
+ - 'python3'
+ - 'python3-setuptools'
+ - 'python3-pip'
+ - 'sqlite3'
+ - 'libopenjp2-7'
+ - 'libtiff5'
+ state: 'present'
+ update_cache: true
+
+- name: 'install required pip packages'
+ become_user: '{{ seafile_user_grp }}'
+ pip:
+ name:
+ - 'captcha'
+ - 'django==2.2.*'
+ - 'django-pylibmc'
+ - 'django-simple-captcha'
+ - 'future'
+ - 'jinja2'
+ - 'Pillow'
+ - 'psd-tools'
+ - 'pylibmc'
+ - 'pexpect'
+ state: 'present'
+
+- name: 'create seafile installation and data directories'
+ file:
+ path: '{{ item.path }}'
+ state: 'directory'
+ owner: '{{ item.owner }}'
+ group: '{{ item.group }}'
+ mode: '{{ item.mode }}'
+ loop:
+ - {path: '{{ seafile_install_dir }}/installed', owner: '{{ seafile_user_grp }}', group: '{{ seafile_user_grp }}', mode: '775'}
+ - {path: '{{ seafile_data_dir }}', owner: '{{ ansible_user }}', group: '{{ ansible_user }}', mode: '755'}
+
+- name: 'download seafile package to local folder'
+ become_user: '{{ seafile_user_grp }}'
+ get_url:
+ url: '{{ seafile_download_url }}'
+ dest: '{{ seafile_install_dir }}/installed/seafile-{{ seafile_version }}.tar.gz'
+ mode: '644'
+ register: '_download_archive'
+ until: '_download_archive is succeeded'
+ retries: 5
+ delay: 2
+ check_mode: false
+
+- name: 'unpack seafile binaries'
+ become_user: '{{ seafile_user_grp }}'
+ unarchive:
+ src: '{{ seafile_install_dir }}/installed/seafile-{{ seafile_version }}.tar.gz'
+ dest: '{{ seafile_install_dir }}'
+ remote_src: true
+ creates: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+ check_mode: false
+
+# this hack is needed for this version only
+- name: 'Remove old PIL dir'
+ become_user: '{{ seafile_user_grp }}'
+ file:
+ path: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}/seahub/thirdpart/PIL'
+ state: 'absent'
+ when: '"buster" in seafile_download_url'
+
+# RUN NON-INTERACTIVELY
+- name: 'Run setup script' # noqa no-changed-when command-instead-of-shell
+ become_user: '{{ seafile_user_grp }}'
+ shell: './setup-seafile.sh auto -n "{{ inventory_hostname }}" -i "0.0.0.0"'
+ args:
+ executable: '/bin/bash'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+ creates: '{{ seafile_install_dir }}/conf/ccnet.conf'
+
+- name: 'Get stats of the data object'
+ stat:
+ path: '{{ seafile_install_dir }}/seafile-data'
+ register: sym
+
+- block:
+ - name: 'Ensure Seafile is not running yet' # noqa command-instead-of-shell
+ become_user: '{{ seafile_user_grp }}'
+ shell: './seafile.sh stop'
+ args:
+ executable: '/bin/bash'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+
+ - name: 'Move old data to new data' # noqa risky-file-permissions
+ become_user: '{{ seafile_user_grp }}'
+ copy:
+ src: '{{ seafile_install_dir }}/seafile-data/'
+ dest: '{{ seafile_data_dir }}'
+ remote_src: true
+
+ - name: 'Delete old data dir'
+ become_user: '{{ seafile_user_grp }}'
+ file:
+ path: '{{ seafile_install_dir }}/seafile-data'
+ state: 'absent'
+
+ - name: 'Create symlink to new data dir'
+ become_user: '{{ seafile_user_grp }}'
+ file:
+ src: '{{ seafile_data_dir }}'
+ dest: '{{ seafile_install_dir }}/seafile-data'
+ state: 'link'
+ when: sym.stat.islnk is defined and (not sym.stat.islnk) # => first time setup
+
+- name: 'Copy conf files'
+ become_user: '{{ seafile_user_grp }}'
+ template:
+ src: '{{ item }}.j2'
+ dest: '{{ seafile_install_dir }}/conf/{{ item }}'
+ mode: '644'
+ loop:
+ - 'ccnet.conf'
+ - 'seafdav.conf'
+ notify:
+ - 'seafile restart'
+ - 'seahub restart'
+
+- name: 'Update gunicorn conf'
+ lineinfile:
+ path: '{{ seafile_install_dir }}/conf/gunicorn.conf.py'
+ regexp: '^bind'
+ line: 'bind = "127.0.0.1:8000"'
+ notify:
+ - 'seahub restart'
+
+# some stuff needed for nginx based install
+- name: 'Update seahub_settings.py'
+ become_user: '{{ seafile_user_grp }}'
+ blockinfile:
+ path: '{{ seafile_install_dir }}/conf/seahub_settings.py'
+ insertafter: '^SECRET_KEY'
+ block: |
+ DEBUG = False
+ FILE_SERVER_ROOT = 'https://{{ seafile_domain }}/seafhttp'
+ SERVE_STATIC = False
+ MEDIA_URL = '/seafmedia/'
+ COMPRESS_URL = MEDIA_URL
+ STATIC_URL = MEDIA_URL + 'assets/'
+ SITE_ROOT = '/files/'
+ LOGIN_URL = '/files/accounts/login/'
+ notify:
+ - 'seahub restart'
+
+- block:
+ - name: 'Run Seafile start script' # noqa command-instead-of-shell
+ become_user: '{{ seafile_user_grp }}'
+ shell: './seafile.sh start'
+ args:
+ executable: '/bin/bash'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+
+ - name: 'Init Seahub with a user'
+ become_user: '{{ seafile_user_grp }}'
+ expect:
+ command: './seahub.sh start'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+ responses:
+ (?i)email: "{{ seafile_user_email }}"
+ (?i)password: "{{ seafile_user_password }}"
+
+ when: sym.stat.islnk is defined and (not sym.stat.islnk) # => first time setup
+
+- name: 'Create systemd services'
+ template:
+ src: '{{ item }}.j2'
+ dest: '/etc/systemd/system/{{ item }}'
+ mode: '644'
+ loop:
+ - 'seafile.service'
+ - 'seahub.service'
+ notify:
+ - 'seafile restart'
+ - 'seahub restart'
+
+- name: 'Reload systemd units'
+ systemd:
+ daemon_reload: true
+
+- block:
+ - name: 'Run Seahub start script' # noqa command-instead-of-shell
+ become_user: '{{ seafile_user_grp }}'
+ shell: './seahub.sh stop'
+ args:
+ executable: '/bin/bash'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+
+ - name: 'Run Seafile stop script' # noqa command-instead-of-shell
+ become_user: '{{ seafile_user_grp }}'
+ shell: './seafile.sh stop'
+ args:
+ executable: '/bin/bash'
+ chdir: '{{ seafile_install_dir }}/seafile-server-{{ seafile_version }}'
+ when: sym.stat.islnk is defined and (not sym.stat.islnk) # => first time setup
+
+- name: 'Start Seafile and Seahub'
+ systemd:
+ name: '{{ item }}'
+ state: 'started'
+ enabled: true
+ loop:
+ - 'seafile'
+ - 'seahub'
diff --git a/roles/seafile_non_docker/templates/ccnet.conf.j2 b/roles/seafile_non_docker/templates/ccnet.conf.j2
new file mode 100644
index 0000000..d6d69cb
--- /dev/null
+++ b/roles/seafile_non_docker/templates/ccnet.conf.j2
@@ -0,0 +1,2 @@
+[General]
+SERVICE_URL = https://{{ seafile_domain }}/files
diff --git a/roles/seafile_non_docker/templates/seafdav.conf.j2 b/roles/seafile_non_docker/templates/seafdav.conf.j2
new file mode 100644
index 0000000..54712a1
--- /dev/null
+++ b/roles/seafile_non_docker/templates/seafdav.conf.j2
@@ -0,0 +1,6 @@
+[WEBDAV]
+enabled = true
+port = 8080
+fastcgi = false
+host = 127.0.0.1
+share_name = /seafdav
diff --git a/roles/seafile_non_docker/templates/seafile.service.j2 b/roles/seafile_non_docker/templates/seafile.service.j2
new file mode 100644
index 0000000..8e4c94f
--- /dev/null
+++ b/roles/seafile_non_docker/templates/seafile.service.j2
@@ -0,0 +1,14 @@
+[Unit]
+Description=Seafile
+After=network.target
+
+[Service]
+Type=forking
+ExecStart={{ seafile_install_dir }}/seafile-server-latest/seafile.sh start
+ExecStop={{ seafile_install_dir }}/seafile-server-latest/seafile.sh stop
+LimitNOFILE=infinity
+User={{ seafile_user_grp }}
+Group={{ seafile_user_grp }}
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/seafile_non_docker/templates/seahub.service.j2 b/roles/seafile_non_docker/templates/seahub.service.j2
new file mode 100644
index 0000000..aa61a83
--- /dev/null
+++ b/roles/seafile_non_docker/templates/seahub.service.j2
@@ -0,0 +1,14 @@
+[Unit]
+Description=Seahub
+After=network.target seafile.service
+
+[Service]
+Type=forking
+ExecStart={{ seafile_install_dir }}/seafile-server-latest/seahub.sh start
+ExecStop={{ seafile_install_dir }}/seafile-server-latest/seahub.sh stop
+LimitNOFILE=infinity
+User={{ seafile_user_grp }}
+Group={{ seafile_user_grp }}
+
+[Install]
+WantedBy=multi-user.target