diff --git a/config/ansible/tasks/global/global.yml b/config/ansible/tasks/global/global.yml index 0e33d9b..19004ce 100644 --- a/config/ansible/tasks/global/global.yml +++ b/config/ansible/tasks/global/global.yml @@ -35,6 +35,7 @@ - trash-cli - curl - wget + - httpie # Python is used for the dotfiles CLI tools - python3 - python3-pip diff --git a/config/ansible/tasks/servers/server.yml b/config/ansible/tasks/servers/server.yml index 888b706..cc1038b 100644 --- a/config/ansible/tasks/servers/server.yml +++ b/config/ansible/tasks/servers/server.yml @@ -29,7 +29,7 @@ enabled: false - name: jellyfin enabled: true - - name: jellyfin + - name: seafile enabled: true - name: uptime-kuma enabled: true diff --git a/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 b/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 index 08cb303..652fbb3 100644 --- a/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 +++ b/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 @@ -22,3 +22,18 @@ status.vleeuwen.me status.mvl.sh { reverse_proxy uptime-kuma:3001 tls {{ caddy_email }} } + +sf.mvl.sh { + reverse_proxy seafile:80 + tls {{ caddy_email }} +} + +of.mvl.sh { + reverse_proxy onlyoffice:80 { + header_up Host {host} + header_up X-Real-IP {remote} + header_up X-Forwarded-For {remote} + header_up X-Forwarded-Proto {scheme} + } + tls {{ caddy_email }} +} diff --git a/config/ansible/tasks/servers/services/seafile/docker-compose.yml.j2 b/config/ansible/tasks/servers/services/seafile/docker-compose.yml.j2 new file mode 100644 index 0000000..77c7a27 --- /dev/null +++ b/config/ansible/tasks/servers/services/seafile/docker-compose.yml.j2 @@ -0,0 +1,90 @@ +services: + db: + image: {{ seafile_db_image | default('mariadb:10.11') }} + container_name: seafile-mysql + environment: + MYSQL_ROOT_PASSWORD: {{ seafile_mysql_root_password | default('ROOT_PASSWORD') }} + MYSQL_USER: {{ seafile_mysql_db_user | default('seafile') }} + MYSQL_PASSWORD: {{ seafile_mysql_db_password | default('PASSWORD') }} + MYSQL_DATABASE: {{ seafile_mysql_db_name | default('seafile') }} + volumes: + - {{ seafile_mysql_volume | default('/opt/seafile-mysql/db') }}:/var/lib/mysql + networks: + - seafile-net + restart: unless-stopped + + memcached: + image: {{ seafile_memcached_image | default('memcached:1.6.29') }} + container_name: seafile-memcached + entrypoint: memcached -m 256 + networks: + - seafile-net + restart: unless-stopped + + seafile: + image: {{ seafile_image | default('seafileltd/seafile-mc:12.0-latest') }} + container_name: seafile + environment: + - DB_HOST={{ seafile_mysql_db_host | default('db') }} + - DB_ROOT_PASSWD={{ seafile_mysql_root_password | default('ROOT_PASSWORD') }} + - TIME_ZONE={{ time_zone | default('Europe/Amsterdam') }} + - SEAFILE_ADMIN_EMAIL={{ seafile_admin_email | default('menno@vleeuwen.me') }} + - SEAFILE_ADMIN_PASSWORD={{ seafile_admin_password | default('WIP123') }} + - SEAFILE_SERVER_HOSTNAME={{ seafile_server_hostname | default('sf.mvl.sh') }} + - SEAFILE_SERVER_LETSENCRYPT=false + - SEADRIVE_SERVER_LETSENCRYPT=false + - SEAFILE_SERVER_PROTOCOL={{ seafile_server_protocol | default('http') }} + - JWT_PRIVATE_KEY={{ jwt_private_key | default('') }} + - ENABLE_SEADOC=false + volumes: + - {{ seafile_volume | default('/opt/seafile-data') }}:/shared + networks: + - seafile-net + - caddy_network + ports: + - 8001:80 + - 8082:8082 + - 8000:8000 + restart: unless-stopped + depends_on: + - db + - memcached + + notification-server: + image: {{ notification_server_image | default('seafileltd/notification-server:12.0-latest') }} + container_name: notification-server + environment: + - DB_HOST={{ seafile_mysql_db_host | default('db') }} + - DB_ROOT_PASSWD={{ seafile_mysql_root_password | default('ROOT_PASSWORD') }} + - TIME_ZONE={{ time_zone | default('Europe/Amsterdam') }} + volumes: + - {{ notification_server_volume | default('/opt/notification-data') }}:/shared + - {{ seafile_volume | default('/opt/seafile-data') }}:/shared/seafile + networks: + - seafile-net + - caddy_network + depends_on: + - db + - seafile + restart: unless-stopped + + onlyoffice: + image: onlyoffice/documentserver:8.3.1.1 + restart: unless-stopped + environment: + - JWT_ENABLED=true + - JWT_SECRET={{ jwt_private_key | default('') }} + - WOPI_ENABLED=false + volumes: + - {{ seafile_data_dir }}/onlyoffice/logs:/var/log/onlyoffice + - {{ seafile_data_dir }}/onlyoffice/data:/var/www/onlyoffice/Data + - {{ seafile_data_dir }}/onlyoffice/lib:/var/lib/onlyoffice + networks: + - seafile-net + - caddy_network + +networks: + seafile-net: + caddy_network: + external: true + name: caddy_default diff --git a/config/ansible/tasks/servers/services/seafile/seafile.yml b/config/ansible/tasks/servers/services/seafile/seafile.yml new file mode 100644 index 0000000..8b77af1 --- /dev/null +++ b/config/ansible/tasks/servers/services/seafile/seafile.yml @@ -0,0 +1,64 @@ +--- +- name: Deploy Seafile service + block: + - name: Set Seafile directories + ansible.builtin.set_fact: + seafile_data_dir: "/mnt/object_storage/services/seafile" + seafile_service_dir: "{{ ansible_env.HOME }}/services/seafile" + + - name: Set Seafile configuration variables + ansible.builtin.set_fact: + # Docker images + seafile_image: "seafileltd/seafile-mc:12.0-latest" + seafile_db_image: "mariadb:10.11" + seafile_memcached_image: "memcached:1.6.29" + notification_server_image: "seafileltd/notification-server:12.0-latest" + + # Volume paths + seafile_volume: "{{ seafile_data_dir }}/seafile-data" + seafile_mysql_volume: "{{ seafile_data_dir }}/seafile-mysql/db" + notification_server_volume: "{{ seafile_data_dir }}/notification-data" + + # Database settings + seafile_mysql_db_host: "db" + seafile_mysql_root_password: "{{ lookup('community.general.onepassword', 'bbzudwdo3byqs4pscd2wy7qsn4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='MYSQL_ROOT_PASSWORD') }}" + seafile_mysql_db_user: "seafile" + seafile_mysql_db_password: "{{ lookup('community.general.onepassword', 'bbzudwdo3byqs4pscd2wy7qsn4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='MYSQL_PASSWORD') }}" + + # Server settings + time_zone: "Europe/Amsterdam" + jwt_private_key: "{{ lookup('community.general.onepassword', 'bbzudwdo3byqs4pscd2wy7qsn4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='jwt_private_key') }}" + seafile_server_hostname: "sf.mvl.sh" + seafile_server_protocol: "https" + + # Admin credentials + seafile_admin_email: "menno@vleeuwen.me" + seafile_admin_password: "{{ lookup('community.general.onepassword', 'bbzudwdo3byqs4pscd2wy7qsn4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='password') }}" + + - name: Create Seafile directories + ansible.builtin.file: + path: "{{ seafile_dir }}" + state: directory + mode: "0755" + loop: + - "{{ seafile_data_dir }}" + - "{{ seafile_service_dir }}" + - "{{ notification_server_volume }}/logs" + - "{{ seafile_volume }}/logs" + loop_control: + loop_var: seafile_dir + + - name: Deploy Seafile configuration files + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ seafile_service_dir }}/docker-compose.yml" + mode: "0644" + register: seafile_configs + + - name: Stop Seafile service + ansible.builtin.command: docker compose -f "{{ seafile_service_dir }}/docker-compose.yml" down --remove-orphans + when: seafile_configs.changed + + - name: Start Seafile service + ansible.builtin.command: docker compose -f "{{ seafile_service_dir }}/docker-compose.yml" up -d + when: seafile_configs.changed diff --git a/config/home-manager/flake.lock b/config/home-manager/flake.lock index 0e263de..a1337ec 100644 --- a/config/home-manager/flake.lock +++ b/config/home-manager/flake.lock @@ -23,11 +23,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1741862977, - "narHash": "sha256-prZ0M8vE/ghRGGZcflvxCu40ObKaB+ikn74/xQoNrGQ=", + "lastModified": 1742136038, + "narHash": "sha256-DDe16FJk18sadknQKKG/9FbwEro7A57tg9vB5kxZ8kY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "cdd2ef009676ac92b715ff26630164bb88fec4e0", + "rev": "a1185f4064c18a5db37c5c84e5638c78b46e3341", "type": "github" }, "original": { @@ -39,11 +39,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1741851582, - "narHash": "sha256-cPfs8qMccim2RBgtKGF+x9IBCduRvd/N5F4nYpU0TVE=", + "lastModified": 1742069588, + "narHash": "sha256-C7jVfohcGzdZRF6DO+ybyG/sqpo1h6bZi9T56sxLy+k=", "owner": "nixos", "repo": "nixpkgs", - "rev": "6607cf789e541e7873d40d3a8f7815ea92204f32", + "rev": "c80f6a7e10b39afcc1894e02ef785b1ad0b0d7e5", "type": "github" }, "original": {