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 1883 additions and 117 deletions
---
title: Podcast Dashboard
---
When you choose your podcast from the Admin dashboard you will be redirected to
the Podcast dashboard page.
The Podcast dashboard shows you up to five of the latest episodes, both those
published and scheduled. You can click on any of these episodes to view them or
click `See all episodes` to see a list of every episode.
## Edit your podcast
To edit your podcast, press `Edit podcast` in the upper right hand corner or
`Edit podcast` in the left hand side navigation.
You can edit any of the
[fields you filled out when creating your podcast](../instance/podcast).
When finished press the `Save podcast` button in the upper right hand corner.
You can also choose to delete your podcast by pressing `Delete podcast` at the
bottom of the Edit podcast page.
## Manage persons
If you have added people to Persons in the Admin dashboard, you can assign them
a role here. People assigned roles will show up on the
[Credits page](../website/credits) linked from your home page to give them
credit for contributing to the podcast.
Roles include Administration, Audio production, cast, guests, hosts, writing,
and more.
From the **Persons** drop down, choose the person you want to add. Then choose a
role from the \*_Roles_ drop down and press `Add person(s)`.
A list of all people assigned roles will be displayed. You can remove them by
pressing the `Remove` button.
Adding persons to your podcast populates the Credits page linked from your
[home page](../website).
## Podcast imports
Podcast imports show you the status of a feed that you imported into Castopod,
including the feed name, how long the import took, and how many episodes were
imported. Under **Actions** you can try re-import the feed if the original
import failed or delete the status message for the imported feed.
If the feed you imported has been updated after your import, press
`Synchronize Feeds` in the upper right hand corner to import the missing
episodes.
## Sync feeds
You can also synchronize missing episode from an imported feed by choosing
`Sync Feeds` from the Podcast dashboard menu. The **Feed URL** should
auto-populate if you have previously imported a feed. Press `Add to queue` to
import any missing episodes from the feed.
---
title: Episodes
---
import { Aside } from "@astrojs/starlight/components";
From the left hand navigation, click **Episodes** and the menu will expand to
**All Episodes** and **New Episode**.
## All Episodes
To view a list of all episodes, click `All Episodes`. Each episode will be
displayed in a list with its name and notes, Visibility such as published or
scheduled, and how many downloads and comments each episode has.
### Actions and the Episode Dashboard
Click the three dots under **Actions** to view a menu of options for an episode
or click on an individual episode to view the available actions:
- **Go to page**: This will redirect you to the public page of the episode and
display the show notes.
- **Edit**: This allows you to change the fields you filled when creating the
episode (see below).
### Embeddable player
Choose a theme color and press the copy button to the right of the text box to
copy the code to your clipboard. Insert the code into a web page to display the
episode.
### Persons
If you have added people in the Admin interface, you can choose a person and
assign them a role, such as guest, for a given episode.
### Video clips and Soundbites
The process to create a video clip and soundbite is the same. It may take a
minute for the file to load and you will see the waveform.
A video clip will create an MP4 video of the audio with text from the transcript
matched to the audio. A soundbite will create an audio clip.
Enter the name of the clip you want to create. Then drag the slider to where you
want to start and end your video clip or soundbite. You can press the `Play`
button to preview your clip.
For video clips, choose a format, including Landscape, Portrait or Squared and a
background theme color.
Then press the `Create` button, you will be redirected to a status page
displaying the status of creating the clip. Refresh the page to see if it's
`Running` or completed. You may need to be patient depending on the length of
the clip.
<Aside>
To create video clips and soundbites, your server must have `FFMPEG` installed
and a transcript.
</Aside>
## Create episode
To add an episode, press the `Add an episode button` in the upper right hand
corner of the Episode dashboard or click `New episode` in the left hand
navigation under `Episodes`.
### 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. If you
are adding a new episode and a previous episode had a season and /or episode
number, the field(s) will be auto filled for you. You can leave it or update
with a different season and / or episode number.
### 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. Chapters do not allow you to click to select the chapter in Castopod's
embeddable player at this time. :::
### 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!
## Editing an episode
You can edit an episode before or after it is published. You can change any of
the fields, including uploading a new episode, updating the show notes, or
updating the transcripts or chapters. Select the episode you want to edit and
choose `Edit Episode`. You can change just one field or multiple fields at the
same time. After you have made the changes, press `Save Episode` in the upper
right corner to finalize the changes.
You can also edit the publication for the episode. Choose the episode again, and
press `Edit Publication` in the upper right hand corner. Update the announcement
post or publication date. When complete, press `Edit publication`. You can also
choose to cancel the publication and it won't be published but will not be
deleted.
---
title: Manage Podcasts
---
import { LinkCard, CardGrid } from "@astrojs/starlight/components";
From the Castopod admin interface, click **Podcasts** and then **All Podcasts**
and you will be redirected to the podcast dashboard. This page displays the
latest episodes, including any scheduled episodes.
From the podcast dashboard, you can add episodes, view analytics, add links to
your homepage, and more. Learn more by clicking the links below.
<CardGrid>
<LinkCard title="Podcast dashboard" href="dashboard" />
<LinkCard title="Episodes" href="episodes" />
<LinkCard title="Analytics" href="analytics" />
<LinkCard title="Broadcast" href="broadcast" />
<LinkCard title="Contributors" href="contributors" />
</CardGrid>
---
title: Podcast Home Page
---
import { Aside } from "@astrojs/starlight/components";
The podcast home page is your landing page for your listeners to view episode
announcements, messages, episodes, and links to where to find your podcast. If
you have only one podcast, your users will be automatically redirected from your
top level domain, such as `www.yourpodcast.com`, to the podcast page at
`www.yourpodcast.com/@yourpodcasthandle`.
If you are hosting multiple podcasts, your top level page will display the
artwork for each podcast. Clicking on the podcast artwork will take you to your
podcast page at `www.yourpodcast.com/@yourpodcasthandle`.
## Home Page
If you are logged in to your podcast, you will see a strip across the top of the
page with a link to the admin interface of your podcast, a bell that will show
if you have any new notifications, and the user who is logged in. You can click
on the user for quick access to your account, changing your password, or to log
out.
<Aside>
If you have multiple podcasts, you can click the user dropdown to switch to
choose which podcast to interact with. If your account has access to two or more
podcasts, pay attention to which podcast is broadcasting messages!
</Aside>
Listeners can click the `Follow` button to follow any messages, including
episode announcements, from a Fediverse app, such as Mastodon. After clicking
`Follow` a pop-up box will be displayed where the user enterse their Fediverse
handle and then clicks `Proceed to follow`.
### Podcast RSS feed
On the right hand side is a link to your RSS Podcast feed. Users can copy that
and subscribe directly in their podcast app.
### Social Networks
Below the RSS feed is are icons that link to all of the social networks you
toggled on in the [Broadcast](../podcast/broadcast#podcasting-apps) section of
the podcast's admin section.
### Podcast Directories
Below the social networking links is **Listen On** which displays icons linked
to the podcast directories you toggled on in the
[Broadcast](../podcast/broadcast#social-networks) section of the podcast's admin
section.
## Activity
The **Activity** tab is located directly under your podcast artwork is the
default home page for your podcast. Website visitors are presented with a list
of messages in chronological order. If you are logged in as a podcast
administrator, you will see a text box where you can write a message to be
broadcasted to your followers. If you include the episode URL, a preview of that
episode will be included in your message.
Below each message there are four icons:
- **Comments**: This will show you the number of comments on a given message.
Clicking this will show you all replies to your message. You can click the
three dots to block a user or a domain in case of spam.
- **Shares**: This shows the number of times your message was shared by other
users.
- **Favorites**: This shows how many people liked your message.
## Episodes
The **Episodes** tab shows a list of all episode announcements you have shared.
If you are using season numbers, it will default to the current season. Users
can click the **Season** link above all of the messages for a dropdown menu to
view past episodes by season.
## About
The About tab shares general information about your podcast, including:
- Podcast description
- Podcast category
- The [people](../podcast/dashboard#manage-persons) who contribute to the
podcast
- Statistics
- Number of seasons
- Number of episodes
- Date first episode was published
---
title: Autenticación & Autenticación
---
Castopod gestiona la autenticación y autorización usando `codeignitor/escudo`
emparejado con reglas personalizadas. Los roles y permisos se definen en dos
niveles:
1. [por instancia](#1-instance-wide-roles-and-permissions)
2. [por podcast](#2-per-podcast-roles-and-permissions)
## 1. Roles por instancia y permisos
### Roles de instancia
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Super administrador | Tiene control completo sobre Castopod. | admin.\*, plugins.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | Usuarios generales de Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Permisos de instancia
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------------------ |
| admin.access | Puedes acceder al área de administración de Castopod. |
| admin.settings | Puede acceder a la configuración de Castopod. |
| plugins.manage | Auth.instance_permissions.plugins.manage |
| users.manage | Puede administrar usuarios de Castopod. |
| persons.manage | Puede administrar personas. |
| pages.manage | Puede administrar páginas. |
| podcasts.view | Puede ver todos los podcasts. |
| podcasts.create | Puede crear nuevos podcasts. |
| podcasts.import | Puede importar podcasts. |
| fediverse.manage-blocks | Puedes bloquear la interacción de actores/dominios del fediverso con Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Permisos y roles por podcast
### Roles por podcast
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Administrador | Tiene el control completo del podcast #\{id\}. | \* |
| Editor | Gestiona el contenido y las publicaciones del 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 | Gestiona el contenido del podcast #\{id\} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Invitado | Colaborador general del podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Permisos por podcast
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| view | Puede ver el panel de control y analíticas del episodio #\{id\}. |
| edit | Puede editar el podcast #\{id\}. |
| delete | Puede borrar el podcast #\{id\}. |
| manage-import | Puede sincronizar el podcast importado #\{id\}. |
| manage-persons | Puede administrar las suscripciones del podcast #\{id\}. |
| manage-subscriptions | Puede administrar las suscripciones del podcast #\{id\}. |
| manage-contributors | Puede administrar colaboradores del podcast #\{id\}. |
| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #\{id\}. |
| manage-publications | Puede publicar el podcast #\{id\}. |
| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #\{id\}. |
| interact-as | Puede interactuar como el podcast #\{id\} para marcar como favarito, compartir o responder a las publicaciones. |
| episodes.view | Puede ver el panel de control y analíticas del episodio #\{id\}. |
| episodes.create | Puede crear episodios para el podcast #\{id\}. |
| episodes.edit | Puede editar episodios del podcast #\{id\}. |
| episodes.delete | Puede borrar episodios del podcast #\{id\}. |
| episodes.manage-persons | Puede administrar las personas de los episodios del podcast #\{id\}. |
| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #\{id\}. |
| episodes.manage-publications | Puede publicar/despublicar episodios y publicaciones del podcast #\{id\}. |
| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #\{id\}. |
{/* AUTH-PODCAST-PERMISSIONS-LIST:END */}
---
title: Imágenes oficiales de Docker
---
Castopod lanza 3 imágenes Docker al Docker Hub durante su proceso de
construcción automatizada:
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): una
imagen completa de castopod que utiliza una unidad nginx
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete
completo de la aplicación con todas las dependencias de Castopod
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
configuración de Nginx para Castopod
Adicionalmente, Castopod requiere una base de datos compatible con MySQL.
También se puede añadir una base de datos Redis como gestor de caché.
## Etiquetas admitidas
- `develop` [unstable], última rama construída de desarrollo
- `beta` [stable], última versión beta
- `latest` [stable], última versión
- `1.x.x` [stable], versión específica de compilación (desde `1.0.0`)
## Ejemplo de uso
1. Instalar [docker](https://docs.docker.com/get-docker/) y
[docker-compose](https://docs.docker.com/compose/install/)
2. Crear un archivo `docker-compose.yml` con lo siguiente:
```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:
```
Debes adaptar algunas variables a tus necesidades (ej. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` y `CP_ANALYTICS_SALT`).
3. Configura un servidor proxy inverso para TLS (SSL/HTTPS).
TLS es imprescindible para que ActivityPub funcione. Este trabajo puede ser
fácilmente manejado por un proxy inverso, por ejemplo con
[Caddy](https://caddyserver.com/):
```
#castopod
castopod.example.com {
reverse_proxy localhost:8000
}
```
4. Ejecuta `docker-compose -d`, espera a que se inicie y ve a
`https://castopod.mi_dominio.com/cp-install` para terminar de configurar
Castopod!
5. Todo listo, empieza a hacer podcasting! 🎙️🚀 🎙️🚀
## Variables de Entorno
- **castopod/castopod** and **castopod/app**
| Nombre de la Variable | Tipo (`predeterminado`) | Default |
| ------------------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_URLBASE`** | ?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"` o `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` |
| **`CP_REDIS_DATABASE`** | ?number | `0` |
| **`HOST_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"` o `"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/servidor web**
| Nombre de la variable | Tipo | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
---
title: ¿Cómo instalar Castopod?
---
import { Aside } from "@astrojs/starlight/components";
Castopod está pensado para ser fácil de instalar. Ya sea usando un alojamiento
dedicado o compartido, puedes instalarlo en la mayoría de servidores web
compatibles con PHP-MySQL.
## Requisitos
- PHP v8.4 or higher
- MySQL versión 8.4 o superior o MariaDB versión 11.4 o superior
- Soporte HTTPS
- 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) con librerias
**JPEG**, **PNG** y **WEBP**.
- [exif](https://www.php.net/manual/en/exif.installation.php)
Además, asegúrate de que las siguientes extensiones están habilitadas en tu PHP:
- json (habilitada por defecto - no la desactives)
- xml (habilitada por defecto - no la desactives)
- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
### Base de datos compatible con MySQL
> Se recomienda usar [MariaDB](https://mariadb.org).
Necesitarás la dirección/nombre del servidor (hostname), el nombre de la base de
datos, el usuario y la contraseña para completar el proceso de instalación. Si
no cuentas con esta información, contacta con el administrador de tu servidor.
#### Privilegios
El usuario debe tener al menos estos privilegios en la base de datos para que
Castopod funcione: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`,
`SELECT`, `UPDATE`, `REFERENCES`, `CREATE VIEW`.
### (Opcional) FFmpeg v4.1.8 o superior para poder generar clips de vídeo (recortes de vídeo)
Es necesario tener instalado [FFmpeg](https://www.ffmpeg.org/) versión 4.1.8 o
superior si desea generar recorte de vídeos. Se debe instalar las siguientes
extensiones:
- Librería **FreeType 2** para
[gd](https://www.php.net/manual/en/image.installation.php).
### (Opcional) Otras recomendaciones
- Redis para mejores rendimientos de caché.
- CDN para almacenamiento en caché de archivos estáticos y mejores rendimientos.
- Pasarela de correo para recuperación de contraseñas olvidadas.
## Instrucciones de instalación
### Pre-requisitos
0. Consigue un servidor web que cuente con todos los [requisitos](#requirements)
recomendados.
1. Crea una base de datos MySQL para Castopod con un usuario que tenga acceso y
privilegios de modificación (para más información, ver
[base de datos compatible con MySQL](#mysql-compatible-database)).
2. Activa HTTPS en tu dominio web mediante un _certificado SSL_.
3. Descarga y descomprime en tu servidor la última versión de
[Castopod](https://castopod.org/), si aún no lo has hecho.
- ⚠️ Edita la configuración de tu servidor para que el "document root" sea la
subcarpeta `castopod/public/`.
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)
### (recomendado) Asistente web de instalación
1. Ejecuta el script de instalación de Castopod visitando en tu navegador web
esta dirección: `https://tu_nombre_de_dominio.com/cp-install`
2. Sigue las instrucciones en pantalla.
3. ¡Empieza a hacer podcasting!
<Aside>
El script de instalación crea un archivo `.env` en la raíz de castopod. 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
La configuración del correo electrónico es necesaria para que algunas
características funcionen correctamente (por ejemplo, recuperar su contraseña
olvidada, enviando instrucciones a los suscriptores premium, …)
Puedes añadir tu configuración de correo electrónico en el archivo `.env` de tu
instancia así:
```ini
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Configuración de Correo Electrónico/SMTP
| Nombre de variable | 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
| Nombre de la variable | 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` |
## Paquetes de la comunidad
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="Instalar Castopod con 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: Seguridad
title: Problemas de seguridad
---
# Problemas de seguridad
Castopod está construido sobre [CodeIgniter4](https://codeigniter.com/), un
framework de PHP que alienta
[buenas prácticas de seguridad](https://codeigniter.com/user_guide/concepts/security.html).
......
---
title: Actualización
sidebarDepth: 3
title: ¿Cómo actualizar Castopod?
---
# ¿Cómo actualizar Castopod?
import { Aside } from "@astrojs/starlight/components";
Después de instalar Castopod, es posible que quieras actualizar tu instancia a
la última versión para disfrutar de las últimas características ✨, correcciones
de errores 🐛 y mejoras de rendimiento ⚡.
## Instrucciones de actualización automática
## Instrucciones de Actualización
> Próximamente... 👀
0. ⚠️ Antes de cualquier actualización, te recomendamos que respaldes tus
archivos de Castopod y base de datos.
## Instrucciones de actualización manual
- cf.
[¿Debería hacer una copia de seguridad antes de actualizar?](#should-i-make-a-backup-before-updating)
1. Vaya a la página de
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea
......@@ -26,37 +27,48 @@ de errores 🐛 y mejoras de rendimiento ⚡.
elegir entre los archivos `zip` o `tar.gz`
- ⚠️ Asegúrate de descargar el paquete de Castopod y **NO** el código fuente
- Ten en cuenta que también puedes descargar el último paquete de
[castopod.org](https://castopod.org/)
3. En tu servidor:
- Eliminar todos los archivos excepto `.env` y la carpeta `public/media`
- Copie los nuevos archivos del paquete descargado en su servidor
::: Nota de información
<Aside>
Es posible que necesite restablecer los permisos de los archivos después el
proceso de instalación. Compruebe
[preocupaciones de seguridad](./security.md).
:::
4. Las versiones pueden venir con instrucciones de actualización adicionales
(véase la página de
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases)).
Generalmente son scripts de migración de base de datos en formato `.sql` para
actualizar su esquema de base de datos.
</Aside>
- 👉 ¡Asegúrate de ejecutar los scripts en tu panel phpmyadmin o usando la
línea de comandos para actualizar la base de datos junto con los archivos
de paquete!
- cf.
4. Actualice su esquema de base de datos desde su `Administrador de Castopod` >
`Acerca de` página o ejecutando:
No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?</p></li> </ul>
```bash
php spark castopod:database-update
```
5. Si estás usando redis, limpia tu caché.
5. Limpia tu caché en `Administrador de Castopod` > `Ajustes` > `general` >
`Housekeeping`
6. ✨ ¡Disfruta de tu instancia recién instalada, todo listo!
<Aside>
Las versiones pueden venir con instrucciones de actualización adicionales (véase
la página de
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases)).
- cf. No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?
</Aside>
## Actualizaciones totalmente automatizadas
> Próximamente... 👀
## Preguntas Frecuentes (FAQ)
### ¿Dónde puedo encontrar mi versión de Castopod?
......@@ -69,10 +81,9 @@ Alternativamente, puedes encontrar la versión en el archivo
### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?
¡No hay problema! Sólo obtenga la última versión tal y como se describe
anteriormente. Simplemente cuando vaya a través de las instrucciones de
lanzamiento (4), realice la actualización secuencialmente, desde el más antiguo
hasta el más reciente.
No problem! Just get the latest release as described above. Simplemente cuando
vaya a través de las instrucciones de lanzamiento (4), realice la actualización
secuencialmente, desde el más antiguo hasta el más reciente.
> Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del
> tiempo que no hayas actualizado Castopod.
......@@ -94,7 +105,7 @@ Por ejemplo, si estás en `v1.0.0-alpha.42` y te gustaría actualizar a
### ¿Debo hacer una copia de seguridad antes de actualizar?
Te aconsejamos que hagas, así que no lo pierdas todo si algo sale mal!
Te aconsejamos que lo hagas, así que no lo pierdas todo si algo sale mal!
De manera más general, te aconsejamos hacer copias de seguridad regulares de tus
archivos de Castopod y base de datos para evitar que pierdas todo…
---
title: Bienvenido 👋
---
import { LinkCard } from "@astrojs/starlight/components";
Castopod es una plataforma gratuita y de código abierto para hospedar podcasts
hecha para podcasters que quieren involucrar e interactuar más con su audiencia.
Castopod es fácil de instalar y se ha desarrollado sobre
[CodeIgniter4](https://codeigniter.com/), un potente y muy ligero framework PHP.
<LinkCard title="Instalación" href="./getting-started/install" />
## Características
- 🌱 Gratis & de código abierto (licencia AGPL v3).
- 🔐 Centrado en la soberanía de los datos: tu contenido, tu audiencia, y tus
estadísticas te pertenecen a ti y solo a ti.
- 🪄 Funciones de Podcasting 2.0: GUID (interfaz gráfica de usuario),
protección y bloqueo del podcast, transcripciones, monetización, episodios,
geo-localización, personas, fragmentos de audio, …
- 💬 Integración con redes sociales:
- 🚀 Castopod es parte del Fediverso, una red social descentralizada
- ❤️ Se puede crear mensajes, compartir, agregar a favoritos y comentar en
episodios
- 📈 Análisis estadísticos integrados:
- ⚖️ Compatible con GDPR / CCPA / LGPD
- 🪙 Medida de audiencia con el estándar IABv2
- 🏡 On-premises analytics, no third party involved
- 📢 Herramientas de marketing incorporadas:
- ✅ Listo para SEO (meta-etiquetas de open-graph, JSON-LD, …)
- 📱 PWA: instalable como una aplicación independiente
- 🎨 Personalizar los colores del tema
- 🎬 Generar recortes de vídeo listos para compartir, a partir de tus
episodios
- 🔉 Generate soundbites
- ▶️ Reproductor incrustable, con el que insertar tus episodios en cualquier
sitio web!
- 💸 Monetización:
- 🔗 Enlaces de financiación
- 📲 Anuncios publicitarios del tipo click-para-escuchar
- 🤝 value4value / WebMonetization (criptomonedas para creadores de
contenido).
- 💎 Premium podcasts
- 📡 Publica tus episodios en todas partes con RSS:
- 📱 En todos los directorios y aplicaciones: Podcast Index, Apple Podcasts,
Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ Emite tus episodios al instante con WebSub.
- 📥 Importación de podcasts: mueve tu podcast existente en otro servicio a tu
servidor Castopod.
- 📤 Mueve tu podcast fuera de Castopod.
- 🔀 Multi-podcast: aloja tantos podcasts como quieras en una misma
instancia/panel de CASTOPOD.
- 👥 Multi-usuario: añade colaboradores y define roles.
- 🌎 Soporte multilingüe i18n: traducido al Inglés, Francés, Polaco, Alemán,
Portugués brasileño, Español, Noruego, … ¡y
[más por venir](https://translate.castopod.org)!
## Motivación
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.
## Comparación con otras soluciones
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. otras plataformas de podcast
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 puede ser auto-hospedado en tu propio servidor y es la única solución
que te permite mantener un control completo sobre los contenidos que produces.
También, como es de código abierto, puedes incluso personalizarlo como desees
y necesites.
- Castopod es la única solución que hasta el momento integra tanto una red
social descentralizada con ActivityPub así como muchas de las características
del podcasting 2.0, con la esperanza de cerrar la brecha entre ambos.
## Contributing
Love Castopod and would like to help? Take a look at the following documentation
to get you started.
### Código de conducta
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.
### Guía para colaborar
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.
## Contacto
You may reach us for help or ask any question you have on:
- [Discord](https://castopod.org/discord) (para interacción directa con
desarrolladores y la comunidad)
- [Seguimiento de incidencias](https://code.castopod.org/adaures/castopod/-/issues)
(para informar de errores y solicitar nuevas funcionalidades)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
- [podlibre.social](https://podlibre.social/@castopod) (instancia de Mastodon)
- [\[Twitter\](https://twitter.com/castopod)](https://twitter.com/castopod)
- [\[LinkedIn\](https://linkedin.com/company/ad-aures)](https://linkedin.com/company/castopod)
- [Facebook (próximamente?)](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/)
## Licencia
[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
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------ |
| 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 |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| plugins.manage | Auth.instance_permissions.plugins.manage |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 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, 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 |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish 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. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes 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-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* 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:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `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! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | 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**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |
---
title: Installation
sidebarDepth: 3
title: How to install Castopod?
---
# How to install 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.
::: info Note
This section of the documentation will help you set up Castopod for production.
If you are looking to partake in the development of Castopod, you may skip to
the contributing section.
:::
## Requirements
- PHP v8.0 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- 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.0 or higher
### PHP v8.4 or higher
PHP version 8.0 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)
- [libcurl](https://php.net/manual/en/curl.requirements.php)
......@@ -43,14 +36,6 @@ Additionally, make sure that the following extensions are enabled in your PHP:
> 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
complete the installation process. If you do not have these, please contact your
server administrator.
......@@ -58,7 +43,8 @@ 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`.
`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
`REFERENCES`, `CREATE VIEW`.
### (Optional) FFmpeg v4.1.8 or higher for Video Clips
......@@ -90,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
(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
* * * * * /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
[FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
```
**Note** - If you do not add this cron task, the following Castopod features
will not work:
> These tasks run **every minute**. You may set the frequency depending on
> your needs: every 5, 10 minutes or more.
- 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
......@@ -121,13 +97,104 @@ want to generate Video Clips. The following extensions must be installed:
2. Follow the instructions on your screen.
3. Start podcasting!
::: info Note
<Aside>
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can
[create and update the `.env` file manually](#alternative-manual-configuration).
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
......@@ -142,29 +209,35 @@ 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
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>
<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>
### Install with Docker
If you wish to use Docker to install Castopod, it is possible thanks to
[Romain de Laage](https://mamot.fr/@rdelaage)!
<a href="https://gitlab.utc.fr/picasoft/projets/services/castopod" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-md shadow gap-x-1 bg-[#1282d7] hover:no-underline hover:bg-[#0f6eb5]">Install
with
Docker<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
::: info Note
Given high demand for docker, we plan on maintaining an official Castopod Docker
image directly into the Castopod repository.
:::
---
title: Security
title: Security concerns
---
# Security concerns
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).
......
---
title: Update
sidebarDepth: 3
title: How to update Castopod?
---
# 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 ⚡.
## Automatic update instructions
## Update instructions
> Coming soon... 👀
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
## Manual update instructions
- 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
......@@ -26,32 +27,47 @@ improvements ⚡.
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
::: info Note
<Aside>
You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md).
:::
</Aside>
4. Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)). They
are usually database migration scripts in `.sql` format to update your
database schema.
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
- 👉 Make sure you run the scripts on your phpmyadmin panel or using command
line to update the database along with the package files!
- 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)
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
5. If you are using redis, clear your cache.
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?
......
---
sidebarDepth: 2
title: Welcome 👋
---
# Welcome 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
import { LinkCard } from "@astrojs/starlight/components";
Castopod is a free & open-source hosting platform made for podcasters who want
engage and interact with their audience.
......@@ -13,52 +11,45 @@ Castopod is easy to install and was built on top of
[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
small footprint.
::: info Status
Castopod is currently in **beta** but already quite stable and used by
podcasters around&nbsp;the&nbsp;world!
:::
<div class="flex items-center">
<a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
</div>
<LinkCard title="Install" href="./getting-started/install" />
## Features
- 🌱 &nbsp;Free & open-source (AGPL v3 License)
- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
belong to you, and&nbsp;you&nbsp;only
- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
chapters, location, persons, soundbites, …
- 💬 &nbsp;Built-in social network:
- 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
- ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
- 📈 &nbsp;Built-in analytics:
- ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
- 🪙 &nbsp;Standard IABv2 audience measurement
- 🏡 &nbsp;On-premises analytics, no third party involved
- 📢 &nbsp;Built-in marketing tools:
-&nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
- 📱 &nbsp;PWA: install as a standalone app
- 🎨 &nbsp;Customizable theme colors
- 🎬 &nbsp;Generate ready-to-share Video clips from episodes
- 🔉 &nbsp;Generate soundbites
- ▶️ &nbsp;Embeddable player, embed your episodes on any website
- 💸 &nbsp;Monetization:
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🤝 &nbsp;value4value / WebMonetization
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
-&nbsp;Broadcast your episodes instantly with WebSub
- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
- 📤 &nbsp;Move your podcast out of Castopod
- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
- 👥 &nbsp;Multi-user: add contributors and set roles
- 🌎 &nbsp;i18n support: translated in English, French & Polish with more to
come!
- 🌱 Free & open-source (AGPL v3 License)
- 🔐 Focused on data sovereignty: your content, audience, and analytics belong
to you, and you only
- 🪄 Podcasting 2.0 features: GUID, locked, transcripts, funding, chapters,
location, persons, soundbites, …
- 💬 Built-in social network:
- 🚀 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)!
## Motivation
......@@ -86,14 +77,14 @@ This project is pushed by the open-source community, and specifically by the
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&nbsp;you.
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&nbsp;it.
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
......@@ -105,7 +96,7 @@ 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&nbsp;journey.
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
......@@ -153,14 +144,14 @@ That being said, there are two main differences with other podcasting solutions:
## Contributing
Love Castopod and would like to help? Take a look at the following documentation
to get you&nbsp;started.
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&nbsp;tolerated.
so that you can understand what actions will and will not be tolerated.
### Contributing guide
......@@ -191,26 +182,12 @@ 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).
<div class="flex flex-wrap gap-x-16 gap-y-8">
<a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
<a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
</div>
[![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/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md
[contributions]: https://code.castopod.org/adaures/castopod/-/issues
[semantic-release]: https://github.com/semantic-release/semantic-release
[discord]: https://castopod.org/discord
[stars]: https://github.com/ad-aures/castopod/stargazers
[crowdin]: https://translate.castopod.org/project/castopod
---
title: Authentication & Authorization
---
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------ |
| 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 |
| Podcaster | General users of Castopod. | admin.access |
{/* AUTH-INSTANCE-ROLES-LIST:END */}
### Instance permissions
{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| plugins.manage | Auth.instance_permissions.plugins.manage |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */}
## 2. Per podcast roles and permissions
### Per podcast roles
{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */}
| role | description | permissions |
| ------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 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, 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 |
| Guest | General contributor of the podcast #\{id\}. | view, episodes.view |
{/* AUTH-PODCAST-ROLES-LIST:END */}
### Per podcast permissions
{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */}
| permission | description |
| ---------------------------- | -------------------------------------------------------------------------- |
| view | Can view dashboard and analytics of podcast #\{id\}. |
| edit | Can edit podcast #\{id\}. |
| delete | Can delete podcast #\{id\}. |
| manage-import | Can synchronize imported podcast #\{id\}. |
| manage-persons | Can manage subscriptions of podcast #\{id\}. |
| manage-subscriptions | Can manage subscriptions of podcast #\{id\}. |
| manage-contributors | Can manage contributors of podcast #\{id\}. |
| manage-platforms | Can set/remove platform links of podcast #\{id\}. |
| manage-publications | Can publish 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. |
| episodes.view | Can view dashboards and analytics of podcast #\{id\}'s episodes. |
| episodes.create | Can create episodes for podcast #\{id\}. |
| episodes.edit | Can edit episodes of podcast #\{id\}. |
| episodes.delete | Can delete episodes 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-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. |
{/* 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:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `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! 🎙️🚀
## Environment Variables
- **castopod/castopod** and **castopod/app**
| Variable name | 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**
| Variable name | Type | Default |
| ---------------------- | --------------------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
| **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` |
| **`CP_TIMEOUT`** | ?number | `900` |