Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| services:radicale [2024/02/22 08:54] – created willy | services:radicale [2025/09/16 13:10] (current) – [WEB GUI to Radicale] willy | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Radicale ====== | ====== Radicale ====== | ||
| - | [[https:// | + | [[https:// |
| [[https:// | [[https:// | ||
| Line 9: | Line 9: | ||
| To add support for both, which will allow your phone to sync contacts and calendars with your home server, i choose to use the great, simple and effective [[https:// | To add support for both, which will allow your phone to sync contacts and calendars with your home server, i choose to use the great, simple and effective [[https:// | ||
| - | Please note that Radicale do not provide a user-interface to **edit** or **use** calendars or contacts, you need third party apps for that. | + | Please note that Radicale do not provide a user-interface to **edit** or **use** calendars or contacts, you need third party apps for that, and the one i am currently using is [[https:// |
| To install radicale, of course, you need it's dedicated user, so add user: | To install radicale, of course, you need it's dedicated user, so add user: | ||
| Line 22: | Line 22: | ||
| </ | </ | ||
| - | Radicale uses //pip//, so as usual enable it on Gentoo for user Radicale by creating the file **/ | + | Radicale uses //pip//, so as usual enable it on Gentoo for user Radicale by creating the file **/ |
| - | <file pip.conf> | + | < |
| [global] | [global] | ||
| break-system-packages = true | break-system-packages = true | ||
| Line 37: | Line 37: | ||
| Create the config file **~/ | Create the config file **~/ | ||
| <file - config> | <file - config> | ||
| + | [server] | ||
| # Bind all addresses | # Bind all addresses | ||
| hosts = 127.0.0.1: | hosts = 127.0.0.1: | ||
| Line 47: | Line 48: | ||
| [storage] | [storage] | ||
| filesystem_folder = / | filesystem_folder = / | ||
| - | </code> | + | </file> |
| then start it: | then start it: | ||
| Line 56: | Line 57: | ||
| ==== Reverse Proxy ==== | ==== Reverse Proxy ==== | ||
| + | |||
| + | Radicale can be hosted both on subdomain or subpath, but i choose subdomain to make it easier to also host InfCloud on the same subdomain. | ||
| As usual you want it protected by the Reverse Proxy, so create the **radicale.conf** file: | As usual you want it protected by the Reverse Proxy, so create the **radicale.conf** file: | ||
| <file - radicale.conf> | <file - radicale.conf> | ||
| - | location | + | server { |
| - | # The trailing / is important! | + | server_name radicale.mydomain.com; |
| - | proxy_pass | + | listen 443 ssl; |
| - | proxy_set_header | + | listen 8443 ssl; |
| - | proxy_set_header | + | http2 on; |
| - | proxy_set_header | + | |
| - | proxy_pass_header Authorization; | + | include " |
| - | proxy_set_header | + | |
| - | # to prevent timeouts importing huge calendars or contacts lists | + | access_log / |
| - | | + | error_log |
| - | | + | |
| + | location / { # The trailing / is important! | ||
| + | proxy_pass | ||
| + | proxy_set_header | ||
| + | | ||
| + | | ||
| + | proxy_set_header | ||
| + | proxy_pass_header Authorization; | ||
| + | | ||
| + | include " | ||
| + | } | ||
| + | |||
| + | location /gui/ { # The trailing / is important! | ||
| + | proxy_pass | ||
| + | | ||
| + | proxy_set_header | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | include com.mydomain/ | ||
| } | } | ||
| </ | </ | ||
| add this config file to NGINX (see [[selfhost: | add this config file to NGINX (see [[selfhost: | ||
| - | Now go with browser | + | This set-up links also Radicale |
| - | ==== Autostart ==== | + | Now go with browser to **https:// |
| - | Autostart, put this into **/ | + | === URLs summary === |
| - | <file - 50-radicale.start> | + | |
| - | #!/bin/bash | + | |
| - | start-stop-daemon | + | The following URL's are exposed between Radicale and InfCloud: |
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | And, last, when setting up your *DAV clients (like on Android or similar), use **https:// | ||
| + | |||
| + | |||
| + | ===== Startup ===== | ||
| + | |||
| + | Since i use OpenRC, to start radicale simply create the following script under / | ||
| + | < | ||
| + | # | ||
| + | # Copyright 1999-2021 Gentoo Authors | ||
| + | # Distributed under the terms of the GNU General Public License v2 | ||
| + | |||
| + | description=" | ||
| + | pidfile=" | ||
| + | command_background=true | ||
| + | command=" | ||
| + | command_args="" | ||
| + | command_user=" | ||
| + | |||
| + | depend() { | ||
| + | need net | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Make it executable and add the service to the default runlevel: | ||
| + | <code bash> | ||
| + | chmod +x / | ||
| + | rc-update add radicale default | ||
| </ | </ | ||
| + | |||
| + | ==== Sharing calendars ==== | ||
| + | |||
| + | Radicale doesn' | ||
| + | |||
| + | So, first of all login on Radicale web GUI with all the users you want to share the calendar with, then create in one of them the actual calendar. | ||
| + | |||
| + | At this point, you only need to link the calendar folder inside all he users: | ||
| + | <code bash> | ||
| + | ln -s / | ||
| + | </ | ||
| + | |||
| + | and that's it. | ||
| + | |||
| + | ====== WEB GUI for Radicale ====== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | First of all, to avoid cross-domain issues (CORS) which are hard to solve due to using SSO on Radicale itself, i will host InfCloud on the same radicale domain, using the **/gui/** subpath. | ||
| + | |||
| + | First of all, setup the docker-compose file **/ | ||
| + | <file - docker-compose.yml> | ||
| + | version: " | ||
| + | |||
| + | services: | ||
| + | infcloud: | ||
| + | image: ckulka/ | ||
| + | restart: always | ||
| + | depends_on: | ||
| + | - php | ||
| + | ports: | ||
| + | - " | ||
| + | volumes: | ||
| + | - infcloud:/ | ||
| + | - ./ | ||
| + | |||
| + | php: | ||
| + | image: php: | ||
| + | restart: always | ||
| + | volumes: | ||
| + | - infcloud:/ | ||
| + | |||
| + | volumes: | ||
| + | infcloud: | ||
| + | |||
| + | </ | ||
| + | |||
| + | Now, create the **/ | ||
| + | <file - config.js> | ||
| + | var globalNetworkCheckSettings={ | ||
| + | href: " | ||
| + | timeOut: 90000, | ||
| + | lockTimeOut: | ||
| + | checkContentType: | ||
| + | settingsAccount: | ||
| + | delegation: true, | ||
| + | additionalResources: | ||
| + | hrefLabel: null, | ||
| + | forceReadOnly: | ||
| + | ignoreAlarms: | ||
| + | backgroundCalendars: | ||
| + | }; | ||
| + | var globalInterfaceLanguage=' | ||
| + | var globalSearchTransformAlphabet={ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }; | ||
| + | var globalSortAlphabet=' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | var globalBackgroundSync=true; | ||
| + | var globalSyncResourcesInterval=120000; | ||
| + | var globalEnableRefresh=false; | ||
| + | var globalEnableKbNavigation=true; | ||
| + | var globalInterfaceCustomLanguages=[]; | ||
| + | var globalResourceAlphabetSorting=true; | ||
| + | var globalNewVersionNotifyUsers=[]; | ||
| + | var globalDatepickerFirstDayOfWeek=1; | ||
| + | var globalHideInfoMessageAfter=1800; | ||
| + | var globalEditorFadeAnimation=666; | ||
| + | var globalEventStartPastLimit=3; | ||
| + | var globalEventStartFutureLimit=3; | ||
| + | var globalTodoPastLimit=1; | ||
| + | var globalLoadedCalendarCollections=[]; | ||
| + | var globalLoadedTodoCollections=[]; | ||
| + | var globalActiveCalendarCollections=[]; | ||
| + | var globalActiveTodoCollections=[]; | ||
| + | var globalActiveView=' | ||
| + | var globalOpenFormMode=' | ||
| + | var globalTodoListFilterSelected=[' | ||
| + | var globalCalendarStartOfBusiness=8; | ||
| + | var globalCalendarEndOfBusiness=17; | ||
| + | var globalDefaultEventDuration=120; | ||
| + | var globalDisplayHiddenEvents=false; | ||
| + | var globalTimeZoneSupport=true; | ||
| + | var globalTimeZone=' | ||
| + | var globalTimeZonesEnabled=[]; | ||
| + | var globalRewriteTimezoneComponent=true; | ||
| + | var globalRemoveUnknownTimezone=false; | ||
| + | var globalShowHiddenAlarms=false; | ||
| + | var globalIgnoreCompletedOrCancelledAlarms=true; | ||
| + | var globalMozillaSupport=false; | ||
| + | var globalWeekendDays=[0, | ||
| + | var globalAppleRemindersMode=true; | ||
| + | var globalLoadedAddressbookCollections=[]; | ||
| + | var globalActiveAddressbookCollections=[]; | ||
| + | var globalCompatibility={anniversaryOutputFormat: | ||
| + | var globalUriHandlerTel=' | ||
| + | var globalUriHandlerEmail=' | ||
| + | var globalUriHandlerUrl=' | ||
| + | var globalUriHandlerProfile={ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }; | ||
| + | var globalDefaultAddressCountry=' | ||
| + | var globalAddressCountryEquivalence=[ | ||
| + | {country: ' | ||
| + | {country: ' | ||
| + | ]; | ||
| + | var globalAddressCountryFavorites=[]; | ||
| + | var globalContactStoreFN=[' | ||
| + | var globalGroupContactsByCompanies=false; | ||
| + | var globalContactDataMinVisiblePercentage=0.95; | ||
| + | </ | ||
| + | |||
| + | Edit to your likings, more detail can be found [[https:// | ||
| + | |||
| + | Now create the startup config script **/ | ||
| + | <file - user-containers.infCloud> | ||
| + | USER=radicale | ||
| + | DESCRIPTION=" | ||
| + | </ | ||
| + | |||
| + | Create the link and start it: | ||
| + | <code bash> | ||
| + | cd / | ||
| + | ln -s user-containers user-containers.infCloud | ||
| + | rc-update add user-containers.infCloud default | ||
| + | ./ | ||
| + | </ | ||
| + | |||
| + | Now point your browser to **https:// | ||