chore(i18n): new Crowdin updates
This commit is contained in:
parent
dc34273826
commit
d2151b74bd
|
@ -9,26 +9,26 @@ declare(strict_types=1);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'title' => "{actorDisplayName}'s Kommentar zu {episodeTitle}",
|
'title' => "Kommentar von {actorDisplayName} für {episodeTitle}",
|
||||||
'back_to_comments' => 'Zurück zu den Kommentaren',
|
'back_to_comments' => 'Zurück zu den Kommentaren',
|
||||||
'form' => [
|
'form' => [
|
||||||
'episode_message_placeholder' => 'Schreibe einen Kommentar…',
|
'episode_message_placeholder' => 'Schreibe einen Kommentar…',
|
||||||
'reply_to_placeholder' => 'Antwort zu @{actorUsername}',
|
'reply_to_placeholder' => 'Antworten auf @{actorUsername}',
|
||||||
'submit' => 'Senden',
|
'submit' => 'Senden',
|
||||||
'submit_reply' => 'Antwort senden',
|
'submit_reply' => 'Antwort senden',
|
||||||
],
|
],
|
||||||
'likes' => '{numberOfLikes, plural,
|
'likes' => '{numberOfLikes, plural,
|
||||||
one {# Like}
|
one {# Beitrag}
|
||||||
other {# Likes}
|
other {# Beiträge}
|
||||||
}',
|
}',
|
||||||
'replies' => '{numberOfReplies, plural,
|
'replies' => '{numberOfReplies, plural,
|
||||||
one {# Antwort}
|
one {# Antwort}
|
||||||
other {# Antworten}
|
other {# Antworten}
|
||||||
}',
|
}',
|
||||||
'like' => 'Liken',
|
'like' => 'Gefällt mir',
|
||||||
'reply' => 'Antwort',
|
'reply' => 'Antworten',
|
||||||
'view_replies' => 'Antworten anzeigen ({numberOfReplies})',
|
'view_replies' => 'Antworten anzeigen ({numberOfReplies})',
|
||||||
'block_actor' => '@{actorUsername} blockieren',
|
'block_actor' => 'Benutzer @{actorUsername} blockieren',
|
||||||
'block_domain' => 'Domain @{actorDomain} blockieren',
|
'block_domain' => 'Domain @{actorDomain} blockieren',
|
||||||
'delete' => 'Kommentar löschen',
|
'delete' => 'Kommentar löschen',
|
||||||
];
|
];
|
||||||
|
|
|
@ -16,14 +16,14 @@ return [
|
||||||
'close' => 'Schließen',
|
'close' => 'Schließen',
|
||||||
'home' => 'Startseite',
|
'home' => 'Startseite',
|
||||||
'explicit' => 'Anstößig',
|
'explicit' => 'Anstößig',
|
||||||
'powered_by' => 'Betrieben durch {castopod}',
|
'powered_by' => 'Betrieben mit {castopod}',
|
||||||
'go_back' => 'Zurück',
|
'go_back' => 'Zurück',
|
||||||
'play_episode_button' => [
|
'play_episode_button' => [
|
||||||
'play' => 'Abspielen',
|
'play' => 'Abspielen',
|
||||||
'playing' => 'Wird wiedergegeben',
|
'playing' => 'Wird wiedergegeben',
|
||||||
],
|
],
|
||||||
'read_more' => 'Mehr lesen',
|
'read_more' => 'Weiterlesen',
|
||||||
'read_less' => 'Weniger lesen',
|
'read_less' => 'Weniger anzeigen',
|
||||||
'see_more' => 'Mehr anzeigen',
|
'see_more' => 'Mehr anzeigen',
|
||||||
'see_less' => 'Weniger anzeigen',
|
'see_less' => 'Weniger anzeigen',
|
||||||
'legal_notice' => 'Impressum',
|
'legal_notice' => 'Impressum',
|
||||||
|
|
|
@ -11,23 +11,23 @@ declare(strict_types=1);
|
||||||
return [
|
return [
|
||||||
'season' => 'Staffel {seasonNumber}',
|
'season' => 'Staffel {seasonNumber}',
|
||||||
'season_abbr' => 'S{seasonNumber}',
|
'season_abbr' => 'S{seasonNumber}',
|
||||||
'number' => 'Episode {episodeNumber}',
|
'number' => 'Folge {episodeNumber}',
|
||||||
'number_abbr' => 'E {episodeNumber}',
|
'number_abbr' => 'F {episodeNumber}',
|
||||||
'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}',
|
'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}',
|
||||||
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
'season_episode_abbr' => 'S{seasonNumber}F{episodeNumber}',
|
||||||
'persons' => '{personsCount, plural,
|
'persons' => '{personsCount, plural,
|
||||||
one {# Mitwirkender}
|
one {# Mitwirkender}
|
||||||
other {# Mitwirkende}
|
other {# Mitwirkende}
|
||||||
}',
|
}',
|
||||||
'persons_list' => 'Mitwirkende',
|
'persons_list' => 'Mitwirkende',
|
||||||
'back_to_episodes' => 'Zurück zu Episoden von {podcast}',
|
'back_to_episodes' => 'Zurück zu den Folgen von {podcast}',
|
||||||
'comments' => 'Kommentare',
|
'comments' => 'Kommentare',
|
||||||
'activity' => 'Aktivitäten',
|
'activity' => 'Aktivitäten',
|
||||||
'description' => 'Beschreibung der Episode',
|
'description' => 'Beschreibung der Folge',
|
||||||
'number_of_comments' => '{numberOfComments, plural,
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
one {# Kommentar}
|
one {# Kommentar}
|
||||||
other {# Kommentare}
|
other {# Kommentare}
|
||||||
}',
|
}',
|
||||||
'all_podcast_episodes' => 'Alle Podcast-Episoden',
|
'all_podcast_episodes' => 'Alle Podcast-Folgen',
|
||||||
'back_to_podcast' => 'Zurück zum Podcast',
|
'back_to_podcast' => 'Zurück zum Podcast',
|
||||||
];
|
];
|
||||||
|
|
|
@ -10,7 +10,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'your_handle' => 'Handle',
|
'your_handle' => 'Handle',
|
||||||
'your_handle_hint' => '@name@domain eingeben, womit Sie agieren möchten.',
|
'your_handle_hint' => '@name@domain eingeben, in deren Name Sie agieren möchten.',
|
||||||
'follow' => [
|
'follow' => [
|
||||||
'label' => 'Folge',
|
'label' => 'Folge',
|
||||||
'title' => 'Folge {actorDisplayName}',
|
'title' => 'Folge {actorDisplayName}',
|
||||||
|
@ -20,18 +20,18 @@ return [
|
||||||
'submit' => 'Weiter zum Folgen',
|
'submit' => 'Weiter zum Folgen',
|
||||||
],
|
],
|
||||||
'favourite' => [
|
'favourite' => [
|
||||||
'title' => "{actorDisplayName}'s Beitrag favorisieren",
|
'title' => "Beitrag von {actorDisplayName} favorisieren",
|
||||||
'subtitle' => 'Sie werden favorisieren:',
|
'subtitle' => 'Sie werden favorisieren:',
|
||||||
'submit' => 'Weiter zum Favorisieren',
|
'submit' => 'Zum Favorisieren fortfahren',
|
||||||
],
|
],
|
||||||
'reblog' => [
|
'reblog' => [
|
||||||
'title' => "{actorDisplayName}'s Beitrag teilen",
|
'title' => "Den Beitrag von {actorDisplayName} teilen",
|
||||||
'subtitle' => 'Sie werden teilen:',
|
'subtitle' => 'Sie werden teilen:',
|
||||||
'submit' => 'Weiter zum Teilen',
|
'submit' => 'Weiter zum Teilen',
|
||||||
],
|
],
|
||||||
'reply' => [
|
'reply' => [
|
||||||
'title' => "Auf {actorDisplayName}'s Beitrag antworten",
|
'title' => "Auf den Beitrag von {actorDisplayName} antworten",
|
||||||
'subtitle' => 'Sie werden antworten auf:',
|
'subtitle' => 'Sie antworten auf:',
|
||||||
'submit' => 'Weiter zum Antworten',
|
'submit' => 'Weiter zum Antworten',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
@ -11,7 +11,7 @@ declare(strict_types=1);
|
||||||
return [
|
return [
|
||||||
'feed' => 'RSS-Feed',
|
'feed' => 'RSS-Feed',
|
||||||
'season' => 'Staffel {seasonNumber}',
|
'season' => 'Staffel {seasonNumber}',
|
||||||
'list_of_episodes_year' => '{year} Folgen ({episodeCount})',
|
'list_of_episodes_year' => '({episodeCount}) Folgen in {year}',
|
||||||
'list_of_episodes_season' =>
|
'list_of_episodes_season' =>
|
||||||
'Staffel {seasonNumber} Folgen ({episodeCount})',
|
'Staffel {seasonNumber} Folgen ({episodeCount})',
|
||||||
'no_episode' => 'Keine Folge gefunden',
|
'no_episode' => 'Keine Folge gefunden',
|
||||||
|
|
|
@ -9,13 +9,13 @@ declare(strict_types=1);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'title' => "{actorDisplayName}'s Beitrag",
|
'title' => "Beitrag von {actorDisplayName}",
|
||||||
'back_to_actor_posts' => 'Zurück zu {actor}\'s Beiträge',
|
'back_to_actor_posts' => 'Zurück zu den Beiträgen von {actor}',
|
||||||
'actor_shared' => '{actor} teilte',
|
'actor_shared' => '{actor} teilte',
|
||||||
'reply_to' => 'Antorten auf @{actorUsername}',
|
'reply_to' => 'Antworten auf @{actorUsername}',
|
||||||
'form' => [
|
'form' => [
|
||||||
'message_placeholder' => 'Scheibe eine Nachricht…',
|
'message_placeholder' => 'Scheibe eine Nachricht…',
|
||||||
'episode_message_placeholder' => 'Schreibe eine Nachricht für die Episode…',
|
'episode_message_placeholder' => 'Schreibe eine Nachricht für die Folge…',
|
||||||
'episode_url_placeholder' => 'URL der Episode',
|
'episode_url_placeholder' => 'URL der Episode',
|
||||||
'reply_to_placeholder' => 'Antworten auf @{actorUsername}',
|
'reply_to_placeholder' => 'Antworten auf @{actorUsername}',
|
||||||
'submit' => 'Senden',
|
'submit' => 'Senden',
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "Commentaire de {actorDisplayName} pour {episodeTitle}",
|
||||||
|
'back_to_comments' => 'Retour à la liste des commentaires',
|
||||||
|
'form' => [
|
||||||
|
'episode_message_placeholder' => 'Écrire un commentaire…',
|
||||||
|
'reply_to_placeholder' => 'Répondre à @{actorUsername}',
|
||||||
|
'submit' => 'Envoyer',
|
||||||
|
'submit_reply' => 'Répondre',
|
||||||
|
],
|
||||||
|
'likes' => '{numberOfLikes, plural,
|
||||||
|
one {# "j\'aime"}
|
||||||
|
other {# "j\'aime"}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# réponse}
|
||||||
|
other {# réponses}
|
||||||
|
}',
|
||||||
|
'like' => 'J’aime',
|
||||||
|
'reply' => 'Répondre',
|
||||||
|
'view_replies' => 'Voir les réponses ({numberOfReplies})',
|
||||||
|
'block_actor' => 'Bloquer l’utilisateur @{actorUsername}',
|
||||||
|
'block_domain' => 'Bloquer le domaine @{actorDomain}',
|
||||||
|
'delete' => 'Supprimer le commentaire',
|
||||||
|
];
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'yes' => 'Oui',
|
||||||
|
'no' => 'Non',
|
||||||
|
'cancel' => 'Annuler',
|
||||||
|
'optional' => 'Optionnel',
|
||||||
|
'close' => 'Fermer',
|
||||||
|
'home' => 'Accueil',
|
||||||
|
'explicit' => 'Explicite',
|
||||||
|
'powered_by' => 'Propulsé par {castopod}',
|
||||||
|
'go_back' => 'Retour en arrière',
|
||||||
|
'play_episode_button' => [
|
||||||
|
'play' => 'Lire',
|
||||||
|
'playing' => 'En cours',
|
||||||
|
],
|
||||||
|
'read_more' => 'Lire plus',
|
||||||
|
'read_less' => 'Lire moins',
|
||||||
|
'see_more' => 'Voir plus',
|
||||||
|
'see_less' => 'Voir moins',
|
||||||
|
'legal_notice' => 'Mentions légales',
|
||||||
|
];
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'season' => 'Saison {seasonNumber}',
|
||||||
|
'season_abbr' => 'S{seasonNumber}',
|
||||||
|
'number' => 'Épisode {episodeNumber}',
|
||||||
|
'number_abbr' => 'Ép. {episodeNumber}',
|
||||||
|
'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}',
|
||||||
|
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# intervenant}
|
||||||
|
other {# intervenants}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Intervenants',
|
||||||
|
'back_to_episodes' => 'Retour aux épisodes de {podcast}',
|
||||||
|
'comments' => 'Commentaires',
|
||||||
|
'activity' => 'Activité',
|
||||||
|
'description' => 'Description de l’épisode',
|
||||||
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
|
one {# commentaire}
|
||||||
|
other {# commentaires}
|
||||||
|
}',
|
||||||
|
'all_podcast_episodes' => 'Tous les épisodes du podcast',
|
||||||
|
'back_to_podcast' => 'Revenir au podcast',
|
||||||
|
];
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2021 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'your_handle' => 'Votre pseudonyme',
|
||||||
|
'your_handle_hint' => 'Entrez l\'@utilisateur@domaine avec lequel vous voulez interagir.',
|
||||||
|
'follow' => [
|
||||||
|
'label' => 'Suivre',
|
||||||
|
'title' => 'Suivre {actorDisplayName}',
|
||||||
|
'subtitle' => 'Vous allez suivre :',
|
||||||
|
'accountNotFound' => 'Le compte n’a pas pu être trouvé.',
|
||||||
|
'remoteFollowNotAllowed' => 'Il semble que le serveur du compte ne permet pas le suivi d’un compte externe…',
|
||||||
|
'submit' => 'Poursuivre',
|
||||||
|
],
|
||||||
|
'favourite' => [
|
||||||
|
'title' => "Mettre la publication de {actorDisplayName} en favori",
|
||||||
|
'subtitle' => 'Vous allez mettre en favori :',
|
||||||
|
'submit' => 'Poursuivre',
|
||||||
|
],
|
||||||
|
'reblog' => [
|
||||||
|
'title' => "Partager la publication de {actorDisplayName}",
|
||||||
|
'subtitle' => 'Vous allez partager :',
|
||||||
|
'submit' => 'Poursuivre',
|
||||||
|
],
|
||||||
|
'reply' => [
|
||||||
|
'title' => "Répondre à la publication de {actorDisplayName}",
|
||||||
|
'subtitle' => 'Vous allez répondre à :',
|
||||||
|
'submit' => 'Poursuivre',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'all_podcasts' => 'Tous les podcasts',
|
||||||
|
'sort_by' => 'Trier par',
|
||||||
|
'sort_options' => [
|
||||||
|
'activity' => 'Activité récente',
|
||||||
|
'created_desc' => 'Le plus récent d’abord',
|
||||||
|
'created_asc' => 'Le plus ancien d’abord',
|
||||||
|
],
|
||||||
|
'no_podcast' => 'Aucun podcast trouvé',
|
||||||
|
];
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'back_to_home' => 'Retour à l’accueil',
|
||||||
|
'map' => [
|
||||||
|
'title' => 'Cartographie',
|
||||||
|
'description' => 'Découvrez des épisodes de podcast placés sur une carte avec {siteName} ! Voyagez sur une carte du monde et écoutez des épisodes mentionnant des lieux spécifiques.',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'feed' => 'Flux RSS du Podcast',
|
||||||
|
'season' => 'Saison {seasonNumber}',
|
||||||
|
'list_of_episodes_year' => 'Épisodes de {year} ({episodeCount})',
|
||||||
|
'list_of_episodes_season' =>
|
||||||
|
'Épisodes de la saison {seasonNumber} ({episodeCount})',
|
||||||
|
'no_episode' => 'Aucun épisode trouvé !',
|
||||||
|
'follow' => 'Suivre',
|
||||||
|
'followTitle' => 'Suivre {actorDisplayName} sur le fédiverse !',
|
||||||
|
'followers' => '{numberOfFollowers, plural,
|
||||||
|
one {# abonné}
|
||||||
|
other {# abonnés}
|
||||||
|
}',
|
||||||
|
'posts' => '{numberOfPosts, plural,
|
||||||
|
one {# publication}
|
||||||
|
other {# publications}
|
||||||
|
}',
|
||||||
|
'activity' => 'Activité',
|
||||||
|
'episodes' => 'Épisodes',
|
||||||
|
'episodes_title' => 'Épisodes de {podcastTitle}',
|
||||||
|
'about' => 'À propos',
|
||||||
|
'stats' => [
|
||||||
|
'title' => 'Statistiques',
|
||||||
|
'number_of_seasons' => '{0, plural,
|
||||||
|
one {# saison}
|
||||||
|
other {# saisons}
|
||||||
|
}',
|
||||||
|
'number_of_episodes' => '{0, plural,
|
||||||
|
one {# épisode}
|
||||||
|
other {# épisodes}
|
||||||
|
}',
|
||||||
|
'first_published_at' => 'Premier épisode publié le {0, date, medium}',
|
||||||
|
],
|
||||||
|
'sponsor' => 'Soutenir',
|
||||||
|
'funding_links' => 'Liens de financement pour {podcastTitle}',
|
||||||
|
'find_on' => 'Trouvez {podcastTitle} sur',
|
||||||
|
'listen_on' => 'Écoutez sur',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# intervenant}
|
||||||
|
other {# intervenants}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Intervenants',
|
||||||
|
];
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "Publication de {actorDisplayName}",
|
||||||
|
'back_to_actor_posts' => 'Retour aux publications de {actor}',
|
||||||
|
'actor_shared' => '{actor} a partagé',
|
||||||
|
'reply_to' => 'Répondre à @{actorUsername}',
|
||||||
|
'form' => [
|
||||||
|
'message_placeholder' => 'Écrivez votre message…',
|
||||||
|
'episode_message_placeholder' => 'Écrivez votre message pour l’épisode…',
|
||||||
|
'episode_url_placeholder' => 'URL de l’épisode',
|
||||||
|
'reply_to_placeholder' => 'Répondre à @{actorUsername}',
|
||||||
|
'submit' => 'Envoyer ',
|
||||||
|
'submit_reply' => 'Répondre',
|
||||||
|
],
|
||||||
|
'favourites' => '{numberOfFavourites, plural,
|
||||||
|
one {# favori}
|
||||||
|
other {# favoris}
|
||||||
|
}',
|
||||||
|
'reblogs' => '{numberOfReblogs, plural,
|
||||||
|
one {# partage}
|
||||||
|
other {# partages}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# réponse}
|
||||||
|
other {# réponses}
|
||||||
|
}',
|
||||||
|
'expand' => 'Étendre la publication',
|
||||||
|
'block_actor' => 'Bloquer l’utilisateur @{actorUsername}',
|
||||||
|
'block_domain' => 'Bloquer le domaine @{actorDomain}',
|
||||||
|
'delete' => 'Supprimer la publication',
|
||||||
|
];
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s comment for {episodeTitle}",
|
||||||
|
'back_to_comments' => 'Back to comments',
|
||||||
|
'form' => [
|
||||||
|
'episode_message_placeholder' => 'Write a comment…',
|
||||||
|
'reply_to_placeholder' => 'Reply to @{actorUsername}',
|
||||||
|
'submit' => 'Send',
|
||||||
|
'submit_reply' => 'Reply',
|
||||||
|
],
|
||||||
|
'likes' => '{numberOfLikes, plural,
|
||||||
|
one {# like}
|
||||||
|
other {# likes}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'like' => 'Like',
|
||||||
|
'reply' => 'Reply',
|
||||||
|
'view_replies' => 'View replies ({numberOfReplies})',
|
||||||
|
'block_actor' => 'Block user @{actorUsername}',
|
||||||
|
'block_domain' => 'Block domain @{actorDomain}',
|
||||||
|
'delete' => 'Delete comment',
|
||||||
|
];
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'yes' => 'Yes',
|
||||||
|
'no' => 'No',
|
||||||
|
'cancel' => 'Cancel',
|
||||||
|
'optional' => 'Optional',
|
||||||
|
'close' => 'Close',
|
||||||
|
'home' => 'Home',
|
||||||
|
'explicit' => 'Explicit',
|
||||||
|
'powered_by' => 'Powered by {castopod}',
|
||||||
|
'go_back' => 'Go back',
|
||||||
|
'play_episode_button' => [
|
||||||
|
'play' => 'Play',
|
||||||
|
'playing' => 'Playing',
|
||||||
|
],
|
||||||
|
'read_more' => 'Read more',
|
||||||
|
'read_less' => 'Read less',
|
||||||
|
'see_more' => 'See more',
|
||||||
|
'see_less' => 'See less',
|
||||||
|
'legal_notice' => 'Legal notice',
|
||||||
|
];
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'season' => 'Season {seasonNumber}',
|
||||||
|
'season_abbr' => 'S{seasonNumber}',
|
||||||
|
'number' => 'Episode {episodeNumber}',
|
||||||
|
'number_abbr' => 'Ep. {episodeNumber}',
|
||||||
|
'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
|
||||||
|
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Persons',
|
||||||
|
'back_to_episodes' => 'Back to episodes of {podcast}',
|
||||||
|
'comments' => 'Comments',
|
||||||
|
'activity' => 'Activity',
|
||||||
|
'description' => 'Episode description',
|
||||||
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
|
one {# comment}
|
||||||
|
other {# comments}
|
||||||
|
}',
|
||||||
|
'all_podcast_episodes' => 'All podcast episodes',
|
||||||
|
'back_to_podcast' => 'Go back to podcast',
|
||||||
|
];
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2021 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'your_handle' => 'Your handle',
|
||||||
|
'your_handle_hint' => 'Enter the @username@domain you want to act from.',
|
||||||
|
'follow' => [
|
||||||
|
'label' => 'Follow',
|
||||||
|
'title' => 'Follow {actorDisplayName}',
|
||||||
|
'subtitle' => 'You are going to follow:',
|
||||||
|
'accountNotFound' => 'The account could not be found.',
|
||||||
|
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
|
||||||
|
'submit' => 'Proceed to follow',
|
||||||
|
],
|
||||||
|
'favourite' => [
|
||||||
|
'title' => "Favourite {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to favourite:',
|
||||||
|
'submit' => 'Proceed to favourite',
|
||||||
|
],
|
||||||
|
'reblog' => [
|
||||||
|
'title' => "Share {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to share:',
|
||||||
|
'submit' => 'Proceed to share',
|
||||||
|
],
|
||||||
|
'reply' => [
|
||||||
|
'title' => "Reply to {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to reply to:',
|
||||||
|
'submit' => 'Proceed to reply',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'all_podcasts' => 'All podcasts',
|
||||||
|
'sort_by' => 'Sort by',
|
||||||
|
'sort_options' => [
|
||||||
|
'activity' => 'Recent activity',
|
||||||
|
'created_desc' => 'Newest first',
|
||||||
|
'created_asc' => 'Oldest first',
|
||||||
|
],
|
||||||
|
'no_podcast' => 'No podcast found',
|
||||||
|
];
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'back_to_home' => 'Back to home',
|
||||||
|
'map' => [
|
||||||
|
'title' => 'Map',
|
||||||
|
'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'feed' => 'RSS Podcast feed',
|
||||||
|
'season' => 'Season {seasonNumber}',
|
||||||
|
'list_of_episodes_year' => '{year} episodes ({episodeCount})',
|
||||||
|
'list_of_episodes_season' =>
|
||||||
|
'Season {seasonNumber} episodes ({episodeCount})',
|
||||||
|
'no_episode' => 'No episode found!',
|
||||||
|
'follow' => 'Follow',
|
||||||
|
'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
|
||||||
|
'followers' => '{numberOfFollowers, plural,
|
||||||
|
one {# follower}
|
||||||
|
other {# followers}
|
||||||
|
}',
|
||||||
|
'posts' => '{numberOfPosts, plural,
|
||||||
|
one {# post}
|
||||||
|
other {# posts}
|
||||||
|
}',
|
||||||
|
'activity' => 'Activity',
|
||||||
|
'episodes' => 'Episodes',
|
||||||
|
'episodes_title' => 'Episodes of {podcastTitle}',
|
||||||
|
'about' => 'About',
|
||||||
|
'stats' => [
|
||||||
|
'title' => 'Stats',
|
||||||
|
'number_of_seasons' => '{0, plural,
|
||||||
|
one {# season}
|
||||||
|
other {# seasons}
|
||||||
|
}',
|
||||||
|
'number_of_episodes' => '{0, plural,
|
||||||
|
one {# episode}
|
||||||
|
other {# episodes}
|
||||||
|
}',
|
||||||
|
'first_published_at' => 'First episode published on {0, date, medium}',
|
||||||
|
],
|
||||||
|
'sponsor' => 'Sponsor',
|
||||||
|
'funding_links' => 'Funding links for {podcastTitle}',
|
||||||
|
'find_on' => 'Find {podcastTitle} on',
|
||||||
|
'listen_on' => 'Listen on',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Persons',
|
||||||
|
];
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s post",
|
||||||
|
'back_to_actor_posts' => 'Back to {actor} posts',
|
||||||
|
'actor_shared' => '{actor} shared',
|
||||||
|
'reply_to' => 'Reply to @{actorUsername}',
|
||||||
|
'form' => [
|
||||||
|
'message_placeholder' => 'Write a message…',
|
||||||
|
'episode_message_placeholder' => 'Write a message for the episode…',
|
||||||
|
'episode_url_placeholder' => 'Episode URL',
|
||||||
|
'reply_to_placeholder' => 'Reply to @{actorUsername}',
|
||||||
|
'submit' => 'Send',
|
||||||
|
'submit_reply' => 'Reply',
|
||||||
|
],
|
||||||
|
'favourites' => '{numberOfFavourites, plural,
|
||||||
|
one {# favourite}
|
||||||
|
other {# favourites}
|
||||||
|
}',
|
||||||
|
'reblogs' => '{numberOfReblogs, plural,
|
||||||
|
one {# share}
|
||||||
|
other {# shares}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'expand' => 'Expand post',
|
||||||
|
'block_actor' => 'Block user @{actorUsername}',
|
||||||
|
'block_domain' => 'Block domain @{actorDomain}',
|
||||||
|
'delete' => 'Delete post',
|
||||||
|
];
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s comment for {episodeTitle}",
|
||||||
|
'back_to_comments' => 'Back to comments',
|
||||||
|
'form' => [
|
||||||
|
'episode_message_placeholder' => 'Write a comment…',
|
||||||
|
'reply_to_placeholder' => 'Reply to @{actorUsername}',
|
||||||
|
'submit' => 'Send',
|
||||||
|
'submit_reply' => 'Reply',
|
||||||
|
],
|
||||||
|
'likes' => '{numberOfLikes, plural,
|
||||||
|
one {# like}
|
||||||
|
other {# likes}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'like' => 'Like',
|
||||||
|
'reply' => 'Reply',
|
||||||
|
'view_replies' => 'View replies ({numberOfReplies})',
|
||||||
|
'block_actor' => 'Block user @{actorUsername}',
|
||||||
|
'block_domain' => 'Block domain @{actorDomain}',
|
||||||
|
'delete' => 'Delete comment',
|
||||||
|
];
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'yes' => 'Yes',
|
||||||
|
'no' => 'No',
|
||||||
|
'cancel' => 'Cancel',
|
||||||
|
'optional' => 'Optional',
|
||||||
|
'close' => 'Close',
|
||||||
|
'home' => 'Home',
|
||||||
|
'explicit' => 'Explicit',
|
||||||
|
'powered_by' => 'Powered by {castopod}',
|
||||||
|
'go_back' => 'Go back',
|
||||||
|
'play_episode_button' => [
|
||||||
|
'play' => 'Play',
|
||||||
|
'playing' => 'Playing',
|
||||||
|
],
|
||||||
|
'read_more' => 'Read more',
|
||||||
|
'read_less' => 'Read less',
|
||||||
|
'see_more' => 'See more',
|
||||||
|
'see_less' => 'See less',
|
||||||
|
'legal_notice' => 'Legal notice',
|
||||||
|
];
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'season' => 'Season {seasonNumber}',
|
||||||
|
'season_abbr' => 'S{seasonNumber}',
|
||||||
|
'number' => 'Episode {episodeNumber}',
|
||||||
|
'number_abbr' => 'Ep. {episodeNumber}',
|
||||||
|
'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
|
||||||
|
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Persons',
|
||||||
|
'back_to_episodes' => 'Back to episodes of {podcast}',
|
||||||
|
'comments' => 'Comments',
|
||||||
|
'activity' => 'Activity',
|
||||||
|
'description' => 'Episode description',
|
||||||
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
|
one {# comment}
|
||||||
|
other {# comments}
|
||||||
|
}',
|
||||||
|
'all_podcast_episodes' => 'All podcast episodes',
|
||||||
|
'back_to_podcast' => 'Go back to podcast',
|
||||||
|
];
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2021 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'your_handle' => 'Your handle',
|
||||||
|
'your_handle_hint' => 'Enter the @username@domain you want to act from.',
|
||||||
|
'follow' => [
|
||||||
|
'label' => 'Follow',
|
||||||
|
'title' => 'Follow {actorDisplayName}',
|
||||||
|
'subtitle' => 'You are going to follow:',
|
||||||
|
'accountNotFound' => 'The account could not be found.',
|
||||||
|
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
|
||||||
|
'submit' => 'Proceed to follow',
|
||||||
|
],
|
||||||
|
'favourite' => [
|
||||||
|
'title' => "Favourite {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to favourite:',
|
||||||
|
'submit' => 'Proceed to favourite',
|
||||||
|
],
|
||||||
|
'reblog' => [
|
||||||
|
'title' => "Share {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to share:',
|
||||||
|
'submit' => 'Proceed to share',
|
||||||
|
],
|
||||||
|
'reply' => [
|
||||||
|
'title' => "Reply to {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to reply to:',
|
||||||
|
'submit' => 'Proceed to reply',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'all_podcasts' => 'All podcasts',
|
||||||
|
'sort_by' => 'Sort by',
|
||||||
|
'sort_options' => [
|
||||||
|
'activity' => 'Recent activity',
|
||||||
|
'created_desc' => 'Newest first',
|
||||||
|
'created_asc' => 'Oldest first',
|
||||||
|
],
|
||||||
|
'no_podcast' => 'No podcast found',
|
||||||
|
];
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'back_to_home' => 'Back to home',
|
||||||
|
'map' => [
|
||||||
|
'title' => 'Map',
|
||||||
|
'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'feed' => 'RSS Podcast feed',
|
||||||
|
'season' => 'Season {seasonNumber}',
|
||||||
|
'list_of_episodes_year' => '{year} episodes ({episodeCount})',
|
||||||
|
'list_of_episodes_season' =>
|
||||||
|
'Season {seasonNumber} episodes ({episodeCount})',
|
||||||
|
'no_episode' => 'No episode found!',
|
||||||
|
'follow' => 'Follow',
|
||||||
|
'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
|
||||||
|
'followers' => '{numberOfFollowers, plural,
|
||||||
|
one {# follower}
|
||||||
|
other {# followers}
|
||||||
|
}',
|
||||||
|
'posts' => '{numberOfPosts, plural,
|
||||||
|
one {# post}
|
||||||
|
other {# posts}
|
||||||
|
}',
|
||||||
|
'activity' => 'Activity',
|
||||||
|
'episodes' => 'Episodes',
|
||||||
|
'episodes_title' => 'Episodes of {podcastTitle}',
|
||||||
|
'about' => 'About',
|
||||||
|
'stats' => [
|
||||||
|
'title' => 'Stats',
|
||||||
|
'number_of_seasons' => '{0, plural,
|
||||||
|
one {# season}
|
||||||
|
other {# seasons}
|
||||||
|
}',
|
||||||
|
'number_of_episodes' => '{0, plural,
|
||||||
|
one {# episode}
|
||||||
|
other {# episodes}
|
||||||
|
}',
|
||||||
|
'first_published_at' => 'First episode published on {0, date, medium}',
|
||||||
|
],
|
||||||
|
'sponsor' => 'Sponsor',
|
||||||
|
'funding_links' => 'Funding links for {podcastTitle}',
|
||||||
|
'find_on' => 'Find {podcastTitle} on',
|
||||||
|
'listen_on' => 'Listen on',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Persons',
|
||||||
|
];
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s post",
|
||||||
|
'back_to_actor_posts' => 'Back to {actor} posts',
|
||||||
|
'actor_shared' => '{actor} shared',
|
||||||
|
'reply_to' => 'Reply to @{actorUsername}',
|
||||||
|
'form' => [
|
||||||
|
'message_placeholder' => 'Write a message…',
|
||||||
|
'episode_message_placeholder' => 'Write a message for the episode…',
|
||||||
|
'episode_url_placeholder' => 'Episode URL',
|
||||||
|
'reply_to_placeholder' => 'Reply to @{actorUsername}',
|
||||||
|
'submit' => 'Send',
|
||||||
|
'submit_reply' => 'Reply',
|
||||||
|
],
|
||||||
|
'favourites' => '{numberOfFavourites, plural,
|
||||||
|
one {# favourite}
|
||||||
|
other {# favourites}
|
||||||
|
}',
|
||||||
|
'reblogs' => '{numberOfReblogs, plural,
|
||||||
|
one {# share}
|
||||||
|
other {# shares}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'expand' => 'Expand post',
|
||||||
|
'block_actor' => 'Block user @{actorUsername}',
|
||||||
|
'block_domain' => 'Block domain @{actorDomain}',
|
||||||
|
'delete' => 'Delete post',
|
||||||
|
];
|
|
@ -26,5 +26,5 @@ return [
|
||||||
'read_less' => 'Czytaj mniej',
|
'read_less' => 'Czytaj mniej',
|
||||||
'see_more' => 'Zobacz więcej',
|
'see_more' => 'Zobacz więcej',
|
||||||
'see_less' => 'Zobacz mniej',
|
'see_less' => 'Zobacz mniej',
|
||||||
'legal_notice' => 'Legal notice',
|
'legal_notice' => 'Informacje prawne',
|
||||||
];
|
];
|
||||||
|
|
|
@ -16,7 +16,7 @@ return [
|
||||||
'title' => 'Obserwuj {actorDisplayName}',
|
'title' => 'Obserwuj {actorDisplayName}',
|
||||||
'subtitle' => 'Zamierzasz obserwować:',
|
'subtitle' => 'Zamierzasz obserwować:',
|
||||||
'accountNotFound' => 'Nie można znaleźć konta.',
|
'accountNotFound' => 'Nie można znaleźć konta.',
|
||||||
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
|
'remoteFollowNotAllowed' => 'Wygląda na to, że serwer kont nie pozwala na śledzenie zdalnie…',
|
||||||
'submit' => 'Przejdź do obserwowania',
|
'submit' => 'Przejdź do obserwowania',
|
||||||
],
|
],
|
||||||
'favourite' => [
|
'favourite' => [
|
||||||
|
|
|
@ -18,12 +18,14 @@ return [
|
||||||
'follow' => 'Obserwuj',
|
'follow' => 'Obserwuj',
|
||||||
'followTitle' => 'Obserwuj {actorDisplayName} na fediverse!',
|
'followTitle' => 'Obserwuj {actorDisplayName} na fediverse!',
|
||||||
'followers' => '{numberOfFollowers, plural,
|
'followers' => '{numberOfFollowers, plural,
|
||||||
one {# follower}
|
one {# polubienie}
|
||||||
other {# followers}
|
few {# polubienia}
|
||||||
|
other {# polubień}
|
||||||
}',
|
}',
|
||||||
'posts' => '{numberOfPosts, plural,
|
'posts' => '{numberOfPosts, plural,
|
||||||
one {# post}
|
one {# osoba}
|
||||||
other {# posts}
|
few {# osoby}
|
||||||
|
other {# osób}
|
||||||
}',
|
}',
|
||||||
'activity' => 'Aktywność',
|
'activity' => 'Aktywność',
|
||||||
'episodes' => 'Odcinki',
|
'episodes' => 'Odcinki',
|
||||||
|
@ -32,14 +34,16 @@ return [
|
||||||
'stats' => [
|
'stats' => [
|
||||||
'title' => 'Statystyki',
|
'title' => 'Statystyki',
|
||||||
'number_of_seasons' => '{0, plural,
|
'number_of_seasons' => '{0, plural,
|
||||||
one {# season}
|
one {# osoba}
|
||||||
other {# seasons}
|
few {# osoby}
|
||||||
}',
|
other {# osób}
|
||||||
|
}',
|
||||||
'number_of_episodes' => '{0, plural,
|
'number_of_episodes' => '{0, plural,
|
||||||
one {# episode}
|
one {# osoba}
|
||||||
other {# episodes}
|
few {# osoby}
|
||||||
}',
|
other {# osób}
|
||||||
'first_published_at' => 'First episode published on {0, date, medium}',
|
}',
|
||||||
|
'first_published_at' => 'Pierwszy odcinek opublikowany {0, date, medium}',
|
||||||
],
|
],
|
||||||
'sponsor' => 'Sponsoruj',
|
'sponsor' => 'Sponsoruj',
|
||||||
'funding_links' => 'Linki finansowania dla {podcastTitle}',
|
'funding_links' => 'Linki finansowania dla {podcastTitle}',
|
||||||
|
|
|
@ -18,12 +18,12 @@ return [
|
||||||
'submit_reply' => 'Odgovori',
|
'submit_reply' => 'Odgovori',
|
||||||
],
|
],
|
||||||
'likes' => '{numberOfLikes, plural,
|
'likes' => '{numberOfLikes, plural,
|
||||||
one {# like}
|
one {# sviđanje}
|
||||||
other {# likes}
|
other {# sviđanja}
|
||||||
}',
|
}',
|
||||||
'replies' => '{numberOfReplies, plural,
|
'replies' => '{numberOfReplies, plural,
|
||||||
one {# reply}
|
one {# odgovor}
|
||||||
other {# replies}
|
other {# odgovora}
|
||||||
}',
|
}',
|
||||||
'like' => 'Preporuči',
|
'like' => 'Preporuči',
|
||||||
'reply' => 'Odgovori',
|
'reply' => 'Odgovori',
|
||||||
|
|
|
@ -16,17 +16,17 @@ return [
|
||||||
'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}',
|
'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}',
|
||||||
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}',
|
||||||
'persons' => '{personsCount, plural,
|
'persons' => '{personsCount, plural,
|
||||||
one {# person}
|
few {# osobe}
|
||||||
other {# persons}
|
other {# osoba}
|
||||||
}',
|
}',
|
||||||
'persons_list' => 'Ličnosti',
|
'persons_list' => 'Ličnosti',
|
||||||
'back_to_episodes' => 'Nazad na epizode {podcast}',
|
'back_to_episodes' => 'Nazad na epizode {podcast}',
|
||||||
'comments' => 'Komentari',
|
'comments' => 'Komentari',
|
||||||
'activity' => 'Aktivnosti',
|
'activity' => 'Aktivnosti',
|
||||||
'description' => 'Opis epizode',
|
'description' => 'Opis epizode',
|
||||||
'number_of_comments' => '{numberOfComments, plural,
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
one {# comment}
|
one {# komentar}
|
||||||
other {# comments}
|
other {# komentara}
|
||||||
}',
|
}',
|
||||||
'all_podcast_episodes' => 'Sve epizode podkasta',
|
'all_podcast_episodes' => 'Sve epizode podkasta',
|
||||||
'back_to_podcast' => 'Nazad na podkast',
|
'back_to_podcast' => 'Nazad na podkast',
|
||||||
|
|
|
@ -16,7 +16,7 @@ return [
|
||||||
'title' => 'Prati {actorDisplayName}',
|
'title' => 'Prati {actorDisplayName}',
|
||||||
'subtitle' => 'Pratićete:',
|
'subtitle' => 'Pratićete:',
|
||||||
'accountNotFound' => 'Nalog ne može biti pronađen.',
|
'accountNotFound' => 'Nalog ne može biti pronađen.',
|
||||||
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
|
'remoteFollowNotAllowed' => 'Čini se da server naloga ne dozvoljava daljinsko praćenje…',
|
||||||
'submit' => 'Nastavite',
|
'submit' => 'Nastavite',
|
||||||
],
|
],
|
||||||
'favourite' => [
|
'favourite' => [
|
||||||
|
|
|
@ -14,40 +14,40 @@ return [
|
||||||
'list_of_episodes_year' => '{year} epizode ({episodeCount})',
|
'list_of_episodes_year' => '{year} epizode ({episodeCount})',
|
||||||
'list_of_episodes_season' =>
|
'list_of_episodes_season' =>
|
||||||
'Sezona {seasonNumber} epizoda ({episodeCount})',
|
'Sezona {seasonNumber} epizoda ({episodeCount})',
|
||||||
'no_episode' => 'Bez epizoda!',
|
'no_episode' => 'Nijedna epizode nije pronađena!',
|
||||||
'follow' => 'Prati',
|
'follow' => 'Prati',
|
||||||
'followTitle' => 'Prati {actorDisplayName} na fediverse!',
|
'followTitle' => 'Prati {actorDisplayName} na fediverse!',
|
||||||
'followers' => '{numberOfFollowers, plural,
|
'followers' => '{numberOfFollowers, plural,
|
||||||
one {# follower}
|
one {# pratioc}
|
||||||
other {# followers}
|
other {# pratilaca}
|
||||||
}',
|
}',
|
||||||
'posts' => '{numberOfPosts, plural,
|
'posts' => '{numberOfPosts, plural,
|
||||||
one {# post}
|
few {# objave}
|
||||||
other {# posts}
|
other {# objava}
|
||||||
}',
|
}',
|
||||||
'activity' => 'Aktivnosti',
|
'activity' => 'Aktivnost',
|
||||||
'episodes' => 'Epizode',
|
'episodes' => 'Epizode',
|
||||||
'episodes_title' => 'Epizode {podcastTitle}',
|
'episodes_title' => 'Epizode {podcastTitle}',
|
||||||
'about' => 'O',
|
'about' => 'Osnovni podaci',
|
||||||
'stats' => [
|
'stats' => [
|
||||||
'title' => 'Statistika',
|
'title' => 'Statistika',
|
||||||
'number_of_seasons' => '{0, plural,
|
'number_of_seasons' => '{0, plural,
|
||||||
one {# season}
|
few {# sezone}
|
||||||
other {# seasons}
|
other {# sezona}
|
||||||
}',
|
}',
|
||||||
'number_of_episodes' => '{0, plural,
|
'number_of_episodes' => '{0, plural,
|
||||||
one {# episode}
|
one {# epizoda}
|
||||||
other {# episodes}
|
other {# epizode}
|
||||||
}',
|
}',
|
||||||
'first_published_at' => 'Prva epizoda objavljena na {0, date, medium}',
|
'first_published_at' => 'Prva epizoda objavljena na {0, date, medium}',
|
||||||
],
|
],
|
||||||
'sponsor' => 'Sponzor',
|
'sponsor' => 'Sponzor',
|
||||||
'funding_links' => 'Funding links for {podcastTitle}',
|
'funding_links' => 'Linkovi za finansiranje {podcastTitle}',
|
||||||
'find_on' => 'Pronađi {podcastTitle} na',
|
'find_on' => 'Pronađi {podcastTitle} na',
|
||||||
'listen_on' => 'Slušaj na',
|
'listen_on' => 'Slušaj na',
|
||||||
'persons' => '{personsCount, plural,
|
'persons' => '{personsCount, plural,
|
||||||
one {# person}
|
one {# osoba}
|
||||||
other {# persons}
|
other {# osobe}
|
||||||
}',
|
}',
|
||||||
'persons_list' => 'Ličnosti',
|
'persons_list' => 'Ličnosti',
|
||||||
];
|
];
|
||||||
|
|
|
@ -22,16 +22,16 @@ return [
|
||||||
'submit_reply' => 'Odgovori',
|
'submit_reply' => 'Odgovori',
|
||||||
],
|
],
|
||||||
'favourites' => '{numberOfFavourites, plural,
|
'favourites' => '{numberOfFavourites, plural,
|
||||||
one {# favourite}
|
one {# omiljen}
|
||||||
other {# favourites}
|
other {# omiljenih}
|
||||||
}',
|
}',
|
||||||
'reblogs' => '{numberOfReblogs, plural,
|
'reblogs' => '{numberOfReblogs, plural,
|
||||||
one {# share}
|
one {# deljenje}
|
||||||
other {# shares}
|
other {# deljenja}
|
||||||
}',
|
}',
|
||||||
'replies' => '{numberOfReplies, plural,
|
'replies' => '{numberOfReplies, plural,
|
||||||
one {# reply}
|
one {# odgovor}
|
||||||
other {# replies}
|
other {# odgovora}
|
||||||
}',
|
}',
|
||||||
'expand' => 'Proširi objavu',
|
'expand' => 'Proširi objavu',
|
||||||
'block_actor' => 'Blokiraj korisnika @{actorUsername}',
|
'block_actor' => 'Blokiraj korisnika @{actorUsername}',
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s comment for {episodeTitle}",
|
||||||
|
'back_to_comments' => 'Повернутися до коментарів',
|
||||||
|
'form' => [
|
||||||
|
'episode_message_placeholder' => 'Написати коментар…',
|
||||||
|
'reply_to_placeholder' => 'Відповісти @{actorUsername}',
|
||||||
|
'submit' => 'Відправити',
|
||||||
|
'submit_reply' => 'Відповісти',
|
||||||
|
],
|
||||||
|
'likes' => '{numberOfLikes, plural,
|
||||||
|
one {# like}
|
||||||
|
other {# likes}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'like' => 'Вподобайка',
|
||||||
|
'reply' => 'Відповідь',
|
||||||
|
'view_replies' => 'Переглянути відповіді ({numberOfReplies})',
|
||||||
|
'block_actor' => 'Заблокувати користувача @{actorUsername}',
|
||||||
|
'block_domain' => 'Заблокувати домен @{actorDomain}',
|
||||||
|
'delete' => 'Видалити коментар',
|
||||||
|
];
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'yes' => 'Так',
|
||||||
|
'no' => 'Ні',
|
||||||
|
'cancel' => 'Відмінити',
|
||||||
|
'optional' => 'Необов\'язково',
|
||||||
|
'close' => 'Закрити',
|
||||||
|
'home' => 'Головна',
|
||||||
|
'explicit' => 'Явний',
|
||||||
|
'powered_by' => 'Створено {castopod}',
|
||||||
|
'go_back' => 'Повернутися назад',
|
||||||
|
'play_episode_button' => [
|
||||||
|
'play' => 'Відтворити',
|
||||||
|
'playing' => 'Відтворюється',
|
||||||
|
],
|
||||||
|
'read_more' => 'Читати більше',
|
||||||
|
'read_less' => 'Приховати деталі',
|
||||||
|
'see_more' => 'Показати більше',
|
||||||
|
'see_less' => 'Показати менше',
|
||||||
|
'legal_notice' => 'Юридичне повідомлення',
|
||||||
|
];
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'season' => 'Сезон {seasonNumber}',
|
||||||
|
'season_abbr' => 'С{seasonNumber}',
|
||||||
|
'number' => 'Серія {episodeNumber}',
|
||||||
|
'number_abbr' => 'Серія {episodeNumber}',
|
||||||
|
'season_episode' => 'Сезон {seasonNumber} серія {episodeNumber}',
|
||||||
|
'season_episode_abbr' => 'С{seasonNumber}:Е{episodeNumber}',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Кіл-сть осіб',
|
||||||
|
'back_to_episodes' => 'Повернутись до серій {podcast}',
|
||||||
|
'comments' => 'Коментарі',
|
||||||
|
'activity' => 'Активність',
|
||||||
|
'description' => 'Опис Серії',
|
||||||
|
'number_of_comments' => '{numberOfComments, plural,
|
||||||
|
one {# comment}
|
||||||
|
other {# comments}
|
||||||
|
}',
|
||||||
|
'all_podcast_episodes' => 'Всі серії подкастів',
|
||||||
|
'back_to_podcast' => 'Повернутися до подкасту',
|
||||||
|
];
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2021 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'your_handle' => 'Your handle',
|
||||||
|
'your_handle_hint' => 'Enter the @username@domain you want to act from.',
|
||||||
|
'follow' => [
|
||||||
|
'label' => 'Follow',
|
||||||
|
'title' => 'Follow {actorDisplayName}',
|
||||||
|
'subtitle' => 'You are going to follow:',
|
||||||
|
'accountNotFound' => 'The account could not be found.',
|
||||||
|
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…',
|
||||||
|
'submit' => 'Proceed to follow',
|
||||||
|
],
|
||||||
|
'favourite' => [
|
||||||
|
'title' => "Favourite {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to favourite:',
|
||||||
|
'submit' => 'Proceed to favourite',
|
||||||
|
],
|
||||||
|
'reblog' => [
|
||||||
|
'title' => "Share {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to share:',
|
||||||
|
'submit' => 'Proceed to share',
|
||||||
|
],
|
||||||
|
'reply' => [
|
||||||
|
'title' => "Reply to {actorDisplayName}'s post",
|
||||||
|
'subtitle' => 'You are going to reply to:',
|
||||||
|
'submit' => 'Proceed to reply',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'all_podcasts' => 'All podcasts',
|
||||||
|
'sort_by' => 'Sort by',
|
||||||
|
'sort_options' => [
|
||||||
|
'activity' => 'Recent activity',
|
||||||
|
'created_desc' => 'Newest first',
|
||||||
|
'created_asc' => 'Oldest first',
|
||||||
|
],
|
||||||
|
'no_podcast' => 'No podcast found',
|
||||||
|
];
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'back_to_home' => 'Back to home',
|
||||||
|
'map' => [
|
||||||
|
'title' => 'Map',
|
||||||
|
'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'feed' => 'RSS Podcast feed',
|
||||||
|
'season' => 'Season {seasonNumber}',
|
||||||
|
'list_of_episodes_year' => '{year} episodes ({episodeCount})',
|
||||||
|
'list_of_episodes_season' =>
|
||||||
|
'Season {seasonNumber} episodes ({episodeCount})',
|
||||||
|
'no_episode' => 'No episode found!',
|
||||||
|
'follow' => 'Follow',
|
||||||
|
'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
|
||||||
|
'followers' => '{numberOfFollowers, plural,
|
||||||
|
one {# follower}
|
||||||
|
other {# followers}
|
||||||
|
}',
|
||||||
|
'posts' => '{numberOfPosts, plural,
|
||||||
|
one {# post}
|
||||||
|
other {# posts}
|
||||||
|
}',
|
||||||
|
'activity' => 'Activity',
|
||||||
|
'episodes' => 'Episodes',
|
||||||
|
'episodes_title' => 'Episodes of {podcastTitle}',
|
||||||
|
'about' => 'About',
|
||||||
|
'stats' => [
|
||||||
|
'title' => 'Stats',
|
||||||
|
'number_of_seasons' => '{0, plural,
|
||||||
|
one {# season}
|
||||||
|
other {# seasons}
|
||||||
|
}',
|
||||||
|
'number_of_episodes' => '{0, plural,
|
||||||
|
one {# episode}
|
||||||
|
other {# episodes}
|
||||||
|
}',
|
||||||
|
'first_published_at' => 'First episode published on {0, date, medium}',
|
||||||
|
],
|
||||||
|
'sponsor' => 'Sponsor',
|
||||||
|
'funding_links' => 'Funding links for {podcastTitle}',
|
||||||
|
'find_on' => 'Find {podcastTitle} on',
|
||||||
|
'listen_on' => 'Listen on',
|
||||||
|
'persons' => '{personsCount, plural,
|
||||||
|
one {# person}
|
||||||
|
other {# persons}
|
||||||
|
}',
|
||||||
|
'persons_list' => 'Persons',
|
||||||
|
];
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Ad Aures
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'title' => "{actorDisplayName}'s post",
|
||||||
|
'back_to_actor_posts' => 'Back to {actor} posts',
|
||||||
|
'actor_shared' => '{actor} shared',
|
||||||
|
'reply_to' => 'Reply to @{actorUsername}',
|
||||||
|
'form' => [
|
||||||
|
'message_placeholder' => 'Write a message…',
|
||||||
|
'episode_message_placeholder' => 'Write a message for the episode…',
|
||||||
|
'episode_url_placeholder' => 'Episode URL',
|
||||||
|
'reply_to_placeholder' => 'Reply to @{actorUsername}',
|
||||||
|
'submit' => 'Send',
|
||||||
|
'submit_reply' => 'Reply',
|
||||||
|
],
|
||||||
|
'favourites' => '{numberOfFavourites, plural,
|
||||||
|
one {# favourite}
|
||||||
|
other {# favourites}
|
||||||
|
}',
|
||||||
|
'reblogs' => '{numberOfReblogs, plural,
|
||||||
|
one {# share}
|
||||||
|
other {# shares}
|
||||||
|
}',
|
||||||
|
'replies' => '{numberOfReplies, plural,
|
||||||
|
one {# reply}
|
||||||
|
other {# replies}
|
||||||
|
}',
|
||||||
|
'expand' => 'Expand post',
|
||||||
|
'block_actor' => 'Block user @{actorUsername}',
|
||||||
|
'block_domain' => 'Block domain @{actorDomain}',
|
||||||
|
'delete' => 'Delete post',
|
||||||
|
];
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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 administrador | Té control complet sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
|
||||||
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
|
| Administrador | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
|
||||||
| Podcaster | General users of Castopod. | admin.access |
|
| Podcaster | Usos generals de Castopod. | admin.access |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
||||||
|
|
||||||
|
@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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 | Pot accedir a l'àrea d'administració de Castopod. |
|
||||||
| admin.settings | Can access the Castopod settings. |
|
| admin.settings | Pot accedir a la configuració de Castopod. |
|
||||||
| users.manage | Can manage Castopod users. |
|
| users.manage | Pot administrar els usuaris de Castopod. |
|
||||||
| persons.manage | Can manage persons. |
|
| persons.manage | Pot administrar persones. |
|
||||||
| pages.manage | Can manage pages. |
|
| pages.manage | Pot administrar pàgines. |
|
||||||
| podcasts.view | Can view all podcasts. |
|
| podcasts.view | Pot veure els pòdcasts. |
|
||||||
| podcasts.create | Can create new podcasts. |
|
| podcasts.create | Pot crear nous pòdcasts. |
|
||||||
| podcasts.import | Can import podcasts. |
|
| podcasts.import | Pot importar pòdcasts. |
|
||||||
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
|
| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb Castopod. |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
||||||
|
|
||||||
|
@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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}. | \* |
|
| Administrador | Té control complet del pòdcast #{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 |
|
| Editor | Administra els continguts i la publicació del pòdcast #{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 |
|
| Autor | Administra el contingut del podcast #{id} però no el pot publicar. | 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 |
|
| Convidat | Col·laborador general del podcast #{id}. | view, episodes.view |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
||||||
|
|
||||||
|
@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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 | Pot veure el tauler i les estadístiques del podcast #{id}. |
|
||||||
| edit | Can edit podcast #{id}. |
|
| edit | Pot editar el podcast #{id}. |
|
||||||
| delete | Can delete podcast #{id}. |
|
| delete | Pot suprimir el podcast #{id}. |
|
||||||
| manage-import | Can synchronize imported podcast #{id}. |
|
| manage-import | Pot sincronitzar el podcast importat #{id}. |
|
||||||
| manage-persons | Can manage subscriptions of podcast #{id}. |
|
| manage-persons | Pot gestionar les subscripcions del podcast #{id}. |
|
||||||
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
|
| manage-subscriptions | Pot gestionar les subscripcions del podcast #{id}. |
|
||||||
| manage-contributors | Can manage contributors of podcast #{id}. |
|
| manage-contributors | Pot gestionar els col·laboradors del podcast #{id}. |
|
||||||
| manage-platforms | Can set/remove platform links of podcast #{id}. |
|
| manage-platforms | Pot establir/eliminar enllaços de plataforma del podcast #{id}. |
|
||||||
| manage-publications | Can publish podcast #{id}. |
|
| manage-publications | Pot publicar el podcast #{id}. |
|
||||||
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
|
| manage-notifications | Pot veure i marcar les notificacions com a llegides per al podcast #{id}. |
|
||||||
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
|
| interact-as | Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi. |
|
||||||
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
|
| episodes.view | Pot veure el tauler i les estadístiques del podcast #{id}. |
|
||||||
| episodes.create | Can create episodes for podcast #{id}. |
|
| episodes.create | Pot crear episodis per al podcast #{id}. |
|
||||||
| episodes.edit | Can edit podcast #{id}. |
|
| episodes.edit | Pot editar el podcast #{id}. |
|
||||||
| episodes.delete | Can delete podcast #{id}. |
|
| episodes.delete | Pot suprimir el podcast #{id}. |
|
||||||
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
| episodes.manage-persons | Pot gestionar les subscripcions del podcast #{id}. |
|
||||||
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
| episodes.manage-clips | Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}. |
|
||||||
| episodes.manage-publications | Can publish podcast #{id}. |
|
| episodes.manage-publications | Pot publicar el podcast #{id}. |
|
||||||
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
| episodes.manage-comments | Pot crear/eliminar comentaris d'episodi del pòdcast #{id}. |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
||||||
|
|
|
@ -23,6 +23,8 @@ Si preferiu utilitzar Docker, podeu ometre això i anar directament a la
|
||||||
- PHP v8.1 o superior
|
- PHP v8.1 o superior
|
||||||
- MySQL versió 5.7 o superior o MariaDB versió 10.2 o superior
|
- MySQL versió 5.7 o superior o MariaDB versió 10.2 o superior
|
||||||
- Support d'HTTPS
|
- Support d'HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 o superior
|
### PHP v8.1 o superior
|
||||||
|
|
||||||
|
@ -165,6 +167,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Paquets de la comunitat
|
## Paquets de la comunitat
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
---
|
---
|
||||||
title: Authentication & Authorization
|
title: Authentifizierung & Autorisierung
|
||||||
sidebarDepth: 3
|
sidebarDepth: 3
|
||||||
---
|
---
|
||||||
|
|
||||||
# Authentication & Authorization
|
# Authentifizierung & Autorisierung
|
||||||
|
|
||||||
Castopod handles authentication and authorization using `codeigniter/shield`
|
Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield`
|
||||||
coupled with custom rules. Roles and permissions are defined at two levels:
|
kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen
|
||||||
|
definiert:
|
||||||
|
|
||||||
1. [instance wide](#1-instance-wide-roles-and-permissions)
|
1. [instanzweit](#1-instance-wide-roles-and-permissions)
|
||||||
2. [per podcast](#2-per-podcast-roles-and-permissions)
|
2. [pro Podcast](#2-per-podcast-roles-and-permissions)
|
||||||
|
|
||||||
## 1. Instance wide roles and permissions
|
## 1. Instanzweite Rollen und Berechtigungen
|
||||||
|
|
||||||
### Instance roles
|
### Instanz Rollen
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
|
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
|
||||||
|
|
||||||
|
@ -25,27 +26,27 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
||||||
|
|
||||||
### Instance permissions
|
### Instanz Berechtigungen
|
||||||
|
|
||||||
<!-- 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 | Kann auf den Admin-Bereich von Castopod zugreifen. |
|
| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. |
|
||||||
| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. |
|
| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. |
|
||||||
| users.manage | Kann Castopod-Benutzer verwalten. |
|
| users.manage | Kann Castopod-Benutzer verwalten. |
|
||||||
| persons.manage | Kann Mitwirkende verwalten. |
|
| persons.manage | Kann Mitwirkende verwalten. |
|
||||||
| pages.manage | Kann Seiten verwalten. |
|
| pages.manage | Kann Seiten verwalten. |
|
||||||
| podcasts.view | Kann alle Podcasts einsehen. |
|
| podcasts.view | Kann alle Podcasts einsehen. |
|
||||||
| podcasts.create | Kann neue Podcasts erstellen. |
|
| podcasts.create | Kann neue Podcasts erstellen. |
|
||||||
| podcasts.import | Kann Podcasts importieren. |
|
| podcasts.import | Kann Podcasts importieren. |
|
||||||
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
|
| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
||||||
|
|
||||||
## 2. Per podcast roles and permissions
|
## 2. Pro Podcast Rollen und Berechtigungen
|
||||||
|
|
||||||
### Per podcast roles
|
### Pro Podcast Rollen
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
|
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
|
||||||
|
|
||||||
|
@ -58,30 +59,30 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
||||||
|
|
||||||
### Per podcast permissions
|
### Pro Podcast Berechtigung
|
||||||
|
|
||||||
<!-- 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 | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. |
|
| view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. |
|
||||||
| edit | Kann Podcast #{id} bearbeiten. |
|
| edit | Kann Podcast #{id} bearbeiten. |
|
||||||
| delete | Kann Podcast #{id} löschen. |
|
| delete | Kann Podcast #{id} löschen. |
|
||||||
| manage-import | Kann den importierten Podcast #{id} synchronisieren. |
|
| manage-import | Kann den importierten Podcast #{id} synchronisieren. |
|
||||||
| manage-persons | Kann Abonnements des Podcasts #{id} verwalten. |
|
| manage-persons | Kann Abonnements des Podcasts #{id} verwalten. |
|
||||||
| manage-subscriptions | Kann Abonnements des Podcasts #{id} verwalten. |
|
| manage-subscriptions | Kann Abonnements des Podcasts #{id} verwalten. |
|
||||||
| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. |
|
| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. |
|
||||||
| manage-platforms | Kann Plattform-Links des Podcasts #{id} verwalten. |
|
| manage-platforms | Kann Plattform-Links des Podcasts #{id} verwalten. |
|
||||||
| manage-publications | Kann Podcast #{id} veröffentlichen. |
|
| manage-publications | Kann Podcast #{id} veröffentlichen. |
|
||||||
| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. |
|
| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. |
|
||||||
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
|
| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. |
|
||||||
| episodes.view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. |
|
| episodes.view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. |
|
||||||
| episodes.create | Kann Folgen für Podcast #{id} erstellen. |
|
| episodes.create | Kann Folgen für Podcast #{id} erstellen. |
|
||||||
| episodes.edit | Kann Podcast #{id} bearbeiten. |
|
| episodes.edit | Kann Podcast #{id} bearbeiten. |
|
||||||
| episodes.delete | Kann Podcast #{id} löschen. |
|
| episodes.delete | Kann Podcast #{id} löschen. |
|
||||||
| episodes.manage-persons | Kann Abonnements des Podcasts #{id} verwalten. |
|
| episodes.manage-persons | Kann Abonnements des Podcasts #{id} verwalten. |
|
||||||
| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. |
|
| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. |
|
||||||
| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. |
|
| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. |
|
||||||
| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen. |
|
| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen. |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
||||||
|
|
|
@ -3,7 +3,7 @@ title: Installation
|
||||||
sidebarDepth: 3
|
sidebarDepth: 3
|
||||||
---
|
---
|
||||||
|
|
||||||
# How to install Castopod?
|
# Wie installiere ich Castopod?
|
||||||
|
|
||||||
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.
|
||||||
|
@ -17,13 +17,15 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Requirements
|
## Voraussetzungen
|
||||||
|
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 oder höher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL Version 5.7 oder höher oder MariaDB Version 10.2 oder höher
|
||||||
- HTTPS support
|
- HTTPS-Unterstützung
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 or higher
|
### PHP v8.1 oder höher
|
||||||
|
|
||||||
PHP version 8.1 or higher is required, with the following extensions installed:
|
PHP version 8.1 or higher is required, with the following extensions installed:
|
||||||
|
|
||||||
|
@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -1,23 +1,25 @@
|
||||||
---
|
---
|
||||||
title: Security
|
title: Sicherheit
|
||||||
---
|
---
|
||||||
|
|
||||||
# Security concerns
|
# Sicherheitsbedenken
|
||||||
|
|
||||||
Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP
|
Castopod wurde mittels [CodeIgniter4](https://codeigniter.com/) (einem PHP
|
||||||
framework that encourages
|
Framework) gebaut, welches
|
||||||
[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
|
[gute Sicherheitspraktiken](https://codeigniter.com/user_guide/concepts/security.html)
|
||||||
|
fördert.
|
||||||
|
|
||||||
To maximize your instance's safety and prevent any malicious attack, we
|
Um die Sicherheit Ihrer Instanz zu erhöhen und bösartige Angriffe zu verhindern,
|
||||||
recommend you update all your Castopod files permissions after installation or
|
empfehlen wir, alle deine Castopod-Dateiberechtigungen nach der Installation
|
||||||
updates (to avoid any prior permission error):
|
oder dem Updaten zu aktualisieren (um Fehler bei der vorherigen Berechtigung zu
|
||||||
|
vermeiden):
|
||||||
|
|
||||||
- `writable/` folder must be **readable** and **writable**.
|
- der `writable/` Ordner muss **lesbar** und **beschreibbar** sein.
|
||||||
- `public/media/` folder must be **readable** and **writable**.
|
- `public/media/` muss **lesbar** und **beschreibbar** sein.
|
||||||
- any other file must be set to **readonly**.
|
- jede andere Datei muss nur **lesbar** sein.
|
||||||
|
|
||||||
For instance, if you are using Apache or NGINX with Ubuntu you may do the
|
Wenn Sie beispielsweise Apache oder NGINX mit Ubuntu verwenden, können Sie
|
||||||
following:
|
folgendermaßen vorgehen:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo chown -R root:root /path/to/castopod
|
sudo chown -R root:root /path/to/castopod
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -23,6 +23,8 @@ Si prefieres usar Docker, puedes saltarte esto e ir directamente a la
|
||||||
- PHP v8.1 o superior
|
- PHP v8.1 o superior
|
||||||
- MySQL versión 5.7 o superior o MariaDB versión 10.2 o superior
|
- MySQL versión 5.7 o superior o MariaDB versión 10.2 o superior
|
||||||
- Soporte HTTPS
|
- Soporte HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 o superior
|
### PHP v8.1 o superior
|
||||||
|
|
||||||
|
@ -167,16 +169,45 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Paquetes de la comunidad
|
## Paquetes de la comunidad
|
||||||
|
|
||||||
Si no quieres molestarte en instalar Castopod manualmente, puedes utilizar uno
|
If you don't want to bother with installing Castopod manually, you may use one
|
||||||
de los paquetes creados y mantenidos por la comunidad de código abierto.
|
of the packages created and maintained by the open-source community.
|
||||||
|
|
||||||
### Instalar con YunoHost
|
### Install with YunoHost
|
||||||
|
|
||||||
[YunoHost](https://yunohost.org/) es una distribución GNU/Linux basada en Debian
|
[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
|
||||||
compuesta por paquetes de software libre y de código abierto. Te ayuda a
|
made up of free and open-source software packages. It manages the hardships of
|
||||||
gestionar las partes difíciles de autoalojamiento.
|
self-hosting for you.
|
||||||
|
|
||||||
<div class="flex flex-wrap items-center gap-4">
|
<div class="flex flex-wrap items-center gap-4">
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -1,87 +1,88 @@
|
||||||
---
|
---
|
||||||
title: Authentication & Authorization
|
title: Authentification et Autorisation
|
||||||
sidebarDepth: 3
|
sidebarDepth: 3
|
||||||
---
|
---
|
||||||
|
|
||||||
# Authentication & Authorization
|
# Authentification et Autorisation
|
||||||
|
|
||||||
Castopod handles authentication and authorization using `codeigniter/shield`
|
Castopod gère l'authentification et l'autorisation à l'aide de
|
||||||
coupled with custom rules. Roles and permissions are defined at two levels:
|
`codeigniter/shield` associés à des règles personnalisées. Les rôles et les
|
||||||
|
autorisations sont définis sur deux niveaux :
|
||||||
|
|
||||||
1. [instance wide](#1-instance-wide-roles-and-permissions)
|
1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions)
|
||||||
2. [per podcast](#2-per-podcast-roles-and-permissions)
|
2. [par podcast](#2-per-podcast-roles-and-permissions)
|
||||||
|
|
||||||
## 1. Instance wide roles and permissions
|
## 1. Rôles et autorisations à l'échelle de l'instance
|
||||||
|
|
||||||
### Instance roles
|
### Rôles dans l’instance
|
||||||
|
|
||||||
<!-- 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 administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
|
||||||
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
|
| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage |
|
||||||
| Podcaster | General users of Castopod. | admin.access |
|
| Podcast·rice·eur | Utilisateurs généraux de Castopod. | admin.access |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
|
||||||
|
|
||||||
### Instance permissions
|
### Autorisations dans l'instance
|
||||||
|
|
||||||
<!-- 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 | Peut accéder à la zone d'administration Castopod. |
|
||||||
| admin.settings | Can access the Castopod settings. |
|
| admin.settings | Peut accéder aux paramètres de Castopod. |
|
||||||
| users.manage | Can manage Castopod users. |
|
| users.manage | Peut gérer les utilisateurs de Castopod. |
|
||||||
| persons.manage | Can manage persons. |
|
| persons.manage | Permet de gérer les personnes. |
|
||||||
| pages.manage | Can manage pages. |
|
| pages.manage | Permet de gérer les pages. |
|
||||||
| podcasts.view | Can view all podcasts. |
|
| podcasts.view | Peut voir tous les podcasts. |
|
||||||
| podcasts.create | Can create new podcasts. |
|
| podcasts.create | Peut créer de nouveaux podcasts. |
|
||||||
| podcasts.import | Can import podcasts. |
|
| podcasts.import | Peut importer des podcasts. |
|
||||||
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
|
| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
||||||
|
|
||||||
## 2. Per podcast roles and permissions
|
## 2. Rôles et autorisations par podcast
|
||||||
|
|
||||||
### Per podcast roles
|
### Rôles par podcast
|
||||||
|
|
||||||
<!-- 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}. | \* |
|
| Administrateur | A un contrôle total sur le 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 |
|
| Éditeur | Gère le contenu et les publications du 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 |
|
| Auteur / Autrice | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | 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 |
|
| Invité | Contributeur général du podcast #{id}. | view, episodes.view |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
<!-- AUTH-PODCAST-ROLES-LIST:END -->
|
||||||
|
|
||||||
### Per podcast permissions
|
### Permissions par podcast
|
||||||
|
|
||||||
<!-- 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 | Peut voir le tableau de bord et les analyses du podcast #{id}. |
|
||||||
| edit | Can edit podcast #{id}. |
|
| edit | Peut éditer le podcast #{id}. |
|
||||||
| delete | Can delete podcast #{id}. |
|
| delete | Peut supprimer le podcast #{id}. |
|
||||||
| manage-import | Can synchronize imported podcast #{id}. |
|
| manage-import | Peut synchroniser le podcast importé #{id}. |
|
||||||
| manage-persons | Can manage subscriptions of podcast #{id}. |
|
| manage-persons | Permet de gérer les abonnements au podcast #{id}. |
|
||||||
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
|
| manage-subscriptions | Permet de gérer les abonnements au podcast #{id}. |
|
||||||
| manage-contributors | Can manage contributors of podcast #{id}. |
|
| manage-contributors | Permet de gérer les contributeurs du podcast #{id}. |
|
||||||
| manage-platforms | Can set/remove platform links of podcast #{id}. |
|
| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. |
|
||||||
| manage-publications | Can publish podcast #{id}. |
|
| manage-publications | Peut publier le podcast #{id}. |
|
||||||
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
|
| manage-notifications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. |
|
||||||
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
|
| interact-as | Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages. |
|
||||||
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
|
| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. |
|
||||||
| episodes.create | Can create episodes for podcast #{id}. |
|
| episodes.create | Peut créer des épisodes pour le podcast #{id}. |
|
||||||
| episodes.edit | Can edit podcast #{id}. |
|
| episodes.edit | Peut éditer le podcast #{id}. |
|
||||||
| episodes.delete | Can delete podcast #{id}. |
|
| episodes.delete | Peut supprimer le podcast #{id}. |
|
||||||
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. |
|
||||||
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. |
|
||||||
| episodes.manage-publications | Can publish podcast #{id}. |
|
| episodes.manage-publications | Peut publier le podcast #{id}. |
|
||||||
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Official Docker images
|
title: Images officielles Docker
|
||||||
sidebarDepth: 3
|
sidebarDepth: 3
|
||||||
---
|
---
|
||||||
|
|
||||||
# Official Docker images
|
# Images officielles de Docker
|
||||||
|
|
||||||
Castopod pushes 3 Docker images to the Docker Hub during its automated build
|
Castopod envoie 3 images Docker au Hub Docker pendant son processus de
|
||||||
process:
|
construction automatisée :
|
||||||
|
|
||||||
- [**`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
|
||||||
|
@ -15,22 +15,22 @@ process:
|
||||||
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
|
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
|
||||||
an optional image building videoclips thanks to ffmpeg
|
an optional image building videoclips thanks to ffmpeg
|
||||||
|
|
||||||
Additionally, Castopod requires a MySQL-compatible database. A Redis database
|
De plus, Castopod nécessite une base de données compatible avec MySQL. Une base
|
||||||
can be added as a cache handler.
|
de données Redis peut être ajoutée en tant que gestionnaire de cache.
|
||||||
|
|
||||||
## Supported tags
|
## Tags supportés
|
||||||
|
|
||||||
- `develop` [unstable], latest development branch build
|
- `développer` [unstable], la dernière version de la branche de développement
|
||||||
- `beta` [stable], latest beta version build
|
- `beta` [stable], dernière version bêta
|
||||||
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
|
- `1.0.0-beta.x` [stable], version bêta spécifique (depuis `1.0.0-beta.22`)
|
||||||
- `latest` [stable], latest version build
|
- `beta` [stable], dernière version bêta
|
||||||
- `1.x.x` [stable], specific version build (since `1.0.0`)
|
- `1.x.x` [stable], version spécifique (depuis `1.0.0`)
|
||||||
|
|
||||||
## Example usage
|
## Exemple d'utilisation
|
||||||
|
|
||||||
1. Install [docker](https://docs.docker.com/get-docker/) and
|
1. Installez [docker](https://docs.docker.com/get-docker/) et
|
||||||
[docker-compose](https://docs.docker.com/compose/install/)
|
[docker-compose](https://docs.docker.com/compose/install/)
|
||||||
2. Create a `docker-compose.yml` file with the following:
|
2. Créez un fichier `docker-compose.yml` avec les éléments suivants :
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
version: "3.7"
|
version: "3.7"
|
||||||
|
@ -112,8 +112,8 @@ can be added as a cache handler.
|
||||||
castopod-db:
|
castopod-db:
|
||||||
```
|
```
|
||||||
|
|
||||||
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
|
Vous devez adapter certaines variables à vos besoins (p. ex. `CP_BASEURL`,
|
||||||
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
|
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` et `CP_ANALYTICS_SALT`).
|
||||||
|
|
||||||
3. Setup a reverse proxy for TLS (SSL/HTTPS)
|
3. Setup a reverse proxy for TLS (SSL/HTTPS)
|
||||||
|
|
||||||
|
@ -127,16 +127,17 @@ can be added as a cache handler.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run `docker-compose up -d`, wait for it to initialize and head on to
|
4. Exécutez `docker-compose up -d`, attendez qu'il s'initialise sur
|
||||||
`https://castopod.example.com/cp-install` to finish setting up Castopod!
|
`https://castopod.example.com/cp-install` pour terminer la configuration de
|
||||||
|
Castopod !
|
||||||
|
|
||||||
5. You're all set, start podcasting! 🎙️🚀
|
5. Vous êtes prêt, commencez à podcaster! 🎙️🚀
|
||||||
|
|
||||||
## Environment Variables
|
## Environment Variables
|
||||||
|
|
||||||
- **castopod/video-clipper**
|
- **castopod/video-clipper**
|
||||||
|
|
||||||
| Variable name | Type (`default`) | Default |
|
| Nom de la variable | Type (`default`) | Par défaut |
|
||||||
| -------------------------- | ---------------- | ---------------- |
|
| -------------------------- | ---------------- | ---------------- |
|
||||||
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
|
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
|
||||||
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
|
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
|
||||||
|
@ -146,7 +147,7 @@ can be added as a cache handler.
|
||||||
|
|
||||||
- **castopod/app**
|
- **castopod/app**
|
||||||
|
|
||||||
| Variable name | Type (`default`) | Default |
|
| Variable name | Type (`default`) | Par défaut |
|
||||||
| ---------------------------- | ----------------------- | ---------------- |
|
| ---------------------------- | ----------------------- | ---------------- |
|
||||||
| **`CP_BASEURL`** | string | `undefined` |
|
| **`CP_BASEURL`** | string | `undefined` |
|
||||||
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
|
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
|
||||||
|
@ -172,6 +173,6 @@ can be added as a cache handler.
|
||||||
|
|
||||||
- **castopod/web-server**
|
- **castopod/web-server**
|
||||||
|
|
||||||
| Variable name | Type | Default |
|
| Nom de la variable | Type | Par défaut |
|
||||||
| --------------------- | ------- | ------- |
|
| --------------------- | ------- | ---------- |
|
||||||
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
|
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
|
||||||
|
|
|
@ -23,6 +23,8 @@ directement à la [documentation Docker](./docker.md) pour Castopod.
|
||||||
- PHP v8.1 ou supérieure
|
- PHP v8.1 ou supérieure
|
||||||
- MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure
|
- MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure
|
||||||
- Prise en charge HTTPS
|
- Prise en charge HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 ou supérieure
|
### PHP v8.1 ou supérieure
|
||||||
|
|
||||||
|
@ -47,7 +49,7 @@ De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP
|
||||||
|
|
||||||
> Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org).
|
> Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org).
|
||||||
|
|
||||||
::: warning Warning
|
::: warning Attention
|
||||||
|
|
||||||
Castopod ne fonctionne qu'avec les bases de données MySQL 5.7 ou plus récentes.
|
Castopod ne fonctionne qu'avec les bases de données MySQL 5.7 ou plus récentes.
|
||||||
Les versions 5.6 (dont le support a cessé le 5 février 2021) ou précédentes de
|
Les versions 5.6 (dont le support a cessé le 5 février 2021) ou précédentes de
|
||||||
|
@ -130,11 +132,11 @@ installées :
|
||||||
2. Suivez les instructions affichée.
|
2. Suivez les instructions affichée.
|
||||||
3. Commencer à baladodiffuser !
|
3. Commencer à baladodiffuser !
|
||||||
|
|
||||||
::: info Note
|
:::info Note
|
||||||
|
|
||||||
Le script d'installation crée un fichier `.env` à la racine du paquet. If you
|
Le script d'installation crée un fichier `.env` à la racine du paquet. Si vous
|
||||||
cannot go through the install wizard, you can create and edit the `.env` file
|
ne pouvez pas passer par l'assistant d'installation, vous pouvez créer et éditer
|
||||||
manually based on the `.env.example` file.
|
le fichier `.env` manuellement en vous appuyant sur le fichier `.env.example`.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -167,6 +169,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Paquets fournis par la communauté
|
## Paquets fournis par la communauté
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -9,10 +9,10 @@ Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers
|
||||||
dernière version afin de profiter des dernières fonctionnalités ✨, des
|
dernière version afin de profiter des dernières fonctionnalités ✨, des
|
||||||
corrections de bugs 🐛 et des améliorations de performance ⚡.
|
corrections de bugs 🐛 et des améliorations de performance ⚡.
|
||||||
|
|
||||||
## Update instructions
|
## Instructions de mise à jour
|
||||||
|
|
||||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
|
||||||
database.
|
vos fichiers Castopod et la base de données .
|
||||||
|
|
||||||
- cf.
|
- cf.
|
||||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||||
|
@ -31,15 +31,16 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
|
||||||
- Note that you can also download the latest package from
|
- Note that you can also download the latest package from
|
||||||
[castopod.org](https://castopod.org/)
|
[castopod.org](https://castopod.org/)
|
||||||
|
|
||||||
3. On your server:
|
3. Sur votre serveur :
|
||||||
|
|
||||||
- Remove all files except `.env` and `public/media`
|
- Supprimer tous les fichiers sauf `.env` et `public/media`
|
||||||
- Copy the new files from the downloaded package into your server
|
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
|
||||||
|
|
||||||
::: info Note
|
::: info Note
|
||||||
|
|
||||||
You may need to reset files permissions as during the install process.
|
Vous devrez peut-être re-définir les autorisations de fichiers comme
|
||||||
Check [Security Concerns](./security.md).
|
effectué durant le processus d'installation. Check
|
||||||
|
[Security Concerns](./security.md).
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -52,19 +53,20 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
|
||||||
|
|
||||||
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
|
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
|
||||||
`Housekeeping`
|
`Housekeeping`
|
||||||
6. ✨ Enjoy your fresh instance, you're all done!
|
6. ✨Profitez de votre nouvelle instance, vous avez terminé !
|
||||||
|
|
||||||
::: info Note
|
::: info Note
|
||||||
|
|
||||||
Releases may come with additional update instructions (see
|
Les versions peuvent être accompagnées d'instructions de mise à jour
|
||||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
|
supplémentaires (cf. la
|
||||||
|
[page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)).
|
||||||
|
|
||||||
- cf.
|
- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire
|
||||||
[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)
|
?</a>
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Fully Automated updates
|
## Mises à jour entièrement automatisées
|
||||||
|
|
||||||
> Prochainement... 👀
|
> Prochainement... 👀
|
||||||
|
|
||||||
|
@ -72,23 +74,23 @@ Releases may come with additional update instructions (see
|
||||||
|
|
||||||
### Où puis-je trouver ma version de Castopod ?
|
### Où puis-je trouver ma version de Castopod ?
|
||||||
|
|
||||||
Go to your Castopod admin panel, the version is displayed on the bottom left
|
Allez dans votre panneau d'administration de Castopod, la version s'affiche en
|
||||||
corner.
|
bas à gauche.
|
||||||
|
|
||||||
Alternatively, you can find the version in the `app > Config > Constants.php`
|
Vous pouvez également trouver la version dans l'application
|
||||||
file.
|
`> Configuration > Constantes.php` dossier.
|
||||||
|
|
||||||
### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
|
### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
|
||||||
|
|
||||||
No problem! Just get the latest release as described above. Only, when going
|
Pas de problème ! Il suffit d'obtenir la dernière version comme décrit
|
||||||
through the release instructions (4), perform them sequentially, from the oldest
|
ci-dessus. Lorsque vous exécutez les instructions de mise à jour (4), lancez-les
|
||||||
to the newest.
|
séquentiellement, de la plus ancienne à la plus récente.
|
||||||
|
|
||||||
> Vous devriez sauvegarder votre instance selon la date de votre dernière mise à
|
> Vous devriez sauvegarder votre instance selon la date de votre dernière mise à
|
||||||
> jour de Castopod.
|
> jour de Castopod.
|
||||||
|
|
||||||
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
|
Par exemple, si vous êtes en `v1.0.0-alpha.42` et souhaitez mettre à jour vers
|
||||||
`v1.0.0-beta.1`:
|
la `v1.0.0-beta.1` :
|
||||||
|
|
||||||
0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base
|
0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base
|
||||||
de données.
|
de données.
|
||||||
|
@ -103,7 +105,8 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
|
||||||
|
|
||||||
### Dois-je faire une sauvegarde avant de mettre à jour ?
|
### Dois-je faire une sauvegarde avant de mettre à jour ?
|
||||||
|
|
||||||
We advise you do, so you don't lose everything if anything goes wrong!
|
Nous vous conseillons de le faire, afin de ne pas tout perdre si quelque chose
|
||||||
|
se passait mal !
|
||||||
|
|
||||||
More generally, we advise you make regular backups of your Castopod files and
|
Plus généralement, nous vous conseillons de faire des sauvegardes régulières de
|
||||||
database to prevent you from losing it all…
|
vos fichiers Castopod et de votre base de données afin d'éviter de tout perdre…
|
||||||
|
|
|
@ -44,7 +44,7 @@ petite taille.
|
||||||
- 🔗 Liens de financement
|
- 🔗 Liens de financement
|
||||||
- 📲 publicité “listen-to-click”
|
- 📲 publicité “listen-to-click”
|
||||||
- 🤝 value4value / WebMonetization
|
- 🤝 value4value / WebMonetization
|
||||||
- 💎 Premium podcasts
|
- 💎 Podcasts premium
|
||||||
- 📡 Publiez vos épisodes partout avec RSS :
|
- 📡 Publiez vos épisodes partout avec RSS :
|
||||||
- 📱 Sur tous les index et toutes les applications : Podcast Index,
|
- 📱 Sur tous les index et toutes les applications : Podcast Index,
|
||||||
Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend…
|
Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend…
|
||||||
|
@ -252,9 +252,9 @@ Merci à toutes ces personnes merveilleuses
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
This project follows the
|
Ce projet suit la spécification
|
||||||
[all-contributors](https://github.com/all-contributors/all-contributors)
|
[all-contributors](https://github.com/all-contributors/all-contributors) .
|
||||||
specification. Contributions of any kind welcome!
|
Toutes les contributions sont bienvenues !
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
|
@ -287,9 +287,9 @@ parrains. Si vous souhaitez aider, n'hésitez pas à
|
||||||
|
|
||||||
## Licence
|
## Licence
|
||||||
|
|
||||||
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
|
[Licence publique générale GNU Affero v3](https://choosealicense.com/licenses/agpl-3.0/)
|
||||||
|
|
||||||
Copyright © 2020-present, [Ad Aures](https://adaures.com/).
|
Copyright © 2020-aujourd'hui, [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/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/github/license/ad-aures/castopod?color=blue
|
||||||
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
|
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
title: Authentication & Authorization
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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.\*, 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. |
|
||||||
|
| 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 dashboard and analytics of podcast #{id}. |
|
||||||
|
| episodes.create | Can create episodes for podcast #{id}. |
|
||||||
|
| episodes.edit | Can edit podcast #{id}. |
|
||||||
|
| episodes.delete | Can delete podcast #{id}. |
|
||||||
|
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
||||||
|
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
||||||
|
| episodes.manage-publications | Can publish podcast #{id}. |
|
||||||
|
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
||||||
|
|
||||||
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
|
@ -0,0 +1,216 @@
|
||||||
|
---
|
||||||
|
title: Installation
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to install Castopod?
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
::: 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
|
||||||
|
|
||||||
|
- PHP v8.1 or higher
|
||||||
|
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
||||||
|
- HTTPS support
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
|
### PHP v8.1 or higher
|
||||||
|
|
||||||
|
PHP version 8.1 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).
|
||||||
|
|
||||||
|
::: 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.
|
||||||
|
|
||||||
|
#### 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):
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
> These tasks run **every minute**. You may set the frequency depending on
|
||||||
|
> your needs: every 5, 10 minutes or more.
|
||||||
|
|
||||||
|
### (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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### 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"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
|
## 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>
|
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
title: Authentication & Authorization
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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.\*, 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. |
|
||||||
|
| 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 dashboard and analytics of podcast #{id}. |
|
||||||
|
| episodes.create | Can create episodes for podcast #{id}. |
|
||||||
|
| episodes.edit | Can edit podcast #{id}. |
|
||||||
|
| episodes.delete | Can delete podcast #{id}. |
|
||||||
|
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
||||||
|
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
||||||
|
| episodes.manage-publications | Can publish podcast #{id}. |
|
||||||
|
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
||||||
|
|
||||||
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
|
@ -0,0 +1,177 @@
|
||||||
|
---
|
||||||
|
title: Official Docker images
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Official Docker images
|
||||||
|
|
||||||
|
Castopod pushes 3 Docker images to the Docker Hub during its automated build
|
||||||
|
process:
|
||||||
|
|
||||||
|
- [**`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
|
||||||
|
- [**`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
|
||||||
|
can be added as a cache handler.
|
||||||
|
|
||||||
|
## Supported tags
|
||||||
|
|
||||||
|
- `develop` [unstable], latest development branch 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
|
||||||
|
- `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/app:latest
|
||||||
|
container_name: "castopod-app"
|
||||||
|
volumes:
|
||||||
|
- castopod-media:/opt/castopod/public/media
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: castopod
|
||||||
|
MYSQL_USER: castopod
|
||||||
|
MYSQL_PASSWORD: changeme
|
||||||
|
CP_BASEURL: "http://castopod.example.com"
|
||||||
|
CP_ANALYTICS_SALT: changeme
|
||||||
|
CP_CACHE_HANDLER: redis
|
||||||
|
CP_REDIS_HOST: redis
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
- 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:
|
||||||
|
- 8080:80
|
||||||
|
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"
|
||||||
|
volumes:
|
||||||
|
- castopod-cache:/data
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
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:8080
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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/video-clipper**
|
||||||
|
|
||||||
|
| Variable name | Type (`default`) | Default |
|
||||||
|
| -------------------------- | ---------------- | ---------------- |
|
||||||
|
| **`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_"` |
|
||||||
|
|
||||||
|
- **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"` |
|
||||||
|
|
||||||
|
- **castopod/web-server**
|
||||||
|
|
||||||
|
| Variable name | Type | Default |
|
||||||
|
| --------------------- | ------- | ------- |
|
||||||
|
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
|
|
@ -0,0 +1,216 @@
|
||||||
|
---
|
||||||
|
title: Installation
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to install Castopod?
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
::: 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
|
||||||
|
|
||||||
|
- PHP v8.1 or higher
|
||||||
|
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
||||||
|
- HTTPS support
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
|
### PHP v8.1 or higher
|
||||||
|
|
||||||
|
PHP version 8.1 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).
|
||||||
|
|
||||||
|
::: 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.
|
||||||
|
|
||||||
|
#### 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):
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
> These tasks run **every minute**. You may set the frequency depending on
|
||||||
|
> your needs: every 5, 10 minutes or more.
|
||||||
|
|
||||||
|
### (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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### 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"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
|
## 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>
|
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: Security
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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).
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
|
@ -0,0 +1,109 @@
|
||||||
|
---
|
||||||
|
title: Update
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to update Castopod?
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
You may need to reset files permissions as during the install process.
|
||||||
|
Check [Security Concerns](./security.md).
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 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…
|
|
@ -0,0 +1,303 @@
|
||||||
|
---
|
||||||
|
sidebarDepth: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Welcome 👋
|
||||||
|
|
||||||
|
[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars]
|
||||||
|
|
||||||
|
Castopod is a free & open-source hosting platform made for podcasters who want
|
||||||
|
engage and interact with their audience.
|
||||||
|
|
||||||
|
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 the 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>
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 🌱 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… 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.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
## Contributors ✨
|
||||||
|
|
||||||
|
Thanks goes to these wonderful people
|
||||||
|
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
This project follows the
|
||||||
|
[all-contributors](https://github.com/all-contributors/all-contributors)
|
||||||
|
specification. Contributions of any kind welcome!
|
||||||
|
|
||||||
|
## 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).
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
## 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
|
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
title: Authentication & Authorization
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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.\*, 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. |
|
||||||
|
| 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 dashboard and analytics of podcast #{id}. |
|
||||||
|
| episodes.create | Can create episodes for podcast #{id}. |
|
||||||
|
| episodes.edit | Can edit podcast #{id}. |
|
||||||
|
| episodes.delete | Can delete podcast #{id}. |
|
||||||
|
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
||||||
|
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
||||||
|
| episodes.manage-publications | Can publish podcast #{id}. |
|
||||||
|
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
||||||
|
|
||||||
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
|
@ -0,0 +1,177 @@
|
||||||
|
---
|
||||||
|
title: Official Docker images
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Official Docker images
|
||||||
|
|
||||||
|
Castopod pushes 3 Docker images to the Docker Hub during its automated build
|
||||||
|
process:
|
||||||
|
|
||||||
|
- [**`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
|
||||||
|
- [**`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
|
||||||
|
can be added as a cache handler.
|
||||||
|
|
||||||
|
## Supported tags
|
||||||
|
|
||||||
|
- `develop` [unstable], latest development branch 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
|
||||||
|
- `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/app:latest
|
||||||
|
container_name: "castopod-app"
|
||||||
|
volumes:
|
||||||
|
- castopod-media:/opt/castopod/public/media
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: castopod
|
||||||
|
MYSQL_USER: castopod
|
||||||
|
MYSQL_PASSWORD: changeme
|
||||||
|
CP_BASEURL: "http://castopod.example.com"
|
||||||
|
CP_ANALYTICS_SALT: changeme
|
||||||
|
CP_CACHE_HANDLER: redis
|
||||||
|
CP_REDIS_HOST: redis
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
- 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:
|
||||||
|
- 8080:80
|
||||||
|
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"
|
||||||
|
volumes:
|
||||||
|
- castopod-cache:/data
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
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:8080
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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/video-clipper**
|
||||||
|
|
||||||
|
| Variable name | Type (`default`) | Default |
|
||||||
|
| -------------------------- | ---------------- | ---------------- |
|
||||||
|
| **`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_"` |
|
||||||
|
|
||||||
|
- **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"` |
|
||||||
|
|
||||||
|
- **castopod/web-server**
|
||||||
|
|
||||||
|
| Variable name | Type | Default |
|
||||||
|
| --------------------- | ------- | ------- |
|
||||||
|
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
|
|
@ -0,0 +1,185 @@
|
||||||
|
---
|
||||||
|
title: Installation
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to install Castopod?
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
::: 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
|
||||||
|
|
||||||
|
- PHP v8.1 or higher
|
||||||
|
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
||||||
|
- HTTPS support
|
||||||
|
|
||||||
|
### PHP v8.1 or higher
|
||||||
|
|
||||||
|
PHP version 8.1 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).
|
||||||
|
|
||||||
|
::: 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.
|
||||||
|
|
||||||
|
#### 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):
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
> These tasks run **every minute**. You may set the frequency depending on
|
||||||
|
> your needs: every 5, 10 minutes or more.
|
||||||
|
|
||||||
|
### (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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### 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"` |
|
||||||
|
|
||||||
|
## 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>
|
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: Security
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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).
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
|
@ -0,0 +1,109 @@
|
||||||
|
---
|
||||||
|
title: Update
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to update Castopod?
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
You may need to reset files permissions as during the install process.
|
||||||
|
Check [Security Concerns](./security.md).
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 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…
|
|
@ -0,0 +1,303 @@
|
||||||
|
---
|
||||||
|
sidebarDepth: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Welcome 👋
|
||||||
|
|
||||||
|
[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars]
|
||||||
|
|
||||||
|
Castopod is a free & open-source hosting platform made for podcasters who want
|
||||||
|
engage and interact with their audience.
|
||||||
|
|
||||||
|
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 the 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>
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 🌱 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… 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.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
## Contributors ✨
|
||||||
|
|
||||||
|
Thanks goes to these wonderful people
|
||||||
|
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
This project follows the
|
||||||
|
[all-contributors](https://github.com/all-contributors/all-contributors)
|
||||||
|
specification. Contributions of any kind welcome!
|
||||||
|
|
||||||
|
## 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).
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
## 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
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.0 or higher
|
- PHP v8.0 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
||||||
- HTTPS support
|
- HTTPS support
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.0 or higher
|
### PHP v8.0 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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 | Kan toegang krijgen tot de beheeromgeving van Castopod. |
|
| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. |
|
||||||
| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. |
|
| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. |
|
||||||
| users.manage | Kan Castopod-gebruikers beheren. |
|
| users.manage | Kan Castopod-gebruikers beheren. |
|
||||||
| persons.manage | Can manage persons. |
|
| persons.manage | Kan personen beheren. |
|
||||||
| pages.manage | Kan pagina's beheren. |
|
| pages.manage | Kan pagina's beheren. |
|
||||||
| podcasts.view | Kan alle podcasts bekijken. |
|
| podcasts.view | Kan alle podcasts bekijken. |
|
||||||
| podcasts.create | Kan nieuwe podcast aanmaken. |
|
| podcasts.create | Kan nieuwe podcast aanmaken. |
|
||||||
| podcasts.import | Kan podcasts importeren. |
|
| podcasts.import | Kan podcasts importeren. |
|
||||||
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
|
| fediverse.manage-blocks | Kan fediverse actors/domains blokkeren voor interactie met Castopod. |
|
||||||
|
|
||||||
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
|
||||||
|
|
||||||
|
@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels:
|
||||||
|
|
||||||
<!-- 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 | Kan dashboard en analyses van podcast #{id} zien. |
|
| view | Kan dashboard en analyses van podcast #{id} zien. |
|
||||||
| edit | Kan podcast #{id} wijzigen. |
|
| edit | Kan podcast #{id} wijzigen. |
|
||||||
| delete | Kan podcast #{id} verwijderen. |
|
| delete | Kan podcast #{id} verwijderen. |
|
||||||
| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. |
|
| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. |
|
||||||
| manage-persons | Can manage subscriptions of podcast #{id}. |
|
| manage-persons | Kan abonnementen van podcast #{id} beheren. |
|
||||||
| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. |
|
| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. |
|
||||||
| manage-contributors | Kan bijdragers van podcast #{id} beheren. |
|
| manage-contributors | Kan bijdragers van podcast #{id} beheren. |
|
||||||
| manage-platforms | Can set/remove platform links of podcast #{id}. |
|
| manage-platforms | Kan platform links van podcast #{id} instellen of verwijderen. |
|
||||||
| manage-publications | Kan podcast #{id} publiceren. |
|
| manage-publications | Kan podcast #{id} publiceren. |
|
||||||
| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. |
|
| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. |
|
||||||
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
|
| interact-as | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. |
|
||||||
| episodes.view | Kan dashboard en analyses van podcast #{id} zien. |
|
| episodes.view | Kan dashboard en analyses van podcast #{id} zien. |
|
||||||
| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. |
|
| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. |
|
||||||
| episodes.edit | Kan podcast #{id} wijzigen. |
|
| episodes.edit | Kan podcast #{id} wijzigen. |
|
||||||
| episodes.delete | Kan podcast #{id} verwijderen. |
|
| episodes.delete | Kan podcast #{id} verwijderen. |
|
||||||
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
| episodes.manage-persons | Kan abonnementen van podcast #{id} beheren. |
|
||||||
| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. |
|
| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. |
|
||||||
| episodes.manage-publications | Kan podcast #{id} publiceren. |
|
| episodes.manage-publications | Kan podcast #{id} publiceren. |
|
||||||
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
| episodes.manage-comments | Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen. |
|
||||||
|
|
||||||
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -23,6 +23,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 eller nyare
|
- PHP v8.1 eller nyare
|
||||||
- MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare
|
- MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare
|
||||||
- Støtte for HTTPS
|
- Støtte for HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 eller nyare
|
### PHP v8.1 eller nyare
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Pakker frå brukarsamfunnet
|
## Pakker frå brukarsamfunnet
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -3,7 +3,7 @@ title: Authentication & Authorization
|
||||||
sidebarDepth: 3
|
sidebarDepth: 3
|
||||||
---
|
---
|
||||||
|
|
||||||
# Authentication & Authorization
|
# Uwierzytelnianie & Autoryzacja
|
||||||
|
|
||||||
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:
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -11,10 +11,10 @@ com PHP-MySQL.
|
||||||
|
|
||||||
::: dica Nota
|
::: dica Nota
|
||||||
|
|
||||||
We've released official Docker images for Castopod!
|
Nós lançamos imagens Docker oficiais para Castopod!
|
||||||
|
|
||||||
If you prefer using Docker, you may skip this and go straight to the
|
Se você prefere usar o Docker, você pode pular isso e ir direto para a
|
||||||
[docker documentation](./docker.md) for Castopod.
|
[documentação docker](./docker.md) de Castopod.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -23,10 +23,12 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 ou superior
|
- PHP v8.1 ou superior
|
||||||
- MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior
|
- MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior
|
||||||
- Suporte a HTTPS
|
- Suporte a HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 ou superior
|
### PHP v8.1 ou superior
|
||||||
|
|
||||||
PHP version 8.1 or higher is required, with the following extensions installed:
|
É necessário PHP versão 8.1 ou superior, com as seguintes extensões instaladas:
|
||||||
|
|
||||||
- [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)
|
||||||
|
@ -35,7 +37,8 @@ PHP version 8.1 or higher is required, with the following extensions installed:
|
||||||
**PNG** e bibliotecas **WEBP**.
|
**PNG** e bibliotecas **WEBP**.
|
||||||
- [exif](https://www.php.net/manual/en/exif.installation.php)
|
- [exif](https://www.php.net/manual/en/exif.installation.php)
|
||||||
|
|
||||||
Additionally, make sure that the following extensions are enabled in your PHP:
|
Além disso, certifique-se de que as seguintes extensões estejam habilitadas em
|
||||||
|
seu PHP:
|
||||||
|
|
||||||
- json (habilitado por padrão - não desativar)
|
- json (habilitado por padrão - não desativar)
|
||||||
- xml (habilitado por padrão - não desativar)
|
- xml (habilitado por padrão - não desativar)
|
||||||
|
@ -45,17 +48,17 @@ Additionally, make sure that the following extensions are enabled in your PHP:
|
||||||
|
|
||||||
> Recomendamos usar o [MariaDB](https://mariadb.org).
|
> Recomendamos usar o [MariaDB](https://mariadb.org).
|
||||||
|
|
||||||
::: warning Warning
|
::: warning Aviso
|
||||||
|
|
||||||
Castopod only works with supported MySQL 5.7 or higher compatible databases. It
|
Castopod só funciona com bancos de dados MySQL 5.7 ou superior compatíveis. It
|
||||||
will break with the previous MySQL v5.6 for example as its end of life was on
|
will break with the previous MySQL v5.6 for example as its end of life was on
|
||||||
February 5, 2021.
|
February 5, 2021.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
You will need the server hostname, database name, username and password to
|
Você vai precisar do hostname do servidor, nome do banco de dados, nome do
|
||||||
complete the installation process. If you do not have these, please contact your
|
usuário e senha para concluir o processo de instalação. Se você não os tem,
|
||||||
server administrator.
|
entre em contato com o administrador do servidor.
|
||||||
|
|
||||||
#### Privilégios
|
#### Privilégios
|
||||||
|
|
||||||
|
@ -66,7 +69,7 @@ User must have at least these privileges on the database for Castopod to work:
|
||||||
### (Opcional) FFmpeg v4.1.8 ou superior para Clipes de Vídeo
|
### (Opcional) FFmpeg v4.1.8 ou superior para Clipes de Vídeo
|
||||||
|
|
||||||
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you
|
[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:
|
want to generate Video Clips. As seguintes extensões devem ser instaladas:
|
||||||
|
|
||||||
- Biblioteca **FreeType 2** para
|
- Biblioteca **FreeType 2** para
|
||||||
[gd](https://www.php.net/manual/en/image.installation.php).
|
[gd](https://www.php.net/manual/en/image.installation.php).
|
||||||
|
@ -125,10 +128,10 @@ want to generate Video Clips. The following extensions must be installed:
|
||||||
2. Siga as instruções na sua tela.
|
2. Siga as instruções na sua tela.
|
||||||
3. Comece o podcast!
|
3. Comece o podcast!
|
||||||
|
|
||||||
::: info Note
|
::: Nota de Informação
|
||||||
|
|
||||||
The install script writes a `.env` file in the package root. If you cannot go
|
O script de instalação grava um arquivo `.env` na raiz do pacote. If you cannot
|
||||||
through the install wizard, you can create and edit the `.env` file manually
|
go 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.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
@ -152,11 +155,11 @@ email.SMTPUser="your_smtp_user"
|
||||||
email.SMTPPass="your_smtp_password"
|
email.SMTPPass="your_smtp_password"
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Email config options
|
#### Configurar opções de e-mail
|
||||||
|
|
||||||
| Variable name | Type | Default |
|
| Nome da variável | Tipo | Padrão |
|
||||||
| ---------------- | -------------------- | ------------ |
|
| ---------------- | -------------------- | ------------ |
|
||||||
| **`fromEmail`** | string | `undefined` |
|
| **`fromEmail`** | string | `indefinido` |
|
||||||
| **`fromName`** | string | `"Castopod"` |
|
| **`fromName`** | string | `"Castopod"` |
|
||||||
| **`SMTPHost`** | string | `undefined` |
|
| **`SMTPHost`** | string | `undefined` |
|
||||||
| **`SMTPUser`** | string | `undefined` |
|
| **`SMTPUser`** | string | `undefined` |
|
||||||
|
@ -164,6 +167,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Pacotes comunitários
|
## Pacotes comunitários
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
- MySQL version 5.7 or higher or MariaDB version 10.2 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.1 or higher
|
||||||
|
|
||||||
|
@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 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
|
||||||
|
|
|
@ -23,6 +23,8 @@ Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt til
|
||||||
- PHP v8.1 or higher
|
- PHP v8.1 or higher
|
||||||
- MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre
|
- MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre
|
||||||
- Stöd för HTTPS
|
- Stöd för HTTPS
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP v8.1 or higher
|
### PHP v8.1 or higher
|
||||||
|
|
||||||
|
@ -161,16 +163,45 @@ email.SMTPPass="your_smtp_password"
|
||||||
| **`SMTPPort`** | nummer | `25` |
|
| **`SMTPPort`** | nummer | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## Gemenskapspaket
|
## Gemenskapspaket
|
||||||
|
|
||||||
Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett
|
If you don't want to bother with installing Castopod manually, you may use one
|
||||||
av de paket som skapats och underhålls av open source-miljön.
|
of the packages created and maintained by the open-source community.
|
||||||
|
|
||||||
### Installera med YunoHost
|
### Install with YunoHost
|
||||||
|
|
||||||
[YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux
|
[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux
|
||||||
som består av mjukvarupaket med fri och öppen källkod. Det hanterar
|
made up of free and open-source software packages. It manages the hardships of
|
||||||
svårigheterna med self-hosting för dig.
|
self-hosting for you.
|
||||||
|
|
||||||
<div class="flex flex-wrap items-center gap-4">
|
<div class="flex flex-wrap items-center gap-4">
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
title: Authentication & Authorization
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Аутентифікація & Авторизація
|
||||||
|
|
||||||
|
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.\*, 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. |
|
||||||
|
| 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 dashboard and analytics of podcast #{id}. |
|
||||||
|
| episodes.create | Can create episodes for podcast #{id}. |
|
||||||
|
| episodes.edit | Can edit podcast #{id}. |
|
||||||
|
| episodes.delete | Can delete podcast #{id}. |
|
||||||
|
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
|
||||||
|
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
|
||||||
|
| episodes.manage-publications | Can publish podcast #{id}. |
|
||||||
|
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
|
||||||
|
|
||||||
|
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->
|
|
@ -0,0 +1,177 @@
|
||||||
|
---
|
||||||
|
title: Official Docker images
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Official Docker images
|
||||||
|
|
||||||
|
Castopod pushes 3 Docker images to the Docker Hub during its automated build
|
||||||
|
process:
|
||||||
|
|
||||||
|
- [**`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
|
||||||
|
- [**`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
|
||||||
|
can be added as a cache handler.
|
||||||
|
|
||||||
|
## Supported tags
|
||||||
|
|
||||||
|
- `develop` [unstable], latest development branch 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
|
||||||
|
- `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/app:latest
|
||||||
|
container_name: "castopod-app"
|
||||||
|
volumes:
|
||||||
|
- castopod-media:/opt/castopod/public/media
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: castopod
|
||||||
|
MYSQL_USER: castopod
|
||||||
|
MYSQL_PASSWORD: changeme
|
||||||
|
CP_BASEURL: "http://castopod.example.com"
|
||||||
|
CP_ANALYTICS_SALT: changeme
|
||||||
|
CP_CACHE_HANDLER: redis
|
||||||
|
CP_REDIS_HOST: redis
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
- 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:
|
||||||
|
- 8080:80
|
||||||
|
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"
|
||||||
|
volumes:
|
||||||
|
- castopod-cache:/data
|
||||||
|
networks:
|
||||||
|
- castopod-app
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
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:8080
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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/video-clipper**
|
||||||
|
|
||||||
|
| Variable name | Type (`default`) | Default |
|
||||||
|
| -------------------------- | ---------------- | ---------------- |
|
||||||
|
| **`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_"` |
|
||||||
|
|
||||||
|
- **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"` |
|
||||||
|
|
||||||
|
- **castopod/web-server**
|
||||||
|
|
||||||
|
| Variable name | Type | Default |
|
||||||
|
| --------------------- | ------- | ------- |
|
||||||
|
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |
|
|
@ -0,0 +1,216 @@
|
||||||
|
---
|
||||||
|
title: Installation
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to install Castopod?
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
::: 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
|
||||||
|
|
||||||
|
- PHP v8.1 or higher
|
||||||
|
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
|
||||||
|
- HTTPS support
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
|
### PHP v8.1 or higher
|
||||||
|
|
||||||
|
PHP version 8.1 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).
|
||||||
|
|
||||||
|
::: 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.
|
||||||
|
|
||||||
|
#### 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):
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
> These tasks run **every minute**. You may set the frequency depending on
|
||||||
|
> your needs: every 5, 10 minutes or more.
|
||||||
|
|
||||||
|
### (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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### 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"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
|
## 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>
|
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: Security
|
||||||
|
---
|
||||||
|
|
||||||
|
# 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).
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
|
@ -0,0 +1,109 @@
|
||||||
|
---
|
||||||
|
title: Update
|
||||||
|
sidebarDepth: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# How to update Castopod?
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
You may need to reset files permissions as during the install process.
|
||||||
|
Check [Security Concerns](./security.md).
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
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!
|
||||||
|
|
||||||
|
::: info Note
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 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…
|
|
@ -0,0 +1,303 @@
|
||||||
|
---
|
||||||
|
sidebarDepth: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Welcome 👋
|
||||||
|
|
||||||
|
[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars]
|
||||||
|
|
||||||
|
Castopod is a free & open-source hosting platform made for podcasters who want
|
||||||
|
engage and interact with their audience.
|
||||||
|
|
||||||
|
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 the 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>
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 🌱 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… 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.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
## Contributors ✨
|
||||||
|
|
||||||
|
Thanks goes to these wonderful people
|
||||||
|
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt="Yassine Doghri"/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt="Benjamin Bellamy"/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ola Hneini"/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Romain de Laage"/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Lyonel Bernard"/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt="Christopher Lagonick-Weitzel"/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Ernesto Acosta"/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt="Bastien Luneteau"/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Cécile Ricordeau"/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Miś"/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt="Marcin Lewandowski"/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sebastian Janik"/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Patryk Karczmarczyk"/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="denis d"/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt="Douglas Kastle"/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="cExplorer"/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="ImaCrea"/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Jonas S"/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt="LEFEBVRE Yann"/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt="Sebastian Späth"/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="rocky III"/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt="Hermann Josef Eckl"/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Delhaye Cyrille"/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt="João Leandro"/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Angelos Chouvardas"/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt="Eivind"/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt="Ewen"/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt="forght"/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt="glottis0q"/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png?s=100" width="100px;" alt="ButterflyOfFire"/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt="Lucian I. Last"/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt="LuuzViir"/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt="CTHTC"/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt="Russian Retro"/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt="Marek L'ach"/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt="GunChleoc"/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt="GabiSnow"/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt="bendaha"/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt="Samuel Roland"/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Dimitri Regnier"/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png?s=100" width="100px;" alt="irithys"/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Sergi"/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt="ghose (XoseM)"/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/basen1982"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="Andreas Olsson"/><br /><sub><b>Andreas Olsson</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/leonfrom"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="leonfrom"/><br /><sub><b>leonfrom</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/agentcobra57"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="agentcobra"/><br /><sub><b>agentcobra</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/alephoto85"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg?s=100" width="100px;" alt="Alessandro"/><br /><sub><b>Alessandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://crowdin.com/profile/liimee"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt="liimee"/><br /><sub><b>liimee</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ahmedsabouni"><img src="https://avatars.githubusercontent.com/u/74497842?v=4?s=100" width="100px;" alt="Ahmed Sabouni"/><br /><sub><b>Ahmed Sabouni</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
This project follows the
|
||||||
|
[all-contributors](https://github.com/all-contributors/all-contributors)
|
||||||
|
specification. Contributions of any kind welcome!
|
||||||
|
|
||||||
|
## 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).
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
## 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
|
|
@ -22,6 +22,8 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服
|
||||||
- PHP 8.1 或更高版本
|
- PHP 8.1 或更高版本
|
||||||
- MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本
|
- MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本
|
||||||
- HTTPS 支持
|
- HTTPS 支持
|
||||||
|
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
|
||||||
|
incoming requests
|
||||||
|
|
||||||
### PHP 8.1 或更高版本
|
### PHP 8.1 或更高版本
|
||||||
|
|
||||||
|
@ -152,14 +154,45 @@ email.SMTPPass="你的邮件密码"
|
||||||
| **`SMTPPort`** | number | `25` |
|
| **`SMTPPort`** | number | `25` |
|
||||||
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
|
||||||
|
|
||||||
|
### S3
|
||||||
|
|
||||||
|
By default, files are stored in the `public/media` folder using the filesystem.
|
||||||
|
|
||||||
|
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` |
|
||||||
|
| **`path_style_endpoint`** | boolean | `false` |
|
||||||
|
|
||||||
## 社区套餐
|
## 社区套餐
|
||||||
|
|
||||||
如果你不想手动安装 Castopod,可以使用一个 由开源社区创建和维护的软件包。
|
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.
|
||||||
|
|
||||||
### 使用 YunoHost 安装
|
### Install with YunoHost
|
||||||
|
|
||||||
[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和
|
[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">
|
<div class="flex flex-wrap items-center gap-4">
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue