Skip to content
Snippets Groups Projects
Commit 2e43b18d authored by jan.bednarik's avatar jan.bednarik
Browse files

Deployment setup

parent 8387a1c4
Branches
No related tags found
1 merge request!23Deployment setup
Pipeline #16819 passed
.git
.venv
.envrc
static_files/
media_files/
node_modules/
dist/
majak_uistyleguide/collectedstatic
stages:
- build
image: docker:20.10.9
variables:
DOCKER_TLS_CERTDIR: "/certs"
IMAGE_TAG_APP: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
services:
- docker:20.10.9-dind
......@@ -9,11 +13,9 @@ services:
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
build_app:
stage: build
script:
- VERSION=`cat VERSION`
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$VERSION --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$VERSION
- docker push $CI_REGISTRY_IMAGE:latest
- docker pull $CI_REGISTRY_IMAGE:test || true
- docker build --cache-from $CI_REGISTRY_IMAGE:test -t $IMAGE_TAG_APP .
- docker push $IMAGE_TAG_APP
FROM python:3.11
FROM node:21
RUN apt-get update \
&& apt-get install -y python3 python3-pip \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /app
WORKDIR /app
# Install NodeJS
ENV NODE_MAJOR=20
RUN apt-get update
RUN apt-get install -y ca-certificates curl gnupg
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt-get update
RUN apt-get install -y nodejs
RUN rm -rf /var/lib/apt/lists/*
COPY requirements requirements/
RUN pip3 install --break-system-packages -r requirements/base.txt -r requirements/prod.txt
COPY . .
RUN pip install -r requirements/base.txt
RUN npm install
RUN npm run prod
# Placeholder values so the static files collect
RUN DJANGO_ALLOWED_HOSTS=x \
DJANGO_SECRET_KEY=x \
python manage.py collectstatic --noinput --settings=majak_uistyleguide.settings.production
RUN bash -c "adduser --disabled-login --quiet --gecos app app && \
chmod -R o+r /app/ && \
chmod o+x /app/run.sh"
RUN bash -c 'adduser --disabled-login --quiet --gecos app app && \
chown -R app:app /app/ && \
chmod o+x /app/run.sh'
USER app
RUN npm i
RUN npm run prod
ENV DJANGO_SETTINGS_MODULE "majak_uistyleguide.settings.production"
# fake values for required env variables used to run collectstatic during build
RUN DJANGO_SECRET_KEY=x DATABASE_URL=postgres://x/x DJANGO_ALLOWED_HOSTS=x \
python3 manage.py collectstatic
EXPOSE 8000
......
Makefile 0 → 100644
#!/usr/bin/make -f
PYTHON = python
VENV = .venv
PORT = 8009
help:
@echo "Setup:"
@echo " venv Setup virtual environment"
@echo " install Install dependencies to venv"
@echo " install-hooks Install pre-commit hooks"
@echo " hooks Run pre-commit hooks manually"
@echo " upgrade Upgrade requirements"
@echo ""
@echo "Application:"
@echo " run Run the application on port ${PORT}"
@echo " shell Run Django shell"
@echo ""
@echo "Database:"
@echo " migrations Generate migrations"
@echo " migrate Run migrations"
@echo ""
venv: .venv/bin/python
.venv/bin/python:
${PYTHON} -m venv ${VENV}
install: venv
${VENV}/bin/pip install -r requirements/base.txt
install-hooks:
pre-commit install --install-hooks
hooks:
pre-commit run -a
run: venv
${VENV}/bin/python manage.py runserver ${PORT}
shell: venv
${VENV}/bin/python manage.py shell_plus
migrations: venv
${VENV}/bin/python manage.py makemigrations
migrate: venv
${VENV}/bin/python manage.py migrate
upgrade:
(cd requirements && pip-compile -U base.in)
(cd requirements && pip-compile -U prod.in)
.PHONY: help venv install install-hooks hooks run shell upgrade migrations migrate
# EOF
......@@ -17,46 +17,41 @@ WSGI_APPLICATION = "majak_uistyleguide.wsgi.application"
# I18N and L10N
# ------------------------------------------------------------------------------
LANGUAGE_CODE = 'cs'
LANGUAGE_CODE = "cs"
TIME_ZONE = "Europe/Prague"
USE_I18N = True
USE_TZ = True
# DATABASES
# ------------------------------------------------------------------------------
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ROOT_DIR / 'db.sqlite3',
}
}
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
DATABASES = {"default": env.db("DATABASE_URL")}
DATABASES["default"]["ATOMIC_REQUESTS"] = True
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
# APPS
# ------------------------------------------------------------------------------
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_vite',
'pattern_library',
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django_vite",
"pattern_library",
]
# MIDDLEWARE
# ------------------------------------------------------------------------------
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware",
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
# TEMPLATES
......@@ -78,7 +73,7 @@ TEMPLATES = [
],
"builtins": [
"pattern_library.loader_tags",
"majak_uistyleguide.templatetags.math"
"majak_uistyleguide.templatetags.math",
],
},
},
......@@ -102,8 +97,8 @@ MEDIA_ROOT = str(ROOT_DIR / "media_files")
# VITE SETTINGS
# ------------------------------------------------------------------------------
# Where ViteJS assets are built.
DJANGO_VITE_ASSETS_PATH = ROOT_DIR / 'dist'
STATIC_FILES = PROJECT_DIR / 'static'
DJANGO_VITE_ASSETS_PATH = ROOT_DIR / "dist"
STATIC_FILES = PROJECT_DIR / "static"
# If use HMR or not.
DJANGO_VITE_DEV_MODE = False
......@@ -113,7 +108,7 @@ STATIC_ROOT = PROJECT_DIR / "collectedstatic"
# Include DJANGO_VITE_ASSETS_PATH into STATICFILES_DIRS to be copied inside
# when run command python manage.py collectstatic
SRC_PATH = ROOT_DIR / 'src'
SRC_PATH = ROOT_DIR / "src"
STATICFILES_DIRS = [DJANGO_VITE_ASSETS_PATH, STATIC_FILES, SRC_PATH]
# PATTERN LIBRARY SETTINGS
......@@ -131,14 +126,11 @@ PATTERN_LIBRARY = {
("organisms", ["patterns/organisms"]),
("templates", ["patterns/templates"]),
),
# Configure which files to detect as templates.
"TEMPLATE_SUFFIX": ".html",
# Set which template components should be rendered inside of,
# so they may use page-level component dependencies like CSS.
"PATTERN_BASE_TEMPLATE_NAME": "patterns/base.html",
# Any template in BASE_TEMPLATE_NAMES or any template that extends a template in
# BASE_TEMPLATE_NAMES is a "page" and will be rendered as-is without being wrapped.
"BASE_TEMPLATE_NAMES": ["patterns/base_page.html"],
......
from .base import *
from .base import env
# DATABASES
# ------------------------------------------------------------------------------
DATABASES["default"]["CONN_MAX_AGE"] = env.int("CONN_MAX_AGE", default=60)
# SECURITY
# ------------------------------------------------------------------------------
ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS")
......
......@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'majak_uistyleguide.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "majak_uistyleguide.settings.dev")
application = get_wsgi_application()
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'majak_uistyleguide.settings')
try:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "majak_uistyleguide.settings.dev")
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
if __name__ == "__main__":
main()
django<4
django-pattern-library
django-environ
django-vite
psycopg2-binary
whitenoise
django==4.0
django-pattern-library==1.0.0
django-environ==0.9.0
django-vite==2.0.2
gunicorn==21.2.0
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile base.in
#
asgiref==3.7.2
# via django
django==3.2.24
# via
# -r base.in
# django-pattern-library
# django-vite
django-environ==0.11.2
# via -r base.in
django-pattern-library==1.2.0
# via -r base.in
django-vite==3.0.3
# via -r base.in
markdown==3.5.2
# via django-pattern-library
psycopg2-binary==2.9.9
# via -r base.in
pytz==2024.1
# via django
pyyaml==6.0.1
# via django-pattern-library
sqlparse==0.4.4
# via django
typing-extensions==4.9.0
# via asgiref
whitenoise==6.6.0
# via -r base.in
gunicorn
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile prod.in
#
gunicorn==21.2.0
# via -r prod.in
packaging==23.2
# via gunicorn
......@@ -4,7 +4,7 @@
set -e
# migrate database
python manage.py migrate
python3 manage.py migrate
# start webserver
exec gunicorn -c gunicorn.conf.py majak_uistyleguide.wsgi
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment