Compare commits

...

2 Commits

Author SHA1 Message Date
Markos Gogoulos
2216efa3a4 wtv 2025-11-15 19:49:13 +02:00
Markos Gogoulos
e8377d4623 this 2025-11-15 19:30:38 +02:00
9 changed files with 88 additions and 56 deletions

View File

@@ -52,11 +52,12 @@ RUN apt-get update -y && \
libxmlsec1-dev \
libxmlsec1-openssl \
libpq-dev \
gosu \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Set up virtualenv
RUN mkdir -p /home/mediacms.io/mediacms/{logs,media_files,static_files} && \
RUN mkdir -p /home/mediacms.io/mediacms/{logs,media_files,static} && \
cd /home/mediacms.io && \
python3 -m venv $VIRTUAL_ENV
@@ -92,11 +93,26 @@ WORKDIR /home/mediacms.io/mediacms
COPY config/imagemagick/policy.xml /etc/ImageMagick-6/policy.xml
# Copy local_settings.py from config to cms/ for default Docker config (if exists)
RUN cp config/local_settings.py cms/local_settings.py 2>/dev/null || true
RUN if [ -f config/local_settings.py ]; then \
cp config/local_settings.py cms/local_settings.py && \
chown www-data:www-data cms/local_settings.py && \
echo "Docker local_settings.py applied"; \
else \
echo "No config/local_settings.py found, using default settings"; \
fi
# Create www-data user directories and set permissions
RUN mkdir -p /var/run/mediacms && \
chown www-data:www-data /var/run/mediacms
chown -R www-data:www-data /home/mediacms.io/mediacms/logs \
/home/mediacms.io/mediacms/media_files \
/home/mediacms.io/mediacms/static \
/var/run/mediacms
# Copy and set up entrypoint script
COPY scripts/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
############ WEB IMAGE (Django/uWSGI) ############
FROM base AS web
@@ -107,8 +123,6 @@ RUN uv pip install uwsgi
# Copy uWSGI configuration
COPY config/uwsgi/uwsgi.ini /home/mediacms.io/mediacms/uwsgi.ini
USER www-data
EXPOSE 9000
CMD ["/home/mediacms.io/bin/uwsgi", "--ini", "/home/mediacms.io/mediacms/uwsgi.ini"]
@@ -116,19 +130,13 @@ CMD ["/home/mediacms.io/bin/uwsgi", "--ini", "/home/mediacms.io/mediacms/uwsgi.i
############ WORKER IMAGE (Celery) ############
FROM base AS worker
USER www-data
# CMD will be overridden in docker-compose for different worker types
############ FULL WORKER IMAGE (Celery with extra codecs) ############
FROM worker AS worker-full
USER root
COPY requirements-full.txt ./
RUN mkdir -p /root/.cache/ && \
chmod go+rwx /root/ && \
chmod go+rwx /root/.cache/ && \
uv pip install -r requirements-full.txt
USER www-data

View File

@@ -253,7 +253,7 @@ POST_UPLOAD_AUTHOR_MESSAGE_UNLISTED_NO_COMMENTARY = ""
CANNOT_ADD_MEDIA_MESSAGE = "User cannot add media, or maximum number of media uploads has been reached."
# mp4hls command, part of Bento4
MP4HLS_COMMAND = "/home/mediacms.io/mediacms/Bento4-SDK-1-6-0-637.x86_64-unknown-linux/bin/mp4hls"
MP4HLS_COMMAND = "/home/mediacms.io/bento4/bin/mp4hls"
# highly experimental, related with remote workers
ADMIN_TOKEN = ""
@@ -370,41 +370,30 @@ FILE_UPLOAD_HANDLERS = [
"django.core.files.uploadhandler.TemporaryFileUploadHandler",
]
LOGS_DIR = os.path.join(BASE_DIR, "logs")
error_filename = os.path.join(LOGS_DIR, "debug.log")
if not os.path.exists(LOGS_DIR):
try:
os.mkdir(LOGS_DIR)
except PermissionError:
pass
if not os.path.isfile(error_filename):
open(error_filename, 'a').close()
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "%(levelname)s %(asctime)s %(module)s "
"%(process)d %(thread)d %(message)s"
}
},
"handlers": {
"file": {
"level": "ERROR",
"class": "logging.FileHandler",
"filename": error_filename,
},
},
"loggers": {
"django": {
"handlers": ["file"],
"level": "ERROR",
"propagate": True,
},
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "verbose",
}
},
"root": {"level": "INFO", "handlers": ["console"]},
}
DATABASES = {"default": {"ENGINE": "django.db.backends.postgresql", "NAME": "mediacms", "HOST": "127.0.0.1", "PORT": "5432", "USER": "mediacms", "PASSWORD": "mediacms", "OPTIONS": {'pool': True}}}
DATABASES = {"default": {"ENGINE": "django.db.backends.postgresql", "NAME": "mediacms", "HOST": "db", "PORT": "5432", "USER": "mediacms", "PASSWORD": "mediacms", "OPTIONS": {'pool': True}}}
REDIS_LOCATION = "redis://127.0.0.1:6379/1"
REDIS_LOCATION = "redis://redis:6379/1"
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",

View File

@@ -1,4 +1,4 @@
user www-data;
user nginx;
worker_processes auto;
pid /run/nginx.pid;

View File

@@ -12,7 +12,7 @@ threads = 2
master = true
socket = 127.0.0.1:9000
socket = 0.0.0.0:9000
workers = 2

View File

