View Raw Ebuild
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_11 python3_12 python3_13 )
inherit systemd python-single-r1
DESCRIPTION="Funkwhale is a self-hosted, modern, free and open-source music server, heavily inspired by Grooveshark."
HOMEPAGE="https://www.funkwhale.audio/"
LICENSE="AGPL-3.0"
SLOT="0"
IUSE="+systemd +nginx apache python_single_target_python3_11 python_single_target_python3_12 python_single_target_python3_13"
REQUIRED_USE="^^ ( python_single_target_python3_11 python_single_target_python3_12 python_single_target_python3_13 )"
BEPEND="virtual/pkgconfig"
RDEPEND="\
acct-user/media\
acct-group/media\
"
DEPEND="\
${RDEPEND}\
media-libs/libjpeg-turbo\
dev-libs/libpqxx\
net-libs/libgsasl\
>=dev-db/postgresql-12.0\
>=dev-db/redis-6.0\
>=media-video/ffmpeg-4.3\
nginx? ( www-servers/nginx[nginx_modules_http_proxy,nginx_modules_http_ssl] )\
apache? ( www-servers/apache[apache2_modules_proxy,apache2_modules_proxy_http2,apache2_modules_http2,ssl] )\
dev-perl/File-LibMagic\
dev-python/python-magic\
dev-python/ldap3\
dev-python/python-ldap[sasl]\
sys-libs/zlib\
dev-libs/libffi\
dev-libs/openssl\
dev-libs/libxml2\
dev-libs/libxslt\
dev-python/virtualenv\
dev-vcs/git\
net-misc/curl\
dev-lang/python\
sys-apps/yarn\
net-libs/nodejs\
"
DISTUTILS_IN_SOURCE_BUILD=
INSTALL_DIR="/var/www/funkwhale"
CONFIG_DIR="/etc/funkwhale"
if [[ ${PV} == 9999 ]]; then
inherit git-r3
EGIT_REPO_URI="https://dev.funkwhale.audio/funkwhale/funkwhale"
EGIT_BRANCH="develop"
SRC_URI=""
KEYWORDS=""
MY_PV=${PV//_}
MY_P=${PN}-${MY_PV}
MY_PN="funkwhale"
S="${WORKDIR}"
else
MY_PV=${PV//_}
MY_PN="funkwhale"
MY_P="funkwhale-${MY_PV}"
#https://dev.funkwhale.audio/funkwhale/funkwhale/-/archive/1.4.1/funkwhale-1.4.1.tar.gz
SRC_URI="https://dev.funkwhale.audio/funkwhale/funkwhale/-/archive/${PV}/${MY_PN}-${PV}.tar.gz -> ${P}.gh.tar.gz"
KEYWORDS="~amd64 ~arm ~arm64 ~x86"
S="${WORKDIR}/"
fi
src_prepare() {
default
}
src_install() {
die() { eerror "$*" 1>&2 ; exit 1; }
mkdir -p "${D}${INSTALL_DIR}"
mkdir -p "${D}${CONFIG_DIR}"
#mkdir -p "${D}${INSTALL_DIR}/config"
mkdir -p "${D}${INSTALL_DIR}/api"
mkdir -p "${D}${INSTALL_DIR}/data/static"
mkdir -p "${D}${INSTALL_DIR}/data/media"
mkdir -p "${D}${INSTALL_DIR}/data/music"
mkdir -p "${D}${INSTALL_DIR}/front"
cp -R -f "${WORKDIR}/${MY_P}/api/." "${D}${INSTALL_DIR}/api/" || die "Install failed (API)!"
cp -R -f "${WORKDIR}/${MY_P}/front/." "${D}${INSTALL_DIR}/front/" || die "Install failed (front)!"
einfo "Example configurations will be stored here: \"${CONFIG_DIR}\"."
cp -f "${WORKDIR}/${MY_P}/deploy/env.prod.sample" "${D}${CONFIG_DIR}/env.example"
cp -f "${WORKDIR}/${MY_P}/deploy/funkwhale_proxy.conf" "${D}${CONFIG_DIR}/funkwhale_proxy.conf.example"
cp -f "${WORKDIR}/${MY_P}/deploy/nginx.template" "${D}${CONFIG_DIR}/nginx.template.example"
cp -f "${WORKDIR}/${MY_P}/deploy/apache.conf" "${D}${CONFIG_DIR}/apache.conf.example"
dosym "${CONFIG_DIR}" "${INSTALL_DIR}/config"
SECRETKEY=`openssl rand -base64 45`
if [[ ${PV} != 9999 ]]; then
sed -i "s,django-allauth = \"==0.42.0\",django-allauth = \"==0.50.0\"," "${D}${INSTALL_DIR}/api/pyproject.toml"
fi
elog "A base64 secret key was generated and stored in the example config file \"${CONFIG_DIR}/env.example\"."
sed -i "s,DJANGO_SECRET_KEY=,DJANGO_SECRET_KEY=\"$SECRETKEY\"," "${D}${CONFIG_DIR}/env.example"
sed -i "s,/srv/funkwhale,${INSTALL_DIR}," "${D}${CONFIG_DIR}/env.example"
sed -i "s,/srv/funkwhale,${INSTALL_DIR}," "${D}${CONFIG_DIR}/apache.conf.example"
sed -i "s,/srv/funkwhale,${INSTALL_DIR}," "${D}${INSTALL_DIR}/front/src/ui/components/UploadModal.vue"
sed -i "s,/srv/funkwhale,${INSTALL_DIR}," "${D}${INSTALL_DIR}/api/config/settings/common.py"
elog "Please pay attention to the fact that the example config file allows the wordwide access to the Funkwhale (FUNKWHALE_API_IP is set to \"0.0.0.0\" in the file \"${CONFIG_DIR}/env.example\")."
sed -i "s,FUNKWHALE_API_IP=127.0.0.1,FUNKWHALE_API_IP=0.0.0.0," "${D}${CONFIG_DIR}/env.example"
echo "\
DATABASE_URL=postgresql://funkwhale@:5432/funkwhale\
" >> "${D}${CONFIG_DIR}/env.example"
echo "\
CACHE_URL=redis://127.0.0.1:6379/0\
" >> "${D}${CONFIG_DIR}/env.example"
echo "\
REQUESTS_CA_BUNDLE=/etc/ssl/certs/localhost.crt\
" >> "${D}${CONFIG_DIR}/env.example"
elog "The example config \"${CONFIG_DIR}/env.example\" assumes that Redis is up and running and is passwordless, uses standard port 6379 and works locally."
elog "The example config \"${CONFIG_DIR}/env.example\" assumes that Postgres is also running locally and uses standard port 5432."
elog "It that's not the case - please don't forget to adjust settings accordingly."
sed -i "s,FUNKWHALE_HOSTNAME=yourdomain.funkwhale,FUNKWHALE_HOSTNAME=localhost," "${D}${CONFIG_DIR}/env.example"
sed -i "s,Define funkwhale-sn funkwhale.yourdomain.com, Define funkwhale-sn localhost," "${D}${CONFIG_DIR}/apache.conf.example"
chown -R media:media "${D}${INSTALL_DIR}"
echo "${PV}-${RANDOM}" > "${D}${INSTALL_DIR}/package_version.txt"
PYTHON_EXECUTABLE="python3"
if [[ ${PV} == 9999 ]]; then
PYTHON_EXECUTABLE="python3"
else
#if ! command -v python3.11 >/dev/null 2>&1
#then
if use python_single_target_python3_11;then
PYTHON_EXECUTABLE="python3.11"
else
if use python_single_target_python3_12;then
PYTHON_EXECUTABLE="python3.12"
else
PYTHON_EXECUTABLE="python3.13"
fi
fi
fi
if use nginx; then
cp -f "${FILESDIR}/installer-cli-nginx.sh" funkwhale-installer-cli || die
elif use apache; then
cp -f "${FILESDIR}/installer-cli-apache.sh" funkwhale-installer-cli || die
sed -i "s,REVERSE_PROXY_TYPE=nginx,REVERSE_PROXY_TYPE=apache2," "${D}${CONFIG_DIR}/env.example"
else
cp -f "${FILESDIR}/installer-cli.sh" funkwhale-installer-cli || die
fi
if [[ ${PV} != 9999 ]]; then
sed -i "s,python3,${PYTHON_EXECUTABLE}," funkwhale-installer-cli
fi
dosbin funkwhale-installer-cli
chown -R media:media config
chown -R media:media data
chown -R media:media "${D}${INSTALL_DIR}"
cd "${D}"
keepdir "${INSTALL_DIR}/data/static"
keepdir "${INSTALL_DIR}/data/media"
keepdir "${INSTALL_DIR}/data/music"
if use systemd; then
systemd_newunit "${FILESDIR}"/funkwhale.target funkwhale.target
systemd_newunit "${FILESDIR}"/funkwhale-server.service funkwhale-server.service
systemd_newunit "${FILESDIR}"/funkwhale-worker.service funkwhale-worker.service
systemd_newunit "${FILESDIR}"/funkwhale-beat.service funkwhale-beat.service
fi
}
pkg_postinst() {
elog ""
elog ""
elog ""
elog " [!!!] Package installed, now it has to be configured. [!!!] "
elog ""
#if [[ ${PV} == 9999 ]]; then
elog "You can do it by running \"emerge --config www-misc/funkwhale\" "
#else
# elog "You can do it by running \"emerge --config www-misc/funkwhale:${PV}\" "
#fi
elog ""
elog ""
elog ""
elog "...or do the following (if manual way is preferred):"
elog "run funkwhale-installer-cli after this installation in order to complete setup."
if use systemd; then
elog "[Systemd] related:"
elog "There are four systemd services installed."
elog "After the installation script finishes it's work, please perform the following:"
elog "sudo systemctl daemon-reload"
elog "sudo systemctl start funkwhale.target"
elog "sudo systemctl enable --now funkwhale.target"
elog "Ideally you'd want to reboot after that."
elog "Alternatively, you may run this:"
elog "systemctl start funkwhale-worker.service funkwhale-server.service funkwhale-beat.service"
fi
if use nginx; then
elog "[Nginx] related:"
elog "After all of that, you probably want to enable the Nginx configuration."
elog "The easiest way is to perform it like that:"
elog "sudo ln -s ${EROOT}/etc/nginx/sites-available/funkwhale.conf ${EROOT}/etc/nginx/funkwhale_vhost.conf"
elog "Afterwards don't forget to restart nginx."
if use systemd; then
elog "systemctl restart nginx"
else
elog "rc-service nginx restart"
fi
fi
if use apache; then
elog "[Apache] related:"
elog "As you decided to use apache, the configutation for this server can be found in here: ${EROOT}/etc/apache2/sites-available/funkwhale.conf"
elog "Just enable this virtualhost."
elog "Afterwards don't forget to restart apache."
if use systemd; then
elog "systemctl restart apache2"
else
elog "/etc/init.d/apache2 reload"
fi
fi
}
pkg_config() {
if [[ -f "${EROOT}${INSTALL_DIR}/package_version_init.txt" ]]; then
PACKAGEVERSION=`cat ${EROOT}${INSTALL_DIR}/package_version_init.txt`
PACKAGEVERSIONTEST=`cat ${EROOT}${INSTALL_DIR}/package_version.txt`
if [[ "${PACKAGEVERSIONTEST}" != "${PACKAGEVERSION}" ]]; then
if [[ ${PV} == 9999 ]]; then
einfo "Package was already configured for a different version - most probably it was reinstalled."
else
einfo "Package was already configured for a different version - looks like it is an upgrade or reinstall."
fi
else
einfo "Package is already configured for this exact version. Please confirm you want to reconfigure it."
fi
einfo "If you don't want to re-configure, please press Ctrl+C now."
einfo "Otherwise, press Enter."
read
einfo "Performing re-configuration."
rm -f "${EROOT}${INSTALL_DIR}/package_version_init.txt"
cd "${EROOT}${INSTALL_DIR}"
if use systemd; then
einfo "Stopping systemd service."
systemctl daemon-reload
systemctl stop funkwhale.target
fi
einfo "Cleaning up."
rm -Rf api/* front/* venv
else
einfo "This will start the configuration phase."
einfo "Press Enter to continue or Ctrl+C to cancel."
read
einfo "Performing configuration."
fi
cd "${EROOT}${INSTALL_DIR}"
einfo "Running installer."
funkwhale-installer-cli
if use systemd; then
einfo "Enabling systemd services..."
systemctl daemon-reload
systemctl start funkwhale.target
systemctl enable --now funkwhale.target
einfo "Finished with systemd services."
einfo "Ideally you'd want to reboot after that."
einfo "Alternatively, you may run this if the services appear to be not running:"
einfo "systemctl start funkwhale-worker.service funkwhale-server.service funkwhale-beat.service"
fi
if use nginx; then
ln -sf "${EROOT}/etc/nginx/sites-available/funkwhale.conf" "${EROOT}/etc/nginx/funkwhale_vhost.conf"
einfo "Don't forget to restart nginx after checking it's configuration, like this:"
if use systemd; then
einfo "systemctl restart nginx"
else
einfo "rc-service nginx restart"
fi
fi
if use apache; then
einfo "The Apache configutation for this server can be found in here: ${EROOT}/etc/apache2/sites-available/funkwhale.conf"
einfo "Just enable this virtualhost."
einfo "Afterwards don't forget to restart apache, like this:"
if use systemd; then
einfo "systemctl restart apache2"
else
einfo "/etc/init.d/apache2 reload"
fi
fi
einfo "Configuration finished."
}
pkg_prerm() {
if use systemd; then
einfo "Stopping systemd services."
systemctl daemon-reload
systemctl stop funkwhale.target
systemctl disable funkwhale.target
fi
if use nginx; then
einfo "Removing Nginx templates."
[[ -e "${EROOT}/etc/nginx/funkwhale_vhost.conf" ]] && rm -f "${EROOT}/etc/nginx/funkwhale_vhost.conf"
[[ -e "${EROOT}/etc/nginx/funkwhale_proxy.conf" ]] && rm -f "${EROOT}/etc/nginx/funkwhale_proxy.conf"
[[ -e "${EROOT}/etc/nginx/sites-available/funkwhale.template" ]] && rm -f "${EROOT}/etc/nginx/sites-available/funkwhale.template"
fi
einfo "Removing virtual environment and static files."
[[ -f "${EROOT}/usr/sbin/funkwhale-installer-cli" ]] && rm -f "${EROOT}/usr/sbin/funkwhale-installer-cli"
[[ -d "${EROOT}${INSTALL_DIR}/venv" ]] && rm -rf "${EROOT}${INSTALL_DIR}/venv"
[[ -d "${EROOT}${INSTALL_DIR}/front" ]] && rm -rf "${EROOT}${INSTALL_DIR}/front"
[[ -d "${EROOT}${INSTALL_DIR}/api" ]] && rm -rf "${EROOT}${INSTALL_DIR}/api"
[[ -d "${EROOT}${INSTALL_DIR}/data/static" ]] && rm -rf "${EROOT}${INSTALL_DIR}/data/static"
[[ -f "${EROOT}${INSTALL_DIR}/package_version_init.txt" ]] && rm -f "${EROOT}${INSTALL_DIR}/package_version_init.txt"
}
pkg_postrm() {
if [[ -d "${EROOT}${INSTALL_DIR}" ]]; then
ewarn ""
ewarn "The directory \"${EROOT}${INSTALL_DIR}\" was not completely removed."
ewarn "If that is not the expected behaviour, please remove it manually."
ewarn ""
fi
if [[ -d "${EROOT}${CONFIG_DIR}" ]]; then
ewarn ""
ewarn "The uninstall action did not remove the configuration files."
ewarn "They were left intact here: \"${EROOT}${CONFIG_DIR}\""
ewarn ""
fi
if use nginx; then
ewarn ""
ewarn "Please don't forget to reload nginx manually after this uninstallation."
ewarn ""
fi
}