mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-20 21:46:04 -05:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
632db06ca3 | ||
|
|
0129ab6732 | ||
|
|
2b65afc8dd | ||
|
|
b27e3ca6f6 | ||
|
|
1a7adb80da | ||
|
|
2552551662 | ||
|
|
3b35ce0262 | ||
|
|
883af9bb4a |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,6 +1,8 @@
|
||||
media_files/encoded/
|
||||
media_files/original/
|
||||
media_files/hls/
|
||||
media_files/chunks/
|
||||
media_files/uploads/
|
||||
postgres_data/
|
||||
celerybeat-schedule
|
||||
logs/
|
||||
|
||||
12
Dockerfile
12
Dockerfile
@@ -16,12 +16,12 @@ RUN pip install -r requirements.txt
|
||||
COPY . /home/mediacms.io/mediacms
|
||||
WORKDIR /home/mediacms.io/mediacms
|
||||
|
||||
RUN wget -q http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip && \
|
||||
unzip Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip -d ../bento4 && \
|
||||
mv ../bento4/Bento4-SDK-1-6-0-632.x86_64-unknown-linux/* ../bento4/ && \
|
||||
rm -rf ../bento4/Bento4-SDK-1-6-0-632.x86_64-unknown-linux && \
|
||||
RUN wget -q http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip && \
|
||||
unzip Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip -d ../bento4 && \
|
||||
mv ../bento4/Bento4-SDK-1-6-0-637.x86_64-unknown-linux/* ../bento4/ && \
|
||||
rm -rf ../bento4/Bento4-SDK-1-6-0-637.x86_64-unknown-linux && \
|
||||
rm -rf ../bento4/docs && \
|
||||
rm Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip
|
||||
rm Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
|
||||
|
||||
############ RUNTIME IMAGE ############
|
||||
FROM python:3.8-slim-buster as runtime-image
|
||||
@@ -47,7 +47,7 @@ ENV ENABLE_MIGRATIONS='yes'
|
||||
ENV VIRTUAL_ENV=/home/mediacms.io
|
||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||
|
||||
COPY --from=compile-image /home/mediacms.io /home/mediacms.io
|
||||
COPY --chown=www-data:www-data --from=compile-image /home/mediacms.io /home/mediacms.io
|
||||
|
||||
RUN apt-get update -y && apt-get -y upgrade && apt-get install --no-install-recommends \
|
||||
supervisor nginx ffmpeg imagemagick procps -y && \
|
||||
|
||||
23
README.md
23
README.md
@@ -9,18 +9,11 @@ A demo is available at https://demo.mediacms.io
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
Vanilla MediaCMS index page
|
||||
|
||||

|
||||
|
||||
Video page with player different options
|
||||
|
||||

|
||||
|
||||
Embed video page
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/mediacms-io/mediacms/main/docs/images/index.jpg" width="340">
|
||||
<img src="https://raw.githubusercontent.com/mediacms-io/mediacms/main/docs/images/video.jpg" width="340">
|
||||
<img src="https://raw.githubusercontent.com/mediacms-io/mediacms/main/docs/images/embed.jpg" width="340">
|
||||
</p>
|
||||
|
||||
## Features
|
||||
- **Complete control over your data**: host it yourself!
|
||||
@@ -94,15 +87,15 @@ git clone https://github.com/mediacms-io/mediacms
|
||||
cd mediacms
|
||||
```
|
||||
|
||||
The default option to serve MediaCMS is on http://localhost. If you want to set a url and have it served there, set the `FRONTEND_HOST` variable on file `deploy/docker/local_settings.py`.
|
||||
The default option is to serve MediaCMS on all ips available of the server (including localhost).
|
||||
|
||||
Now run
|
||||
|
||||
```bash
|
||||
docker-compose build && docker-compose up
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
This will build an image, download and setup necessary Docker images and start all containers. Once it finishes, MediaCMS will be installed and available on http://localhost (or the url you've set as `FRONTEND_HOST` on file `deploy/docker/local_settings.py`)
|
||||
This will download all MediaCMS related Docker images and start all containers. Once it finishes, MediaCMS will be installed and available on http://localhost or http://ip
|
||||
|
||||
For more instructions, checkout the docs on the [Docker deployment](docs/Docker_deployment.md) page. Docker Compose support has been contributed by @swiftugandan.
|
||||
|
||||
|
||||
@@ -42,7 +42,11 @@ ALLOW_RATINGS_CONFIRMED_EMAIL_ONLY = True
|
||||
|
||||
# ip of the server should be part of this
|
||||
ALLOWED_HOSTS = ["*", "mediacms.io", "127.0.0.1", "localhost"]
|
||||
|
||||
FRONTEND_HOST = "http://localhost"
|
||||
# this variable - along with SSL_FRONTEND_HOST is used on several places
|
||||
# as email where a URL need appear etc
|
||||
|
||||
# FRONTEND_HOST needs an http prefix - at the end of the file
|
||||
# there's a conversion to https with the SSL_FRONTEND_HOST env
|
||||
INTERNAL_IPS = "127.0.0.1"
|
||||
@@ -209,7 +213,7 @@ CANNOT_ADD_MEDIA_MESSAGE = ""
|
||||
|
||||
# mp4hls command, part of Bendo4
|
||||
MP4HLS_COMMAND = (
|
||||
"/home/mediacms.io/mediacms/Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/mp4hls"
|
||||
"/home/mediacms.io/mediacms/Bento4-SDK-1-6-0-637.x86_64-unknown-linux/bin/mp4hls"
|
||||
)
|
||||
|
||||
# highly experimental, related with remote workers
|
||||
|
||||
@@ -4,6 +4,7 @@ set -e
|
||||
# forward request and error logs to docker log collector
|
||||
ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log && \
|
||||
ln -sf /dev/stdout /var/log/nginx/mediacms.io.access.log && ln -sf /dev/stderr /var/log/nginx/mediacms.io.error.log
|
||||
|
||||
cp /home/mediacms.io/mediacms/deploy/docker/local_settings.py /home/mediacms.io/mediacms/cms/local_settings.py
|
||||
|
||||
mkdir -p /home/mediacms.io/mediacms/{logs,pids,media_files/hls}
|
||||
@@ -12,8 +13,6 @@ touch /home/mediacms.io/mediacms/logs/debug.log
|
||||
# Remove any dangling pids
|
||||
rm -rf /home/mediacms.io/mediacms/pids/*
|
||||
|
||||
chown -R www-data. /home/mediacms.io/
|
||||
|
||||
TARGET_GID=$(stat -c "%g" /home/mediacms.io/mediacms/)
|
||||
|
||||
EXISTS=$(cat /etc/group | grep $TARGET_GID | wc -l)
|
||||
@@ -28,6 +27,9 @@ else
|
||||
usermod -a -G $GROUP www-data
|
||||
fi
|
||||
|
||||
# We should do this only for folders that have a different owner, since it is an expensive operation
|
||||
find /home/mediacms.io/ ! \( -user www-data -group $TARGET_GID \) -exec chown www-data:$TARGET_GID {} +
|
||||
|
||||
chmod +x /home/mediacms.io/mediacms/deploy/docker/start.sh /home/mediacms.io/mediacms/deploy/docker/prestart.sh
|
||||
|
||||
exec "$@"
|
||||
|
||||
@@ -7,15 +7,15 @@ server {
|
||||
|
||||
error_log /var/log/nginx/mediacms.io.error.log warn;
|
||||
|
||||
# redirect to https if logged in
|
||||
if ($http_cookie ~* "sessionid") {
|
||||
rewrite ^/(.*)$ https://localhost/$1 permanent;
|
||||
}
|
||||
# # redirect to https if logged in
|
||||
# if ($http_cookie ~* "sessionid") {
|
||||
# rewrite ^/(.*)$ https://localhost/$1 permanent;
|
||||
# }
|
||||
|
||||
# redirect basic forms to https
|
||||
location ~ (login|login_form|register|mail_password_form)$ {
|
||||
rewrite ^/(.*)$ https://localhost/$1 permanent;
|
||||
}
|
||||
# # redirect basic forms to https
|
||||
# location ~ (login|login_form|register|mail_password_form)$ {
|
||||
# rewrite ^/(.*)$ https://localhost/$1 permanent;
|
||||
# }
|
||||
|
||||
location /static {
|
||||
alias /home/mediacms.io/mediacms/static ;
|
||||
|
||||
@@ -9,7 +9,7 @@ services:
|
||||
- /var/run/docker.sock:/tmp/docker.sock:ro
|
||||
- ./deploy/docker/reverse_proxy/client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro
|
||||
migrations:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -24,10 +24,7 @@ services:
|
||||
db:
|
||||
condition: service_healthy
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
target: runtime-image
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
@@ -41,7 +38,7 @@ services:
|
||||
depends_on:
|
||||
- migrations
|
||||
celery_beat:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -53,7 +50,7 @@ services:
|
||||
depends_on:
|
||||
- redis
|
||||
celery_worker:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
|
||||
@@ -11,7 +11,7 @@ services:
|
||||
- ./deploy/docker/reverse_proxy/certs/:/etc/nginx/certs/
|
||||
- ./deploy/docker/reverse_proxy/client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro
|
||||
migrations:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -26,10 +26,7 @@ services:
|
||||
db:
|
||||
condition: service_healthy
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
target: runtime-image
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
@@ -43,7 +40,7 @@ services:
|
||||
depends_on:
|
||||
- migrations
|
||||
celery_beat:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -55,7 +52,7 @@ services:
|
||||
depends_on:
|
||||
- redis
|
||||
celery_worker:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 2
|
||||
volumes:
|
||||
|
||||
@@ -2,7 +2,7 @@ version: "3"
|
||||
|
||||
services:
|
||||
migrations:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/deploy/docker/local_settings.py
|
||||
environment:
|
||||
@@ -17,10 +17,7 @@ services:
|
||||
db:
|
||||
condition: service_healthy
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
target: runtime-image
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
ports:
|
||||
@@ -37,7 +34,7 @@ services:
|
||||
depends_on:
|
||||
- migrations
|
||||
celery_beat:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/deploy/docker/local_settings.py
|
||||
environment:
|
||||
@@ -49,7 +46,7 @@ services:
|
||||
depends_on:
|
||||
- redis
|
||||
celery_worker:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
|
||||
@@ -2,7 +2,7 @@ version: "3"
|
||||
|
||||
services:
|
||||
migrations:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -17,10 +17,7 @@ services:
|
||||
db:
|
||||
condition: service_healthy
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
target: runtime-image
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
ports:
|
||||
@@ -35,7 +32,7 @@ services:
|
||||
depends_on:
|
||||
- migrations
|
||||
celery_beat:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- ./:/home/mediacms.io/mediacms/
|
||||
environment:
|
||||
@@ -47,7 +44,7 @@ services:
|
||||
depends_on:
|
||||
- redis
|
||||
celery_worker:
|
||||
image: mediacms:latest
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
@@ -80,4 +77,4 @@ services:
|
||||
test: ["CMD", "redis-cli","ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
retries: 3
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
A number of options are available on `cms/settings.py`.
|
||||
|
||||
It is advisable to override any of them by adding it to `cms/local_settings.py` .
|
||||
It is advisable to override any of them by adding it to `local_settings.py` .
|
||||
|
||||
In case of a the single server installation, add to `cms/local_settings.py` .
|
||||
|
||||
In case of a docker compose installation, add to `deploy/docker/local_settings.py` . This will automatically overwrite `cms/local_settings.py` .
|
||||
|
||||
Any change needs restart of MediaCMS in order to take effect. So edit `cms/local_settings.py`, make a change and restart MediaCMS
|
||||
|
||||
@@ -94,6 +98,14 @@ Make changes (True/False) to any of the following:
|
||||
- CAN_SHARE_MEDIA = True # whether the share media appears
|
||||
```
|
||||
|
||||
### show/hide the download option on a media
|
||||
|
||||
Edit `templates/config/installation/features.html` and set
|
||||
|
||||
```
|
||||
download: false
|
||||
```
|
||||
|
||||
### automatically hide media upon being reported
|
||||
|
||||
set a low number for variable `REPORTED_TIMES_THRESHOLD`
|
||||
|
||||
@@ -37,4 +37,4 @@ The reverse proxy (`jwilder/nginx-proxy`) can be configured to provide SSL termi
|
||||
|
||||
The architecture below generalises all the deployment scenarios above, and provides a conceptual design for other deployments based on kubernetes and docker swarm. It allows for horizontal scaleability through the use of multiple mediacms_web instances and celery_workers. For large deployments, managed postgres, redis and storage may be adopted.
|
||||
|
||||

|
||||

|
||||
|
||||
@@ -5,12 +5,7 @@ from .methods import is_mediacms_editor, is_mediacms_manager
|
||||
def stuff(request):
|
||||
"""Pass settings to the frontend"""
|
||||
ret = {}
|
||||
if request.is_secure():
|
||||
# in case session is https, pass this setting so
|
||||
# that the frontend uses https too
|
||||
ret["FRONTEND_HOST"] = settings.SSL_FRONTEND_HOST
|
||||
else:
|
||||
ret["FRONTEND_HOST"] = settings.FRONTEND_HOST
|
||||
ret["FRONTEND_HOST"] = request.build_absolute_uri('/')
|
||||
ret["DEFAULT_THEME"] = settings.DEFAULT_THEME
|
||||
ret["PORTAL_NAME"] = settings.PORTAL_NAME
|
||||
ret["LOAD_FROM_CDN"] = settings.LOAD_FROM_CDN
|
||||
|
||||
@@ -115,8 +115,8 @@ fi
|
||||
# Bento4 utility installation, for HLS
|
||||
|
||||
cd /home/mediacms.io/mediacms
|
||||
wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip
|
||||
unzip Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip
|
||||
wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
|
||||
unzip Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
|
||||
mkdir /home/mediacms.io/mediacms/media_files/hls
|
||||
|
||||
# last, set default owner
|
||||
|
||||
@@ -9,7 +9,7 @@ uwsgi==2.0.19.1
|
||||
django-redis==4.12.1
|
||||
celery==4.4.7
|
||||
|
||||
Pillow==8.0.1
|
||||
Pillow==8.1.1
|
||||
django-imagekit
|
||||
markdown
|
||||
django-filter
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
MediaCMS.url = {
|
||||
home: "{{FRONTEND_HOST}}",
|
||||
search: "{{FRONTEND_HOST}}/search",
|
||||
latestMedia: "{{FRONTEND_HOST}}/latest",
|
||||
featuredMedia: "{{FRONTEND_HOST}}/featured",
|
||||
recommendedMedia: "{{FRONTEND_HOST}}/recommended",
|
||||
members: "{{FRONTEND_HOST}}/members",
|
||||
/* Error pages */
|
||||
error404: "{{FRONTEND_HOST}}/error",
|
||||
/* Taxonomies pages */
|
||||
tags: "{{FRONTEND_HOST}}/tags",
|
||||
categories: "{{FRONTEND_HOST}}/categories",
|
||||
topics: "{{FRONTEND_HOST}}/topics",
|
||||
languages: "{{FRONTEND_HOST}}/languages",
|
||||
countries: "{{FRONTEND_HOST}}/countries",
|
||||
/* User pages */
|
||||
likedMedia: "{{FRONTEND_HOST}}/liked",
|
||||
history: "{{FRONTEND_HOST}}/history",
|
||||
/* Add/edit pages */
|
||||
addMedia: "{{FRONTEND_HOST}}/upload",
|
||||
/* User account pages */
|
||||
editProfile: "{{user.edit_url}}",
|
||||
{% if request.user.is_authenticated %}
|
||||
signout: "{{FRONTEND_HOST}}/accounts/logout/",
|
||||
editChannel: "{{user.default_channel_edit_url}}",
|
||||
changePassword: "{{FRONTEND_HOST}}/accounts/password/change/",
|
||||
/* Administration pages */
|
||||
{% if IS_MEDIACMS_ADMIN %}admin: '/admin',{% endif %}
|
||||
/* Management pages */
|
||||
{% if IS_MEDIACMS_ADMIN or IS_MEDIACMS_MANAGER or IS_MEDIACMS_EDITOR %}manageMedia: "{{FRONTEND_HOST}}/manage/media",{% endif %}
|
||||
{% if IS_MEDIACMS_ADMIN or IS_MEDIACMS_MANAGER %}manageUsers: "{{FRONTEND_HOST}}/manage/users",{% endif %}
|
||||
{% if IS_MEDIACMS_ADMIN or IS_MEDIACMS_MANAGER or IS_MEDIACMS_EDITOR %}manageComments: "{{FRONTEND_HOST}}/manage/comments",{% endif %}
|
||||
{% else %}
|
||||
signin: "{{FRONTEND_HOST}}/accounts/login/",
|
||||
register: "{{FRONTEND_HOST}}/accounts/signup/",
|
||||
{% endif %}
|
||||
};
|
||||
MediaCMS.url = {
|
||||
home: "/",
|
||||
search: "/search",
|
||||
latestMedia: "/latest",
|
||||
featuredMedia: "/featured",
|
||||
recommendedMedia: "/recommended",
|
||||
members: "/members",
|
||||
/* Error pages */
|
||||
error404: "/error",
|
||||
/* Taxonomies pages */
|
||||
tags: "/tags",
|
||||
categories: "/categories",
|
||||
topics: "/topics",
|
||||
languages: "/languages",
|
||||
countries: "/countries",
|
||||
/* User pages */
|
||||
likedMedia: "/liked",
|
||||
history: "/history",
|
||||
/* Add/edit pages */
|
||||
addMedia: "/upload",
|
||||
/* User account pages */
|
||||
editProfile: "{{user.edit_url}}",
|
||||
{% if request.user.is_authenticated %}
|
||||
signout: "/accounts/logout/",
|
||||
editChannel: "{{user.default_channel_edit_url}}",
|
||||
changePassword: "/accounts/password/change/",
|
||||
/* Administration pages */
|
||||
{% if IS_MEDIACMS_ADMIN %}admin: '/admin',{% endif %}
|
||||
/* Management pages */
|
||||
{% if IS_MEDIACMS_EDITOR %}manageMedia: "/manage/media",{% endif %}
|
||||
{% if IS_MEDIACMS_MANAGER %}manageUsers: "/manage/users",{% endif %}
|
||||
{% if IS_MEDIACMS_EDITOR %}manageComments: "/manage/comments",{% endif %}
|
||||
{% else %}
|
||||
signin: "/accounts/login/",
|
||||
register: "/accounts/signup/",
|
||||
{% endif %}
|
||||
};
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
MediaCMS.site = {
|
||||
id: 'mediacms',
|
||||
title: "{{PORTAL_NAME}}",
|
||||
url: '{{FRONTEND_HOST}}/',
|
||||
api: '{{FRONTEND_HOST}}/api/v1',
|
||||
url: '{{FRONTEND_HOST}}',
|
||||
api: '{{FRONTEND_HOST}}api/v1',
|
||||
theme: {
|
||||
mode: 'light', // Valid values: 'light', 'dark'.
|
||||
switch: {
|
||||
@@ -11,12 +11,12 @@ MediaCMS.site = {
|
||||
},
|
||||
logo:{
|
||||
lightMode:{
|
||||
img: "{{FRONTEND_HOST}}/static/images/logo_dark.png",
|
||||
svg: "{{FRONTEND_HOST}}/static/images/logo_dark.svg",
|
||||
img: "/static/images/logo_dark.png",
|
||||
svg: "/static/images/logo_dark.svg",
|
||||
},
|
||||
darkMode:{
|
||||
img: "{{FRONTEND_HOST}}/static/images/logo_light.png",
|
||||
svg: "{{FRONTEND_HOST}}/static/images/logo_light.svg",
|
||||
img: "/static/images/logo_light.png",
|
||||
svg: "/static/images/logo_light.svg",
|
||||
},
|
||||
},
|
||||
pages: {
|
||||
@@ -49,4 +49,5 @@ MediaCMS.site = {
|
||||
title: 'Categories',
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user