├── .editorconfig ├── .github └── FUNDING.yml ├── LICENSE ├── README.md ├── apps ├── ad-blockers │ ├── adguard.md │ ├── lists-black.txt │ ├── lists-white.txt │ ├── lists.md │ └── pihole.md ├── analytics │ ├── matomo.md │ ├── plausible.md │ └── umami.md ├── backup │ ├── duplicati.md │ └── elkar-backup.md ├── bookmarks │ ├── cherry.jpg │ ├── cherry.md │ ├── hoarder.md │ ├── hoarder.png │ ├── linkace.md │ ├── linkace.png │ ├── linkding.md │ ├── linkding.png │ ├── shaark.jpg │ ├── shaark.md │ ├── shaarli.md │ ├── shaarli.png │ ├── shiori.md │ ├── shiori.png │ ├── wallabag-material.css.zip │ ├── wallabag.jpg │ └── wallabag.md ├── cloud │ ├── filebrowser.md │ ├── filebrowser.png │ ├── filerun.jpg │ ├── filerun.md │ ├── nextcloud.md │ ├── nginx-webdav.md │ ├── oasis.md │ ├── oasis.png │ ├── pydio.md │ ├── screenly.md │ ├── seafile.md │ └── seafile.png ├── cms │ ├── ghost.md │ └── wordpress.md ├── contacts-calendars │ ├── baikal.md │ └── radicale.md ├── cookbook │ ├── mealie.md │ └── mealie.png ├── dashboard │ ├── dashmachine.md │ ├── dashmachine.png │ ├── flame.md │ ├── flame.png │ ├── homarr.md │ ├── homer.md │ ├── homer.png │ ├── mafl.md │ ├── mafl.png │ ├── sui.md │ └── sui.png ├── database │ ├── baserow.md │ ├── nocodb.md │ └── seatable.md ├── docker │ ├── diun.md │ ├── doku.md │ ├── doku.png │ ├── portainer.md │ └── watch-tower.md ├── documents │ └── paperless-ngx.md ├── downloads │ ├── deluge.md │ ├── qbit-settings.png │ ├── qbit.md │ ├── qbit.png │ ├── simple-torrent.md │ ├── simple-torrent.png │ ├── transmission.jpg │ └── transmission.md ├── email │ ├── carddav.md │ ├── enigma.md │ ├── mailcow.md │ └── roundcube.md ├── git │ └── gitea.md ├── home-automation │ ├── home-assistant.md │ ├── homebridge.md │ └── n8n.md ├── media │ ├── audiobookshelf.md │ ├── bazarr.md │ ├── calibre.md │ ├── clibre-web.png │ ├── deemix.md │ ├── invidious.md │ ├── jackett.md │ ├── jellyfin.md │ ├── kavita.md │ ├── kavita.png │ ├── komga.md │ ├── metube.md │ ├── metube.png │ ├── navidrome.md │ ├── navidrome.png │ ├── plex.md │ ├── radarr.md │ ├── readerr.md │ ├── sonarr.md │ ├── tautulli.md │ ├── tubearchivist.md │ ├── tubearchivist.png │ ├── youtubedl-material.md │ ├── youtubedl-material.png │ ├── youtubedl-web.md │ └── youtubedl-web.png ├── monitors │ ├── cachet.md │ ├── checkmk.md │ ├── dockprom.md │ ├── monocker.md │ ├── php-server-monitor.md │ ├── statping.md │ └── uptime-kuma.md ├── notes │ ├── joplin-web.md │ ├── joplin.md │ └── memos.md ├── notifications │ ├── notifiers-by-service.md │ ├── pushover.md │ └── synology-sms-relay.md ├── other │ ├── bitwarden.md │ ├── brave-sync.md │ ├── budibase.md │ ├── change-detection.md │ ├── cockpit.md │ ├── code.md │ ├── crowdsec.md │ ├── firefox-sync.md │ ├── firefox.md │ ├── language-tool.md │ ├── ntfy.md │ ├── openspeedtest.md │ ├── owntracks.md │ ├── penpot.md │ ├── traccar.md │ ├── vpn.md │ └── windows.md ├── photos │ ├── chevereto.md │ ├── comparison.md │ ├── libre-photos.md │ ├── lychee.md │ ├── photoprism.md │ ├── photostructure.md │ ├── photoview.md │ ├── pigallery.md │ ├── piwigo.md │ └── pixelfed.md ├── project-mgmt │ ├── jira.md │ ├── jira.png │ ├── kanboard.md │ ├── open-project.md │ ├── openproject.png │ ├── planka.md │ ├── vikunja.md │ └── wekan.md ├── reverse-proxy-sso │ ├── authelia.md │ ├── npm.md │ └── traefik.md ├── rss │ ├── miniflux-filter.md │ ├── miniflux-filter.png │ ├── miniflux.md │ ├── rssbridge.md │ ├── rsshub.md │ └── rsstt.md ├── search │ ├── searx-settings.yml │ ├── searx.md │ └── whoogle.md ├── social │ ├── etesync.md │ ├── mastodon.md │ ├── mattermost.md │ ├── monica.md │ └── rocketchat.md └── wiki │ ├── bluespice.md │ ├── bookstack.md │ ├── confluence.md │ ├── docmost.md │ ├── notea.md │ ├── wikijs.md │ └── xwiki.md └── docker ├── get-started.md └── troubleshooting.md /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | max_line_length = 120 10 | tab_width = 4 11 | trim_trailing_whitespace = true 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: tborychowski # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: tborychowski # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['paypal.me/tborychowski', 'buymeacoff.ee/tborychowski'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /apps/ad-blockers/adguard.md: -------------------------------------------------------------------------------- 1 | # Adguard Home 2 | 3 | ## Overview 4 | 5 | - [Homepage](https://adguard.com/en/adguard-home/overview.html) 6 | - [Overview blog post](https://adguard.com/en/blog/in-depth-review-adguard-home.html) 7 | - [Github repo](https://github.com/AdguardTeam/AdguardHome) 8 | - [DockerHub repo](https://hub.docker.com/r/adguard/adguardhome) 9 | 10 | 11 | ## `docker-compose.yml` 12 | ```yml 13 | services: 14 | adguard: 15 | container_name: adguard 16 | image: adguard/adguardhome 17 | restart: unless-stopped 18 | ports: 19 | - "53:53/tcp" 20 | - "53:53/udp" 21 | - "853:853/tcp" 22 | - "9001:80/tcp" 23 | - "9002:443/tcp" 24 | - "9003:3000/tcp" 25 | # Therese 3 are required if you want to use AdGuard as a DHCP server 26 | # - "67:67/udp" 27 | # - "68:68/tcp" 28 | # - "68:68/udp" 29 | volumes: 30 | - ./conf:/opt/adguardhome/conf 31 | - ./data:/opt/adguardhome/work 32 | - ./certs:/opt/adguardhome/certs # remember to put this path in the UI too 33 | ``` 34 | Admin panel should be available at https://localhost:9002 35 | 36 | 37 | ## Tips & tricks 38 | 39 | ### Reset UI password 40 | 1. Generate hash 41 | ```sh 42 | htpasswd -B -n -b 43 | ``` 44 | It will print `:` to the terminal. 45 | 2. Open AdGuardHome.yaml 46 | ```sh 47 | nano adguard/conf/AdGuardHome.yaml 48 | ``` 49 | 3. In the `users:` section update: 50 | ```yml 51 | users: 52 | - name: username 53 | password: 54 | ``` 55 | 4. Save & restart AdguardHome 56 | 57 | 58 | ### How to map IP -> Hostname 59 | Add `extra_hosts` node to the `docker-compose.yml` with the mapping, like so: 60 | ```yml 61 | extra_hosts: 62 | - "HomeServer:192.168.1.20" 63 | ``` 64 | This will inject the map to the `/etc/hosts` file of the container, 65 | which **AdGuard** will use to show the nice names. 66 | 67 | Alternatively this can be done through the Admin UI. 68 | 69 | 70 | ### Ensure that port 53 is available for the container 71 | 1. First, disable and stop Ubuntu's DNS resolver using the following two commands: 72 | ```sh 73 | sudo systemctl disable systemd-resolved.service 74 | sudo systemctl stop systemd-resolved.service 75 | ``` 76 | 2. Next, open network manager configuration using the following command for editing: 77 | ```sh 78 | sudo nano /etc/NetworkManager/NetworkManager.conf 79 | ``` 80 | 3. Add `dns=default` under `[main]` so that the file contents look like this: 81 | ```ini 82 | [main] 83 | plugins=ifupdown,keyfile 84 | dns=default 85 | ``` 86 | 4. Then either remove or rename `/etc/resolv.conf` (it's a symbolic link) using the the following command: 87 | ```sh 88 | sudo mv /etc/resolv.conf /etc/resolv.conf.bak 89 | ``` 90 | 5. In case there is a problem, you can rename the file back to `/etc/resolv.conf`. 91 | 6. Finally, restart your network manager using the following command: 92 | ```sh 93 | sudo service network-manager restart 94 | ``` 95 | 7. If that doesn't work, use this: 96 | ```sh 97 | ps aux | grep dns # get the PID of the dns process 98 | sudo kill -9 # kill it 99 | ``` 100 | -------------------------------------------------------------------------------- /apps/ad-blockers/lists.md: -------------------------------------------------------------------------------- 1 | # Blacklists 2 | - [StevenBlack/hosts](https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts) 3 | - [malwaredomains.com](https://mirror1.malwaredomains.com/files/justdomains) 4 | - [sysctl.org](http://sysctl.org/cameleon/hosts) 5 | - [disconnect.me/simple_tracking](https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt) 6 | - [disconnect.me/simple_ad](https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt) 7 | - [hosts-file.net/ad_servers](https://hosts-file.net/ad_servers.txt) 8 | - [ookangzheng/dbl-oisd-nl](https://raw.githubusercontent.com/ookangzheng/dbl-oisd-nl/master/dbl.txt) 9 | - [more lists](lists-black.txt) 10 | 11 | # Whitelists 12 | - [raghavdua1995/DNSlock-PiHole-whitelist](https://raw.githubusercontent.com/raghavdua1995/DNSlock-PiHole-whitelist/master/whitelist.list) 13 | - [another one](lists-white.txt) 14 | -------------------------------------------------------------------------------- /apps/ad-blockers/pihole.md: -------------------------------------------------------------------------------- 1 | # PiHole 2 | 3 | ## Overview 4 | - [Homepage](https://pi-hole.net/) 5 | - [Pihole Docker github repo](https://github.com/pi-hole/docker-pi-hole) 6 | - [Docs](https://docs.pi-hole.net/) 7 | - [Github repo](https://github.com/pi-hole) 8 | - [DockerHub repo](https://hub.docker.com/r/pihole/pihole) 9 | 10 | 11 | ## `docker-compose.yml` 12 | ```yml 13 | services: 14 | pihole: 15 | container_name: pihole 16 | image: pihole/pihole:latest 17 | ports: 18 | - "53:53/tcp" 19 | - "53:53/udp" 20 | - "80:80/tcp" 21 | - "443:443/tcp" 22 | # - "67:67/udp" 23 | environment: 24 | TZ: 'Europe/Dublin' 25 | WEBPASSWORD: 'set a secure password here or it will be random' 26 | volumes: 27 | - ./etc-pihole/:/etc/pihole/ 28 | - ./etc-dnsmasq.d/:/etc/dnsmasq.d/ 29 | cap_add: 30 | - NET_ADMIN 31 | restart: unless-stopped 32 | ``` 33 | 34 | ## Tips & Tricks 35 | Some information here may be outdated! 36 | 37 | ### Force DNS to PiHole with Unifi Secure Gateway 38 | - https://help.ubnt.com/hc/en-us/articles/215458888-UniFi-USG-Advanced-Configuration 39 | 40 | ### Pihole block youtube ads 41 | https://www.reddit.com/r/pihole/comments/84luw8/blocking_youtube_ads/dvqq6ax/ 42 | 43 | ### DNS over HTTPS 44 | https://docs.pi-hole.net/guides/dns-over-https/ 45 | 46 | ### PiHole Conditional forwarding for multiple VLANs 47 | If you have multiple VLANs on your router, then you might want conditional forwarding of all your subnets back to your router. 48 | 49 | 1. Create a new file: 50 | ```sh 51 | sudo nano /etc/dnsmasq.d/02-custom.conf 52 | ``` 53 | 2. Then add, e.g.: 54 | ```sh 55 | server=/5.168.192.in-addr.arpa/192.168.1.1 56 | server=/9.168.192.in-addr.arpa/192.168.1.1 57 | ``` 58 | Which covers `192.168.5.0/24` and `192.168.9.0/24` respectively. 59 | 3. Restart PiHole: 60 | ```sh 61 | pihole restartdns 62 | ``` 63 | -------------------------------------------------------------------------------- /apps/analytics/matomo.md: -------------------------------------------------------------------------------- 1 | # Matomo 2 | 3 | ## Overview 4 | 5 | - no dark theme 6 | - pretty complex 7 | - can be private when setup that way 8 | - lots of stats & metrics 9 | 10 |
11 | 12 | - [Homepage](https://matomo.org) 13 | - [Github repo](https://github.com/matomo-org/docker) 14 | 15 | 16 | ## `docker-compose.yml` 17 | ```yml 18 | services: 19 | db: 20 | image: mariadb 21 | command: --max-allowed-packet=64MB 22 | restart: unless-stopped 23 | environment: 24 | MYSQL_ROOT_PASSWORD: matomo 25 | MYSQL_USER: matomo 26 | MYSQL_PASSWORD: matomo 27 | MYSQL_DATABASE: matomo 28 | MARIADB_AUTO_UPGRADE: 1 29 | MARIADB_INITDB_SKIP_TZINFO: 1 30 | volumes: 31 | - ./db:/var/lib/mysql 32 | 33 | app: 34 | image: matomo 35 | restart: unless-stopped 36 | environment: 37 | MATOMO_DATABASE_HOST: db 38 | MATOMO_DATABASE_ADAPTER: mysql 39 | MATOMO_DATABASE_TABLES_PREFIX: 40 | MATOMO_DATABASE_USERNAME: matomo 41 | MATOMO_DATABASE_PASSWORD: matomo 42 | MATOMO_DATABASE_DBNAME: matomo 43 | ports: 44 | - 3000:80 45 | volumes: 46 | - ./data:/var/www/html 47 | ``` 48 | -------------------------------------------------------------------------------- /apps/analytics/plausible.md: -------------------------------------------------------------------------------- 1 | # Plausible 2 | 3 | ## Overview 4 | 5 | - very simple and easy to setup 6 | - very private (doesn't track much, anonymises data) 7 | - nice dark theme 8 | 9 |
10 | 11 | - [Homepage](https://plausible.io) 12 | - [Docs](https://plausible.io/docs) 13 | - [Github repo](https://github.com/plausible/analytics) 14 | 15 | 16 | ## `schema.postgresql.sql` 17 | 18 | ```env 19 | SECRET_KEY_BASE=1234567890 20 | BASE_URL=https://plausible.domain.com 21 | ENABLE_EMAIL_VERIFICATION=false 22 | 23 | MAILER_EMAIL=plausible@domain.com 24 | SMTP_HOST_ADDR=smtp.mail.com 25 | SMTP_HOST_PORT=465 26 | SMTP_USER_NAME=user@domain.com 27 | SMTP_USER_PWD=password 28 | SMTP_HOST_SSL_ENABLED=true 29 | SMTP_RETRIES=2 30 | ``` 31 | 32 | ## `docker-compose.yml` 33 | 34 | ```yml 35 | services: 36 | mail: 37 | image: bytemark/smtp 38 | container_name: smtp 39 | restart: unless-stopped 40 | 41 | plausible_db: 42 | image: postgres:14-alpine 43 | container_name: plausible-postgres 44 | restart: unless-stopped 45 | volumes: 46 | - ./db:/var/lib/postgresql/data 47 | environment: 48 | - POSTGRES_PASSWORD=postgres 49 | 50 | plausible_events_db: 51 | image: clickhouse/clickhouse-server:22.6-alpine 52 | container_name: plausible-events-db 53 | restart: unless-stopped 54 | ulimits: 55 | nofile: 56 | soft: 262144 57 | hard: 262144 58 | volumes: 59 | - ./event-data:/var/lib/clickhouse 60 | - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro 61 | - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro 62 | 63 | plausible: 64 | image: plausible/analytics:latest 65 | container_name: plausible 66 | restart: unless-stopped 67 | command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" 68 | depends_on: 69 | - plausible_db 70 | - plausible_events_db 71 | - mail 72 | env_file: 73 | - plausible-conf.env 74 | ports: 75 | - 3123:8000 76 | ``` 77 | -------------------------------------------------------------------------------- /apps/backup/duplicati.md: -------------------------------------------------------------------------------- 1 | # Duplicati 2 | 3 | - no notifications! 4 | - ugly as hell 5 | - confusing to set-up 6 | 7 |
8 | 9 | - [Github repo](https://github.com/duplicati/duplicati) 10 | - [Docker Hub](https://hub.docker.com/r/linuxserver/duplicati) 11 | - [Homepage](https://www.duplicati.com/) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | duplicati: 18 | image: linuxserver/duplicati 19 | container_name: duplicati 20 | restart: unless-stopped 21 | environment: 22 | - PUID=1000 23 | - PGID=1000 24 | - TZ=Europe/Dublin 25 | # - CLI_ARGS= #optional 26 | ports: 27 | - 8200:8200 28 | volumes: 29 | - ./config:/config 30 | 31 | - /mnt/backups:/backups/backups # backup target 32 | - ~:/backups/home:ro # backup source - home 33 | - /mnt/docker:/backups/docker:ro # backup source - dockers 34 | ``` 35 | -------------------------------------------------------------------------------- /apps/backup/elkar-backup.md: -------------------------------------------------------------------------------- 1 | # Elkar Backup 2 | 3 | Open source backup solution based on RSync/RSnapshot. 4 | - Decent & clean UI 5 | - Notification scripts 6 | - Really easy to use 7 | 8 | 9 |
10 | 11 | - [Github repo](https://github.com/elkarbackup/elkarbackup) 12 | - [Docker Hub](https://hub.docker.com/r/elkarbackup/elkarbackup/) 13 | - [Docs](https://docs.elkarbackup.org/docs/getting-started.html) 14 | - [Homepage](https://www.elkarbackup.org/) 15 | 16 | 17 | ## docker-compose.yml 18 | ```yml 19 | services: 20 | elkarbackup: 21 | image: elkarbackup/elkarbackup 22 | restart: unless-stopped 23 | environment: 24 | EB_CRON: "enabled" 25 | TZ: "Europe/Dublin" 26 | SYMFONY__DATABASE__PASSWORD: "123123123" 27 | SYMFONY__MAILER__TRANSPORT: "smtp" 28 | SYMFONY__MAILER__HOST: "mail.example.com" 29 | SYMFONY__MAILER__USER: "home@example.com" 30 | SYMFONY__MAILER__PASSWORD: "123123123123" 31 | SYMFONY__MAILER__FROM: "home@example.com" 32 | 33 | volumes: 34 | - ./uploads:/app/uploads 35 | - ./sshkeys:/app/.ssh 36 | - /mnt/backup:/paths/backups # backup target 37 | - /mnt/docker:/paths/docker:ro # backup source 38 | - ~:/paths/home:ro # backup source 39 | ports: 40 | - 3070:80 41 | 42 | db: 43 | image: mysql:5.7.22 44 | restart: unless-stopped 45 | environment: 46 | MYSQL_ROOT_PASSWORD: "1NXXQ5U8Uw6611Y70MSWvU0Vw" 47 | volumes: 48 | - ./db:/var/lib/mysql 49 | 50 | client: 51 | image: elkarbackup/client 52 | restart: unless-stopped 53 | ``` 54 | -------------------------------------------------------------------------------- /apps/bookmarks/cherry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/cherry.jpg -------------------------------------------------------------------------------- /apps/bookmarks/cherry.md: -------------------------------------------------------------------------------- 1 | # Cherry 2 | - Not the worst looking 3 | - Has dark theme 4 | - Poor UX (e.g. no confirmations on user actions, loosing focus) 5 | - Bookmarklet didn't work in safari 6 | - New item is created in a popup (that does not have a deep-link to it, like in other services) 7 | 8 |
9 | 10 | - [Github repo](https://github.com/haishanh/cherry) 11 | - [Homepage](https://cherry.haishan.me) 12 | - [Docs](https://cherry.haishan.me/docs/deploy) 13 | 14 | 15 | ![Screenshot](cherry.jpg) 16 | 17 | 18 | 19 | ## docker-compose.yml 20 | ```yml 21 | services: 22 | cherry: 23 | image: haishanh/cherry 24 | container_name: cherry 25 | restart: unless-stopped 26 | environment: 27 | - JWT_SECRET=some-secret-string 28 | - ENABLE_PUBLIC_REGISTRATION=1 29 | - USE_INSECURE_COOKIE=1 30 | ports: 31 | - 3123:8000 32 | volumes: 33 | - ./data:/data 34 | ``` 35 | -------------------------------------------------------------------------------- /apps/bookmarks/hoarder.md: -------------------------------------------------------------------------------- 1 | # Hoarder 2 | - Modern & simple UI 3 | - Mobile apps 4 | - Browser extensions (although no Safari) 5 | 6 | 7 |
8 | 9 | - [Github repo](https://github.com/hoarder-app/hoarder) 10 | - [Homepage](https://hoarder.app/) 11 | - [Docs](https://docs.hoarder.app) 12 | 13 | 14 | ![Screenshot](hoarder.png) 15 | 16 | 17 | 18 | ## .env 19 | ```ini 20 | HOARDER_VERSION=latest 21 | NEXTAUTH_SECRET=123 22 | MEILI_MASTER_KEY=123 23 | NEXTAUTH_URL=http://localhost:3123 24 | ``` 25 | 26 | ## docker-compose.yml 27 | ```yml 28 | services: 29 | 30 | redis: 31 | image: redis:7.2-alpine 32 | container_name: hoarder-redis 33 | restart: unless-stopped 34 | volumes: 35 | - ./redis:/data 36 | 37 | chrome: 38 | image: gcr.io/zenika-hub/alpine-chrome:123 39 | container_name: hoarder-chrome 40 | restart: unless-stopped 41 | command: 42 | - --no-sandbox 43 | - --disable-gpu 44 | - --disable-dev-shm-usage 45 | - --remote-debugging-address=0.0.0.0 46 | - --remote-debugging-port=9222 47 | - --hide-scrollbars 48 | 49 | meilisearch: 50 | image: getmeili/meilisearch:v1.6 51 | container_name: hoarder-meilisearch 52 | restart: unless-stopped 53 | env_file: 54 | - .env 55 | environment: 56 | MEILI_NO_ANALYTICS: "true" 57 | volumes: 58 | - ./meilisearch:/meili_data 59 | 60 | workers: 61 | image: ghcr.io/hoarder-app/hoarder-workers:latest 62 | container_name: hoarder-workers 63 | restart: unless-stopped 64 | env_file: 65 | - .env 66 | environment: 67 | REDIS_HOST: redis 68 | MEILI_ADDR: http://meilisearch:7700 69 | BROWSER_WEB_URL: http://chrome:9222 70 | DATA_DIR: /data 71 | # OPENAI_API_KEY: ... 72 | depends_on: 73 | web: 74 | condition: service_started 75 | volumes: 76 | - ./data:/data 77 | 78 | web: 79 | image: ghcr.io/hoarder-app/hoarder-web:latest 80 | container_name: hoarder 81 | restart: unless-stopped 82 | env_file: 83 | - .env 84 | environment: 85 | REDIS_HOST: redis 86 | MEILI_ADDR: http://meilisearch:7700 87 | DATA_DIR: /data 88 | ports: 89 | - 3123:3123 90 | volumes: 91 | - ./data:/data 92 | 93 | ``` 94 | -------------------------------------------------------------------------------- /apps/bookmarks/hoarder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/hoarder.png -------------------------------------------------------------------------------- /apps/bookmarks/linkace.md: -------------------------------------------------------------------------------- 1 | # LinkAce 2 | - Decent UI with light & dark themes (but not without issues & FOUCs) 3 | - UX is a bit odd at times and not very intuitive (e.g. Clicking on a link name will open the link in one place, but in another it will open the link-ace entry) 4 | - Imports only from `bookmarks.html` exported from a browser (and it looks like it's crashing at the end, as you need to manually refresh the page) 5 | - Auto-tags bookmarks on import 6 | - No bulk actions (e.g. cannot tag/untag 10 items at once) 7 | - Search is not quick & easy to use and filters are odd: 8 | - e.g. you can filter for "Private links only" but not for "Public links only" 9 | - you can uncheck "title" and "description" and it will still find stuff 10 | 11 | - [Github repo](https://github.com/Kovah/LinkAce/) 12 | - [Docs](https://www.linkace.org/docs) 13 | 14 | ![Screenshot](linkace.png) 15 | 16 | ## Important step! 17 | After `docker-compose up -d` you need to run a few commands: 18 | ```sh 19 | # generate app key 20 | docker exec linkace_app_1 php artisan key:generate 21 | # set permissions 22 | chmod 777 .env 23 | sudo chmod -R 777 logs 24 | ``` 25 | 26 | ## .env 27 | ```ini 28 | # The application name is used internally and may not be changed 29 | APP_NAME=LinkAce 30 | COMPOSE_PROJECT_NAME=linkace 31 | APP_URL=http://192.168.1.10 32 | APP_ENV=production 33 | APP_DEBUG=false 34 | SETUP_COMPLETED=false 35 | 36 | # The app key is generated later, please leave it blank 37 | APP_KEY= 38 | # Set to true, if you are using a proxy that terminates SSL. Required to get the correct URLs for LinkAce 39 | FORCE_HTTPS=false 40 | # session expiration in minutes. Default is 7 days. 41 | SESSION_LIFETIME=10080 42 | 43 | BACKUP_ENABLED=false 44 | BACKUP_DISK=local 45 | BACKUP_MAX_SIZE=512 46 | 47 | ## If you are using the standard configuration provided by LinkAce, you can leave all values except the password as they are. Docker will automatically create a linkace database and a corresponding user. 48 | DB_CONNECTION=mysql 49 | DB_HOST=db 50 | DB_PORT=3306 51 | DB_DATABASE=linkace 52 | # Even if you use the standard configuration, please set a secure password here. 53 | DB_USERNAME=linkace 54 | DB_PASSWORD=ChangeThisToASecurePassword! 55 | 56 | ## Redis cache configuration 57 | # REDIS_HOST=redis 58 | # REDIS_PASSWORD=ChangeThisToASecurePassword! 59 | # REDIS_PORT=6379 60 | 61 | ## You probably do not want to change any values blow. Only continue if you know what you are doing. 62 | SESSION_DRIVER=file 63 | LOG_CHANNEL=stack 64 | BROADCAST_DRIVER=log 65 | CACHE_DRIVER=file 66 | QUEUE_DRIVER=database 67 | ``` 68 | 69 | ## docker-compose.yml 70 | ```yml 71 | services: 72 | db: 73 | image: mariadb:10.5 74 | restart: unless-stopped 75 | command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin 76 | environment: 77 | - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} 78 | - MYSQL_USER=${DB_USERNAME} 79 | - MYSQL_PASSWORD=${DB_PASSWORD} 80 | - MYSQL_DATABASE=${DB_DATABASE} 81 | volumes: 82 | - ./db:/var/lib/mysql 83 | 84 | app: 85 | image: linkace/linkace:simple 86 | restart: unless-stopped 87 | depends_on: 88 | - db 89 | ports: 90 | - "3123:80" 91 | volumes: 92 | - ./.env:/app/.env 93 | - ./logs:/app/storage/logs 94 | - ./backups:/app/storage/app/backups 95 | ``` 96 | -------------------------------------------------------------------------------- /apps/bookmarks/linkace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/linkace.png -------------------------------------------------------------------------------- /apps/bookmarks/linkding.md: -------------------------------------------------------------------------------- 1 | # Linkding 2 | - Looks very similar to pinboard 3 | - Very simple and fast 4 | - nice dark theme 5 | - Firefox & Chrome extensions for adding bookmarks 6 | 7 | - [Github repo](https://github.com/sissbruecker/linkding/) 8 | - [Demo](https://demo.linkding.link/login/?next=/bookmarks) 9 | 10 | ![Screenshot](linkding.png) 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | linkding: 16 | image: sissbruecker/linkding:latest 17 | container_name: linkding 18 | restart: unless-stopped 19 | ports: 20 | - 3123:9090 21 | volumes: 22 | - ./data:/etc/linkding/data 23 | ``` 24 | 25 | Once it starts, create admin user: 26 | ```sh 27 | docker-compose exec linkding python manage.py createsuperuser --username=joe --email=joe@example.com 28 | ``` 29 | 30 | ## Tips & Tricks 31 | Change password for a user 32 | ```sh 33 | docker-compose exec linkding python manage.py changepassword 34 | ``` 35 | -------------------------------------------------------------------------------- /apps/bookmarks/linkding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/linkding.png -------------------------------------------------------------------------------- /apps/bookmarks/shaark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/shaark.jpg -------------------------------------------------------------------------------- /apps/bookmarks/shaark.md: -------------------------------------------------------------------------------- 1 | # Shaark 2 | Good looking, but doesn't work ATM. 3 | Also - doesn't have a public image on Docker Hub (or similar), so can't use `docker-compose` the easy way. 4 | 5 | - [Github repo](https://github.com/MarceauKa/shaark) 6 | - [DockerHub repo]() 7 | - [Docs](https://github.com/MarceauKa/shaark#documentation) 8 | - [Demo](https://shaark.mka.ovh): `admin@example.com`:`secret` 9 | 10 | ![Screenshot](shaark.jpg) 11 | -------------------------------------------------------------------------------- /apps/bookmarks/shaarli.md: -------------------------------------------------------------------------------- 1 | # Shaarli 2 | Not too bad. Just stores & tags links, nothing more. 3 | - [Github repo](https://github.com/shaarli/Shaarli) 4 | - [Docs](https://shaarli.readthedocs.io/en/master/) 5 | - [Demo](https://demo.shaarli.org/) 6 | 7 | ![Screenshot](shaarli.png) 8 | 9 | 10 | ## Prerequisite 11 | Because of the permission issues with using directory mounts instead of named volumes, the two folders need to be created before running the container: 12 | ```sh 13 | mkdir cache data 14 | ``` 15 | and their permissions must be changed to be writable by the shaarli user (Uid 100, Gid 101). The simplest and most convenient (but a bit less secure) is to change permissions to 777 (rwx for all): 16 | ```sh 17 | chmod 777 cache/ data/ 18 | ``` 19 | alternatively folders' owner can be changed to the UID 100: 20 | ```sh 21 | sudo chown 100:101 cache/ data/ 22 | ``` 23 | 24 | ## docker-compose.yml 25 | ```yml 26 | services: 27 | shaarli: 28 | image: shaarli/shaarli:master 29 | container_name: shaarli 30 | restart: unless-stopped 31 | environment: 32 | - TZ=Europe/Dublin 33 | ports: 34 | - "3123:80" 35 | volumes: 36 | - ./cache:/var/www/shaarli/cache 37 | - ./data:/var/www/shaarli/data 38 | ``` 39 | 40 | ## Tips & Tricks 41 | 42 | ### Nicer theme 43 | Edit `shaarli/data/user.css`: 44 | ```css 45 | :root { 46 | --main-color: #144837; 47 | --background-color: #333; 48 | --dark-main-color: #0c281d; 49 | } 50 | 51 | #actions, 52 | #search { display: none; position: relative; } 53 | #actions.open, 54 | #search.open { display: block; } 55 | 56 | #shaarli-menu-tags, 57 | #shaarli-menu-picwall, 58 | #shaarli-menu-daily, 59 | #shaarli-menu-desktop-rss, 60 | #linklist-paging-bottom-block, 61 | #footer, 62 | .linksperpage form, 63 | .linkcount, 64 | .fa-external-link, 65 | .pure-u-lg-2-24, 66 | #search-linklist .searchform { display: none !important; } 67 | 68 | #link-count-content, 69 | #linklist-loop-content { width: 90%; margin: 10px auto; } 70 | 71 | #linklist { margin-bottom: 40px; } 72 | 73 | .linklist-item-title, 74 | .linklist-item { background-color: #222; color: #f0f0f0; } 75 | 76 | .linklist-item { margin-bottom: 20px; } 77 | 78 | .linklist-item-title .linklist-link { color: #ccc !important; font-weight: 300; } 79 | 80 | .linklist-item-infos { background: #0003; color: #333; } 81 | 82 | .linklist-filters, 83 | .linksperpage, 84 | .linklist-item-description, 85 | .linklist-item-infos { color: #aaa !important; } 86 | 87 | .linklist-item.private::before { display: none; } 88 | .linklist-item { box-shadow: none; } 89 | 90 | .linksperpage a, 91 | .linklist-filters .filter-off { background: none; color: #eee; } 92 | 93 | .linklist-item-infos { padding: 10px 20px; } 94 | .linklist-item-infos a { color: #317b63; } 95 | .linklist-item-infos a:hover { color: #eee; } 96 | 97 | .label { font-weight: 300; } 98 | .markdown { font-size: 14px; } 99 | 100 | .linklist-item-title { padding: 5px 10px; } 101 | .linklist-item-description { padding: 5px 20px; } 102 | .linklist-item-thumbnail { margin: -5px -10px 0 0; } 103 | 104 | 105 | .linklist-item-infos-dateblock { display: flex; align-items: center; } 106 | .linklist-item-infos-controls-group { display: inline-flex !important; align-items: center; border-right: 0; } 107 | .linklist-item-infos-controls-item { 108 | height: 24px; 109 | display: inline-flex; 110 | align-items: center; 111 | justify-content: flex-start; 112 | width: 32px; 113 | } 114 | .linklist-item-infos-url { font-size: 14.4px; } 115 | .linklist-item-editbuttons { position: absolute; right: 130px; } 116 | 117 | .page-form, 118 | .page-form .window-title, 119 | .page-form { background: #222; color: #eee; box-shadow: none; } 120 | 121 | .page-form-complete div, 122 | .page-form-complete p { color: #eee; } 123 | 124 | .page-form input[type="password"], 125 | .page-form input[type="text"], 126 | .page-form textarea { background: #111; color: #eee; border-color: #111; } 127 | 128 | .page-form a.button, 129 | .page-form input[type="submit"] { box-shadow: none; border-radius: 5px; } 130 | 131 | .pure-button { 132 | background-color: #111; 133 | color: #ccc; 134 | border-radius: 5px; 135 | padding: 12px; 136 | font-weight: 300; 137 | } 138 | 139 | .linklist-item-tags { margin-bottom: 5px; } 140 | 141 | .edit-link, 142 | .delete-link, 143 | .pin-link { font-size: 14px !important; } 144 | 145 | .linklist-item-infos .pin-link, 146 | .edit-link, 147 | .delete-link { color: #ccc !important; } 148 | ``` 149 | -------------------------------------------------------------------------------- /apps/bookmarks/shaarli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/shaarli.png -------------------------------------------------------------------------------- /apps/bookmarks/shiori.md: -------------------------------------------------------------------------------- 1 | # Shiori 2 | - [Github repo](https://github.com/go-shiori/shiori) 3 | - [Docs](https://github.com/go-shiori/shiori/wiki) 4 | 5 | ![Screenshot](shiori.png) 6 | 7 | 8 | ## docker-compose.yml 9 | ```yml 10 | services: 11 | shiori: 12 | image: radhifadlillah/shiori 13 | container_name: shiori 14 | restart: unless-stopped 15 | environment: 16 | - TZ=Europe/Dublin 17 | ports: 18 | - "3010:8080" 19 | volumes: 20 | - ./data:/srv/shiori 21 | ``` 22 | -------------------------------------------------------------------------------- /apps/bookmarks/shiori.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/shiori.png -------------------------------------------------------------------------------- /apps/bookmarks/wallabag-material.css.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/wallabag-material.css.zip -------------------------------------------------------------------------------- /apps/bookmarks/wallabag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/bookmarks/wallabag.jpg -------------------------------------------------------------------------------- /apps/bookmarks/wallabag.md: -------------------------------------------------------------------------------- 1 | # Wallabag 2 | 3 | - A self hostable application for saving web pages, freely. 4 | - Alternative to Pocket. 5 | - Has mobile apps 6 | 7 |
8 | 9 | - [Homepage](https://www.wallabag.it/en) 10 | - [Github repo](https://github.com/wallabag/docker) 11 | 12 | ![Screenshot](wallabag.jpg) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | wallabag: 19 | image: wallabag/wallabag 20 | environment: 21 | - MYSQL_ROOT_PASSWORD=wallaroot 22 | - SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql 23 | - SYMFONY__ENV__DATABASE_HOST=db 24 | - SYMFONY__ENV__DATABASE_PORT=3306 25 | - SYMFONY__ENV__DATABASE_NAME=wallabag 26 | - SYMFONY__ENV__DATABASE_USER=wallabag 27 | - SYMFONY__ENV__DATABASE_PASSWORD=wallapass 28 | - SYMFONY__ENV__DATABASE_CHARSET=utf8mb4 29 | - SYMFONY__ENV__MAILER_HOST=127.0.0.1 30 | - SYMFONY__ENV__MAILER_USER=~ 31 | - SYMFONY__ENV__MAILER_PASSWORD=~ 32 | - SYMFONY__ENV__FROM_EMAIL=wallabag@example.com 33 | - SYMFONY__ENV__DOMAIN_NAME=https://your-wallabag-url-instance.com 34 | ports: 35 | - "3123:80" 36 | volumes: 37 | - ./images:/var/www/wallabag/web/assets/images 38 | - ./material.css:/var/www/wallabag/web/wallassets/material.css # dark theme hack 39 | db: 40 | image: mariadb 41 | environment: 42 | - MYSQL_ROOT_PASSWORD=wallaroot 43 | volumes: 44 | - ./data:/var/lib/mysql 45 | redis: 46 | image: redis:alpine 47 | ``` 48 | 49 | Default login is `wallabag`:`wallabag`. 50 | 51 | 52 | ## Tips & Tricks 53 | 54 | #### [A hack to get the dark theme](https://github.com/wallabag/wallabag/issues/1521#issuecomment-720541571): 55 | 56 | 1. Create a file `material.css` containing the original material theme CSS + the CSS provided by @STaRDoGG (in the link above) - [material.css.zip](wallabag-material.css.zip). 57 | 2. In docker-compose mount the file like so: 58 | ```yml 59 | - ./material.css:/var/www/wallabag/web/wallassets/material.css 60 | ``` 61 | 3. Once the app starts - reload browser without cache (cmd/ctrl+r) 62 | -------------------------------------------------------------------------------- /apps/cloud/filebrowser.md: -------------------------------------------------------------------------------- 1 | # Filebrowser 2 | 3 | - nice dark theme 4 | - it was difficult to setup (docs are not clear for a typical docker-compose setup) 5 | 6 |
7 | 8 | - [Homepage/Docs](https://filebrowser.org) 9 | - [Github repo](https://github.com/filebrowser/filebrowser) 10 | 11 | 12 | ![Screenshot](filebrowser.png) 13 | 14 | 15 | 16 | ## Prerequisites 17 | 18 | There are 2 files required (which are expected, but not created automatically). We need to create them first: 19 | 20 | ```sh 21 | touch filebrowser.json 22 | touch filebrowser.db 23 | ``` 24 | 25 | The db file can remain empty (will be used by the app), the config - we need to update with some defaults: 26 | 27 | ## filebrowser.json 28 | ```json 29 | { 30 | "port": 80, 31 | "baseURL": "/", 32 | "address": "0.0.0.0", 33 | "log": "stdout", 34 | "database": "/filebrowser.db", 35 | "root": "/srv" 36 | } 37 | ``` 38 | 39 | ## docker-compose.yml 40 | ```yaml 41 | services: 42 | filebrowser: 43 | image: filebrowser/filebrowser 44 | container_name: filebrowser 45 | restart: unless-stopped 46 | user: "1000:1000" 47 | environment: 48 | - TZ=Europe/Dublin 49 | ports: 50 | - "3000:80" 51 | volumes: 52 | - ./filebrowser.db:/filebrowser.db 53 | - ./filebrowser.json:/.filebrowser.json 54 | - ./files/:/srv/ 55 | 56 | ``` 57 | 58 | App should now be available at: `:3000` 59 | Login using: 60 | - u: admin 61 | - p: admin 62 | -------------------------------------------------------------------------------- /apps/cloud/filebrowser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/cloud/filebrowser.png -------------------------------------------------------------------------------- /apps/cloud/filerun.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/cloud/filerun.jpg -------------------------------------------------------------------------------- /apps/cloud/filerun.md: -------------------------------------------------------------------------------- 1 | # FileRun 2 | - Mobile apps are just webdav clients. 3 | - Nice dark theme. 4 | - Doesn't seem to support heic files out-of-the-box nicely 5 | - Sharing as "image gallery" doesn't display videos (only their img thumbs) 6 | - Sharing as "grid" doesn't allow for the nice gallery navigation 7 | 8 |
9 | 10 | - [Homepage](https://filerun.com/) 11 | - [DockerHub repo](https://hub.docker.com/r/afian/filerun/) 12 | - [Docs](https://docs.filerun.com/) 13 | - [Demo](https://demo.filerun.co/?username=admin&password=admin) 14 | 15 | ![Screenshot](filerun.jpg) 16 | 17 | 18 | ## docker-compose.yml 19 | ```yml 20 | services: 21 | db: 22 | image: mariadb:10.1 23 | container_name: filerun-db 24 | restart: unless-stopped 25 | environment: 26 | MYSQL_ROOT_PASSWORD: your_mysql_root_password 27 | MYSQL_USER: db_user 28 | MYSQL_PASSWORD: db_user_password_01 29 | MYSQL_DATABASE: filerundb 30 | volumes: 31 | - ./db:/var/lib/mysql 32 | 33 | filerun: 34 | image: filerun/filerun 35 | container_name: filerun 36 | restart: unless-stopped 37 | environment: 38 | FR_DB_HOST: db 39 | FR_DB_PORT: 3306 40 | FR_DB_NAME: filerundb 41 | FR_DB_USER: db_user 42 | FR_DB_PASS: db_user_password_01 43 | APACHE_RUN_USER: www-data 44 | APACHE_RUN_GROUP: www-data 45 | APACHE_RUN_USER_ID: 33 46 | APACHE_RUN_GROUP_ID: 33 47 | depends_on: 48 | - db 49 | links: 50 | - db:db 51 | ports: 52 | - "3090:80" 53 | volumes: 54 | - ./html:/var/www/html 55 | - ./user-files:/user-files 56 | ``` 57 | -------------------------------------------------------------------------------- /apps/cloud/nextcloud.md: -------------------------------------------------------------------------------- 1 | # NextCloud 2 | - Mobile apps are just for files, not other apps (e.g. tasks) installed in NextCloud. 3 | 4 |
5 | 6 | - [Homepage](https://nextcloud.com/) 7 | - [Github repo](https://github.com/nextcloud) 8 | - [DockerHub repo](https://hub.docker.com/_/nextcloud/) 9 | - [Breeze dark theme](https://github.com/mwalbeck/nextcloud-breeze-dark) 10 | - [Docs](https://docs.nextcloud.com/server/20/admin_manual/) 11 | - [Demo](https://try.nextcloud.com/) 12 | 13 | 14 | ## docker-compose.yml 15 | More examplex [here](https://github.com/nextcloud/docker/tree/master/.examples/docker-compose). 16 | ```yml 17 | services: 18 | app: 19 | image: nextcloud:latest 20 | container_name: nextcloud 21 | restart: unless-stopped 22 | links: 23 | - db 24 | - redis 25 | ports: 26 | - 3100:80 27 | environment: 28 | - MYSQL_PASSWORD=nextcloud 29 | - MYSQL_DATABASE=nextcloud 30 | - MYSQL_USER=nextcloud 31 | - MYSQL_HOST=db 32 | - TRUSTED_PROXIES= # e.g. HOST IP 33 | - OVERWRITEPROTOCOL=https 34 | - OVERWRITEHOST=nextcloud.domain.com 35 | - REDIS_HOST=redis 36 | - REDIS_HOST_PASSWORD=nextcloud # must be set, because of a bug 37 | volumes: 38 | - ./nextcloud:/var/www/html 39 | 40 | cron: 41 | image: nextcloud:latest 42 | restart: unless-stopped 43 | volumes: 44 | - ./nextcloud:/var/www/html 45 | entrypoint: /cron.sh 46 | depends_on: 47 | - db 48 | - redis 49 | 50 | db: 51 | image: mariadb 52 | container_name: nextcloud-db 53 | command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW 54 | restart: unless-stopped 55 | volumes: 56 | - ./db:/var/lib/mysql 57 | environment: 58 | - MYSQL_ROOT_PASSWORD=nextcloud 59 | - MYSQL_PASSWORD=nextcloud 60 | - MYSQL_DATABASE=nextcloud 61 | - MYSQL_USER=nextcloud 62 | - MARIADB_AUTO_UPGRADE=1 63 | - MARIADB_DISABLE_UPGRADE_BACKUP=1 64 | 65 | redis: 66 | image: redis:alpine 67 | container_name: nextcloud-redis 68 | restart: unless-stopped 69 | command: redis-server --requirepass nextcloud 70 | environment: 71 | - TZ=Europe/Dublin 72 | volumes: 73 | - ./redis:/data 74 | expose: 75 | - 6379 76 | ``` 77 | 78 | ## Tips & Tricks 79 | 80 | ### Generate password/secret key 81 | ```sh 82 | openssl rand -base64 32 83 | ``` 84 | 85 | ### Enable HEIC & MOV previews 86 | 87 | 1. Make sure that Preview Generator app is installed 88 | 2. Add this section to the `config.php` 89 | ```php 90 | 'enable_previews' => true, 91 | 'enabledPreviewProviders' => [ 92 | 'OC\Preview\PNG', 93 | 'OC\Preview\JPEG', 94 | 'OC\Preview\GIF', 95 | 'OC\Preview\HEIC', 96 | 'OC\Preview\BMP', 97 | 'OC\Preview\XBitmap', 98 | 'OC\Preview\MP3', 99 | 'OC\Preview\TXT', 100 | 'OC\Preview\MarkDown', 101 | 'OC\Preview\OpenDocument', 102 | 'OC\Preview\Krita', 103 | 'OC\Preview\Movie', 104 | 'OC\Preview\MKV', 105 | 'OC\Preview\MP4', 106 | 'OC\Preview\AVI', 107 | 'OC\Preview\MSOffice2003', 108 | 'OC\Preview\MSOffice2007', 109 | 'OC\Preview\MSOfficeDoc', 110 | 'OC\Preview\PDF', 111 | 'OC\Preview\SVG', 112 | ], 113 | ``` 114 | 115 | 3. If you don't see the previews, try running this command: 116 | ```sh 117 | docker-compose exec -u www-data app bash -c ."/occ preview:generate-all -vvv" 118 | ``` 119 | 120 | 4. For video previews you need to install ffmpeg, like so: 121 | ```sh 122 | docker-compose exec app bash -c "apt update && apt upgrade -y && apt install -y ffmpeg" 123 | # optionally add imagemagick and ghostscript 124 | ``` 125 | 5. This will not persist so it must be run every time the container restarts... 126 | 6. Alternative is to manually build docker image :-| 127 | 128 | 129 | ### Bookmarks previews 130 | For bookmarks previews it's required to have a screenshotting service. 131 | [Screenly](screenly.md) can be easily self-hosted. 132 | -------------------------------------------------------------------------------- /apps/cloud/nginx-webdav.md: -------------------------------------------------------------------------------- 1 | ## docker-nginx-webdav-nononsense 2 | 3 | aims to be a Docker image that enables a no-nonsense WebDAV system on the latest available nginx, stable and mainline. Serves a file server 4 | 5 |
6 | 7 | - [Github repo](https://github.com/dgraziotin/docker-nginx-webdav-nononsense/) 8 | 9 | ## docker-compose-yml 10 | 11 | ```yml 12 | services: 13 | nginxwebdav: 14 | container_name: nginxwebdav 15 | build: 16 | context: . 17 | volumes: 18 | - ./data:/data 19 | - ./config:/config 20 | environment: 21 | - PUID=501 22 | - PGID=20 23 | - TZ=Europe/Berlin 24 | - WEBDAV_USERNAME=user 25 | - WEBDAV_PASSWORD=password 26 | - SERVER_NAMES=localhost 27 | - TIMEOUTS_S=1200 # these are seconds 28 | - CLIENT_MAX_BODY_SIZE=120M # must end with M(egabytes) or G(igabytes) 29 | ports: 30 | - 32080:80 31 | ``` 32 | 33 | ## Tips & Tricks 34 | 35 | ### customise nginx.conf 36 | 37 | Change dav_access user:rw group:rw all:rw to "location" context to custoise client file permissions 38 | 39 | and change dav_ethods to PUT, DELETE, MKCOL, COPY, and MOVE so that clients can erform any action 40 | 41 | alternatively you can create a custom config under /config/custom-cont-init.d/ 42 | -------------------------------------------------------------------------------- /apps/cloud/oasis.md: -------------------------------------------------------------------------------- 1 | # Seafile 2 | 3 | - UX needs work. 4 | - Drag & drop upload doesn't work in Safari 5 | - Extremely basic in functionality 6 | 7 |
8 | 9 | - [Github repo](https://github.com/machengim/oasis) 10 | - [DockerHub repo](https://hub.docker.com/r/machengim/oasis) 11 | 12 | 13 | ![Screenshot](oasis.png) 14 | 15 | 16 | ## docker-compose.yml 17 | ```yml 18 | services: 19 | oasis: 20 | image: machengim/oasis 21 | container_name: oasis 22 | restart: unless-stopped 23 | environment: 24 | - TZ=Europe/Dublin 25 | ports: 26 | - "3123:8000" 27 | volumes: 28 | - ./data:/opt/oasis/data 29 | - ./storage:/home/storage 30 | ``` 31 | -------------------------------------------------------------------------------- /apps/cloud/oasis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/cloud/oasis.png -------------------------------------------------------------------------------- /apps/cloud/pydio.md: -------------------------------------------------------------------------------- 1 | # Pydio Cells 2 | - Overly complex and... weird. 3 | - Has mobile apps. 4 | 5 |
6 | 7 | - [Homepage](https://pydio.com/en/features/pydio-cells-overview) 8 | - [Github repo](https://github.com/pydio/cells) 9 | - [DockerHub repo](https://hub.docker.com/r/pydio/cells/) 10 | - [Docs](https://pydio.com/en/docs/administration-guides) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | cells: 17 | image: pydio/cells:latest 18 | container_name: pydio 19 | hostname: cells 20 | restart: unless-stopped 21 | ports: 22 | - "3060:8080" 23 | environment: 24 | - CELLS_NO_TLS=0 25 | - CELLS_BIND=0.0.0.0:8080 26 | - CELLS_EXTERNAL=pydio.domain.com 27 | - EXTERNAL_BIND=pydio.domain.com 28 | volumes: 29 | - "./datadir:/var/cells/data" 30 | - "./workingdir:/var/cells" 31 | 32 | mysql: 33 | image: mysql:5.7 34 | container_name: pydio-db 35 | restart: unless-stopped 36 | ports: 37 | - "3306:3306" 38 | environment: 39 | MYSQL_ROOT_PASSWORD: secret 40 | MYSQL_DATABASE: cells 41 | MYSQL_USER: pydio 42 | MYSQL_PASSWORD: secret 43 | command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci] 44 | volumes: 45 | - "./mysqldir:/var/lib/mysql" 46 | ``` 47 | -------------------------------------------------------------------------------- /apps/cloud/screenly.md: -------------------------------------------------------------------------------- 1 | # Screenly 2 | Screenshotting service for NextCloud Bookmarks. 3 | 4 |
5 | 6 | - [Homepage](http://screeenly.com/) 7 | - [Github repo](https://github.com/stefanzweifel/screeenly) 8 | - [DockerHub repo](https://hub.docker.com/r/hadogenes/screeenly) 9 | 10 | ## Setup 11 | First run: 12 | ```sh 13 | touch database.sqlite 14 | chmod 777 database.sqlite 15 | ``` 16 | 17 | ## .env 18 | ```ini 19 | APP_NAME=screeenly 20 | APP_ENV=local 21 | APP_KEY= 22 | APP_DEBUG=false 23 | APP_URL=http://localhost 24 | DB_CONNECTION=sqlite 25 | 26 | # Disable Chrome's Sandbox feature 27 | # More information: https://github.com/stefanzweifel/screeenly/issues/174#issuecomment-423438612 28 | SCREEENLY_DISABLE_SANDBOX=true 29 | SESSION_LIFETIME=1200 30 | FILESYSTEM_DRIVER=public 31 | ``` 32 | 33 | ## docker-compose.yml 34 | ```yml 35 | services: 36 | screenly: 37 | image: hadogenes/screeenly 38 | container_name: screenly 39 | restart: unless-stopped 40 | environment: 41 | - TZ=Europe/Dublin 42 | env_file: 43 | - ./.env 44 | ports: 45 | - "3110:80" 46 | volumes: 47 | - ./database.sqlite:/var/www/screeenly/database/database.sqlite 48 | - ./.env:/var/www/screeenly/.env 49 | ``` 50 | 51 | ## Tips & Tricks 52 | After starting the app - check the logs. 53 | - If there are errors, log-in to container's shell: 54 | ```sh 55 | dc exec screenly sh 56 | ``` 57 | - If the errors are about the APP_KEY, inside the container, run: 58 | ```sh 59 | php artisan key:generate 60 | ``` 61 | - If there are errors about the DB records, run: 62 | ```sh 63 | php artisan migrate --force 64 | ``` 65 | Then register & log-in & generate API key for NextCloud. 66 | -------------------------------------------------------------------------------- /apps/cloud/seafile.md: -------------------------------------------------------------------------------- 1 | # Seafile 2 | - Very simple, just raw files nothing more. 3 | - Has mobile apps. 4 | 5 |
6 | 7 | - [Homepage](https://www.seafile.com/en/home/) 8 | - [Github repo](https://github.com/haiwen/seafile) 9 | - [DockerHub repo](https://hub.docker.com/r/seafileltd/seafile-mc) 10 | - [Docs](https://manual.seafile.com/docker/deploy_seafile_with_docker/) 11 | 12 | 13 | ![Screenshot](seafile.png) 14 | 15 | 16 | ## docker-compose.yml 17 | Original file [here](https://download.seafile.com/d/320e8adf90fa43ad8fee/files/?p=/docker/docker-compose.yml). 18 | 19 | ```yml 20 | services: 21 | db: 22 | image: mariadb:10.5 23 | container_name: seafile-mysql 24 | environment: 25 | - MYSQL_ROOT_PASSWORD=db_dev 26 | - MYSQL_LOG_CONSOLE=false 27 | volumes: 28 | - ./db:/var/lib/mysql 29 | 30 | memcached: 31 | image: memcached:1.6 32 | container_name: seafile-memcached 33 | entrypoint: memcached -m 256 34 | 35 | seafile: 36 | image: seafileltd/seafile-mc:latest 37 | container_name: seafile 38 | depends_on: 39 | - db 40 | - memcached 41 | environment: 42 | - DB_HOST=db 43 | - DB_USER=root 44 | - DB_ROOT_PASSWD=db_dev 45 | - TIME_ZONE=Europe/Dublin 46 | - SEAFILE_ADMIN_EMAIL=me@example.com 47 | - SEAFILE_ADMIN_PASSWORD=asecret 48 | - SEAFILE_SERVER_LETSENCRYPT=false 49 | - SEAFILE_SERVER_HOSTNAME=docs.seafile.com 50 | ports: 51 | - "3123:80" 52 | volumes: 53 | - ./data:/shared 54 | ``` 55 | 56 | **Important**: Variable `SEAFILE_SERVER_HOSTNAME` must be set for the file upload to work correctly. 57 | If you're running it locally, set it to your server's IP:port, e.g. `192.168.1.123:3123`. 58 | 59 | 60 | ## Tips & tricks 61 | 62 | ### Dark theme 63 | 64 | 1. Copy the css from here: https://github.com/udlch/seafile_ce-edition_custom_theme/blob/master/sf_dark_theme_7.1.3.css 65 | 2. Check the box in: `System Admin / Settings / Use custom CSS` 66 | 3. Paste the css into the `Custom CSS` box 67 | 4. Save 68 | -------------------------------------------------------------------------------- /apps/cloud/seafile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/cloud/seafile.png -------------------------------------------------------------------------------- /apps/cms/ghost.md: -------------------------------------------------------------------------------- 1 | # Ghost 2 | Flat file cms/blogging platform. 3 | 4 |
5 | 6 | - [Github repo](https://github.com/TryGhost/Ghost) 7 | - [Docs](https://ghost.org/docs/install/docker/) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | ghost: 14 | image: ghost:4-alpine 15 | container_name: ghost 16 | restart: unless-stopped 17 | ports: 18 | - 2368:2368 19 | environment: 20 | # https://ghost.org/docs/config/#configuration-options 21 | url: http://:2368 22 | volumes: 23 | - ./data:/var/lib/ghost/content 24 | ``` 25 | 26 | After the startup, open `http://:2368/ghost` to finish setup. 27 | -------------------------------------------------------------------------------- /apps/cms/wordpress.md: -------------------------------------------------------------------------------- 1 | # Wordpress 2 | The ultimate CMS/blogging platform. 3 | - hellishly slow! (loading from a server in LAN takes ~3-7 seconds) 4 | - extremely complex 5 | - tons of plugins & themes & configurability 6 | 7 |
8 | 9 | - [Homepage](https://wordpress.org/) 10 | - [Docker Hub](https://hub.docker.com/_/wordpress) 11 | - [Github repo](https://github.com/WordPress/WordPress) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | wordpress: 18 | image: wordpress 19 | restart: unless-stopped 20 | ports: 21 | - 3123:80 22 | environment: 23 | WORDPRESS_DB_HOST: db 24 | WORDPRESS_DB_USER: exampleuser 25 | WORDPRESS_DB_PASSWORD: examplepass 26 | WORDPRESS_DB_NAME: blog 27 | volumes: 28 | - ./data:/var/www/html 29 | 30 | db: 31 | image: mysql:5.7 32 | restart: unless-stopped 33 | environment: 34 | MYSQL_DATABASE: blog 35 | MYSQL_USER: exampleuser 36 | MYSQL_PASSWORD: examplepass 37 | MYSQL_RANDOM_ROOT_PASSWORD: '1' 38 | volumes: 39 | - ./db:/var/lib/mysql 40 | ``` 41 | -------------------------------------------------------------------------------- /apps/contacts-calendars/baikal.md: -------------------------------------------------------------------------------- 1 | # Baikal 2 | 3 | lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/ckulka/baikal-docker) 8 | - [Homepage](https://sabre.io/baikal/) 9 | 10 | ## docker-compose 11 | 12 | ```yml 13 | services: 14 | baikal: 15 | image: ckulka/baikal:nginx 16 | depends_on: 17 | - baikal-db 18 | restart: unless-stopped 19 | ports: 20 | - "8456:80" 21 | volumes: 22 | - ./config:/var/www/baikal/config 23 | - ./Specific:/var/www/baikal/Specific 24 | networks: 25 | - baikal-network 26 | 27 | baikal-db: 28 | image: mariadb:latest 29 | restart: unless-stopped 30 | volumes: 31 | - ./mysql-data:/var/lib/mysql 32 | - ./mysql:/etc/mysql/conf.d 33 | ports: 34 | - "4406:3306" 35 | environment: 36 | - MYSQL_ROOT_PASSWORD=rootpassword 37 | - MYSQL_DATABASE=baikal-db 38 | - MYSQL_USER=user 39 | - MYSQL_PASSWORD=password 40 | networks: 41 | - baikal-network 42 | 43 | networks: 44 | baikal-network: 45 | ``` 46 | 47 | ## Tips & tricks 48 | 49 | ### Create and chown the mounting folders before running docker-compose up 50 | 51 | `mkdir -p config Specific` 52 | 53 | And 54 | 55 | `chown -R 101:101 config Specific` 56 | 57 | 58 | 59 | ### Create admin and users(s) 60 | 61 | From the web panel setup admin and auth method 62 | 63 | Enable mysql 64 | 65 | And under database host fill the host lan IP with the database port as mapped in the docker-compose e.g. 192.168.1.24:4406 66 | 67 | Then create a user 68 | 69 | ### Android caldav carddav client 70 | 71 | On DAVx5 use Base URL: /dav.php/ 72 | 73 | (e.g. https://server.example/dav.php/) 74 | -------------------------------------------------------------------------------- /apps/contacts-calendars/radicale.md: -------------------------------------------------------------------------------- 1 | # docker-radicale 2 | 3 | Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts) server 4 | 5 |
6 | 7 | - [Github repo](https://github.com/tomsquest/docker-radicale) 8 | 9 | - [configuration file](https://github.com/tomsquest/docker-radicale/blob/master/config) 10 | 11 | 12 | ```yml 13 | services: 14 | radicale: 15 | image: tomsquest/docker-radicale 16 | container_name: radicale 17 | ports: 18 | - 5232:5232 19 | init: true 20 | read_only: true 21 | security_opt: 22 | - no-new-privileges:true 23 | healthcheck: 24 | test: curl -f http://127.0.0.1:5232 || exit 1 25 | interval: 30s 26 | retries: 3 27 | restart: unless-stopped 28 | volumes: 29 | - ./data:/data 30 | - ./config:/config:ro 31 | - ./users:/etc/radicale/users 32 | ``` 33 | 34 | ## Tips & tricks 35 | 36 | ### configuration file 37 | 38 | create a config directory in the working dir 39 | 40 | `mkdir -p config` 41 | 42 | copy the configuration file from the link above into the config folder 43 | 44 | 45 | ### Basic auth 46 | 47 | Uncomment/Enable the following in the configuration file 48 | 49 | ``` 50 | [auth] 51 | type = htpasswd 52 | htpasswd_filename = /etc/radicale/users 53 | htpasswd_encryption = md5 54 | ``` 55 | 56 | ### htpasswd 57 | 58 | flat-file used to store usernames and password for basic authentication 59 | 60 | While in the working dir 61 | 62 | ``` 63 | htpasswd -c users username 64 | New password: 65 | Re-type new password: 66 | ``` 67 | -------------------------------------------------------------------------------- /apps/cookbook/mealie.md: -------------------------------------------------------------------------------- 1 | # Mealie 2 | - Pretty good configuration options & functionality 3 | - Bulk entry for ingredients and preparation steps! 4 | - Auto-import from URLs (provided they support Recipe Microdata) 5 | - Excellent documentation 6 | - Monotonous UI in a dreadful material style (poor UX) 7 | - Not accessible nor keyboard friendly (poor UX) 8 | - There are categories but you can't filter or group recipes (no tree-like navigation) 9 | 10 |
11 | 12 | - [Github repo](https://github.com/hay-kot/mealie/) 13 | - [Homepage](https://hay-kot.github.io/mealie/) 14 | 15 | ![Screenshot](mealie.png) 16 | 17 | 18 | ## docker-compose.yml 19 | ```yml 20 | services: 21 | mealie: 22 | image: ghcr.io/mealie-recipes/mealie 23 | container_name: mealie 24 | restart: unless-stopped 25 | deploy: 26 | resources: 27 | limits: 28 | memory: 1000M # 29 | environment: 30 | ALLOW_SIGNUP: "false" 31 | PUID: 1000 32 | PGID: 1000 33 | TZ: Europe/Dublin 34 | BASE_URL: https://mealie.yourdomain.com 35 | ports: 36 | - "9925:9000" # 37 | volumes: 38 | - ./data:/app/data/ 39 | ``` 40 | -------------------------------------------------------------------------------- /apps/cookbook/mealie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/cookbook/mealie.png -------------------------------------------------------------------------------- /apps/dashboard/dashmachine.md: -------------------------------------------------------------------------------- 1 | # DashMachine 2 | - user roles are nice 3 | - pretty monotonous and ugly - icons are huge and all look the same (no separation between apps & bookmarks, no sections) 4 | - easy to start, difficult to setup (config is edited through the UI and in case of an error, you may loose the UI...) 5 | 6 |
7 | 8 | - [Github repo](https://github.com/rmountjoy92/DashMachine) 9 | 10 | ![Screenshot](dashmachine.png) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | dashmachine: 17 | image: rmountjoy/dashmachine:latest 18 | container_name: dashmachine 19 | restart: unless-stopped 20 | ports: 21 | - 4010:5000 22 | volumes: 23 | - ./data:/dashmachine/dashmachine/user_data 24 | ``` 25 | -------------------------------------------------------------------------------- /apps/dashboard/dashmachine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/dashboard/dashmachine.png -------------------------------------------------------------------------------- /apps/dashboard/flame.md: -------------------------------------------------------------------------------- 1 | # Flame 2 | - no-code configuration! 3 | - clear UI and configurable (themes, custom CSS) 4 | - nice features: app list, bookmark list 5 | - add bookmark is not linkable (not possible to automate adding bookmarks) 6 | 7 |
8 | 9 | - [Github repo](https://github.com/pawelmalak/flame) 10 | 11 | 12 | ![Screenshot](flame.png) 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | 17 | services: 18 | flame: 19 | image: pawelmalak/flame 20 | container_name: flame 21 | restart: unless-stopped 22 | ports: 23 | - 5005:5005 24 | environment: 25 | - PASSWORD=admin123 26 | volumes: 27 | - ./data:/app/data 28 | - /var/run/docker.sock:/var/run/docker.sock # optional but required for Docker integration 29 | ``` 30 | -------------------------------------------------------------------------------- /apps/dashboard/flame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/dashboard/flame.png -------------------------------------------------------------------------------- /apps/dashboard/homarr.md: -------------------------------------------------------------------------------- 1 | # Homarr 2 | 3 | Customizable browser's home page to interact with your homeserver's Docker containers (e.g. Sonarr/Radarr). 4 | 5 |
6 | 7 | - [Github repo](https://github.com/ajnart/homarr) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | homarr: 14 | image: ghcr.io/ajnart/homarr:latest 15 | container_name: homarr 16 | restart: unless-stopped 17 | volumes: 18 | - ./homarr/configs:/app/data/configs 19 | - ./homarr/icons:/app/public/icons 20 | ports: 21 | - 7575:7575 22 | ``` 23 | -------------------------------------------------------------------------------- /apps/dashboard/homer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/dashboard/homer.png -------------------------------------------------------------------------------- /apps/dashboard/mafl.md: -------------------------------------------------------------------------------- 1 | # Mafl 2 | 3 | Minimalistic flexible homepage. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/hywax/mafl) 8 | - [Website](https://mafl.hywax.space) 9 | 10 | 11 | ![Screenshot](mafl.png) 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | 16 | services: 17 | mafl: 18 | image: hywax/mafl 19 | restart: unless-stopped 20 | ports: 21 | - '3000:3000' 22 | volumes: 23 | - ./config.yml:/app/data/config.yml 24 | ``` 25 | 26 | ## config.yml 27 | ```yml 28 | title: My Home Page 29 | services: 30 | Home: 31 | - title: Home Assistant 32 | description: Home automation system 33 | link: '#' 34 | icon: 35 | name: simple-icons:homeassistant 36 | wrap: true 37 | color: '#3dbcf3' 38 | - title: AdGuard 39 | description: Ad blocking service 40 | link: '#' 41 | icon: 42 | name: simple-icons:adguard 43 | wrap: true 44 | color: '#68bc71' 45 | 46 | Cloud: 47 | - title: Traefik 48 | description: Cloud edge router 49 | link: '#' 50 | icon: 51 | name: devicon:traefikproxy 52 | wrap: true 53 | - title: Portainer 54 | description: Docker container management 55 | link: '#' 56 | icon: 57 | name: devicon:portainer 58 | wrap: true 59 | - title: Grafana 60 | description: Server monitoring dashboards 61 | link: '#' 62 | icon: 63 | name: logos:grafana 64 | wrap: true 65 | 66 | Devices: 67 | - title: Router 68 | description: Keenetic Peak 69 | link: '#' 70 | icon: 71 | name: bi:router-fill 72 | wrap: true 73 | - title: NAS 74 | description: Network storage 75 | link: '#' 76 | icon: 77 | name: mdi:nas 78 | wrap: true 79 | ``` 80 | -------------------------------------------------------------------------------- /apps/dashboard/mafl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/dashboard/mafl.png -------------------------------------------------------------------------------- /apps/dashboard/sui.md: -------------------------------------------------------------------------------- 1 | # SUI 2 | - A bit of a pain to configure 3 | - Couple of issues (submitted a PR) 4 | - Looks pretty, has several themes 5 | - Very simple and minimalistic 6 | 7 |
8 | 9 | - [Github repo](https://github.com/jeroenpardon/sui/) 10 | 11 | 12 | ![Screenshot](sui.png) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | version: "3.5" 18 | services: 19 | sui: 20 | container_name: sui 21 | restart: unless-stopped 22 | build: 23 | context: ./ 24 | environment: 25 | - VIRTUAL_HOST=test.laserr.net 26 | ports: 27 | - 4000:80 28 | volumes: 29 | - ./:/opt/html 30 | ``` 31 | 32 | ## apps.json 33 | ```json 34 | { 35 | "apps" : [ 36 | { "name":"App1", "url":"example.com", "icon":"email-outline" }, 37 | ] 38 | } 39 | ``` 40 | 41 | 42 | ## links.json 43 | ```json 44 | { 45 | "bookmarks": [ 46 | { 47 | "category": "Media", 48 | "links": [ 49 | { "name": "YouTube", "url": "https://youtube.com" }, 50 | { "name": "Prime Video", "url": "https://www.primevideo.com/" }, 51 | { "name": "VideoNeat", "url": "https://www.videoneat.com/category/documentaries/" } 52 | ] 53 | }, 54 | { 55 | "category": "Other", 56 | "links": [ 57 | { "name": "Garmin Connect", "url": "https://connect.garmin.com/modern/" }, 58 | { "name": "Alexa", "url": "https://alexa.amazon.co.uk/" }, 59 | { "name": "Nest", "url": "https://home.nest.com/home" } 60 | ] 61 | }, 62 | { 63 | "category": "Tech Services", 64 | "links": [ 65 | { "name": "Gandi", "url": "https://id.gandi.net/en/login" }, 66 | { "name": "SMTP2Go", "url": "https://app.smtp2go.com/dashboard/main/" } 67 | ] 68 | } 69 | ] 70 | } 71 | ``` 72 | -------------------------------------------------------------------------------- /apps/dashboard/sui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/dashboard/sui.png -------------------------------------------------------------------------------- /apps/database/baserow.md: -------------------------------------------------------------------------------- 1 | # Baserow 2 | 3 | - Open source no-code database and [Airtable](https://airtable.com) alternative. 4 | 5 |
6 | 7 | - [Homepage](https://baserow.io) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | baserow: 14 | image: baserow/baserow:latest 15 | container_name: baserow 16 | restart: unless-stopped 17 | environment: 18 | - TZ=Europe/Dublin 19 | - BASEROW_PUBLIC_URL=http://192.168.1.10:3123 20 | ports: 21 | - "3123:80" 22 | volumes: 23 | - ./data:/baserow/data 24 | ``` 25 | -------------------------------------------------------------------------------- /apps/database/nocodb.md: -------------------------------------------------------------------------------- 1 | # NocoDB 2 | 3 | - Open Source Airtable Alternative - turns any MySQL, Postgres, SQLite into a Spreadsheet with REST APIs. 4 | - quite powerful & lots of options 5 | - too much eye candy animations 6 | - importing csv data didn't work (same file worked well in e.g. baserow) 7 | 8 |
9 | 10 | - [Homepage](https://nocodb.com) 11 | - [Docs](https://docs.nocodb.com) 12 | - [Github Repo](https://docs.nocodb.com) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | root_db: 19 | image: mysql:5.7 20 | container_name: nocodb-db 21 | restart: unless-stopped 22 | healthcheck: 23 | test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] 24 | timeout: 20s 25 | retries: 10 26 | environment: 27 | MYSQL_ROOT_PASSWORD: password 28 | MYSQL_DATABASE: root_db 29 | MYSQL_USER: noco 30 | MYSQL_PASSWORD: password 31 | volumes: 32 | - ./db_data:/var/lib/mysql 33 | 34 | nocodb: 35 | image: nocodb/nocodb:latest 36 | container_name: nocodb 37 | depends_on: 38 | root_db: 39 | condition: service_healthy 40 | restart: unless-stopped 41 | environment: 42 | NC_DB: "mysql2://root_db:3306?u=noco&p=password&d=root_db" 43 | ports: 44 | - "3123:8080" 45 | volumes: 46 | - ./nc_data:/usr/app/data 47 | ``` 48 | -------------------------------------------------------------------------------- /apps/database/seatable.md: -------------------------------------------------------------------------------- 1 | # SeaTable 2 | - Simple like Excel, powerful like a database (free up to 3 users). 3 | - Docker container doesn't work (as per the link below) 4 | 5 |
6 | 7 | - [Homepage](https://seatable.io/) 8 | - [Docs](https://manual.seatable.io/docker/Developer-Edition/Deploy%20SeaTable-DE%20with%20Docker/#installing-docker-compose) 9 | 10 | 11 | ## docker-compose.yml 12 | That this didn't work for me at the time of testing. 13 | ```yml 14 | services: 15 | db: 16 | image: mariadb:10.5 17 | container_name: seatable-mysql 18 | environment: 19 | - MYSQL_ROOT_PASSWORD=PASSWORD 20 | - MYSQL_LOG_CONSOLE=true 21 | volumes: 22 | - ./db:/var/lib/mysql 23 | 24 | memcached: 25 | image: memcached:1.5.6 26 | container_name: seatable-memcached 27 | entrypoint: memcached -m 256 28 | 29 | redis: 30 | image: redis:5.0.7 31 | container_name: seatable-redis 32 | 33 | seatable: 34 | image: seatable/seatable-developer:latest 35 | container_name: seatable 36 | ports: 37 | - "3123:80" 38 | # - "443:443" 39 | volumes: 40 | - ./data:/shared 41 | environment: 42 | - DB_HOST=db 43 | - DB_ROOT_PASSWD=PASSWORD 44 | - SEATABLE_SERVER_HOSTNAME=example.seatable.com # Specifies your host name. 45 | - TIME_ZONE=Europe/Dublin 46 | depends_on: 47 | - db 48 | - memcached 49 | - redis 50 | ``` 51 | -------------------------------------------------------------------------------- /apps/docker/diun.md: -------------------------------------------------------------------------------- 1 | # Diun 2 | - Monitor docker images and check for updates. 3 | - too many (ugly) notifications 4 | - doesn't auto update, only monitors 5 | 6 |
7 | 8 | - [Github repo](https://github.com/crazy-max/diun) 9 | - [DockerHub repo](https://hub.docker.com/r/crazymax/diun/) 10 | - [Docs](https://crazymax.dev/diun/) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | version: "3.2" 16 | services: 17 | diun: 18 | image: crazymax/diun:latest 19 | container_name: diun 20 | restart: unless-stopped 21 | environment: 22 | - "TZ=Europe/Dublin" 23 | - "LOG_LEVEL=info" 24 | - "LOG_JSON=false" 25 | volumes: 26 | - "./data:/data" 27 | - "./diun.yml:/diun.yml:ro" 28 | - "/var/run/docker.sock:/var/run/docker.sock" 29 | ``` 30 | 31 | ## diun.yml 32 | ```yml 33 | db: 34 | path: diun.db 35 | 36 | watch: 37 | workers: 10 38 | schedule: "0 * * * *" 39 | first_check_notif: true 40 | 41 | notif: 42 | slack: 43 | webhook_url: https://hooks.slack.com/services/a/b/c 44 | 45 | regopts: 46 | tom: 47 | username: admin 48 | password: Passw0rd! 49 | timeout: 20 50 | 51 | providers: 52 | docker: 53 | watch_stopped: false 54 | watch_by_default: true 55 | ``` 56 | -------------------------------------------------------------------------------- /apps/docker/doku.md: -------------------------------------------------------------------------------- 1 | # Doku 2 | Doku is a web-based Docker disk usage monitor. 3 | 4 |
5 | 6 | - [Homepage](https://docker-disk.space) 7 | - [Github repo](https://github.com/amerkurev/doku) 8 | 9 | ![Screenshot](doku.png) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | doku: 16 | image: amerkurev/doku 17 | container_name: doku 18 | ports: 19 | - 9090:9090 20 | volumes: 21 | - '/var/run/docker.sock:/var/run/docker.sock:ro' 22 | - '/:/hostroot:ro' 23 | ``` 24 | -------------------------------------------------------------------------------- /apps/docker/doku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/docker/doku.png -------------------------------------------------------------------------------- /apps/docker/portainer.md: -------------------------------------------------------------------------------- 1 | # Portainer 2 | A nice UI for managing docker/kubernetes/swarm containers. 3 | 4 |
5 | 6 | - [Homepage](https://www.portainer.io) 7 | - [Github repo](https://github.com/portainer/portainer) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | portainer: 14 | image: portainer/portainer-ce 15 | container_name: portainer 16 | restart: unless-stopped 17 | ports: 18 | - 8000:8000 19 | - 9443:9443 20 | volumes: 21 | - /var/run/docker.sock:/var/run/docker.sock 22 | - ./data:/data 23 | ``` 24 | -------------------------------------------------------------------------------- /apps/docker/watch-tower.md: -------------------------------------------------------------------------------- 1 | # WatchTower 2 | 3 | - too many notifications 4 | - some false positive (thanks to crappy docker-hub api) 5 | 6 |
7 | 8 | - [Github repo](https://github.com/containrrr/watchtower/) 9 | - [Docs](https://containrrr.dev/watchtower/) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | watchtower: 16 | image: containrrr/watchtower 17 | volumes: 18 | - /var/run/docker.sock:/var/run/docker.sock 19 | command: --interval 30 20 | environment: 21 | - TZ=Europe/Dublin 22 | - WATCHTOWER_MONITOR_ONLY=true 23 | - WATCHTOWER_NOTIFICATIONS=slack 24 | - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://hooks.slack.com/services/a/b/c 25 | ``` 26 | -------------------------------------------------------------------------------- /apps/documents/paperless-ngx.md: -------------------------------------------------------------------------------- 1 | # Paperless-ngx 2 | - decent ui that is also usable on mobile 3 | - lots of filters 4 | - very cool auto tagging, auto categorisation 5 | - trash 6 | - sometimes textual pdfs are OCR-ed, and show gibberish in preview 7 | 8 |
9 | 10 | - [Github repo](https://github.com/paperless-ngx/paperless-ngx) 11 | - [Docs](https://paperless-ngx.readthedocs.io/en/latest/) 12 | 13 | 14 | ## .env 15 | ```ini 16 | COMPOSE_PROJECT_NAME=paperless 17 | ``` 18 | 19 | ## docker-compose.env 20 | ```ini 21 | # The container installs English, German, Italian, Spanish and French by default. 22 | # available languages: 23 | # https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster 24 | # PAPERLESS_OCR_LANGUAGES=eng 25 | 26 | # This is required to expose Paperless-ngx on a public domain 27 | PAPERLESS_URL=https://paperless.domain.com 28 | PAPERLESS_SECRET_KEY=changeme 29 | PAPERLESS_TIME_ZONE=Europe/Dublin 30 | 31 | # Default language to use for OCR 32 | PAPERLESS_OCR_LANGUAGE=eng 33 | ``` 34 | 35 | ## docker-compose.yml 36 | ```yml 37 | services: 38 | broker: 39 | image: docker.io/library/redis:6.0 40 | container_name: paperless-redis 41 | restart: unless-stopped 42 | volumes: 43 | - ./redis:/data 44 | 45 | gotenberg: 46 | image: docker.io/gotenberg/gotenberg:7.4 47 | container_name: paperless-gotenberg 48 | restart: unless-stopped 49 | command: 50 | - "gotenberg" 51 | - "--chromium-disable-routes=true" 52 | 53 | tika: 54 | image: ghcr.io/paperless-ngx/tika:latest 55 | container_name: paperless-tika 56 | restart: unless-stopped 57 | 58 | webserver: 59 | image: ghcr.io/paperless-ngx/paperless-ngx:latest 60 | container_name: paperless-ngx 61 | restart: unless-stopped 62 | depends_on: 63 | - broker 64 | - gotenberg 65 | - tika 66 | healthcheck: 67 | test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"] 68 | interval: 30s 69 | timeout: 10s 70 | retries: 5 71 | env_file: docker-compose.env 72 | environment: 73 | PAPERLESS_REDIS: redis://broker:6379 74 | PAPERLESS_TIKA_ENABLED: 1 75 | PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 76 | PAPERLESS_TIKA_ENDPOINT: http://tika:9998 77 | PAPERLESS_TRASH_DIR: /usr/src/paperless/trash 78 | PAPERLESS_OCR_MODE: skip_noarchive 79 | 80 | ports: 81 | - 8000:8000 82 | volumes: 83 | - ./data:/usr/src/paperless/data 84 | - ./media:/usr/src/paperless/media 85 | - ./export:/usr/src/paperless/export 86 | - ./consume:/usr/src/paperless/consume 87 | - ./trash:/usr/src/paperless/trash 88 | ``` 89 | 90 | ## First run these: 91 | ```sh 92 | # fetch the docker image 93 | docker-compose pull 94 | 95 | # create admin user 96 | docker-compose run --rm webserver createsuperuser 97 | 98 | # start 99 | docker-compose up -d 100 | ``` 101 | -------------------------------------------------------------------------------- /apps/downloads/deluge.md: -------------------------------------------------------------------------------- 1 | # Deluge 2 | - weird 3 | - ugly 4 | - can't disable password 5 | 6 |
7 | 8 | - [Homepage](https://deluge-torrent.org/) 9 | - [Git repo](https://git.deluge-torrent.org/deluge) 10 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/deluge) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | deluge: 17 | image: linuxserver/deluge 18 | container_name: deluge 19 | restart: unless-stopped 20 | environment: 21 | - PUID=1000 22 | - PGID=1000 23 | - TZ=Europe/Dublin 24 | # - UMASK_SET=022 #optional 25 | # - DELUGE_LOGLEVEL=error #optional 26 | ports: 27 | - 3124:8112 28 | volumes: 29 | - ./config:/config 30 | - ./downloads:/downloads 31 | ``` 32 | -------------------------------------------------------------------------------- /apps/downloads/qbit-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/downloads/qbit-settings.png -------------------------------------------------------------------------------- /apps/downloads/qbit.md: -------------------------------------------------------------------------------- 1 | # qbittorrent 2 | - linuxserver image allows theming with mods! 3 | - less ugly with docker-mods theme 4 | - probably the best (as of today) 5 | 6 |
7 | 8 | - [Homepage](https://www.qbittorrent.org/) 9 | - [Github repo](https://github.com/qbittorrent/qBittorrent) 10 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/qbittorrent) 11 | 12 | ![Screenshot](qbit.png) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | qbittorrent: 19 | image: lscr.io/linuxserver/qbittorrent:latest 20 | container_name: qbittorrent 21 | restart: unless-stopped 22 | environment: 23 | - PUID=1000 24 | - PGID=1000 25 | - TZ=Europe/Dublin 26 | - UMASK_SET=022 27 | - WEBUI_PORT=3030 28 | # apply a nice UI theme https://docs.theme-park.dev/setup/#docker-mods 29 | - DOCKER_MODS=ghcr.io/gilbn/theme.park:qbittorrent 30 | - TP_THEME=space-gray 31 | volumes: 32 | - ./config:/config 33 | - ./downloads:/downloads 34 | ports: 35 | - 6881:6881 36 | - 6881:6881/udp 37 | - 3030:3030 38 | networks: 39 | default: 40 | ipam: 41 | driver: default 42 | config: # set fixed subnet mask 43 | - subnet: 192.168.80.0/24 44 | gateway: 192.168.80.1 45 | ``` 46 | 47 | and log-in with the default: 48 | username: admin 49 | password: adminadmin 50 | 51 | ## Tips & Tricks 52 | 53 | ### Disabling the auth for webUI 54 | - find the docker container IP, e.g. in /data/qbittorrent/logs 55 | - in the settings, in WebUI/Authentication - enter the net mask, e.g.: `192.168.80.0/24` 56 | 57 | ![Screenshot](qbit-settings.png) 58 | -------------------------------------------------------------------------------- /apps/downloads/qbit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/downloads/qbit.png -------------------------------------------------------------------------------- /apps/downloads/simple-torrent.md: -------------------------------------------------------------------------------- 1 | # SimpleTorrent (aka CloudTorrent) 2 | - can work with no authentication 3 | - nice web API 4 | - good looking and functional 5 | - there doesn't seem to be a way to integrate it with Sonarr/Radarr 6 | 7 |
8 | 9 | - [Github repo](https://github.com/boypt/simple-torrent) 10 | 11 | ![Screenshot](simple-torrent.png) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | cloud-torrent: 18 | image: boypt/cloud-torrent 19 | container_name: cloud-torrent 20 | restart: unless-stopped 21 | environment: 22 | - TZ=Europe/Dublin 23 | ports: 24 | - "3123:3000" 25 | volumes: 26 | - ./downloads:/downloads 27 | # - /path/to/my/torrents:/torrents 28 | ``` 29 | -------------------------------------------------------------------------------- /apps/downloads/simple-torrent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/downloads/simple-torrent.png -------------------------------------------------------------------------------- /apps/downloads/transmission.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/downloads/transmission.jpg -------------------------------------------------------------------------------- /apps/downloads/transmission.md: -------------------------------------------------------------------------------- 1 | # Transmission 2 | - doesn't have authentication 3 | - with the `/transmission-web-control/` theme it's possible to add a script on download 4 | - ugly as hell 5 | 6 |
7 | 8 | - [Homepage](https://transmissionbt.com/) 9 | - [Github repo](https://github.com/transmission/transmission) 10 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/transmission) 11 | 12 | ![Screenshot](transmission.jpg) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | transmission: 19 | image: linuxserver/transmission 20 | container_name: transmission 21 | restart: unless-stopped 22 | environment: 23 | - PUID=1000 24 | - PGID=1000 25 | - TZ=Europe/Dublin 26 | - TRANSMISSION_WEB_HOME=/transmission-web-control/ 27 | # - TRANSMISSION_WEB_HOME=/kettu/ 28 | ports: 29 | - 3124:9091 30 | - 51413:51413 31 | - 51413:51413/udp 32 | volumes: 33 | - ./config:/config 34 | - ./downloads:/downloads 35 | # - :/watch 36 | ``` 37 | -------------------------------------------------------------------------------- /apps/email/carddav.md: -------------------------------------------------------------------------------- 1 | # Carddav 2 | - [plugins.roundcube.net](https://plugins.roundcube.net/#/packages/roundcube/carddav) 3 | - [Github repo](https://github.com/blind-coder/rcmcarddav) 4 | 5 | 6 | ### How to make it work with Monica 7 | 8 | Password field in the rouncdube db is too short for the API token from Monica, so we need to make it accept longer passwords: 9 | 10 | 1. First get password from `mailcow-dockerized/mailcow.conf`: 11 | ```sh 12 | cat mailcow-dockerized/mailcow.conf | grep DBPASS 13 | ``` 14 | 15 | 2. Then modify the db: 16 | ```sh 17 | docker-compose exec mysql-mailcow sh 18 | mysql -u mailcow -p 19 | use mailcow; 20 | 21 | # see all addressbooks: 22 | select * from mailcow_rc1carddav_addressbooks; 23 | 24 | # see table properties 25 | describe mailcow_rc1carddav_addressbooks; 26 | 27 | # change password field type from varchar to text 28 | ALTER TABLE mailcow_rc1carddav_addressbooks MODIFY password text; 29 | ``` 30 | -------------------------------------------------------------------------------- /apps/email/enigma.md: -------------------------------------------------------------------------------- 1 | # Enigma 2 | 3 | 4 | ### Enable plugin in Roundcube 5 | In `mailcow-dockerized/data/web/roundcube/config/config.inc.php` add it to the `plugins` array: 6 | ```php 7 | $config['plugins'] = array( 8 | 'enigma', 9 | ); 10 | ``` 11 | 12 | ### Create folder for keys 13 | ```sh 14 | cd mailcow-dockerized/data/web 15 | mkdir enigma_keys 16 | chmod 777 enigma_keys 17 | chown 82:docker enigma_keys 18 | ``` 19 | 20 | ### Plugin config 21 | In `mailcow-dockerized/data/web/roundcube/plugins/enigma/config.inc.php`, set the path: 22 | 23 | ```php 24 | 35 | ``` 36 | -------------------------------------------------------------------------------- /apps/email/roundcube.md: -------------------------------------------------------------------------------- 1 | # Roundcube 2 | 3 | It's the best looking, stable, reliable and configurable open source WebMail. 4 | In my setup Roundcube is integrated with MailCow server. 5 | 6 |
7 | 8 | - [Homepage](https://roundcube.net/) 9 | - [Roundcube in Mailcow](https://mailcow.github.io/mailcow-dockerized-docs/third_party-roundcube/) 10 | - [Github repo](https://github.com/roundcube/roundcubemail) 11 | 12 | ### Plugins 13 | - [Carddav](carddav.md) 14 | - [Enigma](enigma.md) 15 | - [SMTP identity](https://plugins.roundcube.net/#/packages/elm/identity_smtp) 🔗 - Send emails from gmail account 16 | - [HTML5 Notifier](https://plugins.roundcube.net/#/packages/kitist/html5_notifier) 🔗 17 | - [Easy unsubscribe](https://plugins.roundcube.net/#/packages/ss88/easy_unsubscribe) 🔗 - (composer require "ss88/easy_unsubscribe @dev") 18 | - [Automatic addressbook](https://plugins.roundcube.net/#/packages/sblaisot/automatic_addressbook) 🔗 19 | - [Context menus](https://plugins.roundcube.net/#/packages/johndoh/contextmenu) 🔗 20 | - [Plugin installer](https://plugins.roundcube.net/#/packages/roundcube/plugin-installer) 🔗 21 | - [Folder size](https://plugins.roundcube.net/#/packages/jfcherng/show-folder-size) 🔗 22 | - [Filters](https://plugins.roundcube.net/#/packages/roundcube/filters) 🔗 23 | 24 | 25 | ## mailcow-dockerized/data/web/roundcube/config/config.inc.php 26 | ```php 27 | array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true) 62 | ); 63 | $config['enable_installer'] = true; 64 | $config['smtp_conn_options'] = array( 65 | 'ssl' => array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true) 66 | ); 67 | 68 | $config['managesieve_port'] = 4190; 69 | $config['managesieve_host'] = 'tls://dovecot'; 70 | $config['managesieve_conn_options'] = array( 71 | 'ssl' => array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true) 72 | ); 73 | // Enables separate management interface for vacation responses (out-of-office) 74 | // 0 - no separate section (default), 75 | // 1 - add Vacation section, 76 | // 2 - add Vacation section, but hide Filters section 77 | $config['managesieve_vacation'] = 1; 78 | $config['db_prefix'] = 'mailcow_rc1'; 79 | 80 | $config['address_book_type'] = ''; 81 | 82 | // Session lifetime in minutes, 10080min = 7 days 83 | $config['session_lifetime'] = 10080; 84 | ``` 85 | 86 | 87 | ## Tips & Tricks 88 | 89 | ### "Remember me" session 90 | - [Issue reference](https://github.com/roundcube/roundcubemail/issues/5050#issuecomment-377663569) 91 | 92 | 1. In `mailcow-dockerized/data/web/roundcube/program/lib/Roundcube/rcube.php` 93 | replace: 94 | ```php 95 | ini_set('session.cookie_lifetime', 0); 96 | ``` 97 | with: 98 | ```php 99 | ini_set('session.cookie_lifetime', 2592000); // 1 month 100 | ``` 101 | 102 | 103 | 2. In `mailcow-dockerized/data/web/roundcube/program/lib/Roundcube/rcube_session.php` 104 | replace: 105 | ```php 106 | rcube_utils::setcookie($this->cookiename, $this->cookie, 0); 107 | ``` 108 | with: 109 | ```php 110 | $timestamp_in_one_month = time() + 60 * 60 * 24 * 30; 111 | rcube_utils::setcookie($this->cookiename, $this->cookie, $timestamp_in_one_month); 112 | ``` 113 | 114 | ### Enable logging 115 | In `mailcow-dockerized/data/web/roundcube/config/config.inc.php` add: 116 | ```php 117 | $config['log_dir'] = '/web/roundcube/logs'; 118 | ``` 119 | 120 | 121 | ### Upgrade script 122 | ```sh 123 | #!/bin/bash 124 | 125 | V=1.4.9 126 | 127 | echo "Upgrading Roundcube to v.$V..." 128 | wget "https://github.com/roundcube/roundcubemail/releases/download/$V/roundcubemail-$V.tar.gz" 129 | tar -xvf "roundcubemail-$V.tar.gz" 130 | rm "roundcubemail-$V.tar.gz" 131 | 132 | cd "roundcubemail-$V" 133 | sudo ./bin/installto.sh /var/www/mailcow-dockerized/data/web/roundcube 134 | cd .. 135 | rm -rf "roundcubemail-$V" 136 | echo "Done." 137 | echo "Remember to update the session cookie expiry!" 138 | ``` 139 | -------------------------------------------------------------------------------- /apps/git/gitea.md: -------------------------------------------------------------------------------- 1 | # Gitea 2 | 3 | Gitea is your local git portal, similar to Github/Gitlab but lightweight and simple. 4 | Can easily mirror repos from different sources (periodically re-syncing them), as a backup. 5 | 6 |
7 | 8 | - [Homepage](https://gitea.io/en-us/) 9 | - [Github repo](https://github.com/go-gitea/) 10 | - [Docker guide](https://docs.gitea.io/en-us/install-with-docker/) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | db: 17 | image: postgres:14 18 | container_name: gitea-db 19 | restart: unless-stopped 20 | environment: 21 | - POSTGRES_USER=gitea 22 | - POSTGRES_PASSWORD=gitea 23 | - POSTGRES_DB=gitea 24 | volumes: 25 | - ./postgres:/var/lib/postgresql/data 26 | 27 | server: 28 | image: gitea/gitea 29 | container_name: gitea 30 | restart: unless-stopped 31 | depends_on: 32 | - db 33 | environment: 34 | - USER_UID=1000 35 | - USER_GID=1000 36 | - GITEA__database__DB_TYPE=postgres 37 | - GITEA__database__HOST=db:5432 38 | - GITEA__database__NAME=gitea 39 | - GITEA__database__USER=gitea 40 | - GITEA__database__PASSWD=gitea 41 | - GITEA__mailer__ENABLED=true 42 | - GITEA__mailer__FROM=git@domain.com 43 | - GITEA__mailer__MAILER_TYPE=smtp 44 | - GITEA__mailer__HOST=smtp.fastmail.com 45 | - GITEA__mailer__IS_TLS_ENABLED=true 46 | - GITEA__mailer__USER=tom@domain.com 47 | - GITEA__mailer__PASSWD=abcdefg_1234567890 48 | volumes: 49 | - /etc/timezone:/etc/timezone:ro 50 | - /etc/localtime:/etc/localtime:ro 51 | - ./gitea:/data 52 | ports: 53 | - "4000:3000" 54 | - "4022:22" 55 | ``` 56 | 57 | **Note:** Remember to put the correct URL in the first setup screen (including `http(s)`). 58 | -------------------------------------------------------------------------------- /apps/home-automation/home-assistant.md: -------------------------------------------------------------------------------- 1 | # Home Assistant 2 | 3 | - [Homepage](https://www.home-assistant.io/) 4 | - [Github repo](https://github.com/home-assistant/core) 5 | - [DockerHub repo](https://hub.docker.com/r/homeassistant/home-assistant) 6 | - [Docs](https://www.home-assistant.io/docs/) 7 | 8 | ## Links 9 | - [awesome-ha](/Users/i313281/Projects/_playground/self-hosted-cookbook/apps/home-automation/home-assistant.md) 10 | - [MDI icons](https://cdn.rawgit.com/james-fry/home-assistant-mdi/efd95d7a/home-assistant-mdi.html) 11 | - [Full MDI icons](https://cdn.materialdesignicons.com/5.2.45/) 12 | - [DubhAd/Home-AssistantConfig](https://github.com/DubhAd/Home-AssistantConfig) 13 | - [compatible devices](https://www.hadevices.com/) 14 | - [presence monitoring](https://community.home-assistant.io/t/monitor-reliable-multi-user-distributed-bluetooth-occupancy-presence-detection/68505) 15 | - [touch panel](https://singlebox.tv/how-to-all-in-one-home-assistant-and-touch-panel/) 16 | - [reddit thread guide](https://www.reddit.com/r/homeautomation/comments/ejo7zg/i_built_an_allinone_touch_panel_to_control_my/) 17 | 18 | 19 | ## Integrations 20 | - [hacs](https://github.com/hacs/integration) 21 | - [aarlo](https://github.com/twrecked/hass-aarlo) 22 | - [garbage collection](https://github.com/bruxy70/Garbage-Collection) 23 | - [unifi protect](https://github.com/briis/unifiprotect) 24 | - [homeassistant-attributes](https://github.com/pilotak/homeassistant-attributes) 25 | 26 | ## Plugins 27 | - [simple-thermostat](https://github.com/nervetattoo/simple-thermostat) 28 | - [lovelace-hass-aarlo](https://github.com/twrecked/lovelace-hass-aarlo) 29 | - [mini-graph-card](https://github.com/kalkih/mini-graph-card) 30 | - [custom-header](https://github.com/maykar/custom-header) 31 | 32 | ## Themes 33 | - [grey-night](https://github.com/home-assistant-community-themes/grey-night) 34 | - [slate](https://github.com/seangreen2/slate_theme) 35 | 36 | 37 | ## docker-compose.yml 38 | ```yml 39 | services: 40 | homeassistant: 41 | container_name: home-assistant 42 | image: homeassistant/home-assistant 43 | restart: unless-stopped 44 | environment: 45 | - TZ=Europe/Dublin 46 | ports: 47 | - 8123:8123 48 | volumes: 49 | - ./config:/config 50 | ``` 51 | 52 | ## configuration.yml 53 | ```yml 54 | default_config: 55 | 56 | tts: # Text to speech 57 | - platform: google_translate 58 | 59 | group: !include groups.yaml 60 | automation: !include automations.yaml 61 | script: !include scripts.yaml 62 | scene: !include scenes.yaml 63 | frontend: 64 | themes: !include_dir_merge_named themes 65 | homeassistant: 66 | customize: !include customize.yaml 67 | 68 | updater: 69 | reporting: false 70 | 71 | wake_on_lan: 72 | 73 | aarlo: 74 | username: "email@example.com" 75 | password: "password" 76 | 77 | webostv: 78 | host: 79 | name: LGTV 80 | turn_on_action: 81 | service: wake_on_lan.send_magic_packet 82 | data: 83 | mac: 84 | broadcast_address: 85 | broadcast_port: 9 86 | customize: 87 | sources: 88 | - Apple TV 89 | - TV 90 | - YouTube 91 | - Plex 92 | 93 | notify: 94 | - name: pushover_notifier 95 | platform: pushover 96 | api_key: 97 | user_key: 98 | 99 | calendar: 100 | - platform: caldav 101 | username: "" 102 | password: "" 103 | url: 104 | 105 | camera: 106 | - platform: aarlo 107 | 108 | media_player: 109 | - platform: aarlo 110 | 111 | weather: 112 | - platform: gismeteo 113 | mode: daily 114 | latitude: 0 115 | longitude: 0 116 | 117 | sensor: 118 | - platform: aarlo 119 | monitored_conditions: 120 | - recent_activity 121 | - captured_today 122 | - battery_level 123 | - platform: attributes 124 | friendly_name: "Batteries" 125 | attribute: battery_level 126 | unit_of_measurement: "%" 127 | entities: 128 | - sensor.some_sensor_light_level 129 | ``` 130 | 131 | ## customize.yml 132 | ```yml 133 | sensor.some_sensor_light_level_battery_level: 134 | friendly_name: Living Room 135 | 136 | media_player.lgtv: 137 | source_list: 138 | - Apple TV 139 | - Plex 140 | - TV 141 | - YouTube 142 | ``` 143 | 144 | ## Tips & Tricks 145 | 146 | ### Nest integration 147 | - [HA Integration guide](https://www.home-assistant.io/integrations/nest/#device-access-registration) 148 | - [Acc auth manual](https://developers.google.com/nest/device-access/authorize) 149 | - [nest console](https://console.nest.google.com/device-access/project-list) 150 | - [devs console](https://console.developers.google.com/) 151 | -------------------------------------------------------------------------------- /apps/home-automation/homebridge.md: -------------------------------------------------------------------------------- 1 | # Homebridge 2 | 3 | Homebridge allows you to integrate with smart home devices that do not natively support HomeKit. 4 | Some of the most popular plugins include: 5 | 6 | - Ring 7 | - Nest & Nest Cameras 8 | - TP-Link Kasa Smart Home 9 | - Hue / deCONZ (Zigbee) 10 | - Belkin Wemo 11 | - myQ 12 | - UniFi Protect 13 | 14 | --- 15 | 16 | - [Homepage](https://homebridge.io/) 17 | - [Github repo](https://github.com/homebridge/homebridge) 18 | - [Docs](https://github.com/homebridge/homebridge/wiki) 19 | 20 | 21 | ## docker-compose.yml 22 | ```yml 23 | services: 24 | homebridge: 25 | image: oznu/homebridge:latest 26 | container_name: homebridge 27 | restart: unless-stopped 28 | network_mode: host 29 | environment: 30 | - TZ=Europe/Dublin 31 | - PGID=1000 32 | - PUID=1000 33 | - HOMEBRIDGE_CONFIG_UI=1 34 | - HOMEBRIDGE_CONFIG_UI_PORT=8581 35 | volumes: 36 | - ./homebridge:/homebridge 37 | ``` 38 | -------------------------------------------------------------------------------- /apps/home-automation/n8n.md: -------------------------------------------------------------------------------- 1 | # n8n 2 | 3 | n8n is a free and open node-based Workflow Automation Tool. It can be self-hosted, easily extended, and so also used with internal tools. 4 | 5 | --- 6 | 7 | - [Homepage](https://n8n.io/) 8 | - [Github repo](https://github.com/n8n-io/n8n) 9 | - [Docs](https://docs.n8n.io/) 10 | 11 | 12 | ## Setup 13 | Create 1 folder and 3 files in the same directory: 14 | - storage/ 15 | - .env 16 | - init-data.sh 17 | - docker-compose.yml 18 | 19 | ```sh 20 | touch .env init-data.sh docker-compose.yml 21 | mkdir storage 22 | 23 | chmod +x init-data.sh # make the init-data.sh executable 24 | chmod 777 storage # make sure the storage folder is writable 25 | ``` 26 | 27 | 28 | 29 | ## .env 30 | ```conf 31 | POSTGRES_USER=n8n 32 | POSTGRES_PASSWORD=n8n 33 | POSTGRES_DB=n8n 34 | 35 | POSTGRES_NON_ROOT_USER=n7n 36 | POSTGRES_NON_ROOT_PASSWORD=n7n 37 | ``` 38 | 39 | 40 | ## init-data.sh 41 | ```sh 42 | #!/bin/bash 43 | set -e; 44 | 45 | if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then 46 | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL 47 | CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}'; 48 | GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER}; 49 | GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER}; 50 | EOSQL 51 | else 52 | echo "SETUP INFO: No Environment variables given!" 53 | fi 54 | ``` 55 | 56 | 57 | ## docker-compose.yml 58 | ```yml 59 | services: 60 | postgres: 61 | image: postgres:16 62 | restart: unless-stopped 63 | environment: 64 | - POSTGRES_USER 65 | - POSTGRES_PASSWORD 66 | - POSTGRES_DB 67 | - POSTGRES_NON_ROOT_USER 68 | - POSTGRES_NON_ROOT_PASSWORD 69 | healthcheck: 70 | test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] 71 | interval: 5s 72 | timeout: 5s 73 | retries: 10 74 | volumes: 75 | - ./db:/var/lib/postgresql/data 76 | - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh 77 | 78 | n8n: 79 | image: docker.n8n.io/n8nio/n8n 80 | restart: unless-stopped 81 | environment: 82 | - DB_TYPE=postgresdb 83 | - DB_POSTGRESDB_HOST=postgres 84 | - DB_POSTGRESDB_PORT=5432 85 | - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} 86 | - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} 87 | - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} 88 | - N8N_EDITOR_BASE_URL=http://localhost:5678/ 89 | #- N8N_SECURE_COOKIE=false 90 | links: 91 | - postgres 92 | depends_on: 93 | postgres: 94 | condition: service_healthy 95 | ports: 96 | - 5678:5678 97 | volumes: 98 | - ./storage:/home/node/.n8n 99 | ``` 100 | 101 | 102 | 103 | ## Tips & Tricks 104 | When running through a reverse proxy, there's a couple of env vars needed (it's a bit weird): 105 | - Normally you'd provide a url, that the app should expect and should set when generating links. 106 | - However, here `N8N_EDITOR_BASE_URL` is not sufficient, and doesn't look like it's working for this, so the host, port and protocol are still required. 107 | - However 2, if you set the port to 443 (as you will be accessing the app via your reverse proxy & https) - the app itself will run on this port (instead of the default: 5678), so you also need to change the container's internal port to 443. 108 | 109 | 110 | ```yml 111 | environment: 112 | - N8N_HOST=n8n.mydomain.com 113 | - N8N_PORT=443 114 | - N8N_PROTOCOL=https 115 | - N8N_EDITOR_BASE_URL=https://n8n.mydomain.com 116 | ports: 117 | - 5678:443 118 | ``` 119 | -------------------------------------------------------------------------------- /apps/media/audiobookshelf.md: -------------------------------------------------------------------------------- 1 | # AudioBookshelf 2 | Self-hosted Audiobook Server. 3 | - It takes a while to adjust the folder structure and file naming for the scanner to pick it up correctly (and then manually fixing them in the UI) 4 | - Looks good and works nicely in a desktop browser 5 | - Unfortunately it doesn't work on mobile 6 | 7 | 8 |
9 | 10 | - [Homepage](https://www.audiobookshelf.org) 11 | - [Github repo](https://github.com/advplyr/audiobookshelf) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | audiobookshelf: 18 | image: advplyr/audiobookshelf 19 | container_name: audiobookshelf 20 | restart: unless-stopped 21 | ports: 22 | - "1337:80" 23 | volumes: 24 | - ./config:/config 25 | - ./metadata:/metadata 26 | - ./audiobooks:/audiobooks 27 | ``` 28 | 29 | Default username is **root** with no password. 30 | -------------------------------------------------------------------------------- /apps/media/bazarr.md: -------------------------------------------------------------------------------- 1 | # Bazarr 2 | 3 | Bazarr is a companion application to Sonarr and Radarr. It manages and downloads subtitles based on your requirements. 4 | 5 |
6 | 7 | - [Homepage](https://www.bazarr.media/) 8 | - [Github repo](https://github.com/morpheus65535/bazarr) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | bazarr: 15 | image: linuxserver/bazarr 16 | container_name: bazarr 17 | restart: unless-stopped 18 | environment: 19 | - PUID=1000 20 | - PGID=1000 21 | - TZ=Europe/Dublin 22 | - UMASK_SET=022 #optional 23 | ports: 24 | - 6767:6767 25 | volumes: 26 | - ./config:/config 27 | - /mnt/video:/video 28 | ``` 29 | -------------------------------------------------------------------------------- /apps/media/calibre.md: -------------------------------------------------------------------------------- 1 | # Calibre 2 | 3 | ## calibre (server) 4 | Basically a desktop calibre app with a web interface. 5 | This will allow you to generate calibre library needed for the Calibre Web. 6 | 7 |
8 | 9 | - [Homepage](https://calibre-ebook.com/) 10 | - [Github repo](https://github.com/kovidgoyal/calibre) 11 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/calibre) 12 | 13 | ### docker-compose.yml 14 | ```yml 15 | services: 16 | calibre: 17 | image: linuxserver/calibre 18 | container_name: calibre 19 | restart: unless-stopped 20 | environment: 21 | - PUID=1000 22 | - PGID=1000 23 | - TZ=Europe/Dublin 24 | # - GUAC_USER=user1 #optional 25 | # - GUAC_PASS=password #optional 26 | volumes: 27 | - ./data:/config 28 | - /my-books:/books 29 | ports: 30 | - 3060:8080 31 | - 3061:8081 32 | ``` 33 | 34 | 35 | ## calibre-web 36 | A nice UI for reading books. 37 | Connects to calibre server's database (server does not need to be running). 38 | 39 |
40 | 41 | - [Github repo](https://github.com/janeczku/calibre-web) 42 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/calibre-web) 43 | 44 | ![screenshot](clibre-web.png) 45 | 46 | ### docker-compose.yml 47 | ```yml 48 | services: 49 | calibre-web: 50 | image: linuxserver/calibre-web 51 | container_name: calibre-web 52 | environment: 53 | - PUID=1000 54 | - PGID=1000 55 | - TZ=Europe/Dublin 56 | volumes: 57 | - ./data:/config 58 | - /my-books/calibre:/books # same as above + "calibre" folder 59 | ports: 60 | - 8083:8083 61 | restart: unless-stopped 62 | ``` 63 | -------------------------------------------------------------------------------- /apps/media/clibre-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/clibre-web.png -------------------------------------------------------------------------------- /apps/media/deemix.md: -------------------------------------------------------------------------------- 1 | # Deemix 2 | 3 | - [Gitlab repo](https://gitlab.com/Bockiii/deemix-docker) 4 | 5 | 6 | ## docker-compose.yml 7 | ```yml 8 | services: 9 | deemix: 10 | image: registry.gitlab.com/bockiii/deemix-docker 11 | container_name: Deemix 12 | restart: unless-stopped 13 | environment: 14 | - PUID=1000 15 | - PGID=1000 16 | ports: 17 | - 6595:6595 18 | volumes: 19 | - ./config:/config 20 | - ./downloads:/downloads 21 | ``` 22 | 23 | 24 | ## Tips & Tricks 25 | ### [Getting ARL](https://codeberg.org/RemixDev/deemix/wiki/Getting-your-own-ARL) 26 | 27 | - Go to [deezer.com](https://www.deezer.com) and log into your account 28 | - Open up Developer Tools 29 | - Go to Storage and open Cookies section 30 | - Select www.deezer.com 31 | - Find the arl cookie (It should be 192 chars long) 32 | - Make sure only copy the value and not the entire cookie 33 | -------------------------------------------------------------------------------- /apps/media/invidious.md: -------------------------------------------------------------------------------- 1 | # Invidious 2 | 3 | Invidious is an alternative front-end to YouTube. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/iv-org/invidious) 8 | - [Config docs](https://github.com/iv-org/documentation/blob/master/Configuration.md) 9 | 10 | ## Prerequisites 11 | It requires some folders & files from the github repo, so easiest way is to clone the repo: 12 | ```sh 13 | git clone https://github.com/iv-org/invidious.git 14 | cd invidious/ 15 | ``` 16 | and remove what's not needed: 17 | ```sh 18 | rm -r .git/ .github/ assets/ kubernetes/ locales/ screenshots/ spec/ src/ 19 | rm .editorconfig .gitignore CHANGELOG.md invidious.service LICENSE README.md shard.lock shard.yml TRANSLATION 20 | rm docker-compose.yml # removing this as we're gonna simplify it and let it use the prebuilt image from docker hub 21 | ``` 22 | 23 | 24 | ## docker-compose.yml 25 | ```yml 26 | services: 27 | postgres: 28 | image: postgres:10 29 | restart: unless-stopped 30 | volumes: 31 | - ./config/sql:/config/sql 32 | - ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh 33 | - ./db:/var/lib/postgresql/data 34 | environment: 35 | POSTGRES_DB: invidious 36 | POSTGRES_PASSWORD: kemal 37 | POSTGRES_USER: kemal 38 | healthcheck: 39 | test: ["CMD", "pg_isready", "-U", "postgres"] 40 | invidious: 41 | image: omarroth/invidious 42 | restart: unless-stopped 43 | depends_on: 44 | - postgres 45 | ports: 46 | - "3000:3000" 47 | environment: 48 | INVIDIOUS_CONFIG: | 49 | channel_threads: 1 50 | check_tables: true 51 | feed_threads: 1 52 | db: 53 | user: kemal 54 | password: kemal 55 | host: postgres 56 | port: 5432 57 | dbname: invidious 58 | full_refresh: false 59 | https_only: false 60 | external_port: 443 61 | domain: yt.example.com 62 | ``` 63 | 64 | 65 | ## Tips & Tricks 66 | 67 | #### Remove the footer 68 | After starting the container (before opening the site in the browser!) run: 69 | ```sh 70 | docker-compose exec -u root invidious sh -c "echo \".footer{display:none;}\" >> /invidious/assets/css/default.css" 71 | ``` 72 | -------------------------------------------------------------------------------- /apps/media/jackett.md: -------------------------------------------------------------------------------- 1 | # Jackett 2 | 3 | API Support for your favorite torrent trackers. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/Jackett/Jackett) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | jackett: 14 | image: linuxserver/jackett 15 | container_name: jackett 16 | restart: unless-stopped 17 | environment: 18 | - PUID=1000 19 | - PGID=1000 20 | - TZ=Europe/Dublin 21 | - RUN_OPTS=run options here #optional 22 | ports: 23 | - 9117:9117 24 | volumes: 25 | - ./data:/config 26 | - ./downloads:/downloads 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/media/jellyfin.md: -------------------------------------------------------------------------------- 1 | # Jellyfin 2 | Audio, Video & Photo manager.
3 | 4 | - Allows you to view all the media from your local server on almost any device, anywhere. 5 | 6 |
7 | 8 | - [Homepage](https://jellyfin.org/) 9 | 10 | okdocker run -d -v /srv/jellyfin/config:/config -v /srv/jellyfin/cache:/cache -v /media:/media --net=host jellyfin/jellyfin:latest 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | jellyfin: 17 | image: jellyfin/jellyfin:latest 18 | container_name: jellyfin 19 | network_mode: host 20 | # user: uid:gid 21 | restart: unless-stopped 22 | # Optional - alternative address used for autodiscovery 23 | # environment: 24 | # - JELLYFIN_PublishedServerUrl=http://example.com 25 | ports: 26 | - 8096:8096 27 | volumes: 28 | - ./config:/config 29 | - ./cache:/cache 30 | - ./media:/media 31 | ``` 32 | 33 | Server should be available at: `:8096` 34 | -------------------------------------------------------------------------------- /apps/media/kavita.md: -------------------------------------------------------------------------------- 1 | # Kavita 2 | 3 | Probably the best self-hosted ebook & comic reader. 4 | 5 |
6 | 7 | - [Homepage](http://www.kavitareader.com) 8 | - [Github repo](https://github.com/Kareadita/Kavita) 9 | - [Demo](https://demo.kavitareader.com) - login: demouser, pass: Demouser64 10 | 11 | ![screenshot](kavita.png) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | kavita: 18 | image: jvmilazz0/kavita:latest 19 | container_name: kavita 20 | restart: unless-stopped 21 | ports: 22 | - "5000:5000" 23 | volumes: 24 | - ./data:/kavita/config 25 | - ./books:/books 26 | ``` 27 | -------------------------------------------------------------------------------- /apps/media/kavita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/kavita.png -------------------------------------------------------------------------------- /apps/media/komga.md: -------------------------------------------------------------------------------- 1 | # Komga 2 | 3 | A very good self-hosted comic books reader. 4 | 5 |
6 | 7 | - [Homepage](https://komga.org/) 8 | - [Github repo](https://github.com/gotson/komga) 9 | - [DockerHub repo](https://hub.docker.com/r/gotson/komga) 10 | - [Docs](https://komga.org/guides/) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | komga: 17 | image: gotson/komga 18 | container_name: komga 19 | restart: unless-stopped 20 | user: "1000:1000" 21 | environment: 22 | - KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS=#recycle,@eaDir 23 | ports: 24 | - 3020:8080 25 | volumes: 26 | - ./data:/config 27 | - ./books:/books 28 | - /etc/timezone:/etc/timezone:ro 29 | ``` 30 | 31 | 32 | ## Tips & Tricks 33 | 34 | ### First steps 35 | - After the first run - admin account gets created. 36 | - You need to check the logs (`docker-compose logs komga` or in `./data` folder) 37 | - Comics should be added to the `./books` folder 38 | -------------------------------------------------------------------------------- /apps/media/metube.md: -------------------------------------------------------------------------------- 1 | # Metube 2 | 3 | - [Github repo](https://github.com/alexta69/metube) 4 | 5 | ![Screenshot](metube.png) 6 | 7 | ## docker-compose.yml 8 | 9 | ```yml 10 | services: 11 | metube: 12 | image: alexta69/metube 13 | container_name: metube 14 | restart: unless-stopped 15 | user: "1001:1001" 16 | ports: 17 | - "8081:8081" 18 | volumes: 19 | - ./downloads:/downloads 20 | ``` 21 | -------------------------------------------------------------------------------- /apps/media/metube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/metube.png -------------------------------------------------------------------------------- /apps/media/navidrome.md: -------------------------------------------------------------------------------- 1 | # Navidrome 2 | 3 | Music streaming service. 4 | 5 |
6 | 7 | - [Homepage](https://www.navidrome.org/) 8 | - [Github repo](https://github.com/deluan/navidrome/) 9 | - [Demo](https://www.navidrome.org/demo/) 10 | 11 | ![screenshot](navidrome.png) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | navidrome: 18 | image: deluan/navidrome:latest 19 | restart: unless-stopped 20 | ports: 21 | - "4533:4533" 22 | environment: 23 | # All options with their default values: 24 | ND_SCANINTERVAL: 1m 25 | ND_LOGLEVEL: info 26 | ND_SESSIONTIMEOUT: 30m 27 | ND_BASEURL: "" 28 | volumes: 29 | - ./data:/data 30 | - ./music/:/music:ro 31 | ``` 32 | -------------------------------------------------------------------------------- /apps/media/navidrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/navidrome.png -------------------------------------------------------------------------------- /apps/media/plex.md: -------------------------------------------------------------------------------- 1 | # Plex 2 | Audio, Video & Photo manager.
3 | 4 | - Allows you to view all the media from your local server on any device, anywhere. 5 | - Allows you to add any other paid streaming service and search through them. 6 | - Requires Plex account for authentication. 7 | - Requires Plex subscription for some extra features. 8 | 9 |
10 | 11 | - [Homepage](https://www.plex.tv/) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | plex: 18 | image: ghcr.io/linuxserver/plex 19 | container_name: plex 20 | network_mode: host 21 | restart: unless-stopped 22 | environment: 23 | - PUID=1000 24 | - PGID=1000 25 | - VERSION=docker 26 | devices: 27 | - /dev/dri:/dev/dri 28 | volumes: 29 | - ./config:/config 30 | - ./tvshows:/Shows 31 | - ./movies:/Movies 32 | - ./music:/Music 33 | ``` 34 | 35 | Server should be available at: `:32400` 36 | -------------------------------------------------------------------------------- /apps/media/radarr.md: -------------------------------------------------------------------------------- 1 | # Radarr 2 | 3 | Movie manager. 4 | 5 |
6 | 7 | - [Homepage](https://radarr.video/) 8 | - [Github repo](https://github.com/Radarr/Radarr) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | radarr: 15 | image: linuxserver/radarr 16 | container_name: radarr 17 | restart: unless-stopped 18 | environment: 19 | - PUID=1000 20 | - PGID=1000 21 | - TZ=Europe/Dublin 22 | - UMASK_SET=022 #optional 23 | ports: 24 | - 7878:7878 25 | volumes: 26 | - ./config:/config 27 | - /mnt/video:/video 28 | ``` 29 | 30 | 31 | ## Tips & Tricks 32 | See [Sonarr](sonarr.md). 33 | -------------------------------------------------------------------------------- /apps/media/readerr.md: -------------------------------------------------------------------------------- 1 | # Readerr 2 | 3 | Ebook & comics manager. 4 | 5 |
6 | 7 | - [Homepage](https://readarr.com/) 8 | - [Github repo](https://github.com/Readarr/Readarr) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | version: "3.5" 14 | services: 15 | readarr: 16 | image: hotio/readarr:nightly 17 | container_name: readarr 18 | environment: 19 | - PUID=1001 20 | - PGID=1001 21 | - TZ=Europe/Dublin 22 | - UMASK=002 23 | volumes: 24 | - ./config:/config 25 | ports: 26 | - 8787:8787 27 | restart: unless-stopped 28 | ``` 29 | -------------------------------------------------------------------------------- /apps/media/sonarr.md: -------------------------------------------------------------------------------- 1 | # Sonarr 2 | 3 | TV show manager. 4 | 5 |
6 | 7 | - [Homepage](https://sonarr.tv/) 8 | - [Github repo](https://github.com/Sonarr/Sonarr) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | sonarr: 15 | image: linuxserver/sonarr 16 | container_name: sonarr 17 | restart: unless-stopped 18 | environment: 19 | - PUID=1000 20 | - PGID=1000 21 | - TZ=Europe/Dublin 22 | - UMASK_SET=022 #optional 23 | ports: 24 | - 8989:8989 25 | volumes: 26 | - ./config:/config 27 | - /mnt/video:/video 28 | ``` 29 | 30 | 31 | ## Tips & Tricks 32 | 33 | ### Map remote folders on Ubuntu/Debian: 34 | Add lines to the **/etc/fstab** file: 35 | 36 | ```sh 37 | :/volume1/video /mnt/video nfs rw,hard,intr,nolock 0 0 38 | ``` 39 | 40 | ### Remote Path Mappings in Sonarr/Radarr settings: 41 | 42 | Make sure that in Download Client (advanced settings): 43 | 44 | | Host | Remote Path | Local Path | 45 | |-------------|----------------|-------------| 46 | | | /volume1/video | /downloads/ | 47 | -------------------------------------------------------------------------------- /apps/media/tautulli.md: -------------------------------------------------------------------------------- 1 | # Tautulli 2 | 3 | Monitor for Plex Media Server. 4 | 5 |
6 | 7 | - [Homepage](https://tautulli.com/) 8 | - [Github repo](https://github.com/Tautulli/Tautulli) 9 | - [Docs](https://github.com/Tautulli/Tautulli-Wiki/wiki/Installation) 10 | 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | tautuli: 17 | image: tautulli/tautulli 18 | container_name: tautuli 19 | restart: unless-stopped 20 | environment: 21 | - TZ=Europe/Dublin 22 | ports: 23 | - "8181:8181" 24 | volumes: 25 | - ./config:/config/ 26 | - /mnt/plex:/plex_logs:ro 27 | ``` 28 | 29 | 30 | ## Tips & Tricks 31 | 32 | ### Mount external server with Plex (e.g. synology NAS) 33 | 34 | 1. Edit `fstab` file: 35 | `sudo nano /etc/fstab` 36 | 2. Add line 37 | ```sh 38 | :/volume1/Plex/Library/Application\040Support/Plex\040Media\040Server/Logs /mnt/plex nfs ro,hard,intr,nolock 0 0 39 | ``` 40 | 41 | ### Troubleshooting 42 | 43 | #### libcgroup1 44 | This lib may need to be installed: 45 | ```sh 46 | apt-get install libcgroup1 47 | ``` 48 | 49 | #### Mountpoint for devices not found 50 | 1. Edit grub 51 | ```sh 52 | sudo nano /etc/default/grub 53 | ``` 54 | 2. Change `GRUB_CMDLINE_LINUX` value to the below: 55 | ```sh 56 | GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0" 57 | ``` 58 | 3. Then run: 59 | ```sh 60 | grub2-mkconfig 61 | sudo reboot 62 | ``` 63 | -------------------------------------------------------------------------------- /apps/media/tubearchivist.md: -------------------------------------------------------------------------------- 1 | # TubeArchivist 2 | 3 | - [Homepage](https://www.tubearchivist.com) 4 | - [Github repo](https://github.com/tubearchivist/tubearchivist) 5 | 6 | ![Screenshot](tubearchivist.png) 7 | 8 | 9 | ## Prerequisities 10 | 11 | 1. Elastic Search in Docker requires the kernel setting of the host machine vm.max_map_count to be set to at least 262144. 12 | ```sh 13 | # temporarily set the value run: 14 | sudo sysctl -w vm.max_map_count=262144 15 | ``` 16 | To apply the change permanentlye.g. on Ubuntu Server add: `vm.max_map_count = 262144` 17 | to the file `/etc/sysctl.conf`. 18 | (more info in the [docs](https://github.com/tubearchivist/tubearchivist#vmmax_map_count)). 19 | 20 | 2. Elasticsearch has issues with permissions, so when using bind volume, folder has to be writable by the correct user. If you don't care, just run these: 21 | ```sh 22 | mkdir elasticsearch 23 | sudo chmod 777 elasticsearch 24 | ``` 25 | 26 | ## docker-compose.yml 27 | ```yml 28 | services: 29 | archivist-es: 30 | image: bbilly1/tubearchivist-es 31 | container_name: tubearchivist-es 32 | restart: unless-stopped 33 | ulimits: 34 | memlock: 35 | soft: -1 36 | hard: -1 37 | environment: 38 | - "ELASTIC_PASSWORD=verysecret" 39 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m" 40 | - "xpack.security.enabled=true" 41 | - "discovery.type=single-node" 42 | - "path.repo=/usr/share/elasticsearch/data/snapshot" 43 | expose: 44 | - "9200" 45 | volumes: 46 | - ./elasticsearch:/usr/share/elasticsearch/data 47 | 48 | 49 | archivist-redis: 50 | image: redislabs/rejson # for arm64 use bbilly1/rejson 51 | container_name: tubearchivist-redis 52 | restart: unless-stopped 53 | depends_on: 54 | - archivist-es 55 | expose: 56 | - "6379" 57 | volumes: 58 | - ./redis:/data 59 | 60 | 61 | tubearchivist: 62 | image: bbilly1/tubearchivist 63 | container_name: tubearchivist 64 | restart: unless-stopped 65 | depends_on: 66 | - archivist-es 67 | - archivist-redis 68 | environment: 69 | - HOST_UID=1000 70 | - HOST_GID=1000 71 | - TZ=Europe/Dublin 72 | - ES_URL=http://archivist-es:9200 73 | - ELASTIC_PASSWORD=verysecret 74 | - REDIS_HOST=archivist-redis 75 | - TA_HOST=192.168.1.123 # server ip, or domain 76 | - TA_USERNAME=admin # initial credentials 77 | - TA_PASSWORD=admin # initial credentials 78 | ports: 79 | - 3123:8000 80 | volumes: 81 | - ./media:/youtube 82 | - ./cache:/cache 83 | ``` 84 | -------------------------------------------------------------------------------- /apps/media/tubearchivist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/tubearchivist.png -------------------------------------------------------------------------------- /apps/media/youtubedl-material.md: -------------------------------------------------------------------------------- 1 | # Metube 2 | 3 | - [Github repo](https://github.com/Tzahi12345/YoutubeDL-Material) 4 | 5 | ![Screenshot](youtubedl-material.png) 6 | 7 | ## docker-compose.yml 8 | ```yml 9 | 10 | services: 11 | metube: 12 | image: alexta69/metube 13 | container_name: metube 14 | restart: unless-stopped 15 | user: "1001:1001" 16 | ports: 17 | - "8081:8081" 18 | volumes: 19 | - ./downloads:/downloads 20 | ``` 21 | -------------------------------------------------------------------------------- /apps/media/youtubedl-material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/youtubedl-material.png -------------------------------------------------------------------------------- /apps/media/youtubedl-web.md: -------------------------------------------------------------------------------- 1 | # YoutubeDL-web 2 | 3 | - [Github repo](https://github.com/franhp/youtubedl-web) 4 | 5 | ![Screenshot](youtubedl-web.png) 6 | 7 | 8 | ## docker-compose.yml 9 | ```yml 10 | services: 11 | youtubedl-web: 12 | image: franhp/youtubedl-web:latest 13 | container_name: youtubedl-web 14 | restart: unless-stopped 15 | ports: 16 | - "5000:5000" 17 | volumes: 18 | - ./downloads:/downloads 19 | ``` 20 | -------------------------------------------------------------------------------- /apps/media/youtubedl-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/media/youtubedl-web.png -------------------------------------------------------------------------------- /apps/monitors/cachet.md: -------------------------------------------------------------------------------- 1 | # Cachet 2 | 3 | - focuses on posting information rather than pinging services 4 | - looks like setting status is manual 5 | 6 |
7 | 8 | - [Github repo](https://github.com/CachetHQ/Docker) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | cachet: 15 | image: cachethq/docker:latest 16 | container_name: cachet 17 | restart: unless-stopped 18 | links: 19 | - postgres 20 | ports: 21 | - 3123:8000 22 | environment: 23 | - DB_DRIVER=pgsql 24 | - DB_HOST=postgres 25 | - DB_DATABASE=postgres 26 | - DB_USERNAME=postgres 27 | - DB_PASSWORD=postgres 28 | - APP_KEY=base64:tixFLbMoKffHKfUO1uEK9cGdpJxHYP7uCAp0lwwzEtM= 29 | 30 | postgres: 31 | image: postgres:9.5 32 | container_name: cachet-db 33 | restart: unless-stopped 34 | environment: 35 | - POSTGRES_USER=postgres 36 | - POSTGRES_PASSWORD=postgres 37 | volumes: 38 | - ./data:/var/lib/postgresql/data 39 | ``` 40 | 41 | ## Tips & Tricks 42 | 43 | ### Generate APP_KEY 44 | Once the container is running, execute the following command: 45 | ```sh 46 | docker exec -i ID_OF_THE_CONTAINER php artisan key:generate 47 | ``` 48 | The full key should include `base64`, e.g.: `base64:YOUR_UNIQUE_KEY`. 49 | -------------------------------------------------------------------------------- /apps/monitors/checkmk.md: -------------------------------------------------------------------------------- 1 | # CheckMK 2 | 3 | - Pretty complete solution for whole infrastructure monitoring 4 | - Based on Nagios 5 | - Complex UI (not very intuitive) 6 | - Requires "some" learning & setup and doesn't do anything out of the box 7 | 8 |
9 | 10 | - [Homepage](https://checkmk.com/) 11 | - [Github repo](https://github.com/tribe29/checkMK) 12 | - [DockerHub repo](https://hub.docker.com/r/checkmk/check-mk-raw) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | 18 | services: 19 | checkmk: 20 | image: checkmk/check-mk-raw 21 | container_name: checkmk 22 | restart: unless-stopped 23 | ulimits: 24 | nofile: 1024 25 | ports: 26 | - "3123:5000" 27 | volumes: 28 | - /etc/localtime:/etc/localtime:ro 29 | - ./monitoring:/omd/sites 30 | ``` 31 | 32 | - Open http://localhost:8080/cmk/check_mk/ 33 | - Username is `cmkadmin` 34 | - Password is written in the logs when the container starts the first time, so just run `docker-compose logs` after starting the container 35 | -------------------------------------------------------------------------------- /apps/monitors/dockprom.md: -------------------------------------------------------------------------------- 1 | # Dockprom 2 | A monitoring solution for Docker hosts and containers with Prometheus, Grafana, cAdvisor, NodeExporter and alerting with AlertManager. 3 | 4 | - [Github repo](https://github.com/stefanprodan/dockprom) 5 | 6 | 7 | ## installation 8 | ```sh 9 | git clone https://github.com/stefanprodan/dockprom 10 | cd dockprom 11 | ADMIN_USER=admin ADMIN_PASSWORD=admin docker-compose up -d 12 | ``` 13 | -------------------------------------------------------------------------------- /apps/monitors/monocker.md: -------------------------------------------------------------------------------- 1 | # Monocker 2 | 3 | Monocker monitors Docker (MONitors dOCKER) containers and alerts on 'state' change. 4 | There is no web ui or fancy dashboard. 5 | 6 |
7 | 8 | - [Github repo](https://github.com/petersem/monocker) 9 | 10 | 11 | ## docker-compose 12 | 13 | ```yml 14 | services: 15 | monocker: 16 | container_name: monocker 17 | image: petersem/monocker 18 | environment: 19 | SERVER_LABEL: 'Dev' 20 | MESSAGE_PLATFORM: 'telegram@your_bot_id@your_chat_id' 21 | # MESSAGE_PLATFORM: 'pushbullet@your_api_key@your_device_id' 22 | # MESSAGE_PLATFORM: 'pushover@your_user_key@your_app_api_token' 23 | # MESSAGE_PLATFORM: 'discord@webhook_url' 24 | LABEL_ENABLE: 'false' 25 | ONLY_OFFLINE_STATES: 'false' 26 | EXCLUDE_EXITED: 'false' 27 | PERIOD: 60 28 | DISABLE_STARTUP_MSG: 'false' 29 | volumes: 30 | - /var/run/docker.sock:/var/run/docker.sock:ro 31 | restart: unless-stopped 32 | ``` 33 | 34 | ## Tips & tricks 35 | 36 | ### raspberry pi and arm users 37 | 38 | There is only amd64 image available, you have to build. 39 | 40 | `get clone https://github.com/petersem/monocker` 41 | 42 | 43 | Change `FROM node:14.17.3-alpine3.14` to `FROM node:latest` in the Dockerfile 44 | 45 | And `docker build -t monocker .` 46 | 47 | Also change `image: petersem/monocker` to `image: monocker` in the docker-compose.yml 48 | 49 | ### telegram notifications 50 | 51 | Contact @botfather, create a bot and copy its token then start a chat with the bot and use the inline command @get_id_bot and copy the chat id 52 | -------------------------------------------------------------------------------- /apps/monitors/php-server-monitor.md: -------------------------------------------------------------------------------- 1 | # PhpServerMonitor 2 | 3 | - Very basic and minimalist 4 | - Various monitors (ping, tcp & http service requests) 5 | - Has Pushover notifications 6 | 7 |
8 | 9 | 10 | - [Github repo](https://github.com/phpservermon/phpservermon) 11 | - [DockerHub repo](https://hub.docker.com/r/alwynpan/phpservermonitor) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | psm: 18 | image: alwynpan/phpservermonitor 19 | container_name: php-server-monitor 20 | restart: unless-stopped 21 | ports: 22 | - 3123:80 23 | depends_on: 24 | - db 25 | environment: 26 | - DATABASE_HOST=db 27 | - DATABASE_PORT=3306 28 | - DATABASE_NAME=psm 29 | - DATABASE_USER=psm 30 | - DATABASE_PASSWORD=psm 31 | - BASE_URL=http://192.168.1.10:3123 32 | - CHECK_INTERVAL=1 33 | - TIMEOUT=10 34 | - DEBUG=true 35 | 36 | db: 37 | image: mysql:5.7 38 | container_name: php-server-monitor-db 39 | restart: unless-stopped 40 | ports: 41 | - 3306:3306 42 | environment: 43 | - MYSQL_ROOT_PASSWORD=top_secret 44 | - MYSQL_DATABASE=psm 45 | - MYSQL_USER=psm 46 | - MYSQL_PASSWORD=psm 47 | volumes: 48 | - ./data/:/var/lib/mysql 49 | ``` 50 | -------------------------------------------------------------------------------- /apps/monitors/statping.md: -------------------------------------------------------------------------------- 1 | # Statping 2 | 3 | - Looks great 4 | - Has a mobile app (albeit buggy) 5 | - Lots of stuff (charts, data, etc) 6 | - Lots of integrations & notification types 7 | - Every other release doesn't work 8 | - Slow UI 9 | 10 |
11 | 12 | - [Homepage](https://statping.com/) 13 | - [Github repo](https://github.com/statping/statping/) 14 | - [DockerHub repo](https://hub.docker.com/r/statping/statping) 15 | 16 | 17 | ## docker-compose.yml 18 | ```yml 19 | statping: 20 | container_name: statping 21 | image: hunterlong/statping 22 | restart: unless-stopped 23 | ports: 24 | - 3020:8080 25 | volumes: 26 | - ./data:/app 27 | # - /var/run/docker.sock:/var/run/docker.sock 28 | environment: 29 | DB_CONN: sqlite 30 | ``` 31 | 32 | - and go to http://192.168.1.10:3020/setup 33 | - or login as `admin:admin` 34 | -------------------------------------------------------------------------------- /apps/monitors/uptime-kuma.md: -------------------------------------------------------------------------------- 1 | # Uptime Kuma 2 | It is a self-hosted monitoring tool like "Uptime Robot". 3 | 4 | - One of the best monitoring services that I've tested! 5 | - Simple yet configurable, and a very nice design overall 6 | - Fast and snappy! 7 | - Great status page, that's available without a login 8 | - Large number of options, notification services, etc. 9 | - Supports 2fa or disabling authentication (if you wish to run it locally) 10 | 11 |
12 | 13 | - [Github repo](https://github.com/louislam/uptime-kuma) 14 | - [Demo](https://demo.uptime.kuma.pet/) 15 | - [Tutorial blog post](https://homegrowntechie.com/uptime-kuma/) 16 | 17 | ## docker-compose.yml 18 | ```yml 19 | services: 20 | uptime-kuma: 21 | image: louislam/uptime-kuma 22 | container_name: uptimekuma 23 | restart: unless-stopped 24 | volumes: 25 | - ./data:/app/data 26 | ports: 27 | - 3001:3001 28 | ``` 29 | First launch in browser will bring up a setup wizard. 30 | -------------------------------------------------------------------------------- /apps/notes/joplin-web.md: -------------------------------------------------------------------------------- 1 | ## Jolin-web 2 | 3 | Joplin-vieweb purpose is to provide an online view of Joplin notes. 4 | It's running on a "Django server", running beside Joplin terminal app. 5 | 6 | ## Requirements 7 | 8 | A Joplin server to that stores your notes 9 | 10 |
11 | 12 | - [Github repo](https://github.com/joplin-vieweb) 13 | - [Docs](https://github.com/joplin-vieweb/joplin-vieweb/#installation--configuration-instructions) 14 | 15 | ## docker-compose.yml 16 | 17 | ```yml 18 | 19 | x-common-variables: &common-variables 20 | ORIGINS: "'http://localhost', 'http://192.168.1.24' , 'https://my-ddns-domain.com'" 21 | 22 | services: 23 | django-joplin-vieweb: 24 | image: gri38/django-joplin-vieweb:latest 25 | depends_on: 26 | - joplin-terminal-xapi 27 | environment: 28 | <<: *common-variables 29 | restart: unless-stopped 30 | ports: 31 | - xxxx:8000 32 | volumes: 33 | - joplin:/root/.config/joplin:ro 34 | - joplin-vieweb:/root/.config/joplin-vieweb 35 | networks: 36 | - joplin-net 37 | 38 | joplin-terminal-xapi: 39 | image: gri38/joplin-terminal-xapi:latest 40 | restart: unless-stopped 41 | volumes: 42 | - joplin:/root/.config/joplin 43 | networks: 44 | - joplin-net 45 | 46 | volumes: 47 | joplin: 48 | joplin-vieweb: 49 | 50 | networks: 51 | joplin-net: {} 52 | ``` 53 | 54 | ## Tips & Tricks 55 | 56 | ### 57 | You can access your notebooks: https://your_domain/joplin (⚠ don't forget the /joplin ⚠) 58 | 59 | - first you set up url/admin and then login to url/joplin 60 | mind the /admin and /joplin 61 | 62 | - for webdav sync you can select the nextcloud option 63 | 64 | - To decryt the notes run 65 | 66 | ```sh 67 | docker exec -ti joplin-vieweb_joplin-terminal-xapi_1 joplin e2ee decrypt 68 | ``` 69 | -------------------------------------------------------------------------------- /apps/notes/joplin.md: -------------------------------------------------------------------------------- 1 | # Joplin Server 2 | Joplin is a free note taking app, available for desktop & mobile. 3 | This is the Joplin sync server. 4 | 5 |
6 | 7 | - [Homepage](https://joplinapp.org) 8 | - [Github repo](https://github.com/laurent22/joplin/blob/dev/packages/server/README.md) 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | db: 14 | image: postgres:13.1 15 | container_name: joplin-db 16 | ports: 17 | - "5432:5432" 18 | restart: unless-stopped 19 | environment: 20 | - POSTGRES_DB=joplin 21 | - POSTGRES_USER=joplin 22 | - POSTGRES_PASSWORD=joplin 23 | volumes: 24 | - ./data:/var/lib/postgresql/data 25 | app: 26 | image: joplin/server:latest 27 | container_name: joplin 28 | depends_on: 29 | - db 30 | ports: 31 | - "22300:22300" 32 | restart: unless-stopped 33 | environment: 34 | - APP_BASE_URL=https://joplin.example.com 35 | - APP_PORT=22300 36 | - DB_CLIENT=pg 37 | - POSTGRES_HOST=db 38 | - POSTGRES_DATABASE=joplin 39 | - POSTGRES_USER=joplin 40 | - POSTGRES_PASSWORD=joplin 41 | - POSTGRES_PORT=5432 42 | 43 | ``` 44 | 45 | ### Login with 46 | email: `admin@localhost` 47 | password: `admin` 48 | -------------------------------------------------------------------------------- /apps/notes/memos.md: -------------------------------------------------------------------------------- 1 | # Memos 2 | An open-source, self-hosted memo hub with knowledge management and collaboration. 3 | 4 | - Really easy to setup and use 5 | - Has a dedicated mobile client! 6 | - Quite good UX 7 | 8 |
9 | 10 | - [Homepage](https://usememos.com) 11 | - [Github repo](https://github.com/usememos/memos) 12 | - [Mobile client](https://memos.moe) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yaml 17 | services: 18 | memos: 19 | image: neosmemo/memos:latest 20 | container_name: memos 21 | volumes: 22 | - ./memos:/var/opt/memos 23 | ports: 24 | - 5230:5230 25 | ``` 26 | -------------------------------------------------------------------------------- /apps/notifications/notifiers-by-service.md: -------------------------------------------------------------------------------- 1 | # Notifiers by service 2 | 3 | | Service | email | slack | webhook | script | telegram | discord | pushover | pushbullet | gotify | 4 | |------------------------|:-----:|:-----:|:-------:|:------:|:--------:|:-------:|:--------:|:----------:|:------:| 5 | | Statping | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔️ | ⛔️ | 6 | | Sonarr | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔️ | ✅ | ✅ | ⛔️ | 7 | | Radarr | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔️ | ✅ | ✅ | ✅ | 8 | | Tautulli | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⛔️ | 9 | | synology-notifications | ✅ | ✅ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | 10 | | download station | ✅ | ✅ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | 11 | | qbittorrent | ✅ | ⛔️ | ✅ | ✅ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | 12 | -------------------------------------------------------------------------------- /apps/notifications/pushover.md: -------------------------------------------------------------------------------- 1 | # Pushover 2 | 3 | - As of today, the best notifier out there 4 | - Has mobile app and web desktop client 5 | - Provides email-to-notification service 6 | - Free tier sufficient for a homelab 7 | 8 |
9 | 10 | - [Homepage](https://pushover.net) 11 | - [Web Client](https://client.pushover.net) 12 | - [Docs](https://pushover.net/api#messages) 13 | 14 | 15 | ## Example script 16 | ```sh 17 | #!/bin/bash 18 | 19 | # info #666d7b 20 | # success #408062 21 | # warning #af8a1a 22 | # danger #8b4848 23 | 24 | MSG=$(printf "%s" "$@") 25 | 26 | curl -s -X POST \ 27 | --data-urlencode "token=" \ 28 | --data-urlencode "user=" \ 29 | --data-urlencode "sound=pushover" \ 30 | --data-urlencode "priority=0" \ 31 | --data-urlencode "html=1" \ 32 | --data-urlencode "title=Home Server" \ 33 | --data-urlencode "message=$MSG" \ 34 | https://api.pushover.net/1/messages.json 35 | ``` 36 | -------------------------------------------------------------------------------- /apps/notifications/synology-sms-relay.md: -------------------------------------------------------------------------------- 1 | # Synology sms relay 2 | 3 | - [Github repo](https://github.com/tborychowski/synology-sms-relay) 4 | - [DockerHub repo](https://hub.docker.com/repository/docker/tborychowski/synology-sms-relay) 5 | - [Docs](https://github.com/tborychowski/synology-sms-relay#docker-compose) 6 | 7 | 8 | ## docker-compose.yml 9 | ```yml 10 | services: 11 | synology-sms-relay: 12 | container_name: synology-sms-relay 13 | image: tborychowski/synology-sms-relay 14 | restart: unless-stopped 15 | ports: 16 | - "3000:3000" 17 | volumes: 18 | - ./script.sh:/app/script.sh 19 | ``` 20 | 21 | ## Example pushover `script.sh` 22 | ```sh 23 | #!/bin/bash 24 | 25 | # info #666d7b 26 | # success #408062 27 | # warning #af8a1a 28 | # danger #8b4848 29 | 30 | MSG=$(printf "%s" "$@") 31 | curl -s -X POST \ 32 | --data-urlencode "token=" \ 33 | --data-urlencode "user=" \ 34 | --data-urlencode "sound=pushover" \ 35 | --data-urlencode "priority=0" \ 36 | --data-urlencode "html=1" \ 37 | --data-urlencode "title=Home Server" \ 38 | --data-urlencode "message=$MSG" \ 39 | https://api.pushover.net/1/messages.json 40 | ``` 41 | -------------------------------------------------------------------------------- /apps/other/bitwarden.md: -------------------------------------------------------------------------------- 1 | # Bitwarden 2 | Bitwarden is a password manager & vault.
3 | 4 | bitwarden_rs is an unofficial Bitwarden compatible server. 5 | 6 |
7 | 8 | - [Official Bitwarden Site](https://bitwarden.com/) 9 | - [bitwarden_rs Github repo](https://github.com/dani-garcia/bitwarden_rs) 10 | - [bitwarden_rs Docs](https://github.com/dani-garcia/bitwarden_rs/wiki) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | bitwarden: 17 | image: bitwardenrs/server:latest 18 | container_name: bitwarden 19 | restart: unless-stopped 20 | ports: 21 | - "3000:80" 22 | volumes: 23 | - ./data:/data/ 24 | environment: 25 | - SIGNUPS_ALLOWED=false 26 | - ADMIN_TOKEN=123123123123123123123123123123123123123123 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/other/budibase.md: -------------------------------------------------------------------------------- 1 | # Budibase 2 | - Build internal apps in minutes. 3 | - This is a "meta" app, that allows to quickly create a database, fill it with data, and create a simple app that would read/write data. 4 | 5 |
6 | 7 | - [Homepage](https://budibase.com) 8 | - [Github repo](https://github.com/Budibase/budibase) 9 | - [Docs](https://docs.budibase.com/docs) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | budibase: 16 | image: budibase/budibase:latest 17 | container_name: budibase 18 | restart: unless-stopped 19 | environment: 20 | JWT_SECRET: lqOTTMi1wSphb7chGMfcHLCDZ1YHVFkdn6fnp0vj45U= 21 | MINIO_ACCESS_KEY: budibase 22 | MINIO_SECRET_KEY: budibase 23 | REDIS_PASSWORD: budibase 24 | COUCHDB_USER: budibase 25 | COUCHDB_PASSWORD: budibase 26 | INTERNAL_API_KEY: budibase 27 | ports: 28 | - "10000:80" 29 | volumes: 30 | - ./data:/data 31 | ``` 32 | -------------------------------------------------------------------------------- /apps/other/change-detection.md: -------------------------------------------------------------------------------- 1 | # Change detection 2 | Periodically monitors websites for changes and sends a notification when a change is detected. 3 | 4 | - can use plain http request (faster option) or playwright (headless chrome) to render websites with javascript 5 | - can filter a site with css selectors (to e.g. only get notifications when a price changes) 6 | - many useful options like executing javascript on a site, before detecting changes (useful to eg. login) 7 | - uses apprise for notifications, so hundreds of options (email, slack, telegram, sms, etc.) 8 | 9 |
10 | 11 | - [Github repo](https://github.com/dgtlmoon/changedetection.io) 12 | - [Non-self-hosted version](https://lemonade.changedetection.io/start) 13 | 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | playwright-chrome: 19 | hostname: playwright-chrome 20 | image: browserless/chrome 21 | restart: unless-stopped 22 | environment: 23 | - SCREEN_WIDTH=1920 24 | - SCREEN_HEIGHT=1024 25 | - SCREEN_DEPTH=16 26 | - ENABLE_DEBUGGER=false 27 | - PREBOOT_CHROME=true 28 | - CONNECTION_TIMEOUT=300000 29 | - MAX_CONCURRENT_SESSIONS=10 30 | - CHROME_REFRESH_TIME=600000 31 | - DEFAULT_BLOCK_ADS=true 32 | - DEFAULT_STEALTH=true 33 | 34 | changedetection: 35 | image: ghcr.io/dgtlmoon/changedetection.io 36 | container_name: changedetection 37 | hostname: changedetection 38 | restart: unless-stopped 39 | environment: 40 | - PLAYWRIGHT_DRIVER_URL=ws://playwright-chrome:3000/?stealth=1&--disable-web-security=true 41 | - BASE_URL=https://changedetection.domain.com 42 | ports: 43 | - 5000:5000 44 | volumes: 45 | - ./data:/datastore 46 | ``` 47 | -------------------------------------------------------------------------------- /apps/other/cockpit.md: -------------------------------------------------------------------------------- 1 | # Cockpit 2 | 3 | 4 | - [Github repo](https://github.com/cockpit-project/cockpit) 5 | - [Docs](https://cockpit-project.org/running.html#ubuntu) 6 | 7 | 8 | ## Installation 9 | ```sh 10 | sudo apt-get install cockpit 11 | ``` 12 | 13 | Then go to `https://:9090` 14 | 15 | 16 | ## Tips & Tricks 17 | To remove the cockpit's motd (welcome message) automatically added to every ssh login: 18 | ```sh 19 | sudo rm /etc/motd.d/cockpit 20 | ``` 21 | -------------------------------------------------------------------------------- /apps/other/code.md: -------------------------------------------------------------------------------- 1 | # Code Server 2 | 3 | VSCode in the browser! 4 | 5 |
6 | 7 | - [Github repo](https://github.com/cdr/code-server) 8 | - [Docker Hub](https://hub.docker.com/r/linuxserver/code-server) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | code-server: 15 | image: linuxserver/code-server 16 | container_name: code-server 17 | restart: unless-stopped 18 | ports: 19 | - 3000:8443 20 | environment: 21 | - PUID=1000 22 | - PGID=1000 23 | - TZ=Europe/Dublin 24 | # - PASSWORD=password #optional 25 | # - SUDO_PASSWORD=password #optional 26 | - PROXY_DOMAIN=code.example.com #optional 27 | 28 | # To get extensions from M$ store - add these: 29 | - SERVICE_URL=https://marketplace.visualstudio.com/_apis/public/gallery 30 | - ITEM_URL=https://marketplace.visualstudio.com/items 31 | volumes: 32 | - ./config:/config 33 | # folder that will show up in the Code file tree 34 | - /var/www/project1:/config/workspace/project1 35 | ``` 36 | -------------------------------------------------------------------------------- /apps/other/crowdsec.md: -------------------------------------------------------------------------------- 1 | # Crowdsec 2 | 3 | It's basically a self-hosted crowd-based firewall. 4 | Setup is a bit cumbersome but (probably) well worth it :-) 5 | 6 |
7 | 8 | - [Homepage](https://www.crowdsec.net) 9 | - [Github repo](https://github.com/crowdsecurity/crowdsec) 10 | - [Docker Hub](https://hub.docker.com/r/crowdsecurity/crowdsec) 11 | - [Crowdsec Hub](https://hub.crowdsec.net) 12 | - [Traefik bouncer](https://github.com/fbonalair/traefik-crowdsec-bouncer) 13 | - [Collections](https://hub.crowdsec.net/browse/#collections) 14 | 15 | 16 | 17 | ## How does that work 18 | - There are 2 parts of the solution: analyser & bouncer 19 | - Crowdsec container (below) just basically analyses your server logs 20 | - Bouncer container (below) uses the analysis to bounce off the potential attacks 21 | 22 | ## Local Setup 23 | This describes how to setup crowdsec with traefik bouncer. There are other bouncers you can use (if you don't use traefik). 24 | 25 | 1. Create 2 files with the following content (`acquis.yml` and `docker-compose.yml`). Remember to update the paths to your logs in `docker-compose.yml`! 26 | 2. Start the containers (`docker compose up -d`) 27 | 3. Wait a minute or so (until it finishes installing collections), you can follow the logs to see what's going on (`docker compose logs -f`) 28 | 4. Add bouncer to the crowdsec instance: 29 | ```sh 30 | docker exec crowdsec cscli bouncers add traefik-bouncer 31 | ``` 32 | 5. Copy the API key printed in the command output and paste it back in the `docker-compose.yml` in the bouncer config (`CROWDSEC_BOUNCER_API_KEY`) 33 | 6. Restart the containers 34 | 7. That's it. 35 | 36 | ## Online console 37 | Unless you want to have an online console, than do this as well: 38 | 1. Register at https://app.crowdsec.net/ 39 | 2. Enroll your instance, with the API key from there, e.g.: 40 | ```sh 41 | docker exec crowdsec cscli console enroll cl8m56qpu00060vlcwgj898z0 42 | ``` 43 | 44 | ## Traefik middleware 45 | 1. Add traefik middleweare in the dynamic config, e.g. 46 | ```toml 47 | [http.middlewares.crowdsec.forwardauth] 48 | address = "http://:3300/api/v1/forwardAuth" 49 | ``` 50 | 2. Use this middleware in your services, e.g. 51 | ```toml 52 | [http.routers.authelia] 53 | rule ="Host(`login.domain.com`)" 54 | service = "authelia" 55 | tls = { } 56 | middlewares = [ "crowdsec" ] 57 | ``` 58 | 59 | 60 | ## acquis.yml 61 | ```yml 62 | --- 63 | filenames: 64 | - /logs/auth.log 65 | - /logs/syslog 66 | - /logs/kern.log 67 | labels: 68 | type: syslog 69 | 70 | --- 71 | filenames: 72 | - /logs/apache2/*.log 73 | - /logs/*httpd*.log 74 | - /logs/httpd/*log 75 | labels: 76 | type: apache2 77 | 78 | --- 79 | filenames: 80 | - /logs/nginx/*.log 81 | labels: 82 | type: nginx 83 | 84 | --- 85 | filenames: 86 | - /logs/authelia.log 87 | labels: 88 | type: authelia 89 | 90 | --- 91 | filenames: 92 | - /logs/traefik/*.log 93 | labels: 94 | type: traefik 95 | ``` 96 | 97 | 98 | 99 | ## docker-compose.yml 100 | ```yml 101 | services: 102 | crowdsec: 103 | image: crowdsecurity/crowdsec 104 | container_name: crowdsec 105 | restart: unless-stopped 106 | environment: 107 | - GID="${GID-1000}" 108 | - COLLECTIONS=crowdsecurity/linux crowdsecurity/iptables crowdsecurity/apache2 crowdsecurity/sshd crowdsecurity/traefik LePresidente/authelia crowdsecurity/nginx crowdsecurity/base-http-scenarios 109 | volumes: 110 | - /var/log/auth.log:/logs/auth.log:ro 111 | - /var/log/syslog.log:/logs/syslog.log:ro 112 | - /var/log/kern.log:/logs/kern.log:ro 113 | - /var/log/apache:/logs/apache:ro 114 | - /var/log/httpd:/logs/httpd:ro 115 | - /var/log/authelia.log:/logs/authelia.log:ro 116 | - /var/log/traefik/logs:/logs/traefik:ro 117 | 118 | - ./acquis.yml:/etc/crowdsec/acquis.yaml 119 | - ./data:/var/lib/crowdsec/data/ 120 | - ./config:/etc/crowdsec/ 121 | 122 | bouncer: 123 | image: fbonalair/traefik-crowdsec-bouncer 124 | container_name: crowdsec-bouncer 125 | restart: unless-stopped 126 | environment: 127 | - PORT=8090 128 | - CROWDSEC_BOUNCER_API_KEY=changeme 129 | - CROWDSEC_AGENT_HOST=crowdsec:8080 130 | ports: 131 | - 3300:8090 132 | ``` 133 | 134 | 135 | ## Useful commands 136 | 137 | 1. List installed items 138 | ```sh 139 | docker exec crowdsec cscli scenarios list 140 | docker exec crowdsec cscli collections list 141 | docker exec crowdsec cscli parsers list 142 | ``` 143 | 144 | 2. Block/unblock an ip 145 | ```sh 146 | docker exec crowdsec cscli decisions add --ip 192.168.1.1 147 | docker exec crowdsec cscli decisions remove --ip 192.168.1.1 148 | docker exec crowdsec cscli decisions list 149 | docker exec crowdsec cscli decisions help # display help on decisions command 150 | docker exec crowdsec cscli decisions add --help # display help on add command 151 | ``` 152 | -------------------------------------------------------------------------------- /apps/other/firefox-sync.md: -------------------------------------------------------------------------------- 1 | # Firefox Sync Server 2 | 3 | Run-Your-Own Firefox Sync Server. I couldn't make it fully work with MacOS & iOS.
4 | Maybe this [tutorial](https://homegrowntechie.com/self-host-your-browser-data/) will work, but I haven't tried that yet. 5 | 6 |
7 | 8 | - [Github repo](https://github.com/mozilla-services/syncserver) 9 | - [HowTo](https://mozilla-services.readthedocs.io/en/latest/howtos/run-sync-1.5.html) 10 | - [Step-by-step Tutorial](https://homegrowntechie.com/self-host-your-browser-data/) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | firefox-sync: 17 | image: mozilla/syncserver:latest 18 | container_name: firefox-sync 19 | restart: unless-stopped 20 | environment: 21 | - TZ=Europe/Dublin 22 | - SYNCSERVER_PUBLIC_URL=http://localhost:5000 23 | - SYNCSERVER_SECRET=0123123123123123123123123123123 24 | - SYNCSERVER_SQLURI=sqlite:////data/syncserver.db 25 | - SYNCSERVER_BATCH_UPLOAD_ENABLED=true 26 | - SYNCSERVER_FORCE_WSGI_ENVIRON=false 27 | ports: 28 | - "3000:5000" 29 | volumes: 30 | - ./data:/data 31 | ``` 32 | 33 | ## Tips & Tricks 34 | 35 | #### Change in Firefox desktop 36 | in `about:config`, change: `identity.sync.tokenserver.uri` to `https://firefox.example.com/token/1.0/sync/1.5`
37 | 38 | (default is `https://token.services.mozilla.com/1.0/sync/1.5`) 39 | 40 | #### Change on iOS 41 | 1. In `Settings` - tap 5 times on the version number to get into **Debug Mode** 42 | 2. Go to `Advanced Sync Settings` and enter your sync URL: `https://firefox.example.com/token/1.0/sync/1.5` 43 | 44 | #### Generate secret 45 | ```sh 46 | head -c 20 /dev/urandom | sha1sum 47 | ``` 48 | 49 | #### Test 50 | `/usr/local/bin/python -m syncstorage.tests.functional.test_storage --use-token-server http://localhost:5000/token/1.0/sync/1.5` 51 | 52 | #### Remove mozilla hosted data 53 | ```sh 54 | pip install PyFxA 55 | python ./bin/delete_user_data.py user@example.com 56 | ``` 57 | -------------------------------------------------------------------------------- /apps/other/firefox.md: -------------------------------------------------------------------------------- 1 | # Firefox 2 | It's a browser inside a browser! 3 | 4 | - Very useful when you need to check a site that is blocked by your provider (work/school) (assuming that the firefox instance you host is not blocked). 5 | - a bit slow, but it works! 6 | 7 |
8 | 9 | - [Github repo](https://github.com/linuxserver/docker-firefox) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | firefox: 16 | image: lscr.io/linuxserver/firefox:latest 17 | container_name: firefox 18 | shm_size: "1gb" 19 | restart: unless-stopped 20 | environment: 21 | - PUID=1000 22 | - PGID=1000 23 | - TZ=Europe/Dublin 24 | ports: 25 | - 3123:3000 26 | volumes: 27 | - ./config:/config 28 | ``` 29 | -------------------------------------------------------------------------------- /apps/other/language-tool.md: -------------------------------------------------------------------------------- 1 | # LanguageTool 2 | Multilingual grammar, style, and spell checker (similar to Grammarly). 3 | 4 |
5 | 6 | - [Official Site](https://languagetool.org) 7 | - [Github repo](https://github.com/Erikvl87/docker-languagetool) 8 | - [Docker Hub](https://hub.docker.com/r/erikvl87/languagetool) 9 | 10 | ## Optional n-gram data 11 | LanguageTool can make use of large n-gram data sets to detect errors with words that are often confused, like `their` and `there`. 12 | 13 | 1. Download & unzip n-gram data for your language: https://languagetool.org/download/ngram-data/ 14 | 15 | ```sh 16 | wget https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip 17 | unzip ngrams-en-20150817.zip 18 | ``` 19 | 20 | 2. Uncomment n-gram volume and env variable below 21 | 22 | ## docker-compose.yml 23 | ```yml 24 | services: 25 | languagetool: 26 | image: erikvl87/languagetool 27 | container_name: languagetool 28 | restart: unless-stopped 29 | ports: 30 | - 8010:8010 # Using default port from the image 31 | environment: 32 | # - langtool_languageModel=/ngrams # OPTIONAL: Using ngrams data 33 | - Java_Xms=512m # OPTIONAL: Setting a minimal Java heap size of 512 mib 34 | - Java_Xmx=1g # OPTIONAL: Setting a maximum Java heap size of 1 Gib 35 | volumes: 36 | - ./ngrams:/ngrams 37 | ``` 38 | 39 | And then, in a browser extension: 40 | - in `LanguageTool API server URL:` select `Other server` 41 | - enter: `http://:8010/v2` 42 | 43 | 44 | 45 | ## Alternative docker-compose.yml 46 | This is using [libregrammar](https://github.com/TiagoSantos81/libregrammar) version, which (allegedly) provides the premium features for free. 47 | 48 | - [Github repo for libregrammar](https://github.com/TiagoSantos81/libregrammar) 49 | - [Github repo for the docker image](https://github.com/py-crash/docker-libregrammar) 50 | 51 | 52 | ```yml 53 | services: 54 | languagetool: 55 | image: registry.gitlab.com/py_crash/docker-libregrammar 56 | container_name: languagetool 57 | restart: unless-stopped 58 | environment: 59 | - langtool_languageModel=/ngrams # OPTIONAL: Using ngrams data 60 | - Java_Xms=512m # OPTIONAL: Setting a minimal Java heap size of 512 mib 61 | - Java_Xmx=1g # OPTIONAL: Setting a maximum Java heap size of 1 Gib 62 | ports: 63 | - "8081:8081" 64 | volumes: 65 | - ./ngrams:/ngrams 66 | ``` 67 | -------------------------------------------------------------------------------- /apps/other/ntfy.md: -------------------------------------------------------------------------------- 1 | # NTFY 2 | A self-hosted notification server (like pushover). 3 | 4 | - has mobile apps for ios and android 5 | - interesting conceptually (simple pub-sub) 6 | - very easy to use (from curl to php) 7 | - notifications arrive promptly, within seconds (1 - 10) (not as instant as e.g. pushover) 8 | - sometimes apps need to be restarted to show notifications (sometimes a notification shows up in notification center, but not in the app) 9 | - no sync between clients - i.e. the same notification must be marked as read or dismissed in all subscribers (in pushover, when I read one on my phone - it shows as read on laptop) 10 | 11 |
12 | 13 | - [Homepage](https://ntfy.sh) 14 | - [Github repo](https://github.com/binwiederhier/ntfy) 15 | - [Docs](https://ntfy.sh/docs/) 16 | 17 | 18 | ## ntfy/server.yml 19 | ```yml 20 | # options: https://ntfy.sh/docs/config/ 21 | 22 | base-url: https://ntfy.domain.com 23 | 24 | # needed for performance 25 | cache-file: /var/cache/ntfy/cache.db 26 | cache-duration: "12h" 27 | cache-startup-queries: | 28 | pragma journal_mode = WAL; 29 | pragma synchronous = normal; 30 | pragma temp_store = memory; 31 | 32 | # This is needed for instant mobile notifications 33 | upstream-base-url: "https://ntfy.sh" 34 | ``` 35 | 36 | 37 | ## docker-compose.yml 38 | ```yml 39 | services: 40 | ntfy: 41 | image: binwiederhier/ntfy 42 | container_name: ntfy 43 | restart: unless-stopped 44 | command: 45 | - serve 46 | environment: 47 | - TZ=Europe/Dublin 48 | volumes: 49 | - ./cache:/var/cache/ntfy 50 | - ./ntfy:/etc/ntfy 51 | ports: 52 | - 3040:80 53 | ``` 54 | -------------------------------------------------------------------------------- /apps/other/openspeedtest.md: -------------------------------------------------------------------------------- 1 | # OpenSpeedTest 2 | Pure HTML5 Network Performance Estimation Tool.
3 | Measure the speed between your server and your computer. 4 | 5 |
6 | 7 | - [Homepage](http://openspeedtest.com) 8 | - [Github repo](https://github.com/openspeedtest/Speed-Test) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | openspeedtest: 15 | image: openspeedtest/latest 16 | container_name: openspeedtest 17 | restart: unless-stopped 18 | ports: 19 | - "3000:3000" 20 | ``` 21 | -------------------------------------------------------------------------------- /apps/other/penpot.md: -------------------------------------------------------------------------------- 1 | # PenPot 2 | Open Source design and prototyping platform for cross-domain teams 3 | 4 | - like Figma but poorer. 5 | 6 |
7 | 8 | - [Homepage](https://penpot.app) 9 | - [Github repo](https://github.com/penpot/penpot) 10 | - [Docs](https://help.penpot.app/technical-guide/getting-started/#install-with-docker) 11 | 12 | 13 | ## You can get the required file directly from github: 14 | ```sh 15 | wget https://raw.githubusercontent.com/penpot/penpot/main/docker/images/docker-compose.yaml 16 | ``` 17 | Or copy & paste from here: 18 | 19 | 20 | ## docker-compose.yml 21 | ```yml 22 | ## You can read more about all available flags and other 23 | ## environment variables here: 24 | ## https://help.penpot.app/technical-guide/configuration/#advanced-configuration 25 | # 26 | # WARNING: if you're exposing Penpot to the internet, you should remove the flags 27 | # 'disable-secure-session-cookies' and 'disable-email-verification' 28 | x-flags: &penpot-flags 29 | PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies 30 | 31 | x-uri: &penpot-public-uri 32 | PENPOT_PUBLIC_URI: http://192.168.1.10:9001 33 | 34 | x-body-size: &penpot-http-body-size 35 | # Max body size (30MiB); Used for plain requests, should never be 36 | # greater than multi-part size 37 | PENPOT_HTTP_SERVER_MAX_BODY_SIZE: 31457280 38 | 39 | # Max multipart body size (350MiB) 40 | PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE: 367001600 41 | 42 | 43 | services: 44 | 45 | penpot-frontend: 46 | image: "penpotapp/frontend:latest" 47 | restart: unless-stopped 48 | depends_on: 49 | - penpot-backend 50 | - penpot-exporter 51 | environment: 52 | << : [*penpot-flags, *penpot-http-body-size] 53 | ports: 54 | - 9001:8080 55 | volumes: 56 | - ./assets:/opt/data/assets 57 | 58 | 59 | penpot-backend: 60 | image: "penpotapp/backend:latest" 61 | restart: unless-stopped 62 | depends_on: 63 | penpot-postgres: 64 | condition: service_healthy 65 | penpot-redis: 66 | condition: service_healthy 67 | environment: 68 | << : [*penpot-flags, *penpot-public-uri, *penpot-http-body-size] 69 | PENPOT_SECRET_KEY: 93ac8dc5eb2bb583bd8f827bd31be520dd32ead00657237d66662013770ee45c 70 | PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot 71 | PENPOT_DATABASE_USERNAME: penpot 72 | PENPOT_DATABASE_PASSWORD: penpot 73 | PENPOT_REDIS_URI: redis://penpot-redis/0 74 | PENPOT_ASSETS_STORAGE_BACKEND: assets-fs 75 | PENPOT_STORAGE_ASSETS_FS_DIRECTORY: /opt/data/assets 76 | PENPOT_TELEMETRY_ENABLED: false 77 | PENPOT_TELEMETRY_REFERER: compose 78 | 79 | ## Example SMTP/Email configuration. By default, emails are sent to the mailcatch 80 | ## service, but for production usage it is recommended to setup a real SMTP 81 | ## provider. Emails are used to confirm user registrations & invitations. Look below 82 | ## how the mailcatch service is configured. 83 | PENPOT_SMTP_DEFAULT_FROM: no-reply@example.com 84 | PENPOT_SMTP_DEFAULT_REPLY_TO: no-reply@example.com 85 | PENPOT_SMTP_HOST: penpot-mailcatch 86 | PENPOT_SMTP_PORT: 1025 87 | PENPOT_SMTP_USERNAME: 88 | PENPOT_SMTP_PASSWORD: 89 | PENPOT_SMTP_TLS: false 90 | PENPOT_SMTP_SSL: false 91 | 92 | volumes: 93 | - ./assets:/opt/data/assets 94 | 95 | 96 | penpot-exporter: 97 | image: "penpotapp/exporter:latest" 98 | restart: unless-stopped 99 | depends_on: 100 | penpot-redis: 101 | condition: service_healthy 102 | environment: 103 | PENPOT_PUBLIC_URI: http://penpot-frontend:8080 104 | PENPOT_REDIS_URI: redis://penpot-redis/0 105 | 106 | 107 | penpot-postgres: 108 | image: "postgres:15" 109 | restart: unless-stopped 110 | stop_signal: SIGINT 111 | healthcheck: 112 | test: ["CMD-SHELL", "pg_isready -U penpot"] 113 | interval: 2s 114 | timeout: 10s 115 | retries: 5 116 | start_period: 2s 117 | environment: 118 | - POSTGRES_INITDB_ARGS=--data-checksums 119 | - POSTGRES_DB=penpot 120 | - POSTGRES_USER=penpot 121 | - POSTGRES_PASSWORD=penpot 122 | volumes: 123 | - ./db:/var/lib/postgresql/data 124 | 125 | 126 | penpot-redis: 127 | image: redis:7.2 128 | restart: unless-stopped 129 | 130 | healthcheck: 131 | test: ["CMD-SHELL", "redis-cli ping | grep PONG"] 132 | interval: 1s 133 | timeout: 3s 134 | retries: 5 135 | start_period: 3s 136 | 137 | 138 | ## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the 139 | ## port 1080 for read all emails the penpot platform has sent. Should be only used as a 140 | ## temporal solution while no real SMTP provider is configured. 141 | penpot-mailcatch: 142 | image: sj26/mailcatcher:latest 143 | restart: unless-stopped 144 | expose: 145 | - '1025' 146 | ports: 147 | - "1080:1080" 148 | 149 | ``` 150 | -------------------------------------------------------------------------------- /apps/other/vpn.md: -------------------------------------------------------------------------------- 1 | # Gluetun VPN client 2 | A VPN client to tunnel to Cyberghost, ExpressVPN, FastestVPN, HideMyAss, IPVanish, IVPN, Mullvad, NordVPN, Perfect Privacy, Privado, Private Internet Access, PrivateVPN, ProtonVPN, PureVPN, Surfshark, TorGuard, VPNUnlimited, VyprVPN, WeVPN and Windscribe VPN servers using Go, OpenVPN or Wireguard, iptables, DNS over TLS, ShadowSocks and an HTTP proxy.
3 | 4 | - [Github repo](https://github.com/qdm12/gluetun) 5 | - [Docker Hub](https://hub.docker.com/r/qmcgaw/gluetun) 6 | 7 | ## Requirements 8 | An account with a compatible VPN provider is required. 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | gluetun: 14 | image: qmcgaw/gluetun 15 | container_name: gluetun 16 | restart: unless-stopped 17 | cap_add: 18 | - NET_ADMIN 19 | environment: 20 | - TZ=Europe/Dublin 21 | - VPN_TYPE=openvpn 22 | - VPNSP=fastestvpn 23 | - OPENVPN_USER= 24 | - OPENVPN_PASSWORD= 25 | - COUNTRY= 26 | volumes: 27 | - ./data:/gluetun 28 | - ./data/port_forward:/tmp/gluetun/forwarded_port 29 | ports: 30 | #- 8888:8888/tcp # HTTP proxy 31 | - 3020:8000/tcp # Built-in HTTP control server 32 | - 9117:9117 # jackett 33 | - 6881:6881 # qbit 34 | - 3030:3030 # qbit webUI 35 | ``` 36 | 37 | and then - in the corresponding service `docker-compose.yml`, e.g.: 38 | ```yml 39 | services: 40 | jackett: 41 | image: ghcr.io/linuxserver/jackett 42 | network_mode: "container:gluetun" 43 | ``` 44 | -------------------------------------------------------------------------------- /apps/other/windows.md: -------------------------------------------------------------------------------- 1 | # Windows 7 in a Docker container 2 | 3 | - [Github repo](https://github.com/dockur/windows) 4 | 5 | 6 | ## docker-compose.yml 7 | ```yml 8 | services: 9 | windows: 10 | image: dockurr/windows 11 | container_name: windows 12 | restart: unless-stopped 13 | devices: 14 | - /dev/kvm 15 | - /dev/net/tun 16 | cap_add: 17 | - NET_ADMIN 18 | ports: 19 | - 8006:8006 20 | - 3389:3389/tcp 21 | - 3389:3389/udp 22 | stop_grace_period: 2m 23 | environment: 24 | CPU_CORES: "4" 25 | RAM_SIZE: "8G" 26 | DISK_SIZE: "128G" 27 | USERNAME: "admin" 28 | volumes: 29 | - ./windows:/storage 30 | - ./win7.iso:/custom.iso 31 | ``` 32 | 33 | ## Tips & Tricks 34 | 35 | ### Custom ISO image 36 | Just add this bit (and remove the `VERSION` environment variable) to the `docker-compose.yml` file: 37 | 38 | ```yml 39 | volumes: 40 | - /home/user/example.iso:/custom.iso 41 | ``` 42 | 43 | ### CPU & RAM 44 | By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM. 45 | If you want to adjust this, you can specify the desired amount using the following environment variables: 46 | 47 | ```yml 48 | environment: 49 | RAM_SIZE: "8G" 50 | CPU_CORES: "4" 51 | ``` 52 | 53 | ### Username and password 54 | By default, a user called `Docker` is created during the installation, with an **empty password**. 55 | If you want to use different credentials, you can change them in your compose file: 56 | 57 | ```yml 58 | environment: 59 | USERNAME: "bill" 60 | PASSWORD: "gates" 61 | ``` 62 | 63 | ### Storage location 64 | To change the storage location, include the following bind mount in your compose file: 65 | 66 | ```yml 67 | volumes: 68 | - /var/win:/storage 69 | ``` 70 | 71 | 72 | ### Storage size 73 | To expand the default size of **64 GB**, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity: 74 | 75 | ```yml 76 | environment: 77 | DISK_SIZE: "256G" 78 | ``` 79 | 80 | ### Sharing files with the host 81 | Open **File Explorer** and click on the **Network** section, you will see a computer called **host.lan**. Double-click it and it will show a folder called **Data**, which can be bound to any folder on your host via the compose file: 82 | 83 | ```yml 84 | volumes: 85 | - /home/user/example:/data 86 | ``` 87 | -------------------------------------------------------------------------------- /apps/photos/chevereto.md: -------------------------------------------------------------------------------- 1 | # Chevereto 2 | 3 | Mature and trusted self-hosted image and video hosting solution since 2009. Create your own Flickr/Imgur-style media sharing platform with full control over your content and rules. 4 | 5 | - [Github repo](https://github.com/chevereto/chevereto) 6 | - [Homepage](https://chevereto.com/) 7 | - [Docs](https://v4-docs.chevereto.com/guides/docker/pure-docker.html) 8 | 9 | ## docker-compose.yml 10 | 11 | ```yml 12 | services: 13 | database: 14 | image: mariadb:jammy 15 | networks: 16 | - chevereto 17 | volumes: 18 | - database:/var/lib/mysql 19 | restart: always 20 | healthcheck: 21 | test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect"] 22 | interval: 10s 23 | timeout: 5s 24 | retries: 3 25 | environment: 26 | MYSQL_ROOT_PASSWORD: password 27 | MYSQL_DATABASE: chevereto 28 | MYSQL_USER: chevereto 29 | MYSQL_PASSWORD: user_database_password 30 | 31 | php: 32 | image: chevereto/chevereto:latest # tweak with target image to run 33 | networks: 34 | - chevereto 35 | volumes: 36 | - storage:/var/www/html/images/ 37 | # - app:/var/www/html/ # uncomment when using CHEVERETO_SERVICING=server 38 | restart: always 39 | depends_on: 40 | database: 41 | condition: service_healthy 42 | expose: 43 | - 80 44 | environment: 45 | CHEVERETO_DB_HOST: database 46 | CHEVERETO_DB_USER: chevereto 47 | CHEVERETO_DB_PASS: user_database_password 48 | CHEVERETO_DB_PORT: 3306 49 | CHEVERETO_DB_NAME: chevereto 50 | CHEVERETO_HOSTNAME: hostname.com 51 | CHEVERETO_HOSTNAME_PATH: / 52 | CHEVERETO_HTTPS: 0 53 | CHEVERETO_MAX_POST_SIZE: 2G 54 | CHEVERETO_MAX_UPLOAD_SIZE: 2G 55 | # CHEVERETO_SERVICING: server # uncomment to enable application filesystem upgrades 56 | 57 | volumes: 58 | database: 59 | storage: 60 | # app: # uncomment when using CHEVERETO_SERVICING=server 61 | 62 | networks: 63 | chevereto: 64 | ``` 65 | -------------------------------------------------------------------------------- /apps/photos/comparison.md: -------------------------------------------------------------------------------- 1 | 2 | | App | UI | Users | Album Sharing | Comments | UI upload | Video support | 3 | |--------------------------------------------------|-----------|------------|----------------------------|----------|-----------|----------------------------------------| 4 | | [Chevereto](chevereto.md) | ⭐️⭐️⭐️⭐️⭐️ | admin only | links, passwords, private | ✅ | ✅ | ✅ | 5 | | [LibrePhotos](libre-photos.md) | ⭐️ | ✅ | links, passwords | ⛔️ | ⛔️ | ⛔️ | 6 | | [Lychee](lychee.md) | ⭐️⭐️⭐️⭐️⭐️ | ✅ | links, passwords | ⛔️ | ✅ | ✅ | 7 | | NextCloud Photos | ⭐️⭐️⭐️⭐️ | ✅ | links, passwords | ✅ | ✅ | ✅ | 8 | | [PhotoPrism](photoprism.md) | ⭐️⭐️⭐️⭐️ | admin only | unique links | ⛔️ | ✅ | ✅ | 9 | | [Pigallery2](pigallery.md) | ⭐️⭐️⭐️ | ✅ | users, links with password | ⛔️ | ⛔️ | ✅ | 10 | | [Piwigo](piwigo.md) | ⭐️⭐️ | ✅ | user/group permissions | ✅ | ✅ | mp4, m4v, webm, webmv | 11 | | [PixelFed](pixelfed.md) | ⭐️⭐️⭐️⭐️ | ✅ | | ✅ | ✅ | ⛔️ | 12 | | [PhotoStructure](photostructure.md) | ⭐️⭐️⭐️⭐️ | ⛔️ | ⛔️ | ⛔️ | ⛔️ | ✅ | 13 | | [PhotoView](photoview.md) | ⭐️⭐️⭐️ | ✅ | unique links with password | ⛔️ | ⛔️ | ✅ | 14 | | Synology Moments | ⭐️⭐️⭐️⭐️ | ✅ | links | ⛔️ | ✅ | ✅ | 15 | | Synology Photo Station | ⭐️⭐️⭐️ | ✅ | links, passwords | ✅ | ✅ | ✅ | 16 | -------------------------------------------------------------------------------- /apps/photos/photoprism.md: -------------------------------------------------------------------------------- 1 | # Photoprism 2 | 3 | Personal Photo Management powered by Go and Google TensorFlow. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/photoprism/photoprism) 8 | - [Demo](https://demo.photoprism.org/photos) 9 | 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | 14 | services: 15 | photoprism: 16 | image: photoprism/photoprism:latest 17 | restart: unless-stopped 18 | ports: 19 | - 2342:2342 20 | shm_size: "2gb" 21 | depends_on: 22 | - photoprism-db 23 | environment: 24 | TF_CPP_MIN_LOG_LEVEL: 0 25 | PHOTOPRISM_SITE_URL: "http://localhost:2342/" 26 | PHOTOPRISM_SITE_TITLE: "PhotoPrism" 27 | PHOTOPRISM_SITE_CAPTION: "Browse Your Life" 28 | PHOTOPRISM_SITE_DESCRIPTION: "Open-Source Personal Photo Management" 29 | PHOTOPRISM_SITE_AUTHOR: "@browseyourlife" 30 | PHOTOPRISM_DEBUG: "false" 31 | PHOTOPRISM_READONLY: "false" 32 | PHOTOPRISM_PUBLIC: "true" 33 | PHOTOPRISM_EXPERIMENTAL: "true" 34 | PHOTOPRISM_UPLOAD_NSFW: "false" 35 | PHOTOPRISM_DETECT_NSFW: "false" 36 | PHOTOPRISM_SERVER_MODE: "production" 37 | PHOTOPRISM_HTTP_HOST: "0.0.0.0" 38 | PHOTOPRISM_HTTP_PORT: 2342 39 | PHOTOPRISM_DATABASE_DRIVER: "mysql" 40 | PHOTOPRISM_DATABASE_DSN: "root:photoprism@tcp(photoprism-db:4001)/photoprism?charset=utf8mb4,utf8&parseTime=true" 41 | PHOTOPRISM_TEST_DRIVER: "sqlite" 42 | PHOTOPRISM_TEST_DSN: ".test.db" 43 | PHOTOPRISM_ADMIN_PASSWORD: "photoprism" 44 | PHOTOPRISM_THUMB_FILTER: "lanczos" # Resample filter, best to worst: blackman, lanczos, cubic, linear 45 | PHOTOPRISM_THUMB_UNCACHED: "true" # Enable on-demand thumbnail rendering (high memory and cpu usage) 46 | PHOTOPRISM_THUMB_SIZE: 2048 # Pre-rendered thumbnail size limit (default 2048, min 720, max 7680) 47 | # PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD 48 | PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # On-demand rendering size limit (default 7680, min 720, max 7680) 49 | PHOTOPRISM_JPEG_SIZE: 7680 # Size limit for converted image files in pixels (720-30000) 50 | PHOTOPRISM_JPEG_QUALITY: 92 # Set to 95 for high-quality thumbnails (25-100) 51 | PHOTOPRISM_DARKTABLE_PRESETS: "false" # Use darktable presets (disables concurrent raw to jpeg conversion) 52 | PHOTOPRISM_SIDECAR_JSON: "true" # Read metadata from JSON sidecar files created by exiftool 53 | PHOTOPRISM_SIDECAR_YAML: "true" # Backup photo metadata to YAML sidecar files 54 | PHOTOPRISM_ASSETS_PATH: "/photoprism/assets" 55 | PHOTOPRISM_ORIGINALS_PATH: "/photoprism/storage/originals" 56 | PHOTOPRISM_IMPORT_PATH: "/photoprism/storage/import" 57 | PHOTOPRISM_STORAGE_PATH: "/photoprism/storage/cache" # Storage PATH for generated files like cache and index 58 | volumes: 59 | - "./storage:/photoprism/storage" # Keep cache, settings and database 60 | 61 | photoprism-db: 62 | image: mariadb:10.5 63 | restart: unless-stopped 64 | command: mysqld --port=4001 --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50 65 | volumes: 66 | - "./db:/var/lib/mysql" 67 | environment: 68 | MYSQL_ROOT_PASSWORD: photoprism 69 | MYSQL_USER: photoprism 70 | MYSQL_PASSWORD: photoprism 71 | MYSQL_DATABASE: photoprism 72 | 73 | ``` 74 | -------------------------------------------------------------------------------- /apps/photos/photostructure.md: -------------------------------------------------------------------------------- 1 | # PhotoStructure 2 | 3 | *"Your new home for all your photos & videos"* 4 | 5 | - Very good looking 6 | - Good support for photo and video files 7 | - Still in early development, so limited features (no accounts, sharing, etc.) 8 | 9 | 10 |
11 | 12 | - [Homepage](https://photostructure.com/) 13 | - [Docs for Docker](https://photostructure.com/server/photostructure-for-docker-compose/) 14 | - [Desktop version](https://photostructure.com/install/) 15 | 16 | ## docker-compose.yml 17 | ```yml 18 | services: 19 | photostructure: 20 | image: photostructure/server 21 | restart: unless-stopped 22 | stop_grace_period: 2m 23 | ports: 24 | - 1787:1787/tcp 25 | volumes: 26 | - ./library:/ps/library 27 | - ./cache:/ps/tmp 28 | - ./config/:/ps/config 29 | - ./logs:/ps/logs 30 | - /mnt/photos:/photos 31 | ``` 32 | 33 | If `docker-compose logs` show permission access errors, changing permissions to the generated folders may be required: 34 | ```sh 35 | sudo chmod -R 777 config cache library logs photos 36 | ``` 37 | -------------------------------------------------------------------------------- /apps/photos/photoview.md: -------------------------------------------------------------------------------- 1 | # PhotoView 2 | 3 | Photo gallery for self-hosted personal servers. 4 | 5 |
6 | 7 | - [Github repo](https://github.com/viktorstrate/photoview) 8 | 9 | 10 | ## docker-compose.yml 11 | ```yml 12 | services: 13 | db: 14 | image: mariadb 15 | restart: unless-stopped 16 | environment: 17 | - MYSQL_DATABASE=photoview 18 | - MYSQL_USER=photoview 19 | - MYSQL_PASSWORD=photo-secret 20 | - MYSQL_RANDOM_ROOT_PASSWORD=1 21 | volumes: 22 | - ./db:/var/lib/mysql 23 | 24 | photoview: 25 | image: viktorstrate/photoview:latest 26 | restart: unless-stopped 27 | ports: 28 | - "3090:80" 29 | depends_on: 30 | - db 31 | environment: 32 | - PHOTOVIEW_DATABASE_DRIVER=mysql 33 | - PHOTOVIEW_MYSQL_URL=photoview:photo-secret@tcp(db)/photoview 34 | - PHOTOVIEW_LISTEN_IP=photoview 35 | - PHOTOVIEW_LISTEN_PORT=80 36 | - PHOTOVIEW_MEDIA_CACHE=/app/cache 37 | volumes: 38 | - ./cache:/app/cache 39 | - ./photos:/photos:ro 40 | ``` 41 | -------------------------------------------------------------------------------- /apps/photos/pigallery.md: -------------------------------------------------------------------------------- 1 | # Pigallery2 2 | 3 | - Decent design & UX 4 | - Good support for photo and video files 5 | - Lots of additional features (map, faces, sharing, etc.) 6 | 7 |
8 | 9 | - [Homepage](http://bpatrik.github.io/pigallery2/) 10 | - [Github repo](https://github.com/bpatrik/pigallery2) 11 | - [Demo](https://pigallery2.herokuapp.com/gallery/) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | pigallery2: 18 | image: bpatrik/pigallery2:latest 19 | container_name: pigallery2 20 | environment: 21 | - NODE_ENV=production 22 | volumes: 23 | - ./db:/app/data/db 24 | - ./data/config:/app/data/config 25 | - ./data/tmp:/app/data/tmp 26 | - ./data/images:/app/data/images 27 | ports: 28 | - 3000:80 29 | restart: unless-stopped 30 | ``` 31 | 32 | And login with *admin*:*admin* 33 | -------------------------------------------------------------------------------- /apps/photos/piwigo.md: -------------------------------------------------------------------------------- 1 | # Piwigo 2 | 3 | - Has mobile app 4 | - Some video support 5 | - Quite complex to manage, but also pretty powerful 6 | 7 |
8 | 9 | - [Homepage](http://piwigo.org/) 10 | - [Github repo](https://github.com/Piwigo) 11 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/piwigo) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | piwigo: 18 | image: linuxserver/piwigo 19 | container_name: piwigo 20 | restart: unless-stopped 21 | environment: 22 | - PUID=1000 23 | - PGID=1000 24 | - TZ=Europe/Dublin 25 | depends_on: 26 | - db 27 | ports: 28 | - 3060:80 29 | volumes: 30 | - ./config:/config 31 | 32 | db: 33 | image: mariadb 34 | restart: unless-stopped 35 | environment: 36 | - MYSQL_ROOT_PASSWORD=piwigo 37 | - MYSQL_DATABASE=piwigo 38 | ``` 39 | -------------------------------------------------------------------------------- /apps/photos/pixelfed.md: -------------------------------------------------------------------------------- 1 | # Pixelfed 2 | 3 | Instagram-like photo stream. 4 | 5 |
6 | 7 | - [Homepage](https://pixelfed.org/) 8 | - [Github repo](https://github.com/pixelfed/pixelfed) 9 | - [Docs](https://docs.pixelfed.org/) 10 | 11 | ## Setup 12 | 13 | First create `.env` file like this one: https://github.com/pixelfed/pixelfed/blob/dev/.env.docker 14 | 15 | ## docker-compose.yml 16 | ```yml 17 | services: 18 | app: 19 | image: pixelfed 20 | restart: unless-stopped 21 | env_file: 22 | - ./.env.docker 23 | volumes: 24 | - "app-storage:/var/www/storage" 25 | - "app-bootstrap:/var/www/bootstrap" 26 | - "./.env.docker:/var/www/.env" 27 | networks: 28 | - external 29 | - internal 30 | ports: 31 | - "8080:80" 32 | depends_on: 33 | - db 34 | - redis 35 | 36 | worker: 37 | image: pixelfed 38 | restart: unless-stopped 39 | env_file: 40 | - ./.env.docker 41 | volumes: 42 | - "app-storage:/var/www/storage" 43 | - "app-bootstrap:/var/www/bootstrap" 44 | networks: 45 | - external 46 | - internal 47 | command: gosu www-data php artisan horizon 48 | depends_on: 49 | - db 50 | - redis 51 | 52 | db: 53 | image: mysql:8.0 54 | restart: unless-stopped 55 | networks: 56 | - internal 57 | command: --default-authentication-plugin=mysql_native_password 58 | environment: 59 | - MYSQL_DATABASE=pixelfed 60 | - MYSQL_USER=${DB_USERNAME} 61 | - MYSQL_PASSWORD=${DB_PASSWORD} 62 | - MYSQL_RANDOM_ROOT_PASSWORD=true 63 | volumes: 64 | - "db-data:/var/lib/mysql" 65 | 66 | redis: 67 | image: redis:5-alpine 68 | restart: unless-stopped 69 | volumes: 70 | - "redis-data:/data" 71 | networks: 72 | - internal 73 | 74 | volumes: 75 | db-data: 76 | redis-data: 77 | app-storage: 78 | app-bootstrap: 79 | 80 | networks: 81 | internal: 82 | internal: true 83 | external: 84 | driver: bridge 85 | ``` 86 | -------------------------------------------------------------------------------- /apps/project-mgmt/jira.md: -------------------------------------------------------------------------------- 1 | # Jira 2 | 3 | - The most feature rich and complete solution with long history and wide support. 4 | - The new (March 2021) pricing model makes it prohibitive for regular users. 5 | 6 |
7 | 8 | - [Homepage](https://www.atlassian.com/software/jira/download) 9 | - [DockerHub repo](https://hub.docker.com/r/atlassian/jira-software) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | jira: 16 | image: atlassian/jira-software 17 | container_name: jira 18 | restart: unless-stopped 19 | environment: 20 | - TZ=Europe/Dublin 21 | - JVM_MINIMUM_MEMORY=4096m 22 | - JVM_MAXIMUM_MEMORY=8192m 23 | - ATL_PROXY_NAME=jira.example.com 24 | - ATL_PROXY_PORT=443 25 | - ATL_TOMCAT_SCHEME=https 26 | - ATL_TOMCAT_SECURE=true 27 | - ATL_AUTOLOGIN_COOKIE_AGE=2592000 # 30 days in seconds 28 | ports: 29 | - "8095:8080" 30 | volumes: 31 | - ./data:/var/atlassian/application-data/jira 32 | 33 | db: 34 | image: postgres 35 | restart: unless-stopped 36 | environment: 37 | - POSTGRES_USER=dbuser1 38 | - POSTGRES_PASSWORD=dbpass1 39 | ``` 40 | 41 | ## Tips & Tricks 42 | 43 | ### First run DB setup: 44 | It's better to user postgres, as the support is built-in. 45 | MySQL requires additional drivers to be installed manually. 46 | 47 | ![setup](jira.png) 48 | -------------------------------------------------------------------------------- /apps/project-mgmt/jira.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/project-mgmt/jira.png -------------------------------------------------------------------------------- /apps/project-mgmt/kanboard.md: -------------------------------------------------------------------------------- 1 | # Kanboard 2 | 3 | - some UI bugs (double scrollbar) 4 | - not the best look (outdated themes) 5 | - pretty solid & stable 6 | - lots of options 7 | 8 |
9 | 10 | - [Homepage](https://kanboard.org/) 11 | - [Github repo](https://github.com/kanboard/kanboard) 12 | - [Docs](https://docs.kanboard.org/en/latest/admin_guide/installation.html) 13 | 14 | ![Screenshot]() 15 | 16 | 17 | ## docker-compose.yml 18 | ```yml 19 | services: 20 | kanboard: 21 | image: kanboard/kanboard:latest 22 | environment: 23 | - PLUGIN_INSTALLER=true 24 | ports: 25 | - "3060:80" 26 | # - "443:443" 27 | volumes: 28 | - ./data:/var/www/app/data 29 | - ./plugins:/var/www/app/plugins 30 | # - kanboard_ssl:/etc/nginx/ssl 31 | ``` 32 | 33 | ## Tips & Tricks 34 | login with `admin:admin` 35 | -------------------------------------------------------------------------------- /apps/project-mgmt/open-project.md: -------------------------------------------------------------------------------- 1 | # Open Project 2 | Full-featured & complicated. 3 | 4 |
5 | 6 | - [Homepage](https://openproject.org/) 7 | - [Github repo](https://github.com/opf/openproject) 8 | - [Docs](https://docs.openproject.org/) 9 | 10 | ![Screenshot](openproject.png) 11 | 12 | 13 | ## docker-compose.yml 14 | ```yml 15 | services: 16 | openproject: 17 | image: openproject/community 18 | container_name: openproject 19 | restart: unless-stopped 20 | environment: 21 | - SECRET_KEY_BASE=secret_key 22 | ports: 23 | - "3090:80" 24 | volumes: 25 | - ./pgdata:/var/openproject/pgdata 26 | - ./assets:/var/openproject/assets 27 | ``` 28 | -------------------------------------------------------------------------------- /apps/project-mgmt/openproject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/project-mgmt/openproject.png -------------------------------------------------------------------------------- /apps/project-mgmt/planka.md: -------------------------------------------------------------------------------- 1 | # Planka 2 | 3 | - [Homepage](https://planka.app/) 4 | - [Github repo](https://github.com/plankanban/planka) 5 | 6 | 7 | ## docker-compose.yml 8 | ```yml 9 | services: 10 | planka: 11 | image: meltyshev/planka:latest 12 | command: > 13 | bash -c 14 | "for i in `seq 1 30`; do 15 | ./start.sh && 16 | s=$$? && break || s=$$?; 17 | echo \"Tried $$i times. Waiting 5 seconds...\"; 18 | sleep 5; 19 | done; (exit $$s)" 20 | restart: unless-stopped 21 | volumes: 22 | - ./avatars:/app/public/user-avatars 23 | - ./background-images:/app/public/project-background-images 24 | - ./attachments:/app/public/attachments 25 | ports: 26 | - 3123:1337 27 | environment: 28 | - BASE_URL=http://localhost:3123 29 | - DATABASE_URL=postgresql://postgres@postgres/planka 30 | - SECRET_KEY=VCFh2BiD6N202jR2jYcp22FqfJfaUg2omTB2MlAZp7o= 31 | depends_on: 32 | - postgres 33 | 34 | postgres: 35 | image: postgres:12-alpine 36 | restart: unless-stopped 37 | volumes: 38 | - ./db:/var/lib/postgresql/data 39 | environment: 40 | - POSTGRES_DB=planka 41 | - POSTGRES_HOST_AUTH_METHOD=trust 42 | ``` 43 | 44 | 45 | ## Tips & Tricks 46 | Login with: 47 | - email: `demo@demo.demo` 48 | - pass: `demo` 49 | -------------------------------------------------------------------------------- /apps/project-mgmt/vikunja.md: -------------------------------------------------------------------------------- 1 | # Vikujna 2 | 3 | - very active development 4 | - lots of features! 5 | - UI looks better with every update 😄 6 | 7 |
8 | 9 | - [Homepage](https://vikunja.io/) 10 | - [Git repo](https://kolaente.dev/vikunja/) 11 | - [Demo](https://try.vikunja.io/login) (demo:demo) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | api: 18 | image: vikunja/api 19 | container_name: vikunja-api 20 | restart: unless-stopped 21 | environment: 22 | - VIKUNJA_SERVICE_TIMEZONE=Europe/Dublin 23 | - VIKUNJA_SERVICE_ENABLEREGISTRATION=false 24 | - VIKUNJA_SERVICE_JWTSECRET=ce23d1aezoosah2bao3ieZohkae5aicah 25 | - VIKUNJA_CACHE_ENABLED=true 26 | - VIKUNJA_CACHE_TYPE=memory 27 | volumes: 28 | - ./vikunja.db:/app/vikunja/vikunja.db 29 | - ./files:/app/vikunja/files 30 | 31 | frontend: 32 | image: vikunja/frontend 33 | container_name: vikunja-ui 34 | restart: unless-stopped 35 | 36 | proxy: 37 | image: nginx 38 | restart: unless-stopped 39 | ports: 40 | - 3111:80 41 | depends_on: 42 | - api 43 | - frontend 44 | volumes: 45 | - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro 46 | ``` 47 | 48 | ## nginx.conf 49 | ```nginx 50 | server { 51 | listen 80; 52 | location / { 53 | proxy_pass http://frontend:80; 54 | } 55 | location ~* ^/(api|dav|\.well-known)/ { 56 | proxy_pass http://api:3456; 57 | client_max_body_size 20M; 58 | } 59 | } 60 | ``` 61 | 62 | 63 | ## Tips & Tricks 64 | Before running, ake sure that db file exists first: 65 | ```sh 66 | touch vikunja.db 67 | ``` 68 | -------------------------------------------------------------------------------- /apps/project-mgmt/wekan.md: -------------------------------------------------------------------------------- 1 | # Wekan 2 | 3 | Probably the best of the ones tested. A good balance between features & complexity and a nice UI. 4 | 5 |
6 | 7 | - [Homepage](https://wekan.github.io/) 8 | - [Github repo](https://github.com/wekan/wekan) 9 | - [Docs](https://github.com/wekan/wekan/wiki) 10 | 11 | ## docker-compose.yml 12 | ```yml 13 | services: 14 | wekandb: 15 | image: mongo:latest 16 | container_name: wekan-db 17 | restart: unless-stopped 18 | command: mongod --oplogSize 128 19 | expose: 20 | - 27017 21 | volumes: 22 | - ./db:/data/db 23 | - ./db-dump:/dump 24 | 25 | wekan: 26 | image: wekanteam/wekan 27 | container_name: wekan-app 28 | restart: unless-stopped 29 | ports: 30 | - 3090:8080 31 | environment: 32 | - MONGO_URL=mongodb://wekandb:27017/wekan 33 | - ROOT_URL=http://localhost:3090 34 | - WITH_API=true # Wekan Export Board works when WITH_API=true. 35 | - RICHER_CARD_COMMENT_EDITOR=false 36 | - CARD_OPENED_WEBHOOK_ENABLED=false 37 | - BIGEVENTS_PATTERN=NONE 38 | - BROWSER_POLICY_ENABLED=true 39 | depends_on: 40 | - wekandb 41 | ``` 42 | 43 | ## Tips & Tricks 44 | - Creating users and logging-in: https://github.com/wekan/wekan/wiki/Adding-users 45 | - Forgot password: https://github.com/wekan/wekan/wiki/Forgot-Password 46 | - Backup/Restore: https://github.com/wekan/wekan/wiki/Backup 47 | -------------------------------------------------------------------------------- /apps/reverse-proxy-sso/authelia.md: -------------------------------------------------------------------------------- 1 | # Authelia 2 | This is a fantastic, feature rich and simple to set-up Single Sign-On solution. 3 | The config files below, will use a file-storage for users, because it's simpler and quite sufficient for simple self-hosting server at home (as opposed to seting up full featured LDAP back-end). 4 | 5 |
6 | 7 | - [Homepage](https://www.authelia.com/) 8 | - [Github repo](https://github.com/authelia/authelia) 9 | - [Docs](https://www.authelia.com/docs/) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | networks: 15 | net: 16 | driver: bridge 17 | 18 | services: 19 | authelia: 20 | image: authelia/authelia 21 | container_name: authelia 22 | restart: unless-stopped 23 | expose: 24 | - 9091 25 | ports: 26 | - "9091:9091" 27 | networks: 28 | - net 29 | environment: 30 | - TZ=Europe/Dublin 31 | volumes: 32 | - ./config:/config 33 | 34 | redis: 35 | image: redis:alpine 36 | container_name: redis 37 | volumes: 38 | - ./redis:/data 39 | expose: 40 | - 6379 41 | networks: 42 | - net 43 | restart: unless-stopped 44 | environment: 45 | - TZ=Europe/Dublin 46 | ``` 47 | 48 | ## config/configuration.yml 49 | ```yml 50 | server: 51 | host: 0.0.0.0 52 | port: 9091 53 | 54 | # log: 55 | # level: debug 56 | 57 | jwt_secret: U8kmbel7WhP1YneQh2134DXhsiSHctE5Emtf 58 | 59 | authentication_backend: 60 | file: 61 | path: /etc/authelia/users.yml 62 | 63 | storage: 64 | encryption_key: U8kmbel7WhP1YneQh2134DXhsiSHctE5Emtf 65 | local: 66 | path: /var/lib/authelia/db.sqlite3 67 | 68 | notifier: 69 | filesystem: 70 | filename: /tmp/authelia/notification.txt 71 | 72 | session: 73 | name: authelia_session 74 | secret: U8kmbel7WhP1YneQh2134DXhsiSHctE5Emtf 75 | expiration: 3600 # 1 hour 76 | inactivity: 300 # 5 minutes 77 | # The domain to protect. 78 | # Note: the login portal must also be a subdomain of that domain. 79 | domain: example.com 80 | redis: 81 | host: redis 82 | port: 6379 83 | 84 | regulation: 85 | max_retries: 3 86 | find_time: 120 87 | ban_time: 300 88 | 89 | access_control: 90 | default_policy: one_factor 91 | rules: 92 | - domain: "*.example.com" 93 | subject: "group:admins" 94 | policy: one_factor 95 | ``` 96 | 97 | ## config/users.yml 98 | ```yml 99 | users: 100 | admin: 101 | displayname: "admin" 102 | password: "" # password hash - see below how to generate 103 | email: admin@example.com 104 | groups: 105 | - admins 106 | ``` 107 | 108 | ## Tips & Tricks 109 | Generate password hash for the `users.yml`: 110 | ```sh 111 | docker run authelia/authelia:latest authelia hash-password 112 | ``` 113 | -------------------------------------------------------------------------------- /apps/reverse-proxy-sso/npm.md: -------------------------------------------------------------------------------- 1 | # nginx-proxy-manager 2 | 3 | - it's basically a very nice UI for nginx reverse-proxy 4 | - a very nice UI 5 | - making it extremely easy to use nginx 6 | 7 |
8 | 9 | - [Github repo](https://github.com/jc21/nginx-proxy-manager) 10 | - [Homepage](https://nginxproxymanager.com/guide/#quick-setup) 11 | 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | app: 18 | image: 'jc21/nginx-proxy-manager:latest' 19 | restart: unless-stopped 20 | ports: 21 | - '80:80' 22 | - '81:81' 23 | - '443:443' 24 | volumes: 25 | - ./data:/data 26 | - ./letsencrypt:/etc/letsencrypt 27 | ``` 28 | 29 | Login with: 30 | - Email: admin@example.com 31 | - Password: changeme 32 | -------------------------------------------------------------------------------- /apps/rss/miniflux-filter.md: -------------------------------------------------------------------------------- 1 | # Miniflux-filter 2 | 3 | Filter for miniflux - "mark as read" all unwanted articles. 4 |
5 | I created that before miniflux added some basic filtering. 6 |
7 | The difference from the built-in filtering is that the built-in filtering filters articles out BEFORE adding them to the DB, whereas this just marks them as read, so you can still go to "All" and see them if you wish. 8 |
9 |
10 | The new version adds a UI for managing filters. The UI "borrows" the css & javascript from Miniflux, so the look & feel is (almost) exactly the same as the main app! 11 | 12 | - [Github repo](https://github.com/tborychowski/miniflux-filter) 13 | - [Docker Hub](https://hub.docker.com/r/tborychowski/miniflux-filter) 14 | 15 | 16 | ![Screenshot](miniflux-filter.png) 17 | 18 | 19 | ## docker-compose.yml 20 | ```yml 21 | services: 22 | miniflux-filter: 23 | image: tborychowski/miniflux-filter:latest 24 | container_name: miniflux-filter 25 | restart: unless-stopped 26 | environment: 27 | - TZ=Europe/Dublin 28 | # if not present - there will be no auth 29 | # - ADMIN_PASSWORD=admin1 30 | # ERROR, WARNING, INFO, DEBUG 31 | - LOG_LEVEL=INFO 32 | ports: 33 | - "5020:80" 34 | volumes: 35 | - ./data:/var/www/html/store 36 | ``` 37 | -------------------------------------------------------------------------------- /apps/rss/miniflux-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tborychowski/self-hosted-cookbook/b98b9e2903c12fd18a2559f9ca33731ec6d30711/apps/rss/miniflux-filter.png -------------------------------------------------------------------------------- /apps/rss/miniflux.md: -------------------------------------------------------------------------------- 1 | # Miniflux 2 | 3 | The best RSS reader that I've tested. Simple, extremely fast and minimalistic. 4 | 5 |
6 | 7 | - [Homepage](https://miniflux.app/) 8 | - [Github repo](https://github.com/miniflux/v2) 9 | - [Docs](https://miniflux.app/docs/index.html) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | miniflux: 16 | image: miniflux/miniflux:nightly 17 | ports: 18 | - "5010:8080" 19 | depends_on: 20 | - db 21 | environment: 22 | - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable 23 | - RUN_MIGRATIONS=1 24 | - CREATE_ADMIN=1 25 | - ADMIN_USERNAME=admin 26 | - ADMIN_PASSWORD=test123 27 | db: 28 | image: postgres:latest 29 | environment: 30 | - POSTGRES_USER=miniflux 31 | - POSTGRES_PASSWORD=secret 32 | volumes: 33 | - ./db:/var/lib/postgresql/data 34 | ``` 35 | 36 | 37 | ## Tips & Tricks 38 | - [Rules](https://miniflux.app/docs/rules.html) can be set for every feed source: 39 | 40 | ### Filter Rules - block rules 41 | exclude articles containing a word (case insensitive), e.g. 42 | ``` 43 | (?i)windows,(?i)miniflux 44 | ``` 45 | 46 | ### Rewrite rules 47 | ``` 48 | add_dynamic_image,add_image_title,add_youtube_video 49 | ``` 50 | 51 | ### Scraper rules 52 | This is just a css selector for the main article DOM element, e.g.: 53 | ```css 54 | #phContent_divMetaBody>p, #phContent_divMetaBody>.content-image-wrapper 55 | ``` 56 | -------------------------------------------------------------------------------- /apps/rss/rssbridge.md: -------------------------------------------------------------------------------- 1 | # RSS-Bridge 2 | 3 | RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. 4 | 5 |
6 | 7 | - [GitHub repo](https://github.com/RSS-Bridge/rss-bridge) 8 | 9 | # docker-compose.yml 10 | 11 | ```yml 12 | services: 13 | rss-bridge: 14 | image: rssbridge/rss-bridge:latest 15 | volumes: 16 | - ./config:/config 17 | ports: 18 | - 3000:80 19 | restart: unless-stopped 20 | ``` 21 | 22 | # Tips & Tricks 23 | 24 | :/config is mounted as config in the virent path. 25 | Enable all bridges by default by creating a file named whitelist.txt in it and write an asterisk: 26 | 27 | `echo '*' > whitelist.txt` 28 | -------------------------------------------------------------------------------- /apps/rss/rsshub.md: -------------------------------------------------------------------------------- 1 | # RSShub 2 | 3 | RSSHub is an open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything. 4 | 5 |
6 | 7 | - [parameters](https://docs.rsshub.app/en/social-media.html) 8 | - [GitHub repo](https://github.com/DIYgod/RSSHub) 9 | 10 | # docker-compose.yml 11 | 12 | ```yml 13 | services: 14 | rsshub: 15 | image: diygod/rsshub 16 | restart: always 17 | ports: 18 | - '1200:1200' 19 | environment: 20 | NODE_ENV: production 21 | CACHE_TYPE: redis 22 | REDIS_URL: 'redis://redis:6379/' 23 | PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000' 24 | depends_on: 25 | - redis 26 | - browserless 27 | 28 | browserless: 29 | image: browserless/chrome 30 | restart: always 31 | ulimits: 32 | core: 33 | hard: 0 34 | soft: 0 35 | 36 | redis: 37 | image: redis:alpine 38 | restart: always 39 | volumes: 40 | - redis-data:/data 41 | 42 | volumes: 43 | redis-data: 44 | ``` 45 | -------------------------------------------------------------------------------- /apps/rss/rsstt.md: -------------------------------------------------------------------------------- 1 | # RSS to telegram bot 2 | 3 | A Telegram RSS bot that cares about your reading experience 4 | 5 | - [GitHub repo](https://github.com/Rongronggg9/RSS-to-Telegram-Bot) 6 | - [Docs](https://github.com/Rongronggg9/RSS-to-Telegram-Bot/tree/dev/docs) 7 | - [env vars description](https://github.com/Rongronggg9/RSS-to-Telegram-Bot/blob/dev/docs/advanced-settings.md) 8 | 9 |
10 | 11 | # docker-compose.yml 12 | 13 | ```yml 14 | 15 | services: 16 | main: 17 | image: rongronggg9/rss-to-telegram:dev # stable image: rongronggg9/rss-to-telegram 18 | container_name: rsstt # need to be unique 19 | restart: unless-stopped 20 | volumes: 21 | - ./config:/app/config 22 | environment: 23 | - TOKEN=1234567890:A1BCd2EF3gH45IJK6lMN7oPqr8ST9UvWX0Yz0 # get it from @BotFather 24 | - MANAGER=1234567890 # get it from @userinfobot 25 | - TELEGRAPH_TOKEN=1a23b456c78de90f1a23b456c78de90f1a23b456c78de90f1a23b456c78 #replace it with your tokens 26 | - MULTIUSER=0 # default: 1 27 | - API_HASH=452b0359b988148995f22ff0f4229750 # get it from https://core.telegram.org/api/obtaining_api_id 28 | ``` 29 | # Tips & Tricks 30 | 31 | - first follow [deployment guide](https://github.com/Rongronggg9/RSS-to-Telegram-Bot/blob/dev/docs/deployment-guide.md) to create a new bot, get it's bot token, bot ID, telegraph api ID and telegraph api hash 32 | - Uncomment MULTIUSER=0, if you want to be the only user that can interact with the bot and API_ID and API_HASH if you don't want to use the sample APIs. API_ID_PUBLISHED_FLOOD_ERROR may occur with sample telegraph api's 33 | -------------------------------------------------------------------------------- /apps/search/searx.md: -------------------------------------------------------------------------------- 1 | # Searx 2 | 3 | - Simple & good looking UI 4 | - Configurable 5 | - Poor keyboard support 6 | 7 |
8 | 9 | - [Homepage](https://searx.github.io/searx/) 10 | - [Github repo](https://github.com/searx/searx) 11 | - [Github repo for Docker](https://github.com/searx/searx-docker) 12 | 13 | ## Configuration 14 | [settings.yml](searx-settings.yml) 15 | 16 | ## docker-compose.yml 17 | ```yml 18 | 19 | services: 20 | 21 | filtron: 22 | container_name: filtron 23 | image: dalf/filtron 24 | restart: unless-stopped 25 | ports: 26 | - "4040:4040" 27 | - "4041:4041" 28 | networks: 29 | - searx 30 | command: -listen 0.0.0.0:4040 -api 0.0.0.0:4041 -target searx:8080 31 | volumes: 32 | - ./rules.json:/etc/filtron/rules.json:rw 33 | read_only: true 34 | cap_drop: 35 | - ALL 36 | 37 | searx: 38 | container_name: searx 39 | image: searx/searx:latest 40 | restart: unless-stopped 41 | networks: 42 | - searx 43 | command: ${SEARX_COMMAND:-} 44 | volumes: 45 | - ./searx:/etc/searx:rw 46 | environment: 47 | - BIND_ADDRESS=0.0.0.0:8080 48 | - BASE_URL=https://${SEARX_HOSTNAME:-localhost}/ 49 | - MORTY_URL=https://morty.example.com/ 50 | - MORTY_KEY=${MORTY_KEY} 51 | cap_drop: 52 | - ALL 53 | cap_add: 54 | - CHOWN 55 | - SETGID 56 | - SETUID 57 | - DAC_OVERRIDE 58 | 59 | morty: 60 | container_name: morty 61 | image: dalf/morty 62 | restart: unless-stopped 63 | ports: 64 | - "4045:3000" 65 | networks: 66 | - searx 67 | command: -timeout 6 -ipv6 68 | environment: 69 | - MORTY_KEY=${MORTY_KEY} 70 | - MORTY_ADDRESS=0.0.0.0:3000 71 | logging: 72 | driver: none 73 | read_only: true 74 | cap_drop: 75 | - ALL 76 | 77 | searx-checker: 78 | container_name: searx-checker 79 | image: searx/searx-checker 80 | restart: unless-stopped 81 | networks: 82 | - searx 83 | command: -cron -o html/data/status.json http://searx:8080 84 | volumes: 85 | - ./searx-checker:/usr/local/searx-checker/html/data:rw 86 | 87 | 88 | networks: 89 | searx: 90 | ipam: 91 | driver: default 92 | ``` 93 | -------------------------------------------------------------------------------- /apps/search/whoogle.md: -------------------------------------------------------------------------------- 1 | # Whoogle 2 | 3 | - not the best looking 4 | - keyboard support (thanks to [me](https://github.com/benbusby/whoogle-search/pull/202) :wink:) 5 | 6 |
7 | 8 | - [Homepage](https://benbusby.com/projects/whoogle-search/) 9 | - [Github repo](https://github.com/benbusby/whoogle-search) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | 15 | services: 16 | whoogle-search: 17 | image: benbusby/whoogle-search 18 | container_name: whoogle-search 19 | restart: unless-stopped 20 | ports: 21 | - 3123:5000 22 | ``` 23 | -------------------------------------------------------------------------------- /apps/social/etesync.md: -------------------------------------------------------------------------------- 1 | # Etesync 2 | 3 | CalDAV & CardDav server & client. 4 | Not terrible, but not great. 5 | 6 |
7 | 8 | - [Homepage](https://www.etesync.com/) 9 | - [Github repo](https://github.com/etesync) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | etesync: 16 | image: dsaier/etesync 17 | container_name: etesync 18 | restart: unless-stopped 19 | environment: 20 | - TIME_ZONE=Europe/Dublin 21 | - AUTO_MIGRATE=true 22 | - SUPER_USER=admin 23 | - SUPER_PASS=admin 24 | - SUPER_EMAIL=admin@example.com 25 | ports: 26 | - "8001:8080" 27 | volumes: 28 | - ./data:/data 29 | ``` 30 | Then go to: http://localhost:8001/admin/logout/ 31 | and login with `admin`:`admin` 32 | -------------------------------------------------------------------------------- /apps/social/mastodon.md: -------------------------------------------------------------------------------- 1 | # Mastodon 2 | Free, open-source social network server based on ActivityPub. 3 | 4 |
5 | 6 | - [Homepage](https://joinmastodon.org) 7 | - [Docs](https://docs.joinmastodon.org/) 8 | - [LinuxServer docs](https://docs.linuxserver.io/images/docker-mastodon) 9 | 10 | 11 | ## Prerequisites 12 | - To generate keys for `SECRET_KEY_BASE` & `OTP_SECRET` run the following command once for each: 13 | ```sh 14 | docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon generate-secret 15 | ``` 16 | 17 | - To generate keys for `VAPID_PRIVATE_KEY` & `VAPID_PUBLIC_KEY` run: 18 | 19 | ```sh 20 | docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon generate-vapid 21 | ``` 22 | 23 | - To use `tootctl` run: 24 | ```sh 25 | # create account 26 | docker compose exec mastodon /tootctl accounts create \ 27 | admin \ 28 | --email admin@example.com \ 29 | --role Owner \ 30 | --confirmed 31 | 32 | # approve the account 33 | docker compose exec mastodon /tootctl accounts approve admin 34 | ``` 35 | 36 | 37 | 38 | ```yaml 39 | services: 40 | redis: 41 | image: redis:alpine 42 | container_name: mastodon-redis 43 | restart: unless-stopped 44 | environment: 45 | - TZ=Europe/Dublin 46 | volumes: 47 | - ./redis:/data 48 | 49 | db: 50 | image: postgres:latest 51 | environment: 52 | - POSTGRES_DB=mastodon 53 | - POSTGRES_USER=mastodon 54 | - POSTGRES_PASSWORD=mastodon 55 | 56 | volumes: 57 | - ./db:/var/lib/postgresql/data 58 | 59 | mastodon: 60 | image: lscr.io/linuxserver/mastodon:latest 61 | container_name: mastodon 62 | restart: unless-stopped 63 | environment: 64 | - PUID=1000 65 | - PGID=1000 66 | - TZ=Europe/Dublin 67 | - LOCAL_DOMAIN=example.com 68 | - WEB_DOMAIN=mastodon.example.com #optional 69 | - EMAIL_DOMAIN_ALLOWLIST=example.com|example.org 70 | 71 | - REDIS_HOST=redis 72 | - REDIS_PORT=6379 73 | 74 | - DB_HOST=db 75 | - DB_USER=mastodon 76 | - DB_NAME=mastodon 77 | - DB_PASS=mastodon 78 | - DB_PORT=5432 79 | 80 | - SECRET_KEY_BASE= 81 | - OTP_SECRET= 82 | 83 | - ES_ENABLED=false 84 | - S3_ENABLED=false 85 | 86 | - VAPID_PRIVATE_KEY= 87 | - VAPID_PUBLIC_KEY= 88 | 89 | - SMTP_SERVER= 90 | - SMTP_PORT=25 91 | - SMTP_LOGIN= 92 | - SMTP_PASSWORD= 93 | - SMTP_FROM_ADDRESS=mastodon@example.com 94 | 95 | volumes: 96 | - ./config:/config 97 | ports: 98 | - 3040:80 99 | - 3041:443 100 | ``` 101 | -------------------------------------------------------------------------------- /apps/social/mattermost.md: -------------------------------------------------------------------------------- 1 | # Mattermost 2 | Collaboration for Mission-Critical Work. Slack alternative. 3 | 4 |
5 | 6 | - [Homepage](https://mattermost.com/) 7 | - [Docs](https://docs.mattermost.com) 8 | - [GH repo for docker setup](https://github.com/mattermost/docker) 9 | 10 | 11 | ```yaml 12 | services: 13 | postgres: 14 | image: postgres:13-alpine 15 | restart: unless-stopped 16 | security_opt: 17 | - no-new-privileges:true 18 | pids_limit: 100 19 | read_only: true 20 | tmpfs: 21 | - /tmp 22 | - /var/run/postgresql 23 | volumes: 24 | - ./database:/var/lib/postgresql/data 25 | environment: 26 | - TZ=Europe/Dublin 27 | - POSTGRES_USER=mattermost 28 | - POSTGRES_PASSWORD=mattermost 29 | - POSTGRES_DB=mattermost 30 | 31 | mattermost: 32 | depends_on: 33 | - postgres 34 | image: mattermost/mattermost-team-edition:9.11.6 35 | restart: unless-stopped 36 | security_opt: 37 | - no-new-privileges:true 38 | pids_limit: 200 39 | read_only: false 40 | tmpfs: 41 | - /tmp 42 | volumes: 43 | - ./config:/mattermost/config:rw 44 | - ./data:/mattermost/data:rw 45 | - ./logs:/mattermost/logs:rw 46 | - ./plugins:/mattermost/plugins:rw 47 | - ./client-plugins:/mattermost/client/plugins:rw 48 | - ./bleve:/mattermost/bleve-indexes:rw 49 | environment: 50 | - TZ=Europe/Dublin 51 | - MM_SQLSETTINGS_DRIVERNAME=postgres 52 | - MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:mattermost@postgres:5432/mattermost?sslmode=disable&connect_timeout=10 53 | - MM_SERVICESETTINGS_SITEURL=https://mm.domain.com 54 | 55 | ports: 56 | - 3123:8065 # Main App port. Open this in browser 57 | - 8443:8443/udp 58 | - 8443:8443/tcp 59 | ``` 60 | 61 | 62 | ## Tips & Tricks 63 | - If logs show permission errors, it may be required that the local folders need write permissions. 64 | the easiest thing to do is to run the following, in the same directory as the `docker-compose.yml` file: 65 | ```sh 66 | chmod -R 777 ./config ./data ./logs ./plugins ./client-plugins ./bleve 67 | ``` 68 | -------------------------------------------------------------------------------- /apps/social/monica.md: -------------------------------------------------------------------------------- 1 | # Monica 2 | 3 | - Probably the only one in its kind :wink: 4 | - Has a very nice feature: CardDAV, but it doesn't work with MacOS contacts :sad: 5 | 6 |
7 | 8 | - [Homepage](https://www.monicahq.com/) 9 | - [Github repo](https://github.com/monicahq/monica) 10 | 11 | 12 | ## Post-setup 13 | Run this after starting the container for the first time: 14 | ```sh 15 | docker-compose exec monicahq php artisan setup:production 16 | ``` 17 | 18 | ## .env 19 | ```ini 20 | APP_ENV=production 21 | APP_DEBUG=false 22 | 23 | # Must be 32 characters long exactly. 24 | # Use `php artisan key:generate` or `pwgen -s 32 1` to generate a random key. 25 | APP_KEY=ddDR0t8E666HH29tL2Fj281sJ2uh1WRQ 26 | HASH_SALT=ddDRs8HH29t1UF2t8Evd 27 | HASH_LENGTH=18 28 | APP_URL=https://monica.example.com 29 | APP_FORCE_URL=false 30 | DB_CONNECTION=mysql 31 | DB_HOST=db 32 | DB_PORT=3306 33 | DB_DATABASE=monica 34 | DB_USERNAME=monica 35 | DB_PASSWORD=monica01 36 | DB_PREFIX= 37 | DB_USE_UTF8MB4=true 38 | 39 | # Mail credentials used to send emails from the application. 40 | MAIL_MAILER=smtp 41 | MAIL_HOST= 42 | MAIL_PORT=25 43 | MAIL_USERNAME= 44 | MAIL_PASSWORD= 45 | MAIL_ENCRYPTION=tls 46 | MAIL_FROM_ADDRESS= 47 | MAIL_FROM_NAME="CRM" 48 | APP_EMAIL_NEW_USERS_NOTIFICATION= 49 | APP_DISABLE_SIGNUP=true 50 | APP_SIGNUP_DOUBLE_OPTIN=false 51 | APP_TRUSTED_PROXIES= # use a comma separated list of IP addresses. 52 | APP_TRUSTED_CLOUDFLARE=false 53 | LOG_CHANNEL=daily 54 | SENTRY_SUPPORT=false 55 | SENTRY_LARAVEL_DSN= 56 | CHECK_VERSION=false 57 | REDIS_HOST=redis 58 | CACHE_DRIVER=redis # database, file, memcached, redis, dynamodb 59 | SESSION_DRIVER=redis # file, cookie, database, apc, memcached, redis, array 60 | SESSION_LIFETIME=120 61 | QUEUE_CONNECTION=sync 62 | DEFAULT_FILESYSTEM=public 63 | DEFAULT_MAX_STORAGE_SIZE=512 64 | DEFAULT_MAX_UPLOAD_SIZE=10240 65 | MFA_ENABLED=true 66 | DAV_ENABLED=true 67 | ALLOW_STATISTICS_THROUGH_PUBLIC_API_ACCESS=false 68 | POLICY_COMPLIANT=true 69 | ENABLE_GEOLOCATION=false 70 | LOCATION_IQ_API_KEY= 71 | ENABLE_WEATHER=false 72 | DARKSKY_API_KEY= 73 | ``` 74 | 75 | ## docker-compose.yml 76 | ```yml 77 | services: 78 | monicahq: 79 | image: monica 80 | container_name: monica 81 | restart: unless-stopped 82 | depends_on: 83 | - db 84 | env_file: 85 | - ./.env 86 | environment: 87 | - TZ=Europe/Dublin 88 | - APP_KEY=ddDR0t8E4s8HH19t333jt81sJNuh1WRQ 89 | - APP_ENV=production 90 | - DB_HOST=db 91 | ports: 92 | - "5020:80" 93 | volumes: 94 | - ./data:/var/www/html/storage 95 | # - ./html:/var/www/monica:ro 96 | db: 97 | image: mysql:5.7 98 | container_name: monica-db 99 | restart: unless-stopped 100 | environment: 101 | - MYSQL_RANDOM_ROOT_PASSWORD=true 102 | - MYSQL_DATABASE=monica 103 | - MYSQL_USER=monica 104 | - MYSQL_PASSWORD=monica01 105 | volumes: 106 | - ./mysql:/var/lib/mysql 107 | 108 | redis: 109 | image: redis:alpine 110 | container_name: monica-redis 111 | restart: unless-stopped 112 | volumes: 113 | - ./redis:/data 114 | ``` 115 | -------------------------------------------------------------------------------- /apps/social/rocketchat.md: -------------------------------------------------------------------------------- 1 | # RocketChat 2 | 3 | The Ultimate Communication Hub. A solid option for self-hosted chat and collaboration. 4 | 5 | - [Homepage](https://www.rocket.chat) 6 | - [Documentation](https://docs.rocket.chat/docs/deploy-with-docker-docker-compose) 7 | - [Github repo](https://github.com/rocketchat/) 8 | 9 | 10 | 11 |
12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | mongodb: 18 | # https://hub.docker.com/r/bitnami/mongodb 19 | image: docker.io/bitnami/mongodb:8.0.5 20 | restart: unless-stopped 21 | volumes: 22 | - ./data:/bitnami/mongodb 23 | environment: 24 | MONGODB_REPLICA_SET_MODE: primary 25 | MONGODB_REPLICA_SET_NAME: rs0 26 | MONGODB_PORT_NUMBER: 27017 27 | MONGODB_INITIAL_PRIMARY_HOST: mongodb 28 | MONGODB_INITIAL_PRIMARY_PORT_NUMBER: 27017 29 | MONGODB_ADVERTISED_HOSTNAME: mongodb 30 | MONGODB_ENABLE_JOURNAL: true 31 | ALLOW_EMPTY_PASSWORD: yes 32 | 33 | 34 | rocketchat: 35 | # https://github.com/RocketChat/Rocket.Chat/releases 36 | image: registry.rocket.chat/rocketchat/rocket.chat:7.4.0 37 | restart: unless-stopped 38 | environment: 39 | MONGO_URL: "mongodb://mongodb:27017/rocketchat?replicaSet=rs0" 40 | MONGO_OPLOG_URL: "mongodb://mongodb:27017/local?replicaSet=rs0" 41 | ROOT_URL: http://localhost:3123 42 | PORT: 3000 43 | DEPLOY_METHOD: docker 44 | depends_on: 45 | - mongodb 46 | expose: 47 | - 3000 48 | ports: 49 | - 3123:3000 50 | ``` 51 | -------------------------------------------------------------------------------- /apps/wiki/bluespice.md: -------------------------------------------------------------------------------- 1 | # Bluespice free 2 | 3 | - Terrible UX, unintuitive and just ugly 4 | - Even with the domain set up - it sometimes redirect to `localhost` 5 | 6 |
7 | 8 | - [Homepage](https://bluespice.com/products/bluespice-free/) 9 | - [DockerHub repo](https://hub.docker.com/r/bluespice/bluespice-free) 10 | 11 | 12 | ## docker-compose.yml 13 | ```yml 14 | services: 15 | bluespice: 16 | image: bluespice/bluespice-free 17 | container_name: bluespice 18 | restart: unless-stopped 19 | environment: 20 | - TZ=Europe/Dublin 21 | - bs_lang=en 22 | - bs_url=https://bluespice.example.com 23 | ports: 24 | - 3123:80 25 | volumes: 26 | - ./data:/data 27 | ``` 28 | 29 | ### Login with 30 | - username: WikiSysop 31 | - password: PleaseChangeMe 32 | -------------------------------------------------------------------------------- /apps/wiki/bookstack.md: -------------------------------------------------------------------------------- 1 | # Bookstack 2 | 3 | - Has some structure: Shelf > Book > Chapter > Page 4 | - Looks modern, but the UX is not great and not very configurable 5 | 6 | 7 |
8 | 9 | - [Homepage](https://www.bookstackapp.com/) 10 | - [Github repo](https://github.com/BookStackApp/BookStack) 11 | - [DockerHub repo](https://hub.docker.com/r/linuxserver/bookstack) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | bookstack: 18 | image: linuxserver/bookstack 19 | container_name: bookstack 20 | environment: 21 | - PUID=1000 22 | - PGID=1000 23 | - DB_HOST=db 24 | - DB_USER=bookstack 25 | - DB_PASS=bookstack 26 | - DB_DATABASE=bookstack 27 | volumes: 28 | - ./data:/config 29 | ports: 30 | - 6875:80 31 | restart: unless-stopped 32 | depends_on: 33 | - db 34 | db: 35 | image: linuxserver/mariadb 36 | container_name: bookstack-db 37 | environment: 38 | - PUID=1000 39 | - PGID=1000 40 | - MYSQL_ROOT_PASSWORD=bookstack 41 | - TZ=Europe/Dublin 42 | - MYSQL_DATABASE=bookstackapp 43 | - MYSQL_USER=bookstack 44 | - MYSQL_PASSWORD=bookstack 45 | volumes: 46 | - ./data:/config 47 | restart: unless-stopped 48 | ``` 49 | 50 | 51 | ## Tips & Tricks 52 | - The app takes a while to start up first time, so be patient! 53 | - Login with: `admin@admin.com`:`password` 54 | -------------------------------------------------------------------------------- /apps/wiki/confluence.md: -------------------------------------------------------------------------------- 1 | # Confluence 2 | 3 | - Not free. Used to be $10 for up to 10 users. From Feb 2021 the Server edition will stop selling new licenses. 4 | - Most feature rich and easy to use by less tech-savvy people. 5 | - Stable core and well tested (that is not to say it has no bugs :smile: e.g. code macro strips leading spaces on paste). 6 | - Slow. 7 | 8 |
9 | 10 | - [Homepage](https://hub.docker.com/r/atlassian/confluence-server) 11 | - [DockerHub repo](https://hub.docker.com/r/atlassian/confluence-server) 12 | 13 | 14 | ## docker-compose.yml 15 | ```yml 16 | services: 17 | confluence: 18 | image: atlassian/confluence-server 19 | container_name: confluence 20 | environment: 21 | - TZ=Europe/Dublin 22 | - JVM_MINIMUM_MEMORY=2048m 23 | - JVM_MAXIMUM_MEMORY=8192m 24 | - ATL_JDBC_USER=dbuser1 25 | - ATL_JDBC_PASSWORD=123456 26 | - ATL_DB_TYPE=postgresql 27 | - ATL_PROXY_NAME=confluence.example.com 28 | - ATL_PROXY_PORT=443 29 | - ATL_TOMCAT_SCHEME=https 30 | - ATL_TOMCAT_SECURE=true 31 | volumes: 32 | - ./data:/var/atlassian/application-data/confluence 33 | ports: 34 | - 8090:8090 35 | - 8091:8091 36 | restart: unless-stopped 37 | depends_on: 38 | - db 39 | 40 | db: 41 | container_name: confluence-postgres 42 | image: postgres:12.4 43 | command: postgres -c 'shared_buffers=128MB' -c 'max_connections=125' 44 | restart: unless-stopped 45 | volumes: 46 | - ./database:/var/lib/postgresql/data 47 | environment: 48 | - POSTGRES_USER=dbuser1 49 | - POSTGRES_PASSWORD=123456 50 | ``` 51 | -------------------------------------------------------------------------------- /apps/wiki/docmost.md: -------------------------------------------------------------------------------- 1 | # Docmost 2 | 3 | - Very simple and easy to use and setup. 4 | - Minimalistic design, just enough functionality without the usual bloat! 5 | - Nice dark & light themes. 6 | - Probably the best OpenSource Confluence alternative out there! 7 | 8 | 9 |
10 | 11 | - [Homepage](https://docmost.com) 12 | - [Docs](https://docmost.com/docs/installation/) 13 | - [GitHub repo](https://github.com/docmost/docmost) 14 | 15 | 16 | ## docker-compose.yml 17 | ```yml 18 | services: 19 | docmost: 20 | image: docmost/docmost:latest 21 | container_name: docmost 22 | restart: unless-stopped 23 | depends_on: 24 | - db 25 | - redis 26 | environment: 27 | APP_URL: 'http://localhost:3000' 28 | APP_SECRET: 'Zw1JsbHQb/FM0evE/uc087s4t9X0OQNXnfg1jaWveA0=' 29 | DATABASE_URL: 'postgresql://docmost:docmost@db:5432/docmost?schema=public' 30 | REDIS_URL: 'redis://redis:6379' 31 | ports: 32 | - "3000:3000" 33 | volumes: 34 | - ./data:/app/data/storage 35 | 36 | db: 37 | image: postgres:16-alpine 38 | container_name: docmost-postgres 39 | restart: unless-stopped 40 | environment: 41 | POSTGRES_DB: docmost 42 | POSTGRES_USER: docmost 43 | POSTGRES_PASSWORD: docmost 44 | volumes: 45 | - ./db_data:/var/lib/postgresql/data 46 | 47 | redis: 48 | image: redis:7.2-alpine 49 | container_name: docmost-redis 50 | restart: unless-stopped 51 | volumes: 52 | - ./redis_data:/data 53 | ``` 54 | -------------------------------------------------------------------------------- /apps/wiki/notea.md: -------------------------------------------------------------------------------- 1 | # Notea 2 | 3 | - This is probably more of a note-taking app rather than a wiki, but why not :-) 4 | - Setup with docker is a bit more challenging than the usual `docker-compose up -d` 5 | - Layout is very minimalistic 6 | - Command palette! 7 | - `/` when writing is great! 8 | - Extremely fast to start-up (not really a feature, but still impressive) 9 | 10 |
11 | 12 | - [Homepage](https://cinwell.com/notea/) 13 | - [GitHub repo](https://github.com/QingWei-Li/notea) 14 | 15 | 16 | ## docker-compose.yml 17 | ```yml 18 | services: 19 | notea: 20 | image: cinwell/notea 21 | container_name: notea 22 | environment: 23 | - STORE_ACCESS_KEY=086o0ITYnydXRzxO 24 | - STORE_SECRET_KEY=7FKZabUq7LCWyhgYyTh39A26vZMKb99G 25 | - STORE_BUCKET=notea 26 | - STORE_END_POINT=http://notea-db:9000 27 | - STORE_FORCE_PATH_STYLE=true 28 | - COOKIE_SECURE=false 29 | - BASE_URL="http://192.168.1.10:3123/" 30 | #- PASSWORD=notea 31 | - DISABLE_PASSWORD=true 32 | ports: 33 | - "3123:3000" 34 | 35 | notea-db: 36 | image: minio/minio 37 | container_name: notea-db 38 | command: server /data --console-address ":9001" 39 | environment: 40 | #- MINIO_BROWSER=off 41 | - MINIO_ROOT_USER=admin 42 | - MINIO_ROOT_PASSWORD=admin123 43 | ports: 44 | - "3124:9000" 45 | - "3125:9001" 46 | volumes: 47 | - ./data:/data 48 | ``` 49 | 50 | ### Next steps 51 | Notea requires external storage. Minio container stands in place of Amazon S3. We just need to create a "Bucket" in minio, so: 52 | #### Create a Bucket 53 | 1. Go to `` (- minio admin console) 54 | 2. Login using `admin:admin123` credentials from `docker-compose.yml` file 55 | 3. Create a new bucket with the name `notea` (no need for any other options, just name) 56 | 57 | #### Access Keys 58 | 1. Next click "Identity/Service Accounts" in the sidebar and click "Create service account" button 59 | 2. Either copy the "Access Key" and "Secret Key" from the yaml above or generate a new pair of keys and update them in your `docker-compose.yml` (and restart it afterwards). 60 | 61 | That's it! 62 | 63 | Notea should be available at `` 64 | -------------------------------------------------------------------------------- /apps/wiki/wikijs.md: -------------------------------------------------------------------------------- 1 | # Wiki.js 2 | 3 | - nice looking UI, with dark mode 4 | - nice search 5 | - configurable & lots of modules/plugins (albeit most of them are useless) 6 | - limited number of code highlighting (no yaml or bash...) 7 | - the navigation logic is extremely weird... Impossible to easily build a tree-like structure (with indefinite nesting level) 8 | - not nearly as feature rich as confluence 9 | 10 |
11 | 12 | - [Homepage](https://js.wiki) 13 | - [Github repo](https://github.com/Requarks/wiki) 14 | - [Docs](https://docs.requarks.io/install/docker) 15 | 16 | 17 | ## docker-compose.yml 18 | ```yml 19 | services: 20 | db: 21 | image: postgres:11-alpine 22 | container_name: wiki.js-db 23 | logging: 24 | driver: "none" 25 | restart: unless-stopped 26 | environment: 27 | POSTGRES_DB: wiki 28 | POSTGRES_PASSWORD: wikijsrocks 29 | POSTGRES_USER: wikijs 30 | volumes: 31 | - ./db:/var/lib/postgresql/data 32 | 33 | wiki: 34 | image: requarks/wiki:2 35 | container_name: wiki.js 36 | depends_on: 37 | - db 38 | environment: 39 | DB_TYPE: postgres 40 | DB_HOST: db 41 | DB_PORT: 5432 42 | DB_USER: wikijs 43 | DB_PASS: wikijsrocks 44 | DB_NAME: wiki 45 | restart: unless-stopped 46 | ports: 47 | - "3300:3000" 48 | ``` 49 | -------------------------------------------------------------------------------- /apps/wiki/xwiki.md: -------------------------------------------------------------------------------- 1 | # XWiki 2 | 3 | - Quite close to Confluence 4 | - UI looks a bit dated, but functional and configurable 5 | 6 |
7 | 8 | - [Homepage](https://www.xwiki.org) 9 | - [Github repo](https://github.com/xwiki) 10 | - [Docker installation](https://github.com/xwiki-contrib/docker-xwiki/blob/master/README.md#using-docker-compose) 11 | 12 | 13 | ## Prerequisities 14 | First run these: 15 | ```sh 16 | wget https://raw.githubusercontent.com/xwiki-contrib/docker-xwiki/master/12/mysql-tomcat/mysql/xwiki.cnf 17 | wget https://raw.githubusercontent.com/xwiki-contrib/docker-xwiki/master/12/mysql-tomcat/mysql/init.sql 18 | ``` 19 | 20 | ## docker-compose.yml 21 | ```yml 22 | services: 23 | db: 24 | image: mysql:5.7 25 | container_name: xwiki-db 26 | volumes: 27 | - ./xwiki.cnf:/etc/mysql/conf.d/xwiki.cnf 28 | - ./init.sql:/docker-entrypoint-initdb.d/init.sql 29 | - ./db:/var/lib/mysql 30 | environment: 31 | - MYSQL_ROOT_PASSWORD=xwiki 32 | - MYSQL_USER=xwiki 33 | - MYSQL_PASSWORD=xwiki 34 | - MYSQL_DATABASE=xwiki 35 | xwiki: 36 | image: xwiki:lts-mysql-tomcat 37 | container_name: xwiki 38 | depends_on: 39 | - db 40 | ports: 41 | - "3123:8080" 42 | environment: 43 | - DB_USER=xwiki 44 | - DB_PASSWORD=xwiki 45 | - DB_HOST=db 46 | volumes: 47 | - ./data:/usr/local/xwiki 48 | ``` 49 | -------------------------------------------------------------------------------- /docker/get-started.md: -------------------------------------------------------------------------------- 1 | # Get started with docker & docker-compose 2 | 3 | Installation instructions for Ubuntu Linux from: https://docs.docker.com/engine/install/ubuntu/ 4 | 5 | 6 | ## Uninstall old versions 7 | ```sh 8 | sudo apt-get remove docker docker-engine docker.io containerd runc 9 | ``` 10 | 11 | ## Install Docker & docker-compose-plugin (on Ubuntu) 12 | ```sh 13 | sudo apt update 14 | sudo apt install ca-certificates curl gnupg lsb-release 15 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 16 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 17 | 18 | sudo apt update 19 | sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin 20 | ``` 21 | 22 | 23 | ## Usage 24 | Full docs are here: https://docs.docker.com/compose/reference/overview/ 25 | 26 | Generally the idea of `docker compose` command is simple: 27 | 1. First you create a folder for your service, e.g. `home-assistant` 28 | 2. Then you then create a `docker-compose.yml` file, which describes the service containers 29 | 3. You run `docker compose up -d` and you're done! 30 | 31 | Here are the most frequently used commands: 32 | 33 | 34 | #### Start a container 35 | `-d` starts in a detached mode - which basically mean that it runs it in the background (so you can do other stuff, instead of looking at the logs). 36 | ```sh 37 | docker compose up -d 38 | ``` 39 | 40 | ### Stop a container 41 | There are 2 options: 42 | ```sh 43 | docker compose stop 44 | docker compose down 45 | ``` 46 | First one (`stop`) onlu stops the containers, whereas the latter (`down`) does some more cleaning (removes the containers, networks, volumes), so I generally recommend `down` if you're tinkering. 47 | 48 | 49 | ### Update a container to use the latest published image 50 | ```sh 51 | docker compose pull && docker compose up -d 52 | ``` 53 | This pulls the latest images as defined in the local `docker-compose.yml` and recreates the containers. 54 | -------------------------------------------------------------------------------- /docker/troubleshooting.md: -------------------------------------------------------------------------------- 1 | # Docker Troubleshooting 2 | Same as **Get Started** section - these instructions are for Ubuntu Linux. 3 | 4 | ### ERROR: Version in "./docker-compose.yml" is unsupported. 5 | You need to update your `docker-compose` version: 6 | ```sh 7 | sudo apt-get remove docker-compose 8 | sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 9 | sudo chmod +x /usr/local/bin/docker-compose 10 | sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 11 | ``` 12 | 13 | 14 | ### ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running? 15 | ```sh 16 | sudo reboot 17 | ``` 18 | 19 | 20 | ### ERROR: Permission denied while trying to connect to the Docker daemon 21 | ```sh 22 | sudo usermod -a -G docker $USER 23 | ``` 24 | 25 | 26 | ### ERROR: mountpoint for devices not found 27 | e.g. 28 | ``` 29 | OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for devices not found\"": unknown 30 | ``` 31 | 32 | #### Follow These Steps: 33 | 1. Edit grub 34 | ```sh 35 | sudo nano /etc/default/grub 36 | ``` 37 | 2. Change `GRUB_CMDLINE_LINUX` value as below: 38 | ``` 39 | GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0" 40 | ``` 41 | 3. Reconfigure grub: 42 | ```sh 43 | grub2-mkconfig 44 | ``` 45 | 4. Finally reboot the system: 46 | ```sh 47 | sudo reboot 48 | ``` 49 | 50 | 51 | ### INTERNAL ERROR: cannot create temporary directory 52 | From: [stackoverflow](https://stackoverflow.com/questions/40755494/docker-compose-internal-error-cannot-create-temporary-directory) 53 | Looks like the docker host run out of free space. 54 | Free up some space on your hard disk and reboot. 55 | Sometimes that may happen due to a crazy docker service running wild. 56 | You can try this to prune everything docker: 57 | ```sh 58 | docker system prune -a --volumes 59 | ``` 60 | --------------------------------------------------------------------------------