Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • adaures/castopod
  • mkljczk/castopod-host
  • spaetz/castopod-host
  • PatrykMis/castopod
  • jonas/castopod
  • ajeremias/castopod
  • misuzu/castopod
  • KrzysztofDomanczyk/castopod
  • Behel/castopod
  • nebulon/castopod
  • ewen/castopod
  • NeoluxConsulting/castopod
  • nateritter/castopod-og
  • prcutler/castopod
14 results
Show changes
Showing
with 2501 additions and 101 deletions
---
title: Dobrodošli 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji
žele interakciju sa svojom publikom.
Castopod se lako instalira i napravljen je na
[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim
otiskom (footprint).
<LinkCard title="Instaliraj" href="./getting-started/install" />
## Funkcionalnosti
- 🌱 Besplatan i otvorenog koda (AGPL v3 License)
- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada
vama i samo vama
- 🪄 Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, podrška,
poglavlja, lokacija, posobe, zvučni isečci, …
- 💬 Ugrađena društvena mreža:
- 🚀 Castopod je deo Fediversa, decentralizovane društvene mreže
- ❤️ Napravite objave, delite, dodajte u omiljene i komentarišite epizode
- 📈 Ugrađena analitika:
- ⚖️ U skladu sa GDPR / CCPA / LGPD
- 🪙 Merenje publike putem IABv2 standarda
- 🏡 Analitika na licu mesta, bez uključenosti trećih strana
- 📢 Ugrađeni marketinški alati:
- ✅ SEO spremno (open-graph meta-tags, JSON-LD, …)
- 📱 PWA: instalirajte kao samostojeću aplikaciju
- 🎨 Prilagodljive boje teme
- 🎬 Napravite video isečke iz epizoda koji su spremni za deljenje
- 🔉 Napravite audio isečke
- ▶️ Plejer koji možete koristiti na svom sajtu (embed)
- 💸 Monetizacija:
- 🔗 Linkovi za podršku publike
- 📲 Slušaj i klikni reklame
- 🤝 value4value / Veb Monetizacija
- 💎 Premijum podkasti
- 📡 Objavite svoje epizode svugde uz RSS:
- 📱 Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts,
Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ Emitujte svoje epizode instant uz WebSub
- 📥 Uvoz podkasta: prebacite svoj postojeći podkast na Castopod
- 📤 Prebacite svoj podkast sa Castopod-a
- 🔀 Mreža: hostujte koliko god želite podkasta
- 👥 Više korisnika: dodajte saradnike i odredite njihove uloge
- 🌎 i18n support: translated in English, French, Polish, German, Brazilian
Portuguese, Spanish, simplified Chinese… and
[many more](https://translate.castopod.org)!
## Motivacija
Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast
kao RSS datoteku, objavite je na vebu i deliti svuda na mreži.
To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo.
Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji
pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim
sadržajem.
Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga
promene ka kontrolisanijem i centralizovanijem mediju.
Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za
hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da
podkasterska kreativnost može da se izrazi.
Ovaj projekat gura zajednica otvorenog koda, ponajviše
[Fedivers](https://fediverse.party/en/fediverse/) i
[Podcasting 2.0](https://podcastindex.org/) pokreti.
## Poređenje sa drugim rešenjima
We believe that a solution is not necessarily right for everyone, it highly
depends on your needs. So, here are comparisons with other tools to help you to
gauge whether Castopod is the right fit for you.
### Castopod protiv Wordpress-a
Castopod is often referred to as "the Wordpress for podcasts" because of the
similarities between the two. In some ways this is true. And actually, Castopod
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
from the community and the number of websites running it.
Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen
koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava
jednostavnu instalaciju na većini veb servera.
Wordpress is a great way to create your website and extend it with plugins to
get what you want. It is a full fledged CMS that helps you get any type of
website online.
On the other hand, Castopod is meant to address the podcasters needs
specifically, focusing on podcasting, and nothing else. You don't need any
plugin to get you started on your podcasting journey.
Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od
kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja,
marketinga i analitike.
Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da
funkcionišu zajedno jer dele iste zahteve!
### Castopod protiv Funkwhale-a
Funkwhale is a self-hosted, modern free and open-source music server. Just as
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
interoperability between the two.
Funkwhale was initially built around music. And later on, as the project
evolved, the ability to host podcasts was introduced.
Unlike Funkwhale, Castopod has been designed and built around podcasting
exclusively. This allows easier implementation for features related to the
podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
chapters, locations, persons, …).
Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da
hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste.
### Castopod protiv drugih podkast hosting-a
Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su
stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se
priključuje Podcasting 2.0 trendu, isto kao i Castopod!
Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa
[listom funkcionalnosti](#features).
Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za
podkasting:
- Castopod can be self-hosted and is the only solution that allows you to keep
full control over what you produce. Also, as it is open-source, you can even
customize it as you wish.
- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu
mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući
se da će ih tako približiti.
## Doprinos
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Kodeks ponašanja
Castopod has adopted a Code of Conduct that we expect project participants to
adhere to. Please read the
[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Vodič za doprinos
Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi
ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i
unapređenja i kako da napravite i testirate svoje promene na Castopod-u.
## Saradnici ✨
Veliko hvala ovim divnim ljudima
([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)):
- [Discord](https://castopod.org/discord) (for direct interaction with
developers and the community)
- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
feature requests & bug reports)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
---
title: Authentifizierung & Autorisierung
---
Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield`
kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen
definiert:
1. [instanzweit](#1-instance-wide-roles-and-permissions)
2. [je Podcast](#2-per-podcast-roles-and-permissions)
## 1. Instanzweite Rollen und Berechtigungen
### Instanz Rollen
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, plugins.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Allgemeine Benutzer von Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instanz Berechtigungen
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ---------------------------------------------------------------------------- |
| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. |
| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. |
| plugins.manage | Auth.instance_permissions.plugins.manage |
| users.manage | Kann Castopod-Benutzer verwalten. |
| persons.manage | Kann Mitwirkende verwalten. |
| pages.manage | Kann Seiten verwalten. |
| podcasts.view | Kann alle Podcasts einsehen. |
| podcasts.create | Kann neue Podcasts erstellen. |
| podcasts.import | Kann Podcasts importieren. |
| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Pro Podcast Rollen und Berechtigungen
### Pro Podcast Rollen
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrator | Hat die vollständige Kontrolle über Podcast #\{id\}. | \* |
| Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Autor | Verwaltet Inhalte von Podcast #\{id\}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Gast | Allgemeiner Mitwirkender des Podcasts #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Pro Podcast Berechtigung
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------------------------------------- |
| view | Kann das Dashboard und Analysen des Podcasts #\{id\} einsehen. |
| edit | Kann Podcast #\{id\} bearbeiten. |
| delete | Kann Podcast #\{id\} löschen. |
| manage-import | Kann den importierten Podcast #\{id\} synchronisieren. |
| manage-persons | Kann Abonnements des Podcasts #\{id\} verwalten. |
| manage-subscriptions | Kann Abonnements des Podcasts #\{id\} verwalten. |
| manage-contributors | Kann Mitwirkende des Podcasts #\{id\} verwalten. |
| manage-platforms | Kann Plattform-Links des Podcasts #\{id\} verwalten. |
| manage-publications | Kann Podcast #\{id\} veröffentlichen. |
| manage-notifications | Kann Benachrichtigungen des Podcasts #\{id\} einsehen und als gelesen markieren. |
| interact-as | Kann als Podcast #\{id\} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. |
| episodes.view | Kann Dashboards und Analysen von Episoden des Podcasts #\{id\} einsehen. |
| episodes.create | Kann Folgen für Podcast #\{id\} erstellen. |
| episodes.edit | Kann Folgen von Podcast #\{id\} bearbeiten. |
| episodes.delete | Kann Folgen von Podcast #\{id\} löschen. |
| episodes.manage-persons | Kann Personen von Episoden des Podcasts #\{id\} verwalten. |
| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #\{id\} verwalten. |
| episodes.manage-publications | Kann Episoden und Posts von Podcast #\{id\} veröffentlichen/zurückziehen. |
| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #\{id\} erstellen und löschen. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}
---
title: Offizielle Docker Images
---
Castopod erstellt während des automatischen Build-Prozesses 3 Docker-Images auf
Docker Hub:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): Ein
umfassendes Castopod Image mit Nginx als Webserver
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): Das App Paket mit
allen Castopod Abhängigkeiten
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): Ein
Nginx Webserver für Castopod
Außerdem benötigt Castopod eine MySQL-kompatible Datenbank. Eine Redis-Datenbank
kann als Cache-Handler hinzugefügt werden.
## Unterstützte Tags
- `develop` [unstable], neueste Updates des development Branches
- `beta` [stable], neueste Beta-Version
- `latest` [stable], die neuste Version
- `1.x.x` [stable], spezifische Version (seit `1.0.0`)
## Beispiel
1. Installiere [Docker](https://docs.docker.com/get-docker/) und
[Docker-Compose](https://docs.docker.com/compose/install/)
2. Erstelle eine `docker-compose.yml` Datei mit folgendem Inhalt:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
Es müssen einige Variablen an deine Bedürfnisse angepasst werden (z.B.
`CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` und
`CP_ANALYTICS_SALT`).
3. Einen Reverse-Proxy für TLS (SSL/HTTPS) einrichten
TLS ist notwendig damit ActivityPub korrekt arbeiten kann. Dieser Job kann
leicht von einem Reverse-Proxy bearbeitet werden, zum Beispiel mit
[Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Führe `docker-compose up -d` aus, warte darauf, dass es initialisiert wird
und gehe auf `https://castopod.example.com/cp-install` um die Einrichtung von
Castopod abzuschließen!
5. Ist alles da? Dann kann das Podcasten beginnen! 🎙️🚀
## Umgebungsvariablen
- **castopod/castopod** und **castopod/app**
| Variablennamen | Typ (`Standard`) | Standardwert |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Variablennamen | Typ | Standardwert |
| ---------------------- | --------------------- | ------------ |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
---
title: Wie installiere ich Castopod?
---
import { Aside } from "@astrojs/starlight/components";
Castopod ist für eine einfache Installation konzipiert. Ob dediziertes oder
Shared-Hosting, du kannst es auf den meisten PHP-MySQL-kompatiblen Webservern
installieren.
## Voraussetzungen
- PHP v8.4 oder höher
- MySQL Version 8.4 oder höher oder MariaDB Version 11.4 oder höher
- HTTPS-Unterstützung
- Eine [ntp-synchronisierte Uhr](https://wiki.debian.org/NTP) um die eingehenden
Anfragen zu überprüfen
### PHP v8.4 oder höher
PHP version 8.4 oder höher ist erforderlich, mit folgenden Erweiterungen
installiert:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)
- [mbstring](https://php.net/manual/en/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) mit **JPEG**,
**PNG** und **WEBP** Bibliotheken.
- [exif](https://www.php.net/manual/en/exif.installation.php)
Stelle außerdem sicher, dass die folgenden Erweiterungen in deinem PHP aktiviert
sind:
- json (standardmäßig aktiviert - nicht ausschalten)
- xml (standardmäßig aktiviert - nicht ausschalten)
- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
### MySQL kompatible Datenbank
> Wir empfehlen [MariaDB](https://mariadb.org).
Du benötigst den Servernamen, den Datenbanknamen, den Benutzernamen und das
Passwort, um den Installationsvorgang abzuschließen. Kontaktiere bitte den
Administrator, falls du keinen Benutzeraccount hast.
#### Berechtigungen
Benutzer müssen mindestens diese Berechtigungen in der Datenbank haben, damit
Castopod funktioniert: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`,
`INSERT`, `SELECT`, `UPDATE`, `REFERENCES`, `CREATE VIEW`.
### (Optional) FFmpeg v4.1.8 oder höher für Videoclips
[FFmpeg](https://www.ffmpeg.org/) Version 4.1.8 oder höher ist erforderlich,
wenn Du Videoclips generieren möchtest. Die folgenden Php-Erweiterungen sind
nicht installiert: %s:
- **FreeType 2** Bibliothek für
[gd](https://www.php.net/manual/en/image.installation.php).
### (Optional) Weitere Empfehlungen
- Redis für bessere Cache-Leistungen.
- CDN für das Caching statischer Dateien und bessere Leistungen.
- E-Mail Server Anbindung für E-Mails zu verlorenen Passwörtern.
## Installationsanleitung
### Voraussetzungen
0. Treib einen Webserver mit den [Voraussetzungen](#requirements) auf
1. Erstellen Sie eine MySQL-Datenbank für Castopod mit einem Benutzer mit
Zugriffsrechten und Modifikationsberechtigungen (für weitere Infos, Siehe
[MySQL kompatible Datenbank](#mysql-compatible-database)).
2. Aktivieren Sie HTTPS auf Ihrer Domain mit einem _SSL Zertifikat_.
3. Lade und entpacke das letzte [Castopod Packet](https://castopod.org/) auf den
Webserver, wenn nicht schon geschehen.
- ⚠️ Setzte das Webserver Document root auf das `public/` Unterverzeichnis
innerhalb des `castopod` Ordners.
4. Füge **cron tasks** auf deinem Webserver hinzu für verschiedene
Hintergrundprozesse (ersetze die Pfade entsprechend):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Hinweis** - Wenn Sie diese Cron-Aufgabe nicht hinzufügen, funktionieren die
folgenden Castopod-Funktionen nicht:
- Einen Podcast aus einem vorhandenen RSS-Feed importieren
- Sende soziale Aktivitäten an deine Follower im Fediversum
- Übertragungen von Episoden zu open hubs mit
[WebSub-](https://en.wikipedia.org/wiki/WebSub)
- Generieren von Videoclips -
[benötigt FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (empfohlen) Installations-Assistent
1. Führen Sie das Castopod Installationsskript aus, indem Sie auf die
Installations-Seite (`https://your_domain_name.com/cp-install`) in Ihrem
bevorzugten Webbrowser gehen.
2. Folge der Anleitung auf dem Bildschirm.
3. Podcasting starten!
<Aside>
Das Installationsskript schreibt eine `.env` Datei im Paket-Root. Wenn Sie nicht
durch den Installations-Assistenten kommen, können Sie die `.env` Datei manuell
erstellen und bearbeiten basierend auf der `.env.example` Datei.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### E-Mail-Konfigurationsoptionen
E-Mail-Konfiguration ist erforderlich, damit einige Funktionen ordnungsgemäß
funktionieren (zB. das Abrufen Ihres vergessenen Passworts, das Senden von
Anweisungen an Premium-Abonnenten, …)
Sie können Ihre E-Mail-Konfiguration in `.env` Ihrer Instanz einfügen:
```ini
# […]
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email/SMTP Setup
| Variablennamen | Typ | Voreinstellung |
| ---------------- | -------------------- | -------------- |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
Standardmäßig werden Dateien im Ordner `public/media` über das Dateisystem
gespeichert. Wenn Sie den Ordner `media` an einen anderen Ort verlegen müssen,
können Sie es in Ihrer `.env` Datei angeben wie unten gezeigt:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In diesem Beispiel werden die Dateien im Ordner /mnt/storage/media gespeichert.
Stellen Sie sicher, dass Sie auch Ihre Webserver-Konfiguration aktualisieren, um
diese Änderung wiederzugeben.
### S3
Wenn Sie Ihre Mediendateien lieber auf einem S3-kompatiblen Speicher speichern
möchten, können Sie dies in Ihrer `.env` spezifizieren:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 Konfigurationsoptionen
| Variablennamen | Typ | Voreinstellung |
| ----------------------- | ------- | -------------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## Community-Pakete
Wenn Sie Castopod nicht manuell installieren wollen, können Sie eines der von
der Open-Source-Community erstellten und betreuten Pakete verwenden.
### Installieren mit YunoHost
[YunoHost](https://yunohost.org/) ist eine auf Debian GNU/Linux basierende
Distribution, die aus freien und Open-Source-Software-Paketen besteht. Es
kümmert sich um den Aufwand von self-hosting für dich.
<div class="flex flex-wrap items-center gap-4">
<a
href="https://install-app.yunohost.org/?app=castopod"
target="_blank"
rel="noopener noreferrer"
>
<img
src="https://install-app.yunohost.org/install-with-yunohost.svg"
alt="Installiere Castopod mit YunoHost"
class="align-middle"
/>
</a>
<a
href="https://github.com/YunoHost-Apps/castopod_ynh"
target="_blank"
rel="noopener noreferrer"
class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="1em"
height="1em"
class="text-xl"
>
<path fill="none" d="M0 0h24v24H0z" />
<path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z" />
</svg>
Github Repo
</a>
</div>
---
title: Sicherheitsbedenken
---
Castopod wurde mittels [CodeIgniter4](https://codeigniter.com/) (einem PHP
Framework) gebaut, welches
[gute Sicherheitspraktiken](https://codeigniter.com/user_guide/concepts/security.html)
fördert.
Um die Sicherheit Ihrer Instanz zu erhöhen und bösartige Angriffe zu verhindern,
empfehlen wir, alle deine Castopod-Dateiberechtigungen nach der Installation
oder dem Updaten zu aktualisieren (um Fehler bei der vorherigen Berechtigung zu
vermeiden):
- der `writable/` Ordner muss **lesbar** und **beschreibbar** sein.
- `public/media/` muss **lesbar** und **beschreibbar** sein.
- jede andere Datei muss nur **lesbar** sein.
Wenn Sie beispielsweise Apache oder NGINX mit Ubuntu verwenden, können Sie
folgendermaßen vorgehen:
```bash
sudo chown -R root:root /path/to/castopod
sudo chown -R www-data:www-data /path/to/castopod/writable
sudo chown -R www-data:www-data /path/to/castopod/public/media
```
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
After installing Castopod, you may want to update your instance to the latest
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
improvements ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Da li treba da napravim rezervnu kopiju pre ažuriranja?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
- cf.
[Gde mogu da pronađem moju verziju Castopod-a?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives
- ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. Na vašem serveru:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
Možda ćete morati da resetujete dozvole za datoteke kao tokom procesa
instalacije. Proverite [Bezbednosne interese](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Izdanja mogu doći sa dodatnim uputstvima za ažuriranje (pogledajte
[stranicu izdanja](https://code.castopod.org/adaures/castopod/-/releases)).
- cf.
[Nisam ažurirao/la svoju instancu jako dugo… Šta treba da uradim?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
</Aside>
## Fully Automated updates
> Stiže uskoro... 👀
## Frequently asked questions (FAQ)
### Gde mogu da pronađem svoju verziju Castopod-a?
Idite na administratorski panel vašeg Castopod-a, verziju možete pronaći u
donjem levom uglu.
Alternativno, verziju možete pronaći u `app > Config > Constants.php` datoteci.
### I haven't updated my instance in a long time… What should I do?
Nema problema! Samo preuzmite poslednju verziju na način opisan iznad. Samo,
kada idete kroz uputstva izdanja (4), izvodite ih jedno za drugim, od
najstarijih do najnovijih.
> You may want to backup your instance depending on how long you haven't updated
> Castopod.
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
`v1.0.0-beta.1`:
0. (highly recommended) Make a backup of your files and database.
1. Download the latest release, overwrite your files whilst keeping `.env` and
`public/media`.
2. Prođite kroz uputstva za ažuriranje svakog izdanja po redu (od najstarijeg do
najnovijeg) počevši sa `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
`v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
3. ✨ Enjoy your fresh instance, you're all done!
### Should I make a backup before updating?
We advise you do, so you don't lose everything if anything goes wrong!
More generally, we advise you make regular backups of your Castopod files and
database to prevent you from losing it all…
---
title: Willkommen 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod ist eine freie & Open-Source-Hosting-Plattform für Podcastende, die ihr
Publikum einbinden und mit ihnen interagieren möchten.
Castopod ist einfach zu installieren und wurde auf
[CodeIgniter4](https://codeigniter.com/) aufgebaut, ein mächtiges PHP Framework,
mit einem sehr kleinen Fußabdruck.
<LinkCard title="Installieren" href="./getting-started/install" />
## Merkmale
- 🌱 Kostenlos & Open-Source (AGPL v3 Lizenz)
- 🔐 Fokussiert auf die Datensouveränität: Ihre Inhalte, Ihr Publikum und
Analysen gehören zu Ihnen, und nur Ihnen
- 🪄 Podcasting 2.0 Features: GUID, gesperrt, Transkripte, Finanzierung,
Kapitel, Standort, Personen, Soundbites, …
- 💬 Integriertes soziales Netzwerk:
- 🚀 Castopod ist Teil des Fediversums, einem dezentralen sozialen Netzwerk
- ❤️ Erstelle Beiträge, teile, favorisiere und kommentiere Episoden
- 📈 Integrierte Analyse:
- ⚖️ GDPR / CCPA / LGPD konform
- 🪙 Standard IABv2 Zuschauermessung
- 🏡 On-premises Analytik, kein Dritter beteiligt
- 📢 Integrierte Marketing-Tools:
- ✅ SEO bereit (open-graph Meta-Tags, JSON-LD, …)
- 📱 PWA: als eigenständige App installieren
- 🎨 Anpassbare Theme-Farben
- 🎬 Generiere Videoclips aus Episoden fertig zum Teilen
- 🔉 Soundbites erstellen
- ▶️ Embeddable Player, binde deine Episoden auf jeder Webseite ein
- 💸 Monetarisierung:
- 🔗 Funding links
- 📲 listen-to-click ads
- 🤝 value4value / WebMonetization
- 💎 Premium podcasts
- 📡 Publish your episodes everywhere with RSS:
- 📱 On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, Google
Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ Broadcast your episodes instantly with WebSub
- 📥 Podcast import: move your existing podcast into Castopod
- 📤 Move your podcast out of Castopod
- 🔀 Multi-tenant: host as many podcasts as you want
- 👥 Multi-user: add contributors and set roles
- 🌎 i18n support: translated in English, French, Polish, German, Brazilian
Portuguese & Spanish… with [more to come](https://translate.castopod.org)!
## Motivation
The podcasting ecosystem is decentralized by nature: you can create your podcast
as an RSS file, publish it on the web and have it shared everywhere online.
It is in fact one of the only media to have stayed this way for a long time.
As usages are evolving, more and more people are getting into podcasts: whether
it is creators finding new ways to share their ideas, or listeners in the search
for better content.
With podcasting becoming more widely used, some companies are trying to shift it
towards a more controlled and centralized medium.
Castopod was created in an effort to provide an open and sustainable alternative
to hosting your podcasts, promoting decentralization to ensure that podcasters
creativity can express itself.
This project is pushed by the open-source community, and specifically by the
[Fediverse](https://fediverse.party/en/fediverse/) and
[Podcasting 2.0](https://podcastindex.org/) movements.
## Vergleiche mit anderen Lösungen
We believe that a solution is not necessarily right for everyone, it highly
depends on your needs. So, here are comparisons with other tools to help you to
gauge whether Castopod is the right fit for you.
### Castopod vs Wordpress
Castopod is often referred to as "the Wordpress for podcasts" because of the
similarities between the two. In some ways this is true. And actually, Castopod
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
from the community and the number of websites running it.
Just like Wordpress, Castopod is free & open source, built using PHP with a
MySQL database and is packaged in a way that you can easily install on most web
servers.
Wordpress is a great way to create your website and extend it with plugins to
get what you want. It is a full fledged CMS that helps you get any type of
website online.
On the other hand, Castopod is meant to address the podcasters needs
specifically, focusing on podcasting, and nothing else. You don't need any
plugin to get you started on your podcasting journey.
This allows optimizing the processes specific to podcasting: ranging from the
creation of your podcasts and the publication of new episodes all the way to
broadcasting, marketing and analytics.
Finally, depending on your needs, Wordpress and Castopod can even live side by
side as they share the same requirements!
### Castopod vs Funkwale
Funkwhale is a self-hosted, modern free and open-source music server. Just as
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
interoperability between the two.
Funkwhale was initially built around music. And later on, as the project
evolved, the ability to host podcasts was introduced.
Unlike Funkwhale, Castopod has been designed and built around podcasting
exclusively. This allows easier implementation for features related to the
podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
chapters, locations, persons, …).
So, you should probably use Funkwhale if you want to host your music, and use
Castopod if you want to host your podcasts.
### Castopod vs other podcast hosts
There are many solutions for you to host your podcasts, some of which are really
great and [a lot of them](https://podcastindex.org/apps) are jumping into the
Podcasting 2.0 wagon just like Castopod!
Each of these solutions differ from one another, you may compare with the
[list of features](#features).
That being said, there are two main differences with other podcasting solutions:
- Castopod can be self-hosted and is the only solution that allows you to keep
full control over what you produce. Also, as it is open-source, you can even
customize it as you wish.
- Castopod is the only solution that currently integrates both a decentralized
social network with ActivityPub as well as many of the podcasting 2.0
features, hoping to bridge the gap between the two.
## Contributing
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Code of conduct
Castopod has adopted a Code of Conduct that we expect project participants to
adhere to. Please read the
[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Contributing guide
Read our [contributing guide](../contributing/guidelines.md) to learn about our
development process, how to propose bugfixes and improvements, and how to build
and test your changes to Castopod.
## Contact
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (for direct interaction with
developers and the community)
- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
feature requests & bug reports)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
--- ---
title: Authentication & Authorization title: Ταυτοποίηση & εξουσιοδότηση
sidebarDepth: 3
--- ---
# Ταυτοποίηση & εξουσιοδότηση Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
Ο Castopod χειρίζεται τον έλεγχο ταυτότητας και την έγκριση χρησιμοποιώντας
`codeigniter/shield` σε συνδυασμό με προσαρμοσμένους κανόνες. Οι ρόλοι και τα
δικαιώματα καθορίζονται σε δύο επίπεδα:
1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions) 1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions)
2. [ανά podcast](#2-per-podcast-roles-and-permissions) 2. [ανά podcast](#2-per-podcast-roles-and-permissions)
## 1. Διαχείριση ρόλων και δικαιωμάτων ## 1. Instance wide roles and permissions
### Ρόλοι εμφάνισης ### Ρόλοι εμφάνισης
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section --> {/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| ρόλος | περιγραφή | δικαιώματα | | role | description | permissions |
| ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | | ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, plugins.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Γενικοί χρήστες του Castopod. | admin.access | | Podcaster | Γενικοί χρήστες του Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END --> {/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions ### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section --> {/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description | | permission | description |
| ----------------------- | ------------------------------------------------------------------ | | ----------------------- | -------------------------------------------------------------------------------------- |
| admin.access | Can access the Castopod admin area. | | admin.access | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. |
| admin.settings | Can access the Castopod settings. | | admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. |
| users.manage | Can manage Castopod users. | | plugins.manage | Auth.instance_permissions.plugins.manage |
| persons.manage | Can manage persons. | | users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. |
| pages.manage | Can manage pages. | | persons.manage | Μπορεί να διαχειριστεί τα άτομα. |
| podcasts.view | Can view all podcasts. | | pages.manage | Μπορεί να διαχειριστεί τις σελίδες. |
| podcasts.create | Can create new podcasts. | | podcasts.view | Μπορεί να δει όλα τα podcasts. |
| podcasts.import | Can import podcasts. | | podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | | podcasts.import | Μπορεί να εισάγει podcasts. |
| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END --> {/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions ## 2. Per podcast roles and permissions
### Per podcast roles ### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section --> {/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions | | role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* | | Διαχειριστής | Έχει πλήρη έλεγχο του podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | | Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Συντάκτης | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view | | Επισκέπτης | Γενικός συντελεστής του podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END --> {/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions ### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section --> {/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description | | permission | description |
| ---------------------------- | ------------------------------------------------------------------------ | | ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #{id}. | | view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #{id}. | | edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #{id}. | | delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #{id}. | | manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #{id}. | | manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. | | manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #{id}. | | manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. | | manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #{id}. | | manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. | | manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | | interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. | | episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #{id}. | | episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit podcast #{id}. | | episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete podcast #{id}. | | episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | | episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | | episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish podcast #{id}. | | episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | | episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END --> {/* AUTH-PODCAST-PERMISSIONS-LIST:END */}
---
title: Official Docker images
---
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler.
## Supported tags
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage
1. Install [docker](https://docs.docker.com/get-docker/) and
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
```yml
version: "3.7"
services:
app:
image: castopod/castopod:latest
container_name: "castopod-app"
volumes:
- castopod-media:/var/www/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks:
- castopod-app
- castopod-db
ports:
- 8000:8000
restart: unless-stopped
mariadb:
image: mariadb:10.5
container_name: "castopod-mariadb"
networks:
- castopod-db
volumes:
- castopod-db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
restart: unless-stopped
redis:
image: redis:7.0-alpine
container_name: "castopod-redis"
command: --requirepass changeme
volumes:
- castopod-cache:/data
networks:
- castopod-app
volumes:
castopod-media:
castopod-db:
castopod-cache:
networks:
castopod-app:
castopod-db:
```
Rankout a rit azasaat un nebeud variennoù hervez hoc'h ezhommoù (da skouer
`CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` ha
`CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by a
reverse proxy, for example with [Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Run `docker-compose up -d`, wait for it to initialize and head on to
`https://castopod.example.com/cp-install` to finish setting up Castopod!
5. You're all set, start podcasting! 🎙️🚀
## Variennoù endro
- **castopod/castopod** and **castopod/app**
| Anv ar varienn | Type (`default`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server**
| Anv ar varienn | Doare | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
---
title: Hoe installeer je Castopod?
---
import { Aside } from "@astrojs/starlight/components";
Castopod was thought-out to be easy to install. Whether using dedicated or
shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)
- [mbstring](https://php.net/manual/en/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
**PNG** and **WEBP** libraries.
- [exif](https://www.php.net/manual/en/exif.installation.php)
Additionally, make sure that the following extensions are enabled in your PHP:
- json (enabled by default - don't turn it off)
- xml (enabled by default - don't turn it off)
- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
### MySQL compatible database
> We recommend using [MariaDB](https://mariadb.org).
You will need the server hostname, database name, username and password to
complete the installation process. If you do not have these, please contact your
server administrator.
#### Privileges
User must have at least these privileges on the database for Castopod to work:
`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
`REFERENCES`, `CREATE VIEW`.
### (Optional) FFmpeg v4.1.8 or higher for Video Clips
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
want to generate Video Clips. The following extensions must be installed:
- **FreeType 2** library for
[gd](https://www.php.net/manual/en/image.installation.php).
### (Optional) Other recommendations
- Redis for better cache performances.
- CDN for static files caching and better performances.
- e-mail gateway for lost passwords.
## Install instructions
### Pre-requisites
0. Get a Web Server with [requirements](#requirements) installed
1. Create a MySQL database for Castopod with a user having access and
modification privileges (for more info, see
[MySQL compatible database](#mysql-compatible-database)).
2. Activate HTTPS on your domain with an _SSL certificate_.
3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
the web server if you haven’t already.
- ⚠️ Set the web server document root to the `public/` sub-folder within the
`castopod` folder.
4. Add **cron tasks** on your web server for various background processes
(replace the paths accordingly):
```bash
* * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
- Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (recommended) Install Wizard
1. Run the Castopod install script by going to the install wizard page
(`https://your_domain_name.com/cp-install`) in your favorite web browser.
2. Follow the instructions on your screen.
3. Start podcasting!
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
</Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
…)
You may add your email configuration in your instance's `.env` like so:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## Community packages
If you don't want to bother with installing Castopod manually, you may use one
of the packages created and maintained by the open-source community.
### Install with YunoHost
[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
made up of free and open-source software packages. It manages the hardships of
self-hosting for you.
<div class="flex flex-wrap items-center gap-4">
<a
href="https://install-app.yunohost.org/?app=castopod"
target="_blank"
rel="noopener noreferrer"
>
<img
src="https://install-app.yunohost.org/install-with-yunohost.svg"
alt="Install Castopod with YunoHost"
class="align-middle"
/>
</a>
<a
href="https://github.com/YunoHost-Apps/castopod_ynh"
target="_blank"
rel="noopener noreferrer"
class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="1em"
height="1em"
class="text-xl"
>
<path fill="none" d="M0 0h24v24H0z" />
<path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z" />
</svg>
Github Repo
</a>
</div>
--- ---
title: Security title: Veiligheidszorgen
--- ---
# Security concerns
Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
framework that encourages framework that encourages
[good security practices](https://codeigniter.com/user_guide/concepts/security.html). [good security practices](https://codeigniter.com/user_guide/concepts/security.html).
......
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
After installing Castopod, you may want to update your instance to the latest
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
improvements ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
- cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- cf.
[I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
</Aside>
## Volledig geautomatiseerde updates
> Coming soon... 👀
## Veelgestelde vragen (FAQ)
### Waar kan ik mijn Castopod versie vinden?
Go to your Castopod admin panel, the version is displayed on the bottom left
corner.
Alternatively, you can find the version in the `app > Config > Constants.php`
file.
### I haven't updated my instance in a long time… What should I do?
No problem! Just get the latest release as described above. Only, when going
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
> You may want to backup your instance depending on how long you haven't updated
> Castopod.
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
`v1.0.0-beta.1`:
0. (highly recommended) Make a backup of your files and database.
1. Download the latest release, overwrite your files whilst keeping `.env` and
`public/media`.
2. Go through each release update instructions sequentially (from oldest to
newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
`v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
3. ✨ Enjoy your fresh instance, you're all done!
### Moet ik een back-up maken voordat ik update?
We advise you do, so you don't lose everything if anything goes wrong!
More generally, we advise you make regular backups of your Castopod files and
database to prevent you from losing it all…
---
title: Καλώς Ήλθατε 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Το Castopod είναι μια δωρεάν & ανοικτού κώδικα πλατφόρμα φιλοξενίας podcast που
κατασκευάζεται για podcasters που θέλουν να συμμετάσχουν και να αλληλεπιδράσουν
με το κοινό τους.
Το Castopod είναι εύκολο στην εγκατάσταση και χτίστηκε με το
[CodeIgniter4](https://codeigniter.com/), ένα ισχυρό PHP framework με ένα πολύ
μικρό αποτύπωμα.
<LinkCard title="Εγκατάσταση" href="./getting-started/install" />
## Χαρακτηριστικά
- 🌱 Δωρεάν & open-source (AGPL v3 License)
- 🔐 Εστιάζει στην κυριαρχία των δεδομένων: το περιεχόμενο, το κοινό και τα
αναλυτικά στοιχεία ανήκουν σε εσάς μόνο
- 🪄 Podcasting 2.0 features: GUID, locked, transcripts, funding, chapters,
location, persons, soundbites, …
- 💬 Ενσωματωμένο κοινωνικό δίκτυο:
- 🚀 Castopod is part of the Fediverse, a decentralized social network
- ❤️ Create posts, share, favourite, and comment on episodes
- 📈 Built-in analytics:
- ⚖️ GDPR / CCPA / LGPD compliant
- 🪙 Standard IABv2 audience measurement
- 🏡 On-premises analytics, no third party involved
- 📢 Built-in marketing tools:
- ✅ SEO ready (open-graph meta-tags, JSON-LD, …)
- 📱 PWA: install as a standalone app
- 🎨 Customizable theme colors
- 🎬 Generate ready-to-share Video clips from episodes
- 🔉 Generate soundbites
- ▶️ Embeddable player, embed your episodes on any website
- 💸 Monetization:
- 🔗 Funding links
- 📲 listen-to-click ads
- 🤝 value4value / WebMonetization
- 💎 Premium podcasts
- 📡 Publish your episodes everywhere with RSS:
- 📱 On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, Google
Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ Broadcast your episodes instantly with WebSub
- 📥 Podcast import: move your existing podcast into Castopod
- 📤 Move your podcast out of Castopod
- 🔀 Multi-tenant: host as many podcasts as you want
- 👥 Multi-user: add contributors and set roles
- 🌎 i18n support: translated in English, French, Polish, German, Brazilian
Portuguese, Spanish, simplified Chinese… and
[many more](https://translate.castopod.org)!
## Κίνητρα
The podcasting ecosystem is decentralized by nature: you can create your podcast
as an RSS file, publish it on the web and have it shared everywhere online.
It is in fact one of the only media to have stayed this way for a long time.
As usages are evolving, more and more people are getting into podcasts: whether
it is creators finding new ways to share their ideas, or listeners in the search
for better content.
With podcasting becoming more widely used, some companies are trying to shift it
towards a more controlled and centralized medium.
Castopod was created in an effort to provide an open and sustainable alternative
to hosting your podcasts, promoting decentralization to ensure that podcasters
creativity can express itself.
This project is pushed by the open-source community, and specifically by the
[Fediverse](https://fediverse.party/en/fediverse/) and
[Podcasting 2.0](https://podcastindex.org/) movements.
## Comparison with other solutions
We believe that a solution is not necessarily right for everyone, it highly
depends on your needs. So, here are comparisons with other tools to help you to
gauge whether Castopod is the right fit for you.
### Castopod vs Wordpress
Castopod is often referred to as "the Wordpress for podcasts" because of the
similarities between the two. In some ways this is true. And actually, Castopod
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
from the community and the number of websites running it.
Just like Wordpress, Castopod is free & open source, built using PHP with a
MySQL database and is packaged in a way that you can easily install on most web
servers.
Wordpress is a great way to create your website and extend it with plugins to
get what you want. It is a full fledged CMS that helps you get any type of
website online.
On the other hand, Castopod is meant to address the podcasters needs
specifically, focusing on podcasting, and nothing else. You don't need any
plugin to get you started on your podcasting journey.
This allows optimizing the processes specific to podcasting: ranging from the
creation of your podcasts and the publication of new episodes all the way to
broadcasting, marketing and analytics.
Finally, depending on your needs, Wordpress and Castopod can even live side by
side as they share the same requirements!
### Castopod vs Funkwhale
Funkwhale is a self-hosted, modern free and open-source music server. Just as
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
interoperability between the two.
Funkwhale was initially built around music. And later on, as the project
evolved, the ability to host podcasts was introduced.
Unlike Funkwhale, Castopod has been designed and built around podcasting
exclusively. This allows easier implementation for features related to the
podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
chapters, locations, persons, …).
So, you should probably use Funkwhale if you want to host your music, and use
Castopod if you want to host your podcasts.
### Castopod vs other podcast hosts
There are many solutions for you to host your podcasts, some of which are really
great and [a lot of them](https://podcastindex.org/apps) are jumping into the
Podcasting 2.0 wagon just like Castopod!
Each of these solutions differ from one another, you may compare with the
[list of features](#features).
That being said, there are two main differences with other podcasting solutions:
- Castopod can be self-hosted and is the only solution that allows you to keep
full control over what you produce. Also, as it is open-source, you can even
customize it as you wish.
- Castopod is the only solution that currently integrates both a decentralized
social network with ActivityPub as well as many of the podcasting 2.0
features, hoping to bridge the gap between the two.
## Contributing
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Code of conduct
Castopod has adopted a Code of Conduct that we expect project participants to
adhere to. Please read the
[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be tolerated.
### Contributing guide
Read our [contributing guide](../contributing/guidelines.md) to learn about our
development process, how to propose bugfixes and improvements, and how to build
and test your changes to Castopod.
## Contact
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (for direct interaction with
developers and the community)
- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
feature requests & bug reports)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)
[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/)
## License
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
--- ---
title: Authentication & Authorization title: Authentication & Authorization
sidebarDepth: 3
--- ---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield` Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels: coupled with custom rules. Roles and permissions are defined at two levels:
...@@ -15,24 +12,25 @@ coupled with custom rules. Roles and permissions are defined at two levels: ...@@ -15,24 +12,25 @@ coupled with custom rules. Roles and permissions are defined at two levels:
### Instance roles ### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section --> {/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions | | role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Super admin | Has complete control over Castopod. | admin.\*, plugins.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access | | Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END --> {/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions ### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section --> {/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description | | permission | description |
| ----------------------- | ------------------------------------------------------------------ | | ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. | | admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. | | admin.settings | Can access the Castopod settings. |
| plugins.manage | Auth.instance_permissions.plugins.manage |
| users.manage | Can manage Castopod users. | | users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. | | persons.manage | Can manage persons. |
| pages.manage | Can manage pages. | | pages.manage | Can manage pages. |
...@@ -41,47 +39,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: ...@@ -41,47 +39,47 @@ coupled with custom rules. Roles and permissions are defined at two levels:
| podcasts.import | Can import podcasts. | | podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | | fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END --> {/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions ## 2. Per podcast roles and permissions
### Per podcast roles ### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section --> {/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions | | role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* | | Admin | Has complete control of podcast #\{id\}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | | Editor | Manages content and publications of podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Author | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view | | Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END --> {/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions ### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section --> {/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description | | permission | description |
| ---------------------------- | ------------------------------------------------------------------------ | | ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #{id}. | | view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #{id}. | | edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #{id}. | | delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #{id}. | | manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #{id}. | | manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. | | manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #{id}. | | manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. | | manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish podcast #{id}. | | manage-publications | Can publish podcast #\{id\}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. | | manage-notifications | Can view and mark notifications as read for podcast #\{id\}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | | interact-as | Can interact as the podcast #\{id\} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. | | episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #{id}. | | episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit podcast #{id}. | | episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete podcast #{id}. | | episodes.delete | Can delete episodes of podcast #\{id\}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | | episodes.manage-persons | Can manage episode persons of podcast #\{id\}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | | episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. |
| episodes.manage-publications | Can publish podcast #{id}. | | episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | | episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END --> {/* AUTH-PODCAST-PERMISSIONS-LIST:END */}
---
title: Create your first episode
---
To add an episode to your podcast, choose Podcasts -> All podcasts from your
instance management left hand sidebar. Then choose Podcast dashboard and press
the Add an episode button in the upper right hand corner and fill out the
following fields.
## Episode Info
### Audio file
Press the `Choose File` button to select the audio file to upload to Castopod.
The audio file must be an mp3 or m4a file and cannot be larger than 512
megabytes.
### Episode cover
You can optionally add a different podcast cover / artwork. Press `Choose File`
and select an image from your computer that must be at least 1400px wide and
tall and no larger than 3000px wide and tall. If you do not choose an episode
cover, your default podcast artwork will be used.
### Title
Enter the name for your new episode. Do not add the season or episode number in
the **Title** field. Choose a clear and concise episode name to help your
listeners.
### Permalink
The permalink is the link to the public episode page. This will be automatically
filled out based on the title you entered above. If you wish to have a different
permalink, press the edit button to the right of the displayed permalink.
### Season and Episode
You can optionally add a season and / or episode number to your episode.
## Show Notes
Describe your episode in detail. You can use up to 4000 characters, and you can
use Markdown to style your show notes. You can expand the text box by pressing
and holding the bottom right corner of the text box.
When your show notes are complete, press `Preview` to view how your show notes
will be displayed.
## Additional Files
### Transcripts
You can add a transcript to your episode by choosing a file in SRT or VTT format
to upload. Transcripts will be shown in a tab on the episode page and some
podcast apps such as Apple Podcasts can display the transcript.
Transcripts help users who may have a hearing disability and can also help with
search engine optimization.
### Chapters
You can optionally upload a chapters file in JSON format. To learn more about
chapters and for an example of the correct format, visit the
[Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md).
!!! note Not all podcast players natively support chapters in JSON format. More
modern players, such as Fountain and Apple Podcasts, do support chapters in JSON
format.
## Publish your episode
When complete, press the `Create episode` button at the bottom of the page. You
will be automatically directed to the next step to publish your episode. Your
episode is in draft mode and is not yet published. You can preview how your
episode will look when published or publish your episode. To publish your
episode, press the `Publish` button in the upper right hand corner.
### Create your announcement post
After pressing `Publish` you will be directed to the next page to draft your
announcement post. Write your message in the text box provided. This will be the
message broadcast to the Fediverse and published on your podcast's home page.
### Publication date
Choose `Now` or `Schedule` to publish your episode. If you choose `Now`, your
episode will be live. Or you can schedule the day and time to publish your
episode by choosing the `Schedule` radio button and choosing the day and time.
Press `Publish` to finish.
Your RSS feed will be automatically updated with your episode information and
listeners who subscribe will be notified of a new episode. Congratulations on
publishing your first episode!
---
title: Create your first podcast
---
import { Aside } from "@astrojs/starlight/components";
From the left hand navigation sidebar, press the `+` sign to the right of
Podcasts to create your first podcast.
## Podcast Identity
### Podcast Cover
To upload your podcast cover art, press the `Choose File` button and choose your
cover art from your computer. The cover art needs to be in JPG or PNG format and
a minimum of 1400px wide and tall with a maximum of 3000px wide and tall.
### Title
Enter the name of your podcast in the **Title** field.
### Description
Describe what your podcast is about. You can use Markdown to style the text and
you can resize the text box by pressing and holding the bottom right hand corner
of the text box.
### Type
Choose how your listeners should listen to your podcast. **Episodic** lets
listeners know they can consume your podcast in any order, such as an interview
podcast. Choose **Serial** if your episodes are meant to be listened to in
sequential order.
### Medium
Choose the type of audio for your podcast:
- **Podcast**: a standard podcast.
- **Music**: A feed of music organized into an "album" with each item a song
within the album.
- **Audiobook**: A specific type of audio with one item per feed, or where items
represent chapters within a book.
## Classification
### Language
From the dropdown menu, choose which language is spoken in your podcast.
### Category
Choose the category that represents your podcast, such as Arts, Comedy, Sports,
Technology, etc.
### Other categories (optional)
You can choose a second category in addition to the main category you set up.
### Parental advisory
Choose if your podcast has explicit content or swearing or choose Clean if your
podcast is suitable for everyone. You can also choose to leave this category as
undefined. When [creating a new episode](../podcast/episodes), you will also
have the opportunity to choose clean, explicit, or undefined on a per episode
basis.
## Author
### Owner name and email
Enter the owner name and email in the provided fields. This is only visible in
the RSS feed and is used by other podcasting platforms to verify your ownership
of your podcast. You can choose to remove the owner email from the public RSS
feed by using the provided toggle.
### Publisher
If your podcast is part of a podcast network or is produced by a company, enter
the publisher here.
### Copyright
You can optionally add the copyright holder in this field.
### Fediverse identity
Enter the handle (or nickname) for your podcast. This will allow people on
Mastodon and other Fediverse services to follow your podcast. Your handle will
be shown as @yourdomain.com@handle on the Fediverse.
To learn more about Fediverse integration, visit the
[Fediverse documentation page](../instance/fediverse).
### Podcast banner
Upload a banner image to be displayed at the top of your podcast's home page.
The banner must have a 3:1 ration and be at least 1500px wide.
### Premium
Toggle this setting to set all episodes by default as premium. When creating an
episode, it will default to premium, and you can still choose to make some
episodes, trailers, or bonus content as free and public.
## Open Podcast Prefix Project (OP3)
The [Open Podcast Prefix Project](https://op3.dev) is an open source and trusted
third party analytics service. If you toggle this to enabled, you will be able
to view analytics for your podcast over time including the number of listens
over time, episode comparison charts, and more.
## Location
You can optionally add a real or fictitious location name in this field. When
[creating a new episode](../podcast/episodes) you also can add a location to an
individual episode.
## Advanced Parameters
You can optionally toggle the following settings:
- **Prevent podcast from being copied**: this locks your podcast and does not
allow other podcast platforms to import your podcast. If you decide in the
future to migrate away from Castopod to a new platform, this toggle will need
to be unchecked.
- **Podcast should be hidden from public catalogues**: If toggled, a best effort
is made to hide the entire podcast from appearing in Apple Podcasts, YouTube
Music, and any other third party podcast apps. (Not guaranteed)
- **Podcast will not be having new episodes**: If your podcast comes to an end,
you can toggle this to let listeners know there will not be new episodes.
--- ---
title: Official Docker images title: Official Docker images
sidebarDepth: 3
--- ---
# Official Docker images
Castopod pushes 3 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all
in one castopod image using nginx unit
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
...@@ -22,7 +19,6 @@ can be added as a cache handler. ...@@ -22,7 +19,6 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build - `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`) - `1.x.x` [stable], specific version build (since `1.0.0`)
...@@ -36,37 +32,29 @@ can be added as a cache handler. ...@@ -36,37 +32,29 @@ can be added as a cache handler.
version: "3.7" version: "3.7"
services: services:
app: castopod:
image: castopod/app:latest image: castopod/castopod:latest
container_name: "castopod-app" container_name: "castopod"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/var/www/castopod/public/media
environment: environment:
MYSQL_DATABASE: castopod MYSQL_DATABASE: castopod
MYSQL_USER: castopod MYSQL_USER: castopod
MYSQL_PASSWORD: changeme MYSQL_PASSWORD: changeme
CP_BASEURL: "http://castopod.example.com" CP_BASEURL: "https://castopod.example.com"
CP_ANALYTICS_SALT: changeme CP_ANALYTICS_SALT: changeme
CP_CACHE_HANDLER: redis CP_CACHE_HANDLER: redis
CP_REDIS_HOST: redis CP_REDIS_HOST: redis
CP_REDIS_PASSWORD: changeme
networks: networks:
- castopod-app - castopod
- castopod-db - castopod-db
restart: unless-stopped
web-server:
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
networks:
- castopod-app
ports: ports:
- 8080:80 - 8000:8000
restart: unless-stopped restart: unless-stopped
mariadb: mariadb:
image: mariadb:10.5 image: mariadb:11.2
container_name: "castopod-mariadb" container_name: "castopod-mariadb"
networks: networks:
- castopod-db - castopod-db
...@@ -80,27 +68,13 @@ can be added as a cache handler. ...@@ -80,27 +68,13 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
redis: redis:
image: redis:7.0-alpine image: redis:7.2-alpine
container_name: "castopod-redis" container_name: "castopod-redis"
command: --requirepass changeme
volumes: volumes:
- castopod-cache:/data - castopod-cache:/data
networks: networks:
- castopod-app - castopod
# this container is optional
# add this if you want to use the videoclips feature
video-clipper:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
...@@ -108,7 +82,7 @@ can be added as a cache handler. ...@@ -108,7 +82,7 @@ can be added as a cache handler.
castopod-cache: castopod-cache:
networks: networks:
castopod-app: castopod:
castopod-db: castopod-db:
``` ```
...@@ -123,7 +97,7 @@ can be added as a cache handler. ...@@ -123,7 +97,7 @@ can be added as a cache handler.
``` ```
#castopod #castopod
castopod.example.com { castopod.example.com {
reverse_proxy localhost:8080 reverse_proxy localhost:8000
} }
``` ```
...@@ -134,44 +108,50 @@ can be added as a cache handler. ...@@ -134,44 +108,50 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper** - **castopod/castopod** and **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- | | ------------------------------------- | ----------------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | | **`CP_BASEURL`** | string | `undefined` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | | **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
- **castopod/app** | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| Variable name | Type (`default`) | Default | | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| ---------------------------- | ----------------------- | ---------------- | | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_BASEURL`** | string | `undefined` | | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | | **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | | **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | | **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` | | **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | | **`CP_EMAIL_FROM`** | ?string | `undefined` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` | | **`CP_ENABLE_2FA`** | ?boolean | `undefined` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` | | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` |
| **`CP_REDIS_PORT`** | ?number | `6379` | | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` |
| **`CP_REDIS_DATABASE`** | ?number | `0` | | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` |
| **`CP_EMAIL_FROM`** | ?string | `undefined` | | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` |
| **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
- **castopod/web-server** - **castopod/web-server**
| Variable name | Type | Default | | Variable name | Type | Default |
| --------------------- | ------- | ------- | | ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
--- ---
title: Installation title: How to install Castopod?
sidebarDepth: 3
--- ---
# How to install Castopod? import { Aside } from "@astrojs/starlight/components";
Castopod was thought-out to be easy to install. Whether using dedicated or Castopod was thought-out to be easy to install. Whether using dedicated or
shared hosting, you can install it on most PHP-MySQL compatible web servers. shared hosting, you can install it on most PHP-MySQL compatible web servers.
::: tip Note
We've released official Docker images for Castopod!
If you prefer using Docker, you may skip this and go straight to the
[docker documentation](./docker.md) for Castopod.
:::
## Requirements ## Requirements
- PHP v8.1 or higher - PHP v8.4 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher - MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support - HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.1 or higher ### PHP v8.4 or higher
PHP version 8.1 or higher is required, with the following extensions installed: PHP version 8.4 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php) - [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php)
...@@ -44,14 +36,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: ...@@ -44,14 +36,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> We recommend using [MariaDB](https://mariadb.org). > We recommend using [MariaDB](https://mariadb.org).
::: warning Warning
Castopod only works with supported MySQL 5.7 or higher compatible databases. It
will break with the previous MySQL v5.6 for example as its end of life was on
February 5, 2021.
:::
You will need the server hostname, database name, username and password to You will need the server hostname, database name, username and password to
complete the installation process. If you do not have these, please contact your complete the installation process. If you do not have these, please contact your
server administrator. server administrator.
...@@ -92,29 +76,19 @@ want to generate Video Clips. The following extensions must be installed: ...@@ -92,29 +76,19 @@ want to generate Video Clips. The following extensions must be installed:
4. Add **cron tasks** on your web server for various background processes 4. Add **cron tasks** on your web server for various background processes
(replace the paths accordingly): (replace the paths accordingly):
- For social features to work properly, this task is used to broadcast social
activities to your followers on the fediverse:
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
```
- For having your episodes be broadcasted on open hubs upon publication using
[WebSub](https://en.wikipedia.org/wiki/WebSub):
```bash ```bash
* * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1
``` ```
- For Video Clips to be created (see **Note** - If you do not add this cron task, the following Castopod features
[FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): will not work:
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
```
> These tasks run **every minute**. You may set the frequency depending on - Importing a podcast from an existing RSS feed
> your needs: every 5, 10 minutes or more. - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using
[WebSub](https://en.wikipedia.org/wiki/WebSub)
- Generating video clips -
[requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips)
### (recommended) Install Wizard ### (recommended) Install Wizard
...@@ -123,13 +97,30 @@ want to generate Video Clips. The following extensions must be installed: ...@@ -123,13 +97,30 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen. 2. Follow the instructions on your screen.
3. Start podcasting! 3. Start podcasting!
::: info Note <Aside>
The install script writes a `.env` file in the package root. If you cannot go The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file. based on the `.env.example` file.
::: </Aside>
### Using CLI
1. Create a `.env` file in the package root based on the `.env.example` file.
2. Initialize the database using:
```sh
php spark install:init-database
```
3. Create the superadmin user using:
```sh
php spark install:create-superadmin
```
4. Head on to your admin gateway to start podcasting!
### Email/SMTP setup ### Email/SMTP setup
...@@ -142,8 +133,6 @@ You may add your email configuration in your instance's `.env` like so: ...@@ -142,8 +133,6 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
# […]
email.fromEmail="your_email_address" email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host" email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user" email.SMTPUser="your_smtp_user"
...@@ -162,6 +151,50 @@ email.SMTPPass="your_smtp_password" ...@@ -162,6 +151,50 @@ email.SMTPPass="your_smtp_password"
| **`SMTPPort`** | number | `25` | | **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
### Media storage
By default, files are saved to the `public/media` folder using the file system.
If you need to relocate the `media` folder to a different location, you can
specify it in your `.env` file as shown below:
```ini
# […]
media.root="media"
media.storage="/mnt/storage"
```
In this example, the files will be saved to the /mnt/storage/media folder. Make
sure to also update your web server configuration to reflect this change.
### S3
If you prefer storing your media files on an S3 compatible storage, you may
specify it in your `.env`:
```ini
# […]
media.fileManager="s3"
media.s3.endpoint="your_s3_host"
media.s3.key="your_s3_key"
media.s3.secret="your_s3_secret"
media.s3.region="your_s3_region"
```
#### S3 config options
| Variable name | Type | Default |
| ----------------------- | ------- | ----------- |
| **`endpoint`** | string | `undefined` |
| **`key`** | string | `undefined` |
| **`secret`** | string | `undefined` |
| **`region`** | string | `undefined` |
| **`bucket`** | string | `castopod` |
| **`protocol`** | number | `undefined` |
| **`pathStyleEndpoint`** | boolean | `false` |
| **`keyPrefix`** | string | `undefined` |
## Community packages ## Community packages
If you don't want to bother with installing Castopod manually, you may use one If you don't want to bother with installing Castopod manually, you may use one
...@@ -175,13 +208,35 @@ self-hosting for you. ...@@ -175,13 +208,35 @@ self-hosting for you.
<div class="flex flex-wrap items-center gap-4"> <div class="flex flex-wrap items-center gap-4">
<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer"> <a
<img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" /> href="https://install-app.yunohost.org/?app=castopod"
target="_blank"
rel="noopener noreferrer"
>
<img
src="https://install-app.yunohost.org/install-with-yunohost.svg"
alt="Install Castopod with YunoHost"
class="align-middle"
/>
</a> </a>
<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg <a
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" href="https://github.com/YunoHost-Apps/castopod_ynh"
class="text-xl"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z"/></svg>Github target="_blank"
Repo</a> rel="noopener noreferrer"
class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="1em"
height="1em"
class="text-xl"
>
<path fill="none" d="M0 0h24v24H0z" />
<path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 6.84 9.49c.5.09.69-.21.69-.48l-.02-1.86c-2.51.46-3.16-.61-3.36-1.18-.11-.28-.6-1.17-1.02-1.4-.35-.2-.85-.66-.02-.67.79-.01 1.35.72 1.54 1.02.9 1.52 2.34 1.1 2.91.83a2.1 2.1 0 0 1 .64-1.34c-2.22-.25-4.55-1.11-4.55-4.94A3.9 3.9 0 0 1 6.68 8.8a3.6 3.6 0 0 1 .1-2.65s.83-.27 2.75 1.02a9.28 9.28 0 0 1 2.5-.34c.85 0 1.7.12 2.5.34 1.9-1.3 2.75-1.02 2.75-1.02.54 1.37.2 2.4.1 2.65.63.7 1.02 1.58 1.02 2.68 0 3.84-2.34 4.7-4.56 4.94.36.31.67.91.67 1.85l-.01 2.75c0 .26.19.58.69.48A10.02 10.02 0 0 0 22 12 10 10 0 0 0 12 2z" />
</svg>
Github Repo
</a>
</div> </div>
---
title: Security concerns
---
import { Aside } from "@astrojs/starlight/components";
Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
framework that encourages
[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
To maximize your instance's safety and prevent any malicious attack, we
recommend you update all your Castopod files permissions after installation or
updates (to avoid any prior permission error):
- `writable/` folder must be **readable** and **writable**.
- `public/media/` folder must be **readable** and **writable**.
- any other file must be set to **readonly**.
For instance, if you are using Apache or NGINX with Ubuntu you may do the
following:
```bash
sudo chown -R root:root /path/to/castopod
sudo chown -R www-data:www-data /path/to/castopod/writable
sudo chown -R www-data:www-data /path/to/castopod/public/media
```
## Third-party Plugins
<Aside type="caution" title="Disclaimer">
Installing untrusted third-party plugins on Castopod carries inherent security
risks, such as unauthorized access to sensitive user data, data breaches, data
tampering, and injecting malicious code.
</Aside>
Since v2's [Plugins Architecture](../../plugins), Castopod can be extended with
all sorts of cool features. Anyone can choose to create their own plugins and
even share them with the community.
👉 Plugins are a way to inject code in parts of Castopod through
[Hooks](../../plugins/hooks).
Now, if you create your own plugin and install it in your own Castopod, that
means you control both the code that gets injected and the environment: all is
good!
But as for **third-party plugins**, you must treat them as a **potential
security risk _by default_**:
1. Make sure you **trust the source before installing any third-party plugin**
2. **Review the plugin's code** yourself if you can or
[ask developers from the community for help](https://castopod.org/chat)
---
title: How to update Castopod?
---
import { Aside } from "@astrojs/starlight/components";
After installing Castopod, you may want to update your instance to the latest
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
improvements ⚡.
## Update instructions
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
- cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. On your server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security).
</Aside>
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
<Aside>
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
- cf.
[I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
</Aside>
## Fully Automated updates
> Coming soon... 👀
## Frequently asked questions (FAQ)
### Where can I find my Castopod version?
Go to your Castopod admin panel, the version is displayed on the bottom left
corner.
Alternatively, you can find the version in the `app > Config > Constants.php`
file.
### I haven't updated my instance in a long time… What should I do?
No problem! Just get the latest release as described above. Only, when going
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
> You may want to backup your instance depending on how long you haven't updated
> Castopod.
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
`v1.0.0-beta.1`:
0. (highly recommended) Make a backup of your files and database.
1. Download the latest release, overwrite your files whilst keeping `.env` and
`public/media`.
2. Go through each release update instructions sequentially (from oldest to
newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
`v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
3. ✨ Enjoy your fresh instance, you're all done!
### Should I make a backup before updating?
We advise you do, so you don't lose everything if anything goes wrong!
More generally, we advise you make regular backups of your Castopod files and
database to prevent you from losing it all…