@@ -7,7 +7,7 @@ services:
environment:
ADMIN_USER: 'admin'
ADMIN_EMAIL: 'admin@localhost'
# ADMIN_PASSWORD: 'uncomment_and_set_password_here'
ADMIN_PASSWORD: # ADMIN_PASSWORD: 'uncomment_and_set_password_here'
restart: "no"
depends_on:
redis:
@@ -15,7 +15,7 @@ services:
db:
condition: service_healthy
volumes:
- static_files:/home/mediacms.io/mediacms/static_files
- static_files:/home/mediacms.io/mediacms/static
- media_files:/home/mediacms.io/mediacms/media_files
- logs:/home/mediacms.io/mediacms/logs
@@ -32,7 +32,7 @@ services:
db:
condition: service_healthy
volumes:
- static_files:/home/mediacms.io/mediacms/static_files
- static_files:/home/mediacms.io/mediacms/static
- media_files:/home/mediacms.io/mediacms/media_files
- logs:/home/mediacms.io/mediacms/logs
@@ -51,7 +51,7 @@ services:
celery_beat:
image: mediacms/mediacms-worker:7.3
restart: unless-stopped
command: ["/home/mediacms.io/bin/celery", "-A", "cms", "beat", "--loglevel=INFO"]
command: ["/home/mediacms.io/bin/celery", "-A", "cms", "beat", "--loglevel=INFO", "--schedule=/home/mediacms.io/mediacms/logs/celerybeat-schedule"]
depends_on:
migrations:
condition: service_completed_successfully

View File

@@ -110,7 +110,7 @@ urlpatterns = [
re_path(r"^manage/users$", views.manage_users, name="manage_users"),
# Media uploads in ADMIN created pages
re_path(r"^tinymce/upload/", tinymce_handlers.upload_image, name="tinymce_upload_image"),
re_path("^(?P<slug>[\w.-]*)$", views.get_page, name="get_page"), # noqa: W605
re_path(r"^(?P<slug>[\w.-]*)$", views.get_page, name="get_page"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -e
# Fix permissions on volume mounts
chown -R www-data:www-data \
/home/mediacms.io/mediacms/logs \
/home/mediacms.io/mediacms/media_files \
/home/mediacms.io/mediacms/static \
2>/dev/null || true
# Run as www-data user
exec gosu www-data "$@"

19
scripts/entrypoint.sh Normal file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
# Fix permissions on mounted volumes if running as root
if [ "$(id -u)" = "0" ]; then
echo "Fixing permissions on data directories..."
chown -R www-data:www-data /home/mediacms.io/mediacms/logs \
/home/mediacms.io/mediacms/media_files \
/home/mediacms.io/mediacms/static_files \
/var/run/mediacms 2>/dev/null || true
# If command starts with python or celery, run as www-data
if [ "${1:0:1}" != '-' ]; then
exec gosu www-data "$@"
fi
fi
# Execute the command
exec "$@"

View File

@@ -5,18 +5,22 @@ echo "========================================="
echo "MediaCMS Migrations Starting..."
echo "========================================="
# Wait for database to be ready
until python manage.py migrate --check 2>/dev/null; do
echo "Waiting for database to be ready..."
sleep 2
done
# Ensure virtualenv is activated
export VIRTUAL_ENV=/home/mediacms.io
export PATH="$VIRTUAL_ENV/bin:$PATH"
# Use explicit python path from virtualenv
PYTHON="$VIRTUAL_ENV/bin/python"
echo "Using Python: $PYTHON"
$PYTHON --version
# Run migrations
echo "Running database migrations..."
python manage.py migrate
$PYTHON manage.py migrate
# Check if this is a new installation
EXISTING_INSTALLATION=$(echo "from users.models import User; print(User.objects.exists())" | python manage.py shell)
EXISTING_INSTALLATION=$(echo "from users.models import User; print(User.objects.exists())" | $PYTHON manage.py shell)
if [ "$EXISTING_INSTALLATION" = "True" ]; then
echo "Existing installation detected, skipping initial data load"
@@ -24,14 +28,14 @@ else
echo "New installation detected, loading initial data..."
# Load fixtures
python manage.py loaddata fixtures/encoding_profiles.json
python manage.py loaddata fixtures/categories.json
$PYTHON manage.py loaddata fixtures/encoding_profiles.json
$PYTHON manage.py loaddata fixtures/categories.json
# Create admin user
RANDOM_ADMIN_PASS=$(python -c "import secrets;chars = 'abcdefghijklmnopqrstuvwxyz0123456789';print(''.join(secrets.choice(chars) for i in range(10)))")
RANDOM_ADMIN_PASS=$($PYTHON -c "import secrets;chars = 'abcdefghijklmnopqrstuvwxyz0123456789';print(''.join(secrets.choice(chars) for i in range(10)))")
ADMIN_PASSWORD=${ADMIN_PASSWORD:-$RANDOM_ADMIN_PASS}
DJANGO_SUPERUSER_PASSWORD=$ADMIN_PASSWORD python manage.py createsuperuser \
DJANGO_SUPERUSER_PASSWORD=$ADMIN_PASSWORD $PYTHON manage.py createsuperuser \
--no-input \
--username=${ADMIN_USER:-admin} \
--email=${ADMIN_EMAIL:-admin@localhost} \
@@ -44,7 +48,7 @@ fi
# Collect static files
echo "Collecting static files..."
python manage.py collectstatic --noinput
$PYTHON manage.py collectstatic --noinput
echo "========================================="
echo "Migrations completed successfully!"