--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.env.tmpl Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,8 @@
+ADMIN_EMAIL=
+POSTGRES_PASSWORD=
+DJANGO_SECRET=
+BROKER_PASSWORD=
+POSTGRES_USER=iri
+DEBUG=True
+ADMIN_EMAIL=admin@mail.com
+
--- a/.hgignore Mon Jul 22 18:07:43 2024 +0200
+++ b/.hgignore Tue Jul 23 23:18:21 2024 +0200
@@ -15,4 +15,9 @@
^web/\.htaccess$
^virtualenv/sync/distribute-0\.6\.24\.tar\.gz$
^virtualenv/web/distribute-0\.6\.24\.tar\.gz$
-^virtualenv/sync/project-boot\.py$
\ No newline at end of file
+^virtualenv/sync/project-boot\.py$
+^data_docker
+^.env$
+^.envrc$
+^.etchosts$
+^data/backup_db_tralalere_2024-07-23.sql.gz$
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker-compose.yaml Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,41 @@
+services:
+ server:
+ build:
+ context: .
+ dockerfile: docker/server/server.dockerfile
+ environment:
+ - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST:-db}:${POSTGRES_PORT:-5432}/tralalere
+ - DEBUG=${DEBUG}
+ depends_on:
+ db:
+ condition: service_healthy
+ volumes:
+ - ./data_docker/static:/static
+ - ./data_docker/index:/index
+
+ db:
+ image: postgres
+ restart: always
+ volumes:
+ - ./data_docker/db:/var/lib/postgresql/data
+ environment:
+ POSTGRES_DB: "tralalere"
+ POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
+ POSTGRES_USER: "${POSTGRES_USER}"
+ POSTGRES_HOST_AUTH_METHOD: "md5"
+ POSTGRES_INITDB_ARGS: "--auth-local=md5"
+ healthcheck:
+ test: [ "CMD", "pg_isready", "-U", "${POSTGRES_USER}"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ caddy:
+ build:
+ context: docker/web
+ dockerfile: web.dockerfile
+ volumes:
+ - ./data_docker/static:/static
+ ports:
+ - "80:80"
+ - "443:443"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/server/config.py Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+import os, logging
+import tralalere
+
+from environs import Env
+
+env = Env()
+# Read .env into os.environ
+env.read_env()
+
+SITE_ID = 1
+
+#BASE_DIR = os.path.dirname(os.path.abspath(__file__)).rstrip("/")+"/"
+BASE_DIR = '/code/tralalere/'
+BASE_URL = '/'
+WEB_URL = 'http://tralalere.iri-research.org'
+
+
+STREAM_SRC_PREFIX = ""
+
+BASE_STATIC_URL = BASE_URL + 'static/'
+BASE_STATIC_ROOT = "/static/"
+
+#STREAM_URL = "rtmp://media.iri.centrepompidou.fr/ddc_player/"
+STREAM_URL = 'rtmp://media.iri.centrepompidou.fr/ddc_player/'
+
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = BASE_STATIC_ROOT + "media/"
+
+
+STATIC_URL = BASE_STATIC_URL + 'site/'
+# Absolute path to the directory that static files (js, css, swf...)
+# DO NOT forget to do command line ./manage.py collectstatic to gather static media into the web/static folder
+STATIC_ROOT = BASE_STATIC_ROOT + "site/"
+
+# PATH to the ffmpeg executable, used to know automatically the media file duration
+FFMPEG_PATH = ""
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = BASE_STATIC_URL + "media/"
+
+CONTENT_ROOT = MEDIA_ROOT + "/content/"
+
+STREAM_PATH = CONTENT_ROOT
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
+LDT_MEDIA_PREFIX = STATIC_URL + 'ldt/'
+
+#DATABASES = {
+# 'default': {
+# 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+# 'NAME': 'tralalere', # Or path to database file if using sqlite3.
+# 'USER': 'iri', # Not used with sqlite3.
+# 'PASSWORD': 'iri', # Not used with sqlite3.
+# 'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3.
+# 'PORT': '5432', # Set to empty string for default. Not used with sqlite3.
+# }
+#}
+
+DATABASES = {
+ 'default': env.dj_db_url("DATABASE_URL"),
+}
+
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+LOG_LEVEL = logging.DEBUG
+
+#INDEX_PATH = os.path.abspath(BASE_DIR + "../index/")
+INDEX_PATH = '/index/'
+
+ADMINS = (
+ # ('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+GOOGLE_ANALYTICS_CODE = ''
+
+#EMAIL_USE_TLS = True
+#EMAIL_HOST = 'smtp.gmail.com'
+#EMAIL_HOST_USER = 'iri.ddc@gmail.com'
+#EMAIL_HOST_PASSWORD = ''
+#EMAIL_PORT = 587
+
+EMAIL_USE_TLS = True
+EMAIL_HOST = ''
+EMAIL_HOST_USER = ''
+EMAIL_HOST_PASSWORD = ''
+EMAIL_PORT = 0
+
+
+ACCOUNT_ACTIVATION_DAYS = 7
+REGISTRATION_OPEN = False
+
+LDT_MAX_SEARCH_NUMBER = 50
+LDT_JSON_DEFAULT_INDENT = 2
+
+EMPTY_MEDIA_EXTERNALID = None
+
+AUTO_INDEX_AFTER_SAVE = True
+
+FRONT_TAG_LIST = [u"Enmi 2011", u"film", u"conférence"]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/server/entrypoint.sh Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+set -Eeuo pipefail
+
+# from https://stackoverflow.com/a/45977232
+# Following regex is based on https://www.rfc-editor.org/rfc/rfc3986#appendix-B with
+# additional sub-expressions to split authority into userinfo, host and port
+#
+readonly URI_REGEX='^(([^:/?#]+):)?(//((([^/?#]+)@)?([^:/?#]+)(:([0-9]+))?))?(/([^?#]*))(\?([^#]*))?(#(.*))?'
+# ↑↑ ↑ ↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
+# |2 scheme | ||6 userinfo 7 host | 9 port | 11 rpath | 13 query | 15 fragment
+# 1 scheme: | |5 userinfo@ 8 :… 10 path 12 ?… 14 #…
+# | 4 authority
+# 3 //…
+
+parse_host () {
+ [[ "$@" =~ $URI_REGEX ]] && echo "${BASH_REMATCH[7]}"
+}
+
+parse_port () {
+ [[ "$@" =~ $URI_REGEX ]] && echo "${BASH_REMATCH[9]}"
+}
+
+dbhost=$(parse_host "${DATABASE_URL}")
+dbport=$(parse_port "${DATABASE_URL}")
+
+cd ${BASEDIR}
+
+if [[ "$*" =~ 'uwsgi' ]]; then
+ echo "Waiting for postgres on ${dbhost}:${dbport}..."
+
+ while ! nc -z ${dbhost} ${dbport}; do
+ sleep 0.1
+ done
+
+ echo "PostgreSQL started"
+
+ python manage.py syncdb --migrate
+ python manage.py collectstatic --noinput --clear
+
+fi
+
+exec "$@"
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/server/requirements.txt Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,27 @@
+Django==1.4
+django-extensions==0.8
+django-guardian==1.0.3
+django-oauth==1.1
+django-openid-consumer @ git+https://github.com/jjanssen/django-openid-consumer.git@master
+django-piston==0.2.3
+django-registration==0.8
+django-social-auth==0.3.10
+django-tagging==0.3.1
+httplib2
+#JCC==2.13
+#ldt==1.11
+# lucene==3.6.0 @ file:///code/pylucene-3.6.0-2-src.tar.gz
+lxml==4.4.2
+oauth2==1.5.210
+Pillow
+psycopg2==2.8.4
+python-memcached==1.59
+python-openid==2.2.5
+pytz
+setuptools-hg==0.4
+six==1.14.0
+sorl-thumbnail==11.12
+South==0.7.5
+uWSGI
+dj-database-url==0.5.0
+environs [django]==4.2.0
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/server/server.dockerfile Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,87 @@
+# set base image (host OS)
+FROM docker.io/python:2.7-alpine as builder
+
+ENV VIRTUALENV=/opt/venv
+
+# set the working directory in the container
+WORKDIR /code
+
+RUN \
+ pip install virtualenv && \
+ virtualenv $VIRTUALENV
+
+ENV PATH="$VIRTUALENV/bin:$PATH"
+
+# copy the dependencies file to the working directory
+COPY docker/server/requirements.txt .
+
+ENV JCC_JDK=/usr/lib/jvm/java-11-openjdk
+ENV JCC_LFLAGS="-L/usr/lib/jvm/java-11-openjdk/jre/lib -ljava -L/usr/lib/jvm/java-11-openjdk/jre/lib/server -ljvm"
+ENV PATH="/usr/lib/jvm/java-11-openjdk/jre/bin:$PATH"
+ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-11-openjdk/jre/lib:/usr/lib/jvm/java-11-openjdk/jre/lib/server"
+# ENV JCC_LFLAGS=-L/usr/lib/jvm/java-8-openjdk/jre/lib/amd64
+
+
+RUN \
+ apk add --no-cache postgresql-client postgresql-libs libxml2 libxslt libmemcached openjdk11 apache-ant bash jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev && \
+ apk add --no-cache --virtual .build-deps build-base postgresql-dev libxml2-dev libxslt-dev linux-headers sed wget patchelf git jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev && \
+ wget https://dlcdn.apache.org/lucene/pylucene/pylucene-7.7.1-src.tar.gz && \
+ tar zxvf pylucene-7.7.1-src.tar.gz && \
+ cd pylucene-7.7.1 && \
+ cd jcc && \
+ python setup.py install && \
+ cd .. && \
+ sed -i '1s/^/PREFIX_PYTHON=\/opt\/venv\nANT=JAVA_HOME=\/usr\/lib\/jvm\/java-11-openjdk \/usr\/bin\/ant\nPYTHON=$(PREFIX_PYTHON)\/bin\/python\nJCC=$(PYTHON) -m jcc --shared\nNUM_FILES=8\n/' Makefile && \
+ sed -i 's/http:\/\/repo1\.maven\.org\/maven2/https:\/\/repo1.maven.org\/maven2/' lucene-java-7.7.1/lucene/common-build.xml && \
+ patchelf --add-needed libjvm.so /opt/venv/lib/python2.7/site-packages/JCC-3.5-py2.7-linux-x86_64.egg/jcc/_jcc2.so && \
+ patchelf --add-needed libjvm.so /opt/venv/lib/python2.7/site-packages/JCC-3.5-py2.7-linux-x86_64.egg/libjcc2.so && \
+ make && \
+ make install && \
+ cd /code && \
+ wget https://hg.dev.iri-research.org/platform/archive/V01.11.tar.gz && \
+ tar zxvf V01.11.tar.gz && \
+ cd platform-V01.11/src/ldt && \
+ python setup.py sdist && \
+ pip install dist/ldt-1.11.tar.gz && \
+ cd /code && \
+ pip install -r requirements.txt
+
+
+FROM docker.io/python:2.7-alpine
+
+COPY --from=builder /opt/venv /opt/venv
+COPY web/tralalere /code/tralalere
+COPY web/manage.py /code/
+
+
+
+ENV BASEDIR="/code"
+ENV PATH="/opt/venv/bin:$BASEDIR:$PATH"
+
+WORKDIR $BASEDIR
+
+RUN \
+ apk add --no-cache postgresql-client postgresql-libs libxml2 libxslt libmemcached openjdk11 apache-ant bash jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev bash && \
+ mkdir -p /static
+
+
+COPY docker/server/config.py ./tralalere/
+
+COPY docker/server/tralalere.yml .
+COPY --chmod=0755 docker/server/entrypoint.sh /
+
+ENV PYTHONPATH "/code/"
+ENV DJANGO_SETTINGS_MODULE tralalere.settings
+ENV DEBUG "False"
+ENV DATABASE_URL ""
+ENV DJANGO_SECRET ""
+
+ENV PATH="/usr/lib/jvm/java-11-openjdk/jre/bin:$PATH"
+ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-11-openjdk/jre/lib:/usr/lib/jvm/java-11-openjdk/jre/lib/server"
+
+EXPOSE 8000
+
+ENTRYPOINT ["/entrypoint.sh"]
+
+# # command to run on container start
+CMD [ "/opt/venv/bin/uwsgi", "--yaml", "/code/tralalere.yml"]
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/server/tralalere.yml Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,8 @@
+uwsgi:
+ master: true
+ socket: :8000
+ processes: 4
+ chdir: /code
+ module: tralalere.wsgi
+ pythonpath: "/code"
+ log-master: true
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/web/Caddyfile Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,17 @@
+tralalere.iri-research.org {
+ tls internal
+
+ handle_path /static/* {
+ root * /static
+ file_server
+ }
+
+ handle /* {
+ reverse_proxy server:8000 {
+ transport uwsgi {
+ uwsgi_param SCRIPT_NAME /tralalere
+ uwsgi_param UWSGI_SCHEME https
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/web/web.dockerfile Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,10 @@
+FROM docker.io/caddy:builder AS builder
+
+RUN xcaddy build \
+ --with github.com/BadAimWeeb/caddy-uwsgi-transport
+
+FROM docker.io/caddy:latest
+
+COPY --from=builder /usr/bin/caddy /usr/bin/caddy
+COPY Caddyfile /etc/caddy/Caddyfile
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/virtualenv/requirements.txt Tue Jul 23 23:18:21 2024 +0200
@@ -0,0 +1,26 @@
+Django==1.4
+django-extensions==0.8
+django-guardian==1.0.3
+django-oauth==1.1
+django-openid-consumer==0.1.1
+django-piston==0.2.3
+django-registration==0.8
+django-social-auth==0.3.10
+django-tagging==0.3.1
+httplib2==0.7.4
+JCC==2.13
+ldt==1.11
+lucene==3.6.0
+lxml==4.4.2
+oauth2==1.5.210
+PIL==1.1.7
+psycopg2==2.8.4
+python-memcached==1.59
+python-openid==2.2.5
+pytz==2019.3
+setuptools-hg==0.4
+six==1.14.0
+sorl-thumbnail==11.12
+South==0.7.5
+uWSGI==2.0.18
+