Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Thomas Citharel | 8ad67797df | |
Berto Te | 40ca0ed126 |
|
@ -22,7 +22,7 @@
|
|||
# In the latter case `**/*.{ex,exs}` will be used.
|
||||
#
|
||||
included: ["lib/", "src/", "test/"],
|
||||
excluded: [~r"/_build/", ~r"/deps/", ~r"/src/"]
|
||||
excluded: [~r"/_build/", ~r"/deps/", ~r"/js/"]
|
||||
},
|
||||
#
|
||||
# If you create your own checks, you must specify the source files for
|
||||
|
@ -39,9 +39,6 @@
|
|||
# to `false` below:
|
||||
#
|
||||
color: true,
|
||||
plugins: [
|
||||
{CredoCodeClimate, []}
|
||||
],
|
||||
#
|
||||
# You can customize the parameters of any check by adding a second element
|
||||
# to the tuple.
|
||||
|
|
|
@ -1,66 +0,0 @@
|
|||
# Update the VARIANT arg in docker-compose.yml to pick an Elixir version: 1.9, 1.10, 1.10.4
|
||||
ARG VARIANT="1.12.3"
|
||||
FROM elixir:${VARIANT}
|
||||
|
||||
# This Dockerfile adds a non-root user with sudo access. Update the “remoteUser” property in
|
||||
# devcontainer.json to use it. More info: https://aka.ms/vscode-remote/containers/non-root-user.
|
||||
ARG USERNAME=vscode
|
||||
ARG USER_UID=1000
|
||||
ARG USER_GID=$USER_UID
|
||||
|
||||
# Options for common package install script
|
||||
ARG INSTALL_ZSH="true"
|
||||
ARG UPGRADE_PACKAGES="true"
|
||||
ARG COMMON_SCRIPT_SOURCE="https://raw.githubusercontent.com/microsoft/vscode-dev-containers/v0.209.6/script-library/common-debian.sh"
|
||||
ARG COMMON_SCRIPT_SHA="d35dd1711454156c9a59cc41ebe04fbff681ca0bd304f10fd5b13285d0de13b2"
|
||||
|
||||
# Optional Settings for Phoenix
|
||||
ARG PHOENIX_VERSION="1.6.2"
|
||||
|
||||
# [Optional] Setup nodejs
|
||||
ARG NODE_SCRIPT_SOURCE="https://raw.githubusercontent.com/microsoft/vscode-dev-containers/main/script-library/node-debian.sh"
|
||||
ARG NODE_SCRIPT_SHA="dev-mode"
|
||||
ARG NODE_VERSION="none"
|
||||
ENV NVM_DIR=/usr/local/share/nvm
|
||||
ENV NVM_SYMLINK_CURRENT=true
|
||||
ENV PATH=${NVM_DIR}/current/bin:${PATH}
|
||||
|
||||
# [Optional, Choice] Node.js version: none, lts/*, 16, 14, 12, 10
|
||||
ARG NODE_VERSION="none"
|
||||
|
||||
# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
|
||||
RUN apt-get update \
|
||||
&& export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install --no-install-recommends curl ca-certificates 2>&1 \
|
||||
&& curl -sSL ${COMMON_SCRIPT_SOURCE} -o /tmp/common-setup.sh \
|
||||
&& ([ "${COMMON_SCRIPT_SHA}" = "dev-mode" ] || (echo "${COMMON_SCRIPT_SHA} */tmp/common-setup.sh" | sha256sum -c -)) \
|
||||
&& /bin/bash /tmp/common-setup.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
|
||||
#
|
||||
# [Optional] Install Node.js for use with web applications
|
||||
&& if [ "$NODE_VERSION" != "none" ]; then \
|
||||
curl -sSL ${NODE_SCRIPT_SOURCE} -o /tmp/node-setup.sh \
|
||||
&& ([ "${NODE_SCRIPT_SHA}" = "dev-mode" ] || (echo "${NODE_SCRIPT_SHA} */tmp/node-setup.sh" | sha256sum -c -)) \
|
||||
&& /bin/bash /tmp/node-setup.sh "${NVM_DIR}" "${NODE_VERSION}" "${USERNAME}"; \
|
||||
fi \
|
||||
#
|
||||
# Install dependencies
|
||||
&& apt-get install -y build-essential \
|
||||
#
|
||||
# Clean up
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean -y \
|
||||
&& rm -rf /var/lib/apt/lists/* /tmp/common-setup.sh /tmp/node-setup.sh
|
||||
|
||||
RUN su ${USERNAME} -c "mix local.hex --force \
|
||||
&& mix local.rebar --force \
|
||||
&& mix archive.install --force hex phx_new ${PHOENIX_VERSION}"
|
||||
|
||||
RUN apt-get update \
|
||||
&& export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install --no-install-recommends cmake webp bash libncurses6 git python3 inotify-tools \
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# [Optional] Uncomment this line to install additional package.
|
||||
# RUN mix ...
|
|
@ -1,46 +0,0 @@
|
|||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
||||
// https://github.com/microsoft/vscode-dev-containers/tree/v0.209.6/containers/elixir-phoenix-postgres
|
||||
{
|
||||
"name": "Elixir, Phoenix, Node.js & PostgresSQL (Community)",
|
||||
"dockerComposeFile": "docker-compose.yml",
|
||||
"service": "elixir",
|
||||
"workspaceFolder": "/workspace",
|
||||
|
||||
// Set *default* container specific settings.json values on container create.
|
||||
"settings": {
|
||||
"sqltools.connections": [
|
||||
{
|
||||
"name": "Container database",
|
||||
"driver": "PostgreSQL",
|
||||
"previewLimit": 50,
|
||||
"server": "localhost",
|
||||
"port": 5432,
|
||||
"database": "postgres",
|
||||
"username": "postgres",
|
||||
"password": "postgres"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
"extensions": [
|
||||
"jakebecker.elixir-ls",
|
||||
"mtxr.sqltools",
|
||||
"mtxr.sqltools-driver-pg"
|
||||
],
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [4000, 4001, 5432],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "mix deps.get",
|
||||
// "runArgs": ["--userns=keep-id", "--privileged"],
|
||||
// "containerUser": "vscode",
|
||||
// "containerEnv": {
|
||||
// "HOME": "/home/vscode",
|
||||
// },
|
||||
// "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z",
|
||||
|
||||
// Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
|
||||
"remoteUser": "vscode"
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
version: "3.8"
|
||||
|
||||
services:
|
||||
elixir:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
# Elixir Version: 1.9, 1.10, 1.10.4, ...
|
||||
VARIANT: "1.13.1"
|
||||
# Phoenix Version: 1.4.17, 1.5.4, ...
|
||||
PHOENIX_VERSION: "1.6.6"
|
||||
# Node Version: 10, 11, ...
|
||||
NODE_VERSION: "16"
|
||||
|
||||
volumes:
|
||||
- ..:/workspace:z
|
||||
# Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
|
||||
network_mode: service:db
|
||||
|
||||
# Overrides default command so things don't shut down after the process ends.
|
||||
command: sleep infinity
|
||||
environment:
|
||||
MOBILIZON_INSTANCE_NAME: My Mobilizon Instance
|
||||
MOBILIZON_INSTANCE_HOST: localhost
|
||||
MOBILIZON_INSTANCE_HOST_PORT: 4000
|
||||
MOBILIZON_INSTANCE_PORT: 4000
|
||||
MOBILIZON_INSTANCE_EMAIL: noreply@mobilizon.me
|
||||
MOBILIZON_INSTANCE_REGISTRATIONS_OPEN: "true"
|
||||
MOBILIZON_DATABASE_PASSWORD: postgres
|
||||
MOBILIZON_DATABASE_USERNAME: postgres
|
||||
MOBILIZON_DATABASE_DBNAME: mobilizon
|
||||
MOBILIZON_DATABASE_HOST: db
|
||||
|
||||
db:
|
||||
image: postgis/postgis:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_DB: app
|
||||
|
||||
volumes:
|
||||
postgres-data: null
|
|
@ -1,10 +1,6 @@
|
|||
_build
|
||||
CONTRIBUTING.md
|
||||
coverage
|
||||
demo
|
||||
deps
|
||||
doc
|
||||
docs
|
||||
docker-compose.yml
|
||||
Dockerfile
|
||||
.elixir_ls
|
||||
|
@ -19,8 +15,5 @@ Makefile
|
|||
README.md
|
||||
SECURITY.md
|
||||
ssh_match_hostname
|
||||
package-lock.json
|
||||
node_modules
|
||||
playwright-report
|
||||
test
|
||||
tests
|
||||
.js/package-lock.json
|
||||
js/node_modules
|
|
@ -19,9 +19,7 @@ MOBILIZON_REPLY_EMAIL=contact@mobilizon.lan
|
|||
# Email settings
|
||||
MOBILIZON_SMTP_SERVER=localhost
|
||||
MOBILIZON_SMTP_PORT=25
|
||||
MOBILIZON_SMTP_HOSTNAME=localhost
|
||||
MOBILIZON_SMTP_USERNAME=noreply@mobilizon.lan
|
||||
MOBILIZON_SMTP_PASSWORD=password
|
||||
MOBILIZON_SMTP_SSL=false
|
||||
|
||||
# When using docker for development, VITE_HOST must be set to 0.0.0.0
|
||||
VITE_HOST=localhost
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
[
|
||||
import_deps: [:ecto, :ecto_sql, :phoenix],
|
||||
plugins: [Phoenix.LiveView.HTMLFormatter],
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test,priv}/**/*.{ex,exs,heex}"]
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test,priv}/**/*.{ex,exs}"]
|
||||
]
|
||||
|
|
|
@ -46,14 +46,6 @@ release/
|
|||
.weblate
|
||||
docker/production/.env
|
||||
test-junit-report.xml
|
||||
junit.xml
|
||||
js/junit.xml
|
||||
.env
|
||||
demo/
|
||||
codeclimate.json
|
||||
|
||||
node_modules
|
||||
stats.html
|
||||
/coverage
|
||||
/playwright-report/
|
||||
.histoire
|
||||
|
||||
|
|
305
.gitlab-ci.yml
|
@ -4,14 +4,15 @@ stages:
|
|||
- install
|
||||
- check
|
||||
- build-js
|
||||
- sentry
|
||||
- test
|
||||
- build
|
||||
- docker
|
||||
- package
|
||||
- upload
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
MIX_ENV: "test"
|
||||
YARN_CACHE_FOLDER: "js/.yarn"
|
||||
# DB Variables for Postgres / Postgis
|
||||
POSTGRES_DB: mobilizon_test
|
||||
POSTGRES_USER: postgres
|
||||
|
@ -30,14 +31,17 @@ variables:
|
|||
EXPORT_FORMATS: "csv,ods,pdf"
|
||||
APP_VERSION: "${CI_COMMIT_REF_NAME}"
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
CYPRESS_INSTALL_BINARY: 0
|
||||
|
||||
cache:
|
||||
key: "${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
|
||||
paths:
|
||||
- ~/.cache/Cypress
|
||||
- cache/Cypress
|
||||
- deps/
|
||||
- _build/
|
||||
- node_modules
|
||||
- .npm
|
||||
- js/node_modules
|
||||
- js/.yarn
|
||||
|
||||
# Installed dependencies are cached across the pipeline
|
||||
# So there is no need to reinstall them all the time
|
||||
|
@ -45,7 +49,7 @@ cache:
|
|||
install:
|
||||
stage: install
|
||||
script:
|
||||
- npm ci
|
||||
- yarn --cwd "js" install --frozen-lockfile
|
||||
- mix deps.get
|
||||
- mix compile
|
||||
|
||||
|
@ -55,37 +59,31 @@ lint-elixir:
|
|||
- mix deps.get
|
||||
script:
|
||||
- export EXITVALUE=0
|
||||
- git fetch origin ${CI_DEFAULT_BRANCH}
|
||||
- TARGET_SHA1=$(git show-ref -s ${CI_DEFAULT_BRANCH})
|
||||
- echo "$TARGET_SHA1"
|
||||
- mix format --check-formatted --dry-run || export EXITVALUE=1
|
||||
- mix credo diff --from-git-merge-base $TARGET_SHA1 --strict -a || export EXITVALUE=1
|
||||
- mix credo --strict -a || export EXITVALUE=1
|
||||
- mix sobelow --config || export EXITVALUE=1
|
||||
- exit $EXITVALUE
|
||||
artifacts:
|
||||
reports:
|
||||
codequality: codeclimate.json
|
||||
|
||||
lint-front:
|
||||
image: node:20
|
||||
image: node:16
|
||||
stage: check
|
||||
before_script:
|
||||
- export EXITVALUE=0
|
||||
- npm ci
|
||||
- yarn --cwd "js" install --frozen-lockfile
|
||||
script:
|
||||
- npm run lint || export EXITVALUE=1
|
||||
- npx prettier -c . || export EXITVALUE=1
|
||||
- yarn --cwd "js" run lint || export EXITVALUE=1
|
||||
- yarn --cwd "js" run prettier -c . || export EXITVALUE=1
|
||||
- exit $EXITVALUE
|
||||
|
||||
build-frontend:
|
||||
stage: build-js
|
||||
image: node:20
|
||||
image: node:16
|
||||
before_script:
|
||||
- apt update
|
||||
- apt install -y --no-install-recommends python3 build-essential webp imagemagick gifsicle jpegoptim optipng pngquant
|
||||
- apt install -y --no-install-recommends python build-essential webp imagemagick gifsicle jpegoptim optipng pngquant
|
||||
script:
|
||||
- npm install --frozen-lockfile
|
||||
- npm run build
|
||||
- yarn --cwd "js" install --frozen-lockfile
|
||||
- yarn --cwd "js" run build
|
||||
artifacts:
|
||||
expire_in: 5 days
|
||||
paths:
|
||||
|
@ -93,21 +91,6 @@ build-frontend:
|
|||
needs:
|
||||
- lint-front
|
||||
|
||||
sentry-commit:
|
||||
stage: sentry
|
||||
image: getsentry/sentry-cli
|
||||
script:
|
||||
- echo "Create a new release $CI_COMMIT_TAG"
|
||||
- sentry-cli releases new $CI_COMMIT_TAG
|
||||
- sentry-cli releases set-commits $CI_COMMIT_TAG --auto
|
||||
- sentry-cli releases files $CI_COMMIT_TAG upload-sourcemaps priv/static/assets/
|
||||
- sentry-cli releases finalize $CI_COMMIT_TAG
|
||||
- echo "Finalized release for $CI_COMMIT_TAG"
|
||||
needs:
|
||||
- build-frontend
|
||||
only:
|
||||
- tags@framasoft/mobilizon
|
||||
|
||||
deps:
|
||||
stage: check
|
||||
before_script:
|
||||
|
@ -115,7 +98,7 @@ deps:
|
|||
script:
|
||||
- export EXITVALUE=0
|
||||
- mix hex.outdated || export EXITVALUE=1
|
||||
- npm outdated || export EXITVALUE=1
|
||||
- yarn --cwd "js" outdated || export EXITVALUE=1
|
||||
- exit $EXITVALUE
|
||||
allow_failure: true
|
||||
needs:
|
||||
|
@ -124,14 +107,12 @@ deps:
|
|||
exunit:
|
||||
stage: test
|
||||
services:
|
||||
- name: postgis/postgis:16-3.4
|
||||
- name: postgis/postgis:13-3.1
|
||||
alias: postgres
|
||||
variables:
|
||||
MIX_ENV: test
|
||||
before_script:
|
||||
- mix deps.get
|
||||
- mix compile
|
||||
- mix tz_world.update
|
||||
- mix deps.get && mix tz_world.update
|
||||
- mix ecto.create
|
||||
- mix ecto.migrate
|
||||
script:
|
||||
|
@ -143,85 +124,77 @@ exunit:
|
|||
- test-junit-report.xml
|
||||
expire_in: 30 days
|
||||
|
||||
vitest:
|
||||
jest:
|
||||
stage: test
|
||||
needs:
|
||||
- lint-front
|
||||
before_script:
|
||||
- npm install --frozen-lockfile
|
||||
- yarn --cwd "js" install --frozen-lockfile
|
||||
script:
|
||||
- npm run coverage --reporter=default --reporter=junit --outputFile.junit=./junit.xml
|
||||
- yarn --cwd "js" run test:unit --no-color --ci --reporters=default --reporters=jest-junit
|
||||
artifacts:
|
||||
when: always
|
||||
paths:
|
||||
- coverage
|
||||
- js/coverage
|
||||
reports:
|
||||
junit:
|
||||
- junit.xml
|
||||
- js/junit.xml
|
||||
expire_in: 30 days
|
||||
|
||||
e2e:
|
||||
stage: test
|
||||
services:
|
||||
- name: postgis/postgis:16-3.4
|
||||
alias: postgres
|
||||
variables:
|
||||
MIX_ENV: "e2e"
|
||||
before_script:
|
||||
- mix deps.get
|
||||
- mix ecto.create
|
||||
- mix ecto.migrate
|
||||
- mix run priv/repo/e2e.seed.exs
|
||||
- npm install && npm run build && npx playwright install
|
||||
- mix phx.digest
|
||||
script:
|
||||
- mix phx.server &
|
||||
- npx wait-on http://localhost:4000
|
||||
- npx playwright test --project $BROWSER
|
||||
parallel:
|
||||
matrix:
|
||||
- BROWSER: ["firefox", "chromium"]
|
||||
artifacts:
|
||||
expire_in: 2 days
|
||||
paths:
|
||||
- playwright-report/
|
||||
- test-results/
|
||||
# cypress:
|
||||
# stage: test
|
||||
# services:
|
||||
# - name: postgis/postgis:13.3
|
||||
# alias: postgres
|
||||
# variables:
|
||||
# MIX_ENV=e2e
|
||||
# script:
|
||||
# - mix ecto.create
|
||||
# - mix ecto.migrate
|
||||
# - mix run priv/repo/e2e.seed.exs
|
||||
# - mix phx.server &
|
||||
# - cd js
|
||||
# - npx wait-on http://localhost:4000
|
||||
# - if [ -z "$CYPRESS_KEY" ]; then npx cypress run; else npx cypress run --record --parallel --key $CYPRESS_KEY; fi
|
||||
# artifacts:
|
||||
# expire_in: 2 day
|
||||
# paths:
|
||||
# - js/tests/e2e/screenshots/**/*.png
|
||||
# - js/tests/e2e/videos/**/*.mp4
|
||||
|
||||
pages:
|
||||
stage: deploy
|
||||
script:
|
||||
- mv public public-mbz
|
||||
- mkdir public
|
||||
- mix deps.get
|
||||
- mix docs
|
||||
- mv doc public/backend
|
||||
# #- npm run styleguide:build
|
||||
# #- mv styleguide public/frontend
|
||||
# #- yarn run --cwd "js" styleguide:build
|
||||
# #- mv js/styleguide public/frontend
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == "main"'
|
||||
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||
artifacts:
|
||||
expire_in: 1 hour
|
||||
paths:
|
||||
- public
|
||||
|
||||
.docker: &docker
|
||||
stage: build
|
||||
image: docker:24
|
||||
stage: docker
|
||||
image: docker:stable
|
||||
variables:
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
DOCKER_HOST: tcp://docker:2376
|
||||
DOCKER_TLS_VERIFY: 1
|
||||
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
||||
DOCKER_DRIVER: overlay2
|
||||
DOCKER_CLI_EXPERIMENTAL: enabled
|
||||
services:
|
||||
- docker:24-dind
|
||||
- docker:stable-dind
|
||||
cache: {}
|
||||
before_script:
|
||||
# Install buildx
|
||||
- wget https://github.com/docker/buildx/releases/download/v0.11.2/buildx-v0.11.2.linux-amd64
|
||||
- wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
|
||||
- mkdir -p ~/.docker/cli-plugins/
|
||||
- mv buildx-v0.11.2.linux-amd64 ~/.docker/cli-plugins/docker-buildx
|
||||
- mv buildx-v0.6.3.linux-amd64 ~/.docker/cli-plugins/docker-buildx
|
||||
- chmod a+x ~/.docker/cli-plugins/docker-buildx
|
||||
# Create env
|
||||
- docker context create tls-environment
|
||||
|
@ -229,96 +202,48 @@ pages:
|
|||
# Install qemu/binfmt
|
||||
- docker pull tonistiigi/binfmt:latest
|
||||
- docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||
# Install jq
|
||||
- apk --no-cache add jq
|
||||
# Login to DockerHub
|
||||
- mkdir -p ~/.docker
|
||||
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$CI_REGISTRY_AUTH\",\"email\":\"$CI_REGISTRY_EMAIL\"}}}" > ~/.docker/config.json
|
||||
tags:
|
||||
- "privileged"
|
||||
|
||||
build-docker-main:
|
||||
<<: *docker
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_TRIGGERED == "true"'
|
||||
script:
|
||||
- docker buildx build --platform linux/amd64 -t framasoft/mobilizon:main -f docker/production/Dockerfile .
|
||||
|
||||
build-docker-tag:
|
||||
<<: *docker
|
||||
rules: &release-tag-rules
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
- if: $CI_COMMIT_TAG != null
|
||||
when: on_success
|
||||
timeout: 3 hours
|
||||
script:
|
||||
- >
|
||||
docker buildx build
|
||||
--push
|
||||
--platform linux/${ARCH}
|
||||
--provenance=false
|
||||
--build-arg="${ERL_FLAGS}"
|
||||
-t framasoft/mobilizon:${CI_COMMIT_TAG}-${ARCH}
|
||||
--platform linux/amd64,linux/arm64,linux/arm
|
||||
-t $DOCKER_IMAGE_NAME
|
||||
-f docker/production/Dockerfile .
|
||||
parallel:
|
||||
matrix:
|
||||
- ARCH: ["amd64"]
|
||||
ERL_FLAGS: ["ERL_FLAGS="]
|
||||
- ARCH: ["arm64"]
|
||||
ERL_FLAGS: ["ERL_FLAGS=+JMsingle true"]
|
||||
tags:
|
||||
- "privileged"
|
||||
timeout: 3 hours
|
||||
|
||||
# Create manifest and push
|
||||
docker-manifest-push:
|
||||
build-docker-master:
|
||||
<<: *docker
|
||||
needs: ["build-docker-tag"]
|
||||
rules: &release-tag-rules
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
- if: $CI_COMMIT_TAG != null
|
||||
when: on_success
|
||||
script:
|
||||
- >
|
||||
docker manifest create framasoft/mobilizon:${CI_COMMIT_TAG}
|
||||
--amend framasoft/mobilizon:${CI_COMMIT_TAG}-amd64
|
||||
--amend framasoft/mobilizon:${CI_COMMIT_TAG}-arm64
|
||||
- docker manifest push --purge framasoft/mobilizon:${CI_COMMIT_TAG}
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
variables:
|
||||
DOCKER_IMAGE_NAME: framasoft/mobilizon:master
|
||||
|
||||
###
|
||||
# Simply creating an alias to the tag doesn't work:
|
||||
# « xxx is a manifest list »
|
||||
# https://joonas.fi/2021/02/docker-multi-arch-image-tooling-buildx/
|
||||
###
|
||||
docker-latest:
|
||||
build-docker-tag:
|
||||
<<: *docker
|
||||
needs: ["docker-manifest-push"]
|
||||
rules: &release-tag-rules
|
||||
rules: &tag-rules
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG !~ /alpha|beta|rc/
|
||||
when: on_success
|
||||
script:
|
||||
- echo docker manifest create framasoft/mobilizon:latest $(docker manifest inspect framasoft/mobilizon:$CI_COMMIT_TAG | jq '.manifests[] | .digest' | xargs -I {} echo framasoft/mobilizon@{})
|
||||
- docker manifest create framasoft/mobilizon:latest $(docker manifest inspect framasoft/mobilizon:$CI_COMMIT_TAG | jq -r '.manifests[] | .digest' | xargs -I {} echo framasoft/mobilizon@{})
|
||||
- docker manifest push --purge framasoft/mobilizon:latest
|
||||
- if: $CI_COMMIT_TAG
|
||||
variables:
|
||||
DOCKER_IMAGE_NAME: framasoft/mobilizon:$CI_COMMIT_TAG
|
||||
|
||||
# Packaging app for amd64
|
||||
package-app:
|
||||
image: mobilizon/buildpack:1.15.7-erlang-26.1.2-${SYSTEM}
|
||||
stage: build
|
||||
stage: package
|
||||
variables: &release-variables
|
||||
MIX_ENV: "prod"
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
TZ: Etc/UTC
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
script: &release-script
|
||||
- mix local.hex --force
|
||||
- mix local.rebar --force
|
||||
- mix deps.get --only-prod
|
||||
- mix compile
|
||||
- mix phx.digest.clean --all && mix phx.digest
|
||||
- mix deps.get
|
||||
- mix phx.digest
|
||||
- mix release --path release/mobilizon
|
||||
- cd release/mobilizon && ln -s lib/mobilizon-*/priv priv && cd ../../
|
||||
- du -sh release/
|
||||
|
@ -328,25 +253,12 @@ package-app:
|
|||
only:
|
||||
- tags@framasoft/mobilizon
|
||||
artifacts:
|
||||
expire_in: 2 days
|
||||
expire_in: 30 days
|
||||
paths:
|
||||
- ${APP_ASSET}
|
||||
parallel:
|
||||
matrix:
|
||||
- SYSTEM:
|
||||
[
|
||||
"debian-bookworm",
|
||||
"debian-bullseye",
|
||||
"debian-buster",
|
||||
"ubuntu-jammy",
|
||||
"ubuntu-focal",
|
||||
"ubuntu-bionic",
|
||||
"fedora-38",
|
||||
"fedora-39",
|
||||
]
|
||||
|
||||
package-app-dev:
|
||||
stage: build
|
||||
stage: package
|
||||
variables: *release-variables
|
||||
script: *release-script
|
||||
except:
|
||||
|
@ -357,9 +269,9 @@ package-app-dev:
|
|||
- ${APP_ASSET}
|
||||
|
||||
# Packaging app for multi-arch
|
||||
package-multi-arch-release:
|
||||
stage: build
|
||||
image: docker:24
|
||||
multi-arch-release:
|
||||
stage: package
|
||||
image: docker:stable
|
||||
variables:
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
DOCKER_HOST: tcp://docker:2376
|
||||
|
@ -367,15 +279,14 @@ package-multi-arch-release:
|
|||
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
||||
DOCKER_DRIVER: overlay2
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
OS: debian-buster
|
||||
services:
|
||||
- docker:24-dind
|
||||
- docker:stable-dind
|
||||
cache: {}
|
||||
before_script:
|
||||
# Install buildx
|
||||
- wget https://github.com/docker/buildx/releases/download/v0.11.2/buildx-v0.11.2.linux-amd64
|
||||
- wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
|
||||
- mkdir -p ~/.docker/cli-plugins/
|
||||
- mv buildx-v0.11.2.linux-amd64 ~/.docker/cli-plugins/docker-buildx
|
||||
- mv buildx-v0.6.3.linux-amd64 ~/.docker/cli-plugins/docker-buildx
|
||||
- chmod a+x ~/.docker/cli-plugins/docker-buildx
|
||||
# Create env
|
||||
- docker context create tls-environment
|
||||
|
@ -384,71 +295,43 @@ package-multi-arch-release:
|
|||
- docker pull tonistiigi/binfmt:latest
|
||||
- docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||
script:
|
||||
- docker buildx build --platform linux/${ARCH} --output type=local,dest=releases --build-arg="ERL_FLAGS=+JMsingle true" --build-arg APP_ASSET=${APP_ASSET} -f docker/multiarch/Dockerfile .
|
||||
- docker buildx build --platform linux/${ARCH} --output type=local,dest=releases --build-arg APP_ASSET=${APP_ASSET} -f docker/multiarch/Dockerfile .
|
||||
- ls -alh releases/mobilizon/
|
||||
- du -sh releases/mobilizon/${APP_ASSET}
|
||||
- mv releases/mobilizon/${APP_ASSET} .
|
||||
tags:
|
||||
- "privileged"
|
||||
artifacts:
|
||||
expire_in: 2 days
|
||||
expire_in: 30 days
|
||||
paths:
|
||||
- ${APP_ASSET}
|
||||
- erl_crash.dump # if there's a memory issue
|
||||
- releases/mobilizon/${APP_ASSET}
|
||||
parallel:
|
||||
matrix:
|
||||
- ARCH: ["arm64"]
|
||||
## Currently not used as the hexpm base images do not have support for other architectures than amd64
|
||||
# SYSTEM:
|
||||
# [
|
||||
# "debian-bookworm",
|
||||
# "debian-bullseye",
|
||||
# "ubuntu-jammy",
|
||||
# "ubuntu-focal",
|
||||
# "ubuntu-bionic",
|
||||
# "alpine-3.17.5",
|
||||
# "alpine-3.18.4",
|
||||
# "fedora-38",
|
||||
# "fedora-39",
|
||||
# ]
|
||||
- ARCH: ["arm", "arm64"]
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG != null || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_TRIGGERED == "true"'
|
||||
timeout: 3h
|
||||
allow_failure: true
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
- if: $CI_COMMIT_TAG
|
||||
|
||||
# Release
|
||||
release-upload:
|
||||
stage: upload
|
||||
image: framasoft/upload-packages:latest
|
||||
variables:
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
image: framasoft/yakforms-assets-deploy:latest
|
||||
rules: *tag-rules
|
||||
script:
|
||||
- eval `ssh-agent -s`
|
||||
- ssh-add <(echo "${DEPLOYEMENT_KEY}" | base64 --decode -i)
|
||||
- echo "put -r ${APP_ASSET}" | sftp -o "VerifyHostKeyDNS yes" ${DEPLOYEMENT_USER}@${DEPLOYEMENT_HOST}:public/
|
||||
- echo "put -r mobilizon_*.tar.gz" | sftp -o "VerifyHostKeyDNS yes" ${DEPLOYEMENT_USER}@${DEPLOYEMENT_HOST}:public/
|
||||
artifacts:
|
||||
expire_in: 1 day
|
||||
when: on_success
|
||||
paths:
|
||||
- mobilizon_*.tar.gz
|
||||
parallel:
|
||||
matrix:
|
||||
- ARCH: ["amd64", "arm", "arm64"]
|
||||
allow_failure: true
|
||||
|
||||
release-create:
|
||||
stage: deploy
|
||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
|
||||
when: never
|
||||
variables:
|
||||
APP_ASSET_AMD64: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_amd64.tar.gz"
|
||||
APP_ASSET_ARM: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_arm.tar.gz"
|
||||
APP_ASSET_ARM64: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_arm64.tar.gz"
|
||||
rules: *tag-rules
|
||||
before_script:
|
||||
- apk --no-cache add gawk sed grep
|
||||
script: |
|
||||
|
@ -458,6 +341,4 @@ release-create:
|
|||
release-cli create --name "$CI_COMMIT_TAG" \
|
||||
--description "$CHANGELOG" \
|
||||
--tag-name "$CI_COMMIT_TAG" \
|
||||
--assets-link "{\"name\":\"${APP_ASSET_AMD64}\",\"url\":\"${ENDPOINT}/${CI_COMMIT_REF_NAME}/${APP_ASSET_AMD64}\"}" \
|
||||
--assets-link "{\"name\":\"${APP_ASSET_ARM}\",\"url\":\"${ENDPOINT}/${CI_COMMIT_REF_NAME}/${APP_ASSET_ARM}\"}" \
|
||||
--assets-link "{\"name\":\"${APP_ASSET_ARM64}\",\"url\":\"${ENDPOINT}/${CI_COMMIT_REF_NAME}/${APP_ASSET_ARM64}\"}"
|
||||
--assets-link "{\"name\":\"${APP_ASSET}\",\"url\":\"${ENDPOINT}/${APP_ASSET}\"}"
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
npm run pre-commit
|
|
@ -1,4 +0,0 @@
|
|||
src/i18n/*.json
|
||||
coverage/
|
||||
**/*.md
|
||||
test/fixtures
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"trailingComma": "es5",
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"bracketSpacing": true
|
||||
}
|
|
@ -8,5 +8,5 @@
|
|||
out: "",
|
||||
threshold: "medium",
|
||||
ignore: ["Config.HTTPS", "Config.CSP"],
|
||||
ignore_files: ["config/runtime.exs"]
|
||||
ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs", "config/runtime.1.secret.exs", "config/runtime.2.secret.exs", "config/runtime.3.secret.exs", "config/runtime.exs"]
|
||||
]
|
||||
|
|
|
@ -1,20 +1,12 @@
|
|||
|
||||
5048AE33D6269B15E21CF28C6F545AB6
|
||||
|
||||
752C0E897CA81ACD81F4BB215FA5F8E4
|
||||
23412CF16549E4E88366DC9DECF39071
|
||||
81C1F600C5809C7029EE32DE4818CD7D
|
||||
155A1FB53DE39EC8EFCFD7FB94EA823D
|
||||
1C29EE70E90ECED01AF28EC58D2575B5
|
||||
26ED12A8E03D044BEDC08749BAA5E357
|
||||
2BB1D36656B423758A470021718FCB09
|
||||
31CE26BC979C57B9E3CC97B40C290CE5
|
||||
3529E7A4CECC24D02678820E6F521162
|
||||
3644C4E850300482AA409471EFE1EFB3
|
||||
4E7C044C59E0BCB76AA826789998F624
|
||||
53CBBEB6243FAF5C37249CBA17DE6F4C
|
||||
5BCE3651A03711295046DE48BDFE007E
|
||||
5C4CED447689F00D9D1ACEB9B895ED29
|
||||
94ACF7B17C3FF42F64E57DD1DA936BD8
|
||||
A32E125003F1EDFAD95C487C6A969725
|
||||
ACF6272A1DBB3A2ABD96C0C120B5CA69
|
||||
C46C4893B2F702ACADC4CAA5683FE370
|
||||
CDF2CCE0CF10F49CDFAE22FE26208155
|
||||
E720CB13C50FF3ADEE7C522531E11217
|
||||
F3D5851D3FB050939841ED2F14307A27
|
||||
FD1C9756370A195B74E95CE504C45E9E
|
||||
73B351E4CB3AF715AD450A085F5E6304
|
||||
BBACD7F0BACD4A6D3010C26604671692
|
||||
6D4D4A4821B93BCFAC9CDBB367B34C4B
|
||||
5674F0D127852889ED0132DC2F442AAB
|
||||
1600B7206E47F630D94AB54C360906F0
|
|
@ -1,2 +0,0 @@
|
|||
elixir 1.15.5-otp-26
|
||||
erlang 26.0.2
|
1707
CHANGELOG.md
|
@ -1,10 +1,9 @@
|
|||
FROM elixir:1.15-alpine
|
||||
FROM elixir:alpine
|
||||
|
||||
RUN apk add --no-cache inotify-tools postgresql-client file make gcc libc-dev argon2 imagemagick cmake build-base libwebp-tools bash ncurses git python3 npm
|
||||
RUN apk add --no-cache inotify-tools postgresql-client yarn file make gcc libc-dev argon2 imagemagick cmake build-base libwebp-tools bash ncurses git python3
|
||||
|
||||
RUN mix local.hex --force && mix local.rebar --force
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
EXPOSE 4000
|
||||
EXPOSE 5173
|
||||
|
|
3
Makefile
|
@ -4,7 +4,7 @@ init:
|
|||
|
||||
setup: stop
|
||||
@bash docker/message.sh "Compiling everything"
|
||||
docker-compose run --rm api bash -c 'mix deps.get; npm ci; npm run build:pictures; mix ecto.create; mix ecto.migrate'
|
||||
docker-compose run --rm api bash -c 'mix deps.get; yarn --cwd "js"; yarn --cwd "js" build:pictures; mix ecto.create; mix ecto.migrate'
|
||||
migrate:
|
||||
docker-compose run --rm api mix ecto.migrate
|
||||
logs:
|
||||
|
@ -19,7 +19,6 @@ stop:
|
|||
@bash docker/message.sh "Mobilizon is stopped"
|
||||
test: stop
|
||||
@bash docker/message.sh "Running tests"
|
||||
docker-compose -f docker-compose.yml -f docker-compose.test.yml run api mix prepare_test
|
||||
docker-compose -f docker-compose.yml -f docker-compose.test.yml run api mix test $(only)
|
||||
@bash docker/message.sh "Done running tests"
|
||||
format:
|
||||
|
|
|
@ -41,7 +41,7 @@ There's no lock-in, you can interact with the event without registration.
|
|||
|
||||
## Contributing
|
||||
|
||||
We appreciate any contribution to Mobilizon. Check [our contributing page](https://docs.joinmobilizon.org/contribute/) for more information.
|
||||
We appreciate any contribution to Mobilizon. Check our [CONTRIBUTING](CONTRIBUTING.md) file for more information.
|
||||
|
||||
## Links
|
||||
|
||||
|
@ -50,7 +50,6 @@ We appreciate any contribution to Mobilizon. Check [our contributing page](https
|
|||
* 🔢 Pick an instance [https://mobilizon.org](https://mobilizon.org)
|
||||
* 💻 Source: [https://framagit.org/framasoft/mobilizon](https://framagit.org/framasoft/mobilizon)
|
||||
* 📜 Documentation [https://docs.joinmobilizon.org](https://docs.joinmobilizon.org)
|
||||
* A summarized description of structure of sources is done in [`docs/dev.md`](./docs/dev.md)
|
||||
|
||||
### Discuss
|
||||
* 💬 Element/Matrix: [https://matrix.to/#/#Mobilizon:matrix.org](https://matrix.to/#/#Mobilizon:matrix.org)
|
||||
|
|
179
UPGRADE.md
|
@ -1,182 +1,37 @@
|
|||
# Upgrading from 2.0 to 2.1
|
||||
|
||||
## Mailer library change
|
||||
|
||||
### Docker
|
||||
|
||||
The change is already applied. You may remove the `MOBILIZON_SMTP_HOSTNAME` environment key which is not used anymore.
|
||||
|
||||
### Release and source mode
|
||||
|
||||
In your configuration file under `config :mobilizon, Mobilizon.Web.Email.Mailer`,
|
||||
|
||||
- Change `Bamboo.SMTPAdapter` to `Swoosh.Adapters.SMTP`,
|
||||
- rename the `server` key to `relay`
|
||||
- remove the `hostname` key,
|
||||
- the default value of the username and password fields is an empty string and no longer `nil`.
|
||||
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer,
|
||||
- adapter: Bamboo.SMTPAdapter,
|
||||
+ adapter: Swoosh.Adapters.SMTP,
|
||||
- server: "localhost",
|
||||
+ relay: "localhost",
|
||||
- hostname: "localhost",
|
||||
# usually 25, 465 or 587
|
||||
port: 25,
|
||||
- username: nil,
|
||||
+ username: "",
|
||||
- password: nil,
|
||||
+ password: "",
|
||||
# can be `:always` or `:never`
|
||||
tls: :if_available,
|
||||
allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
|
||||
retries: 1,
|
||||
# can be `true`
|
||||
no_mx_lookups: false,
|
||||
# can be `:always`. If your smtp relay requires authentication set it to `:always`.
|
||||
auth: :if_available
|
||||
```
|
||||
|
||||
# Upgrading from 1.3 to 2.0
|
||||
|
||||
Requirements dependencies depend on the way Mobilizon is installed.
|
||||
|
||||
## New Elixir version requirement
|
||||
|
||||
### Docker and Release install
|
||||
|
||||
You are already using latest Elixir version in the release tarball and Docker images.
|
||||
|
||||
### Source install
|
||||
|
||||
**Elixir 1.12 and Erlang OTP 22 are now required**. If your distribution or the repositories from Erlang Solutions don't provide these versions, you need to uninstall the current versions and install [Elixir](https://github.com/asdf-vm/asdf-elixir) through the [ASDF tool](https://asdf-vm.com/).
|
||||
|
||||
## Geographic timezone data
|
||||
|
||||
Mobilizon 2.0 uses data based on [timezone-boundary-builder](https://github.com/evansiroky/timezone-boundary-builder) (which is based itself on OpenStreetMap data) to determine the timezone of an event automatically, based on it's geocoordinates. However, this needs ~700Mio of disk, so we don't redistribute data directly, depending on the case. It's possible to skip this part, but users will need to manually pick the timezone for every event they created when it has a different timezone from their own.
|
||||
|
||||
### Docker install
|
||||
|
||||
The geographic timezone data is already bundled into the image, you have nothing to do.
|
||||
|
||||
### Release install
|
||||
|
||||
In order to keep the release tarballs light, the geographic timezone data is not bundled directly. You need to download the data :
|
||||
|
||||
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon ./bin/mobilizon_ctl tz_world.update
|
||||
```
|
||||
|
||||
- either already processed from our own distribution server
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon curl -L 'https://packages.joinmobilizon.org/tz_world/timezones-geodata.dets' -o /var/lib/mobilizon/timezones/timezones-geodata.dets
|
||||
```
|
||||
|
||||
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected if you decide to change it from the default location (`/var/lib/mobilizon/timezones`) :
|
||||
|
||||
```elixir
|
||||
config :tz_world, data_dir: "/some/place"
|
||||
```
|
||||
|
||||
### Source install
|
||||
|
||||
You need to download the data :
|
||||
|
||||
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon mix mobilizon.tz_world.update
|
||||
```
|
||||
|
||||
- either already processed from our own distribution server
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon curl -L 'https://packages.joinmobilizon.org/tz_world/timezones-geodata.dets' -o /var/lib/mobilizon/timezones/timezones-geodata.dets
|
||||
```
|
||||
|
||||
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected:
|
||||
|
||||
```elixir
|
||||
config :tz_world, data_dir: "/some/place"
|
||||
```
|
||||
|
||||
## Exports folder
|
||||
|
||||
Create the folder for default CSV export:
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir -p /var/lib/mobilizon/uploads/exports/csv
|
||||
```
|
||||
|
||||
This path can be configured, see [the dedicated docs page about this](https://docs.joinmobilizon.org/administration/configure/exports/).
|
||||
Files in this folder are temporary and are cleaned once an hour.
|
||||
|
||||
## New optional dependencies
|
||||
|
||||
These are optional, installing them will allow Mobilizon to export to PDF and ODS as well. Mobilizon 2.0 allows to export the participant list, but more is planned.
|
||||
|
||||
### Docker
|
||||
|
||||
Everything is included in our Docker image.
|
||||
|
||||
### Release and source install
|
||||
|
||||
New optional Python dependencies:
|
||||
|
||||
- `Python` >= 3.6
|
||||
- `weasyprint` for PDF export (with [a few extra dependencies](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html))
|
||||
- `pyexcel-ods3` for ODS export (no extra dependencies)
|
||||
|
||||
Both can be installed through pip. You need to enable and configure exports for PDF and ODS in the configuration afterwards. Read [the dedicated docs page about this](https://docs.joinmobilizon.org/administration/configure/exports/).
|
||||
|
||||
# Upgrading from 1.0 to 1.1
|
||||
|
||||
The 1.1 version of Mobilizon brings Elixir releases support. An Elixir release is a self-contained directory that contains all of Mobilizon's code (front-end and backend), it's dependencies, as well as the Erlang Virtual Machine and runtime (only the parts you need). As long as the release has been assembled on the same OS and architecture, it can be deploy and run straight away. [Read more about releases](https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html#releases).
|
||||
|
||||
## Comparison
|
||||
|
||||
Migrating to releases means:
|
||||
|
||||
- You only get a precompiled binary, so you avoid compilation times when updating
|
||||
- No need to have Elixir/NodeJS installed on the system
|
||||
- Code/data/config location is more common (/opt, /var/lib, /etc)
|
||||
- More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
|
||||
- You can't hardcode modifications in Mobilizon's code
|
||||
* You only get a precompiled binary, so you avoid compilation times when updating
|
||||
* No need to have Elixir/NodeJS installed on the system
|
||||
* Code/data/config location is more common (/opt, /var/lib, /etc)
|
||||
* More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
|
||||
* You can't hardcode modifications in Mobilizon's code
|
||||
|
||||
Staying on source releases means:
|
||||
|
||||
- You need to recompile everything with each update
|
||||
- Compiling frontend and backend has higher system requirements than just running Mobilizon
|
||||
- You can change things in Mobilizon's code and recompile right away to test changes
|
||||
* You need to recompile everything with each update
|
||||
* Compiling frontend and backend has higher system requirements than just running Mobilizon
|
||||
* You can change things in Mobilizon's code and recompile right away to test changes
|
||||
|
||||
## Releases
|
||||
|
||||
If you want to migrate to releases, [we provide a full guide](https://docs.joinmobilizon.org/administration/upgrading/source_to_release/). You may do this at any time.
|
||||
|
||||
## Source install
|
||||
|
||||
To stay on a source release, you just need to check the following things:
|
||||
|
||||
- Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
|
||||
- If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Endpoint,
|
||||
- server: true,
|
||||
```
|
||||
- The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
|
||||
* Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
|
||||
* If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Endpoint,
|
||||
- server: true,
|
||||
```
|
||||
* The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
|
||||
```elixir
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
|
||||
```
|
||||
Or you may use any other directory where the `mobilizon` user has write permissions.
|
||||
- The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
|
||||
* The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
|
||||
```elixir
|
||||
config :geolix, databases: [
|
||||
%{
|
||||
|
@ -186,4 +41,4 @@ To stay on a source release, you just need to check the following things:
|
|||
}
|
||||
]
|
||||
```
|
||||
Or you may use any other directory where the `mobilizon` user has read permissions.
|
||||
Or you may use any other directory where the `mobilizon` user has read permissions.
|
|
@ -7,6 +7,6 @@ module.exports = {
|
|||
localSchemaFile: "./schema.graphql",
|
||||
},
|
||||
// Files processed by the extension
|
||||
includes: ["src/**/*.vue", "src/**/*.js"],
|
||||
includes: ["js/src/**/*.vue", "js/src/**/*.js"],
|
||||
},
|
||||
};
|
||||
|
|
|
@ -19,7 +19,6 @@ config :mobilizon, :instance,
|
|||
registrations_open: false,
|
||||
registration_email_allowlist: [],
|
||||
registration_email_denylist: [],
|
||||
disable_database_login: false,
|
||||
languages: [],
|
||||
default_language: "en",
|
||||
demo: false,
|
||||
|
@ -41,10 +40,7 @@ config :mobilizon, :instance,
|
|||
email_reply_to: "noreply@localhost"
|
||||
|
||||
config :mobilizon, :groups, enabled: true
|
||||
|
||||
config :mobilizon, :events,
|
||||
creation: true,
|
||||
external: true
|
||||
config :mobilizon, :events, creation: true
|
||||
|
||||
config :mobilizon, :restrictions, only_admin_can_create_groups: false
|
||||
config :mobilizon, :restrictions, only_groups_can_create_events: false
|
||||
|
@ -58,7 +54,7 @@ config :mobilizon, Mobilizon.Web.Endpoint,
|
|||
secret_key_base: "1yOazsoE0Wqu4kXk3uC5gu3jDbShOimTCzyFL3OjCdBmOXMyHX87Qmf3+Tu9s0iM",
|
||||
render_errors: [view: Mobilizon.Web.ErrorView, accepts: ~w(html json)],
|
||||
pubsub_server: Mobilizon.PubSub,
|
||||
cache_static_manifest: "priv/static/cache_manifest.json",
|
||||
cache_static_manifest: "priv/static/manifest.json",
|
||||
has_reverse_proxy: true
|
||||
|
||||
config :mime, :types, %{
|
||||
|
@ -68,10 +64,6 @@ config :mime, :types, %{
|
|||
"application/xrd+xml" => ["xrd-xml"]
|
||||
}
|
||||
|
||||
config :mime, :extensions, %{
|
||||
"activity-json" => "application/activity+json"
|
||||
}
|
||||
|
||||
# Upload configuration
|
||||
config :mobilizon, Mobilizon.Web.Upload,
|
||||
uploader: Mobilizon.Web.Upload.Uploader.Local,
|
||||
|
@ -96,10 +88,6 @@ config :mobilizon, Mobilizon.Web.Upload,
|
|||
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads"
|
||||
|
||||
config :tz_world, data_dir: "/var/lib/mobilizon/timezones"
|
||||
|
||||
config :mobilizon, Timex.Gettext, default_locale: "en"
|
||||
|
||||
config :mobilizon, :media_proxy,
|
||||
enabled: true,
|
||||
proxy_opts: [
|
||||
|
@ -114,35 +102,29 @@ config :mobilizon, :media_proxy,
|
|||
]
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer,
|
||||
adapter: Swoosh.Adapters.SMTP,
|
||||
relay: "localhost",
|
||||
username: "",
|
||||
password: "",
|
||||
adapter: Bamboo.SMTPAdapter,
|
||||
server: "localhost",
|
||||
hostname: "localhost",
|
||||
# usually 25, 465 or 587
|
||||
port: 25,
|
||||
username: nil,
|
||||
password: nil,
|
||||
# can be `:always` or `:never`
|
||||
auth: :if_available,
|
||||
# can be `true`
|
||||
# ssl: false,
|
||||
# can be `:always` or `:never`
|
||||
tls: :never,
|
||||
tls: :if_available,
|
||||
allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
|
||||
retries: 1,
|
||||
# can be `true`
|
||||
no_mx_lookups: false
|
||||
|
||||
config :vite_phx,
|
||||
release_app: :mobilizon,
|
||||
# to tell prod and dev env appart
|
||||
environment: config_env(),
|
||||
# this manifest is different from the Phoenix "cache_manifest.json"!
|
||||
# optional
|
||||
vite_manifest: "priv/static/manifest.json",
|
||||
# optional
|
||||
dev_server_address: "http://localhost:5173"
|
||||
|
||||
# Configures Elixir's Logger
|
||||
config :logger, :console,
|
||||
backends: [:console],
|
||||
format: "$time $metadata[$level] $message\n",
|
||||
metadata: [:request_id, :graphql_operation_name, :user_id, :actor_name, :trace]
|
||||
metadata: [:request_id]
|
||||
|
||||
config :logger, Sentry.LoggerBackend,
|
||||
level: :warn,
|
||||
capture_log_messages: true
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Auth.Guardian,
|
||||
issuer: "mobilizon",
|
||||
|
@ -152,12 +134,13 @@ config :mobilizon, Mobilizon.Web.Auth.Guardian,
|
|||
}
|
||||
|
||||
config :guardian, Guardian.DB,
|
||||
adapter: Guardian.DB.EctoAdapter,
|
||||
repo: Mobilizon.Storage.Repo,
|
||||
# default
|
||||
schema_name: "guardian_tokens",
|
||||
# store all token types if not set
|
||||
token_types: ["refresh"]
|
||||
token_types: ["refresh"],
|
||||
# default: 60 minutes
|
||||
sweep_interval: 60
|
||||
|
||||
config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase
|
||||
|
||||
|
@ -198,13 +181,7 @@ config :phoenix, :filter_parameters, ["password", "token"]
|
|||
config :absinthe, schema: Mobilizon.GraphQL.Schema
|
||||
config :absinthe, Absinthe.Logger, filter_variables: ["token", "password", "secret"]
|
||||
|
||||
config :codepagex, :encodings, [
|
||||
:ascii,
|
||||
~r[iso8859]i,
|
||||
:"VENDORS/MICSFT/WINDOWS/CP1252"
|
||||
]
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Gettext, split_module_by: [:locale, :domain]
|
||||
config :mobilizon, Mobilizon.Web.Gettext, one_module_per_locale: true
|
||||
|
||||
config :ex_cldr,
|
||||
default_locale: "en",
|
||||
|
@ -217,16 +194,14 @@ config :mobilizon, :cldr,
|
|||
locales: [
|
||||
"fr",
|
||||
"en",
|
||||
"ru",
|
||||
"ar"
|
||||
"ru"
|
||||
]
|
||||
|
||||
config :mobilizon, :activitypub,
|
||||
# One day
|
||||
actor_stale_period: 3_600 * 48,
|
||||
actor_key_rotation_delay: 3_600 * 48,
|
||||
sign_object_fetches: true,
|
||||
stale_actor_search_exclusion_after: 3_600 * 24 * 7
|
||||
sign_object_fetches: true
|
||||
|
||||
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
|
||||
|
||||
|
@ -310,24 +285,15 @@ config :mobilizon, Oban,
|
|||
crontab: [
|
||||
{"@hourly", Mobilizon.Service.Workers.BuildSiteMap, queue: :background},
|
||||
{"17 4 * * *", Mobilizon.Service.Workers.RefreshGroups, queue: :background},
|
||||
{"36 3 * * *", Mobilizon.Service.Workers.RefreshInstances, queue: :background},
|
||||
{"@hourly", Mobilizon.Service.Workers.CleanOrphanMediaWorker, queue: :background},
|
||||
{"@hourly", Mobilizon.Service.Workers.CleanUnconfirmedUsersWorker, queue: :background},
|
||||
{"@hourly", Mobilizon.Service.Workers.ExportCleanerWorker, queue: :background},
|
||||
{"@hourly", Mobilizon.Service.Workers.SendActivityRecapWorker, queue: :notifications},
|
||||
{"@daily", Mobilizon.Service.Workers.CleanOldActivityWorker, queue: :background},
|
||||
{"@daily", Mobilizon.Service.Workers.RefreshParticipantStats, queue: :background},
|
||||
{"@hourly", Mobilizon.Service.Workers.CleanApplicationData,
|
||||
queue: :background, args: %{type: :application_token}},
|
||||
{"@hourly", Mobilizon.Service.Workers.CleanApplicationData,
|
||||
queue: :background, args: %{type: :application_device_activation}}
|
||||
{"@daily", Mobilizon.Service.Workers.CleanOldActivityWorker, queue: :background}
|
||||
]},
|
||||
{Oban.Plugins.Pruner, max_age: 300}
|
||||
]
|
||||
|
||||
config :hammer,
|
||||
backend: {Hammer.Backend.ETS, [expiry_ms: 60_000 * 60 * 4, cleanup_interval_ms: 60_000 * 10]}
|
||||
|
||||
config :mobilizon, :rich_media,
|
||||
parsers: [
|
||||
Mobilizon.Service.RichMedia.Parsers.OEmbed,
|
||||
|
@ -358,34 +324,10 @@ config :mobilizon, Mobilizon.Service.Notifier.Email, enabled: true
|
|||
config :mobilizon, Mobilizon.Service.Notifier.Push, enabled: true
|
||||
|
||||
config :mobilizon, :exports,
|
||||
path: "/var/lib/mobilizon/uploads/exports",
|
||||
formats: [
|
||||
Mobilizon.Service.Export.Participants.CSV
|
||||
]
|
||||
|
||||
config :mobilizon, :analytics, providers: []
|
||||
|
||||
config :mobilizon, Mobilizon.Service.Pictures, service: Mobilizon.Service.Pictures.Unsplash
|
||||
|
||||
config :mobilizon, Mobilizon.Service.Pictures.Unsplash,
|
||||
app_name: "Mobilizon",
|
||||
access_key: nil
|
||||
|
||||
config :mobilizon, :search, global: [is_default_search: false, is_enabled: true]
|
||||
|
||||
config :mobilizon, Mobilizon.Service.GlobalSearch,
|
||||
service: Mobilizon.Service.GlobalSearch.SearchMobilizon
|
||||
|
||||
config :mobilizon, Mobilizon.Service.GlobalSearch.SearchMobilizon,
|
||||
endpoint: "https://search.joinmobilizon.org",
|
||||
csp_policy: [
|
||||
img_src: ["search.joinmobilizon.org"]
|
||||
]
|
||||
|
||||
config :mobilizon, Mobilizon.Service.AntiSpam, service: Mobilizon.Service.AntiSpam.Akismet
|
||||
|
||||
config :mobilizon, Mobilizon.Service.SiteMap, path: "/var/lib/mobilizon/sitemap"
|
||||
|
||||
# Import environment specific config. This must remain at the bottom
|
||||
# of this file so it overrides the configuration defined above.
|
||||
import_config "#{config_env()}.exs"
|
||||
|
|
|
@ -15,9 +15,14 @@ config :mobilizon, Mobilizon.Web.Endpoint,
|
|||
check_origin: false,
|
||||
watchers: [
|
||||
node: [
|
||||
"node_modules/.bin/vite",
|
||||
"--host",
|
||||
System.get_env("VITE_HOST", "localhost")
|
||||
"node_modules/webpack/bin/webpack.js",
|
||||
"--mode",
|
||||
"development",
|
||||
"--watch",
|
||||
"--watch-options-stdin",
|
||||
"--config",
|
||||
"node_modules/@vue/cli-service/webpack.config.js",
|
||||
cd: Path.expand("../js", __DIR__)
|
||||
]
|
||||
]
|
||||
|
||||
|
@ -49,11 +54,11 @@ config :mobilizon, Mobilizon.Web.Endpoint,
|
|||
]
|
||||
|
||||
# Do not include metadata nor timestamps in development logs
|
||||
config :logger, :console, format: "$metadata[$level] $message\n", level: :debug
|
||||
config :logger, :console, format: "[$level] $message\n", level: :debug
|
||||
|
||||
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Gettext, allowed_locales: ["fr", "en", "ru", "ar"]
|
||||
config :mobilizon, Mobilizon.Web.Gettext, allowed_locales: ["fr", "en", "ar"]
|
||||
|
||||
# Set a higher stacktrace during development. Avoid configuring such
|
||||
# in production as building large stacktraces may be expensive.
|
||||
|
@ -62,7 +67,7 @@ config :phoenix, :stacktrace_depth, 20
|
|||
# Initialize plugs at runtime for faster development compilation
|
||||
config :phoenix, :plug_init_mode, :runtime
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Swoosh.Adapters.Local
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.LocalAdapter
|
||||
|
||||
# Configure your database
|
||||
config :mobilizon, Mobilizon.Storage.Repo,
|
||||
|
@ -72,9 +77,7 @@ config :mobilizon, Mobilizon.Storage.Repo,
|
|||
hostname: System.get_env("MOBILIZON_DATABASE_HOST", "localhost"),
|
||||
port: System.get_env("MOBILIZON_DATABASE_PORT", "5432"),
|
||||
pool_size: 10,
|
||||
show_sensitive_data_on_connection_error: true,
|
||||
# Logging is handled by Ecto.DevLogger
|
||||
log: false
|
||||
show_sensitive_data_on_connection_error: true
|
||||
|
||||
config :mobilizon, :instance,
|
||||
name: System.get_env("MOBILIZON_INSTANCE_NAME", "Mobilizon"),
|
||||
|
@ -91,16 +94,7 @@ config :mobilizon, Mobilizon.Web.Auth.Guardian,
|
|||
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
|
||||
|
||||
config :mobilizon, :exports, path: "uploads/exports"
|
||||
|
||||
config :mobilizon, Mobilizon.Service.SiteMap,
|
||||
path: System.get_env("MOBILIZON_SITEMAP_PATH", "priv/static")
|
||||
|
||||
config :tz_world, data_dir: "_build/dev/lib/tz_world/priv"
|
||||
|
||||
config :mobilizon, :anonymous,
|
||||
reports: [
|
||||
allowed: true
|
||||
]
|
||||
|
||||
config :unplug, :init_mode, :runtime
|
||||
|
|
|
@ -2,28 +2,6 @@
|
|||
|
||||
import Config
|
||||
|
||||
{:ok, _} = Application.ensure_all_started(:tls_certificate_check)
|
||||
|
||||
loglevels = [
|
||||
:emergency,
|
||||
:alert,
|
||||
:critical,
|
||||
:error,
|
||||
:warning,
|
||||
:notice,
|
||||
:info,
|
||||
:debug
|
||||
]
|
||||
|
||||
loglevel_env = System.get_env("MOBILIZON_LOGLEVEL", "error")
|
||||
|
||||
loglevel =
|
||||
if loglevel_env in Enum.map(loglevels, &to_string/1) do
|
||||
String.to_existing_atom(loglevel_env)
|
||||
else
|
||||
:error
|
||||
end
|
||||
|
||||
listen_ip = System.get_env("MOBILIZON_INSTANCE_LISTEN_IP", "0.0.0.0")
|
||||
|
||||
listen_ip =
|
||||
|
@ -55,27 +33,27 @@ config :mobilizon, :instance,
|
|||
email_from: System.get_env("MOBILIZON_INSTANCE_EMAIL", "noreply@mobilizon.lan"),
|
||||
email_reply_to: System.get_env("MOBILIZON_REPLY_EMAIL", "noreply@mobilizon.lan")
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local,
|
||||
uploads: System.get_env("MOBILIZON_UPLOADS", "/app/uploads")
|
||||
|
||||
config :mobilizon, Mobilizon.Storage.Repo,
|
||||
adapter: Ecto.Adapters.Postgres,
|
||||
username: System.get_env("MOBILIZON_DATABASE_USERNAME", "username"),
|
||||
password: System.get_env("MOBILIZON_DATABASE_PASSWORD", "password"),
|
||||
database: System.get_env("MOBILIZON_DATABASE_DBNAME", "mobilizon"),
|
||||
hostname: System.get_env("MOBILIZON_DATABASE_HOST", "postgres"),
|
||||
port: System.get_env("MOBILIZON_DATABASE_PORT", "5432"),
|
||||
ssl: System.get_env("MOBILIZON_DATABASE_SSL", "false") == "true",
|
||||
port: 5432,
|
||||
pool_size: 10
|
||||
|
||||
config :logger, level: loglevel
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer,
|
||||
adapter: Swoosh.Adapters.SMTP,
|
||||
relay: System.get_env("MOBILIZON_SMTP_SERVER", "localhost"),
|
||||
adapter: Bamboo.SMTPAdapter,
|
||||
server: System.get_env("MOBILIZON_SMTP_SERVER", "localhost"),
|
||||
hostname: System.get_env("MOBILIZON_SMTP_HOSTNAME", "localhost"),
|
||||
port: System.get_env("MOBILIZON_SMTP_PORT", "25"),
|
||||
username: System.get_env("MOBILIZON_SMTP_USERNAME", nil),
|
||||
password: System.get_env("MOBILIZON_SMTP_PASSWORD", nil),
|
||||
tls: System.get_env("MOBILIZON_SMTP_TLS", "if_available"),
|
||||
tls_options:
|
||||
:tls_certificate_check.options(System.get_env("MOBILIZON_SMTP_SERVER", "localhost")),
|
||||
tls: :if_available,
|
||||
allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
|
||||
ssl: System.get_env("MOBILIZON_SMTP_SSL", "false"),
|
||||
retries: 1,
|
||||
no_mx_lookups: false,
|
||||
|
@ -90,18 +68,4 @@ config :geolix,
|
|||
}
|
||||
]
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local,
|
||||
uploads: System.get_env("MOBILIZON_UPLOADS", "/var/lib/mobilizon/uploads")
|
||||
|
||||
config :mobilizon, :exports,
|
||||
path: System.get_env("MOBILIZON_UPLOADS_EXPORTS", "/var/lib/mobilizon/uploads/exports"),
|
||||
formats: [
|
||||
Mobilizon.Service.Export.Participants.CSV,
|
||||
Mobilizon.Service.Export.Participants.PDF,
|
||||
Mobilizon.Service.Export.Participants.ODS
|
||||
]
|
||||
|
||||
config :tz_world,
|
||||
data_dir: System.get_env("MOBILIZON_TIMEZONES_DIR", "/var/lib/mobilizon/timezones")
|
||||
|
||||
config :tzdata, :data_dir, System.get_env("MOBILIZON_TZDATA_DIR", "/var/lib/mobilizon/tzdata")
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobilizon/uploads"
|
||||
|
|
|
@ -16,44 +16,22 @@ config :mobilizon, Mobilizon.Web.Endpoint,
|
|||
check_origin: false,
|
||||
# Somehow this can't be merged properly with the dev config so we got this…
|
||||
watchers: [
|
||||
node: [
|
||||
"node_modules/.bin/vite"
|
||||
]
|
||||
yarn: [cd: Path.expand("../js", __DIR__)]
|
||||
]
|
||||
|
||||
config :vite_phx,
|
||||
release_app: :mobilizon,
|
||||
# Hard code :prod as an environment as :e2e will not be recongnized
|
||||
environment: :prod,
|
||||
vite_manifest: "priv/static/manifest.json",
|
||||
phx_manifest: "priv/static/cache_manifest.json",
|
||||
dev_server_address: "http://localhost:5173"
|
||||
require Logger
|
||||
|
||||
config :mobilizon, :instance,
|
||||
name: "E2E Testing instance",
|
||||
description: "E2E is safety",
|
||||
hostname: "mobilizon1.com",
|
||||
registrations_open: true,
|
||||
registration_email_denylist: ["gmail.com", "deny@tcit.fr"],
|
||||
demo: false,
|
||||
default_language: "en",
|
||||
allow_relay: true,
|
||||
federating: true,
|
||||
email_from: "mobilizon@mobilizon1.com",
|
||||
email_reply_to: nil,
|
||||
enable_instance_feeds: true,
|
||||
koena_connect_link: true,
|
||||
extra_categories: [
|
||||
%{
|
||||
id: :something_else,
|
||||
label: "Quelque chose d'autre"
|
||||
}
|
||||
]
|
||||
cond do
|
||||
System.get_env("INSTANCE_CONFIG") &&
|
||||
File.exists?("./config/#{System.get_env("INSTANCE_CONFIG")}") ->
|
||||
import_config System.get_env("INSTANCE_CONFIG")
|
||||
|
||||
config :mobilizon, Mobilizon.Storage.Repo,
|
||||
adapter: Ecto.Adapters.Postgres,
|
||||
username: System.get_env("MOBILIZON_DATABASE_USERNAME", "mobilizon_e2e"),
|
||||
password: System.get_env("MOBILIZON_DATABASE_PASSWORD", "mobilizon_e2e"),
|
||||
database: System.get_env("MOBILIZON_DATABASE_DBNAME", "mobilizon_e2e"),
|
||||
hostname: System.get_env("MOBILIZON_DATABASE_HOST", "localhost"),
|
||||
port: System.get_env("MOBILIZON_DATABASE_PORT") || "5432"
|
||||
System.get_env("DOCKER", "false") == "false" && File.exists?("./config/e2e.secret.exs") ->
|
||||
import_config "e2e.secret.exs"
|
||||
|
||||
System.get_env("DOCKER", "false") == "true" ->
|
||||
Logger.info("Using environment configuration for Docker")
|
||||
|
||||
true ->
|
||||
Logger.error("No configuration file found")
|
||||
end
|
||||
|
|
|
@ -18,28 +18,31 @@ config :mobilizon, :cldr,
|
|||
locales: [
|
||||
"ar",
|
||||
"be",
|
||||
"bn",
|
||||
"ca",
|
||||
"cs",
|
||||
"cy",
|
||||
"de",
|
||||
"en",
|
||||
"es",
|
||||
"fa",
|
||||
"fi",
|
||||
"fr",
|
||||
"gd",
|
||||
"gl",
|
||||
"hr",
|
||||
"hu",
|
||||
"id",
|
||||
"it",
|
||||
"ja",
|
||||
"nl",
|
||||
"nn",
|
||||
"oc",
|
||||
"pl",
|
||||
"pt",
|
||||
"ru",
|
||||
"sv",
|
||||
"zh_Hant"
|
||||
"sv"
|
||||
]
|
||||
|
||||
cond do
|
||||
System.get_env("INSTANCE_CONFIG") &&
|
||||
File.exists?("./config/#{System.get_env("INSTANCE_CONFIG")}") ->
|
||||
import_config System.get_env("INSTANCE_CONFIG")
|
||||
|
||||
true ->
|
||||
:ok
|
||||
end
|
||||
|
|
|
@ -54,39 +54,24 @@ config :mobilizon, :ldap,
|
|||
bind_uid: System.get_env("LDAP_BIND_UID"),
|
||||
bind_password: System.get_env("LDAP_BIND_PASSWORD")
|
||||
|
||||
# Faster runs in test environment
|
||||
config :argon2_elixir,
|
||||
t_cost: 1,
|
||||
m_cost: 8
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Swoosh.Adapters.Test
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer, adapter: Bamboo.TestAdapter
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Upload, filters: [], link_name: false
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "test/uploads"
|
||||
|
||||
config :mobilizon, :exports, path: "test/uploads/exports"
|
||||
|
||||
config :mobilizon, Mobilizon.Service.SiteMap,
|
||||
path: System.get_env("MOBILIZON_SITEMAP_PATH", "test/sitemap")
|
||||
|
||||
config :tz_world, data_dir: "_build/test/lib/tz_world/priv"
|
||||
config :exvcr,
|
||||
vcr_cassette_library_dir: "test/fixtures/vcr_cassettes"
|
||||
|
||||
config :tesla, Mobilizon.Service.HTTP.ActivityPub,
|
||||
adapter: Mobilizon.Service.HTTP.ActivityPub.Mock
|
||||
|
||||
config :tesla, Mobilizon.Service.HTTP.WebfingerClient,
|
||||
adapter: Mobilizon.Service.HTTP.WebfingerClient.Mock
|
||||
|
||||
config :tesla, Mobilizon.Service.HTTP.GeospatialClient,
|
||||
adapter: Mobilizon.Service.HTTP.GeospatialClient.Mock
|
||||
|
||||
config :tesla, Mobilizon.Service.HTTP.HostMetaClient,
|
||||
adapter: Mobilizon.Service.HTTP.HostMetaClient.Mock
|
||||
|
||||
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Mock
|
||||
|
||||
config :mobilizon, Oban, testing: :manual
|
||||
config :mobilizon, Oban, queues: false, plugins: false
|
||||
|
||||
config :mobilizon, Mobilizon.Web.Auth.Guardian, secret_key: "some secret"
|
||||
|
||||
|
@ -96,10 +81,6 @@ config :mobilizon, Mobilizon.Web.Gettext, allowed_locales: ["fr", "en", "es", "r
|
|||
|
||||
config :junit_formatter, report_dir: "."
|
||||
|
||||
config :mobilizon, :http_security, report_uri: "https://endpoint.com"
|
||||
|
||||
config :mobilizon, Mobilizon.Service.AntiSpam, service: Mobilizon.Service.AntiSpam.Mock
|
||||
|
||||
if System.get_env("DOCKER", "false") == "false" && File.exists?("./config/test.secret.exs") do
|
||||
import_config "test.secret.exs"
|
||||
end
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
version: "3.2"
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
|
@ -11,7 +11,7 @@ services:
|
|||
MIX_ENV: "test"
|
||||
MOBILIZON_DATABASE_DBNAME: mobilizon_test
|
||||
MOBILIZON_INSTANCE_HOST: mobilizon.test
|
||||
command: "mix prepare_test && mix test"
|
||||
command: "mix test"
|
||||
volumes:
|
||||
pgdata:
|
||||
.:
|
||||
|
|
|
@ -19,7 +19,6 @@ services:
|
|||
- ".:/app"
|
||||
ports:
|
||||
- 4000:4000
|
||||
- 5173:5173
|
||||
depends_on:
|
||||
- postgres
|
||||
environment:
|
||||
|
@ -36,7 +35,6 @@ services:
|
|||
MOBILIZON_DATABASE_DBNAME: ${POSTGRES_DB}
|
||||
MOBILIZON_DATABASE_HOST: postgres
|
||||
MOBILIZON_DATABASE_PORT: ${POSTGRES_PORT}
|
||||
VITE_HOST: ${VITE_HOST:-localhost}
|
||||
command: sh -c "mix phx.server"
|
||||
volumes:
|
||||
pgdata:
|
||||
|
|
|
@ -1,27 +1,21 @@
|
|||
ARG IMAGE="elixir:1.15"
|
||||
|
||||
FROM ${IMAGE} as build
|
||||
FROM elixir as build
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
ENV MIX_ENV prod
|
||||
# ENV LANG en_US.UTF-8
|
||||
ARG APP_ASSET
|
||||
|
||||
# Fix qemu segfault on arm64
|
||||
# See https://github.com/plausible/analytics/pull/2879 and https://github.com/erlang/otp/pull/6340
|
||||
ARG ERL_FLAGS=""
|
||||
ENV ERL_FLAGS=$ERL_FLAGS
|
||||
|
||||
# Set the right versions
|
||||
ENV ELIXIR_VERSION latest
|
||||
ENV ERLANG_VERSION latest
|
||||
ENV NODE_VERSION 20
|
||||
ENV NODE_VERSION 16
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update -yq && apt-get install -yq build-essential cmake postgresql-client git curl gnupg unzip exiftool webp imagemagick gifsicle
|
||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
|
||||
# # Install Node
|
||||
# # Install Node & yarn
|
||||
# RUN curl -sL https://deb.nodesource.com/setup_16.x | bash && apt-get install nodejs -yq
|
||||
# RUN npm install -g yarn
|
||||
|
||||
# Install build tools
|
||||
RUN source /root/.bashrc && \
|
||||
|
@ -33,15 +27,14 @@ COPY ./ /mobilizon
|
|||
WORKDIR /mobilizon
|
||||
|
||||
# # Build front-end
|
||||
# RUN npm install
|
||||
# RUN npm run build
|
||||
# RUN yarn --cwd "js" install --frozen-lockfile
|
||||
# RUN yarn --cwd "js" run build
|
||||
|
||||
# Elixir release
|
||||
RUN source /root/.bashrc && \
|
||||
mix deps.get --only prod && \
|
||||
mix compile && \
|
||||
mix phx.digest.clean --all && \
|
||||
mix phx.digest && \
|
||||
mix release --path release/mobilizon && \
|
||||
cd release/mobilizon && \
|
||||
ln -s lib/mobilizon-*/priv priv && \
|
||||
|
|
|
@ -1,20 +1,17 @@
|
|||
# First build the application assets
|
||||
FROM node:20-alpine as assets
|
||||
FROM node:16-alpine as assets
|
||||
|
||||
RUN apk add --no-cache python3 build-base libwebp-tools bash imagemagick ncurses
|
||||
WORKDIR /build
|
||||
COPY . .
|
||||
COPY js .
|
||||
|
||||
# Network timeout because it's slow when cross-compiling
|
||||
RUN npm install && npm run build
|
||||
ENV CYPRESS_INSTALL_BINARY 0
|
||||
|
||||
RUN yarn install \
|
||||
&& yarn run build
|
||||
|
||||
# Then, build the application binary
|
||||
FROM elixir:1.15-alpine AS builder
|
||||
|
||||
# Fix qemu segfault on arm64
|
||||
# See https://github.com/plausible/analytics/pull/2879 and https://github.com/erlang/otp/pull/6340
|
||||
ARG ERL_FLAGS=""
|
||||
ENV ERL_FLAGS=$ERL_FLAGS
|
||||
FROM elixir:1.12-alpine AS builder
|
||||
|
||||
RUN apk add --no-cache build-base git cmake
|
||||
|
||||
|
@ -30,9 +27,10 @@ COPY config/config.exs config/prod.exs ./config/
|
|||
COPY config/docker.exs ./config/runtime.exs
|
||||
COPY rel ./rel
|
||||
COPY support ./support
|
||||
COPY --from=assets /build/priv/static ./priv/static
|
||||
COPY --from=assets ./priv/static ./priv/static
|
||||
|
||||
RUN mix phx.digest.clean --all && mix phx.digest && mix release
|
||||
RUN mix phx.digest \
|
||||
&& mix release
|
||||
|
||||
# Finally setup the app
|
||||
FROM alpine
|
||||
|
@ -50,24 +48,12 @@ LABEL org.opencontainers.image.title="mobilizon" \
|
|||
org.opencontainers.image.revision=$VCS_REF \
|
||||
org.opencontainers.image.created=$BUILD_DATE
|
||||
|
||||
RUN apk add --no-cache curl openssl ca-certificates ncurses-libs file postgresql-client libgcc libstdc++ imagemagick python3 py3-pip py3-pillow py3-cffi py3-brotli gcc g++ musl-dev python3-dev pango libxslt-dev ttf-cantarell openssl1.1-compat
|
||||
RUN pip --no-cache-dir install weasyprint pyexcel-ods3
|
||||
RUN apk add --no-cache openssl ca-certificates ncurses-libs file postgresql-client libgcc libstdc++ imagemagick
|
||||
|
||||
# Create every data directory
|
||||
RUN mkdir -p /var/lib/mobilizon/uploads && chown nobody:nobody /var/lib/mobilizon/uploads
|
||||
RUN mkdir -p /var/lib/mobilizon/timezones && chown nobody:nobody /var/lib/mobilizon/timezones
|
||||
RUN mkdir -p /var/lib/mobilizon/tzdata && chown nobody:nobody /var/lib/mobilizon/tzdata
|
||||
RUN mkdir -p /var/lib/mobilizon/sitemap && chown nobody:nobody /var/lib/mobilizon/sitemap
|
||||
RUN mkdir -p /var/lib/mobilizon/uploads/exports/{csv,pdf,ods} && chown -R nobody:nobody /var/lib/mobilizon/uploads/exports
|
||||
|
||||
# Create configuration directory
|
||||
RUN mkdir -p /app/uploads && chown nobody:nobody /app/uploads
|
||||
RUN mkdir -p /etc/mobilizon && chown nobody:nobody /etc/mobilizon
|
||||
|
||||
USER nobody
|
||||
|
||||
# Get timezone geodata
|
||||
RUN curl -L 'https://packages.joinmobilizon.org/tz_world/timezones-geodata.dets' -o /var/lib/mobilizon/timezones/timezones-geodata.dets
|
||||
|
||||
EXPOSE 4000
|
||||
|
||||
ENV MOBILIZON_DOCKER=true
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
set -e
|
||||
|
||||
echo "-- Waiting for database..."
|
||||
while ! pg_isready -U ${MOBILIZON_DATABASE_USERNAME} -d postgres://${MOBILIZON_DATABASE_HOST}:${MOBILIZON_DATABASE_PORT:-5432}/${MOBILIZON_DATABASE_DBNAME} -t 1; do
|
||||
while ! pg_isready -U ${MOBILIZON_DATABASE_USERNAME} -d postgres://${MOBILIZON_DATABASE_HOST}:5432/${MOBILIZON_DATABASE_DBNAME} -t 1; do
|
||||
sleep 1s
|
||||
done
|
||||
|
||||
PGPASSWORD=$MOBILIZON_DATABASE_PASSWORD psql -U $MOBILIZON_DATABASE_USERNAME -d $MOBILIZON_DATABASE_DBNAME -h $MOBILIZON_DATABASE_HOST -p ${MOBILIZON_DATABASE_PORT:-5432} -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
|
||||
PGPASSWORD=$MOBILIZON_DATABASE_PASSWORD psql -U $MOBILIZON_DATABASE_USERNAME -d $MOBILIZON_DATABASE_DBNAME -h $MOBILIZON_DATABASE_HOST -p ${MOBILIZON_DATABASE_PORT:-5432} -c 'CREATE EXTENSION IF NOT EXISTS unaccent;'
|
||||
PGPASSWORD=$MOBILIZON_DATABASE_PASSWORD psql -U $MOBILIZON_DATABASE_USERNAME -d $MOBILIZON_DATABASE_DBNAME -h $MOBILIZON_DATABASE_HOST -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
|
||||
PGPASSWORD=$MOBILIZON_DATABASE_PASSWORD psql -U $MOBILIZON_DATABASE_USERNAME -d $MOBILIZON_DATABASE_DBNAME -h $MOBILIZON_DATABASE_HOST -c 'CREATE EXTENSION IF NOT EXISTS unaccent;'
|
||||
|
||||
echo "-- Running migrations..."
|
||||
/bin/mobilizon_ctl migrate
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
FROM elixir:latest
|
||||
LABEL maintainer="Thomas Citharel <thomas.citharel@framasoft.org>"
|
||||
LABEL maintainer="Thomas Citharel <tcit@tcit.fr>"
|
||||
|
||||
ENV REFRESHED_AT=2023-11-20
|
||||
RUN apt-get update -yq && apt-get install -yq ca-certificates build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 cmake exiftool python3-pip python3-setuptools
|
||||
RUN mkdir -p /etc/apt/keyrings && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && apt-get update && apt-get install nodejs -yq
|
||||
RUN npm install -g wait-on
|
||||
ENV REFRESHED_AT=2021-10-04
|
||||
RUN apt-get update -yq && apt-get install -yq build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 cmake exiftool python3-pip python3-setuptools
|
||||
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash && apt-get install nodejs -yq
|
||||
RUN npm install -g yarn wait-on
|
||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
RUN mix local.hex --force && mix local.rebar --force
|
||||
RUN pip3 --no-cache-dir install -Iv weasyprint pyexcel_ods3
|
||||
# Weasyprint 53 requires pango >= 1.44.0, which is not available in Stretch.
|
||||
# TODO: Remove the version requirement when elixir:latest is based on Bullseye
|
||||
# https://github.com/erlang/docker-erlang-otp/issues/362
|
||||
# https://github.com/Kozea/WeasyPrint/issues/1384
|
||||
RUN pip3 install -Iv weasyprint==52 pyexcel_ods3
|
||||
RUN curl https://dbip.mirror.framasoft.org/files/dbip-city-lite-latest.mmdb --output GeoLite2-City.mmdb -s && mkdir -p /usr/share/GeoIP && mv GeoLite2-City.mmdb /usr/share/GeoIP/
|
||||
|
|
30
docs/dev.md
|
@ -1,30 +0,0 @@
|
|||
# Documentation for developpers
|
||||
|
||||
_This file is a summary of the documentation for developpers. As explained in [CONTRIBUTING.md](../CONTRIBUTING.md), the main documentation is available at <https://docs.joinmobilizon.org/contribute/>_
|
||||
|
||||
## Technologies
|
||||
|
||||
Mobilizon is an app that uses:
|
||||
* [Elixir](https://elixir-lang.org/) for backend,
|
||||
* [VueJS](https://vuejs.org/) for front-end
|
||||
* [GraphQL](https://graphql.org/) as it's API layer
|
||||
|
||||
[GraphQL](https://graphql.org/) is managed using:
|
||||
* [Absinthe](https://absinthe-graphql.org/) on the backend
|
||||
* [VueApollo](https://apollo.vuejs.org/) on the front-end.
|
||||
|
||||
[UI](https://en.wikipedia.org/wiki/User_interface) is handled with [Tailwind](https://tailwindcss.com/) and [Oruga](https://oruga.io/).
|
||||
|
||||
## Structure of sources
|
||||
|
||||
* `config` backend compile-time and runtime configuration
|
||||
* `docker` 🐳
|
||||
* `src` Front-end
|
||||
* `lib/federation` Handling all the federation stuff (sending and receving activities, converting activities, signatures, helpers…)
|
||||
* `lib/graphql/schema` The schema declarations for the GraphQL API
|
||||
* `lib/graphql/resolvers` The logic behind the GraphQL API
|
||||
* `lib/mix/tasks` CLI
|
||||
* `lib/mobilizon` model structures, database queries
|
||||
* `lib/service` various services
|
||||
* `lib/web` controllers, middlewares, auth-related stuff
|
||||
* `test` tests
|
|
@ -1,12 +0,0 @@
|
|||
/// <reference types="histoire/vue" />
|
||||
|
||||
/// <reference types="vite/client" />
|
||||
|
||||
interface ImportMetaEnv {
|
||||
readonly VITE_SERVER_URL: string;
|
||||
readonly VITE_HISTOIRE_ENV: string;
|
||||
}
|
||||
|
||||
interface ImportMeta {
|
||||
readonly env: ImportMetaEnv;
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/// <reference types="@histoire/plugin-vue/components" />
|
||||
|
||||
import { defineConfig } from "histoire";
|
||||
import { HstVue } from "@histoire/plugin-vue";
|
||||
import path from "path";
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [HstVue()],
|
||||
setupFile: path.resolve(__dirname, "./src/histoire.setup.ts"),
|
||||
viteNodeInlineDeps: [/date-fns/],
|
||||
// viteIgnorePlugins: ['vite-plugin-pwa', 'vite-plugin-pwa:build', 'vite-plugin-pwa:info'],
|
||||
tree: {
|
||||
groups: [
|
||||
{
|
||||
title: "Actors",
|
||||
include: (file) => /^src\/components\/Account/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Address",
|
||||
include: (file) => /^src\/components\/Address/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Comments",
|
||||
include: (file) => /^src\/components\/Comment/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Discussion",
|
||||
include: (file) => /^src\/components\/Discussion/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Events",
|
||||
include: (file) => /^src\/components\/Event/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Groups",
|
||||
include: (file) => /^src\/components\/Group/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Home",
|
||||
include: (file) => /^src\/components\/Home/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Posts",
|
||||
include: (file) => /^src\/components\/Post/.test(file.path),
|
||||
},
|
||||
{
|
||||
title: "Others",
|
||||
include: () => true,
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
|
@ -1,6 +1,3 @@
|
|||
/* eslint-env node */
|
||||
require("@rushstack/eslint-patch/modern-module-resolution");
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
|
||||
|
@ -9,11 +6,11 @@ module.exports = {
|
|||
},
|
||||
|
||||
extends: [
|
||||
"plugin:vue/essential",
|
||||
"eslint:recommended",
|
||||
"plugin:vue/vue3-essential",
|
||||
"@vue/eslint-config-typescript/recommended",
|
||||
"plugin:prettier/recommended",
|
||||
"@vue/eslint-config-prettier",
|
||||
"@vue/typescript/recommended",
|
||||
"@vue/prettier",
|
||||
"@vue/prettier/@typescript-eslint",
|
||||
],
|
||||
|
||||
plugins: ["prettier"],
|
||||
|
@ -24,14 +21,16 @@ module.exports = {
|
|||
},
|
||||
|
||||
rules: {
|
||||
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||
"no-underscore-dangle": [
|
||||
"error",
|
||||
{
|
||||
allow: ["__typename", "__schema"],
|
||||
allow: ["__typename"],
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"cypress/no-unnecessary-waiting": "off",
|
||||
"vue/max-len": [
|
||||
"off",
|
||||
{
|
||||
|
@ -53,7 +52,4 @@ module.exports = {
|
|||
},
|
||||
|
||||
ignorePatterns: ["src/typings/*.d.ts", "vue.config.js"],
|
||||
globals: {
|
||||
GeolocationPositionError: true,
|
||||
},
|
||||
};
|
|
@ -0,0 +1,25 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
/tests/e2e/videos/
|
||||
/tests/e2e/screenshots/
|
||||
/coverage
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
|
@ -0,0 +1,2 @@
|
|||
src/i18n/*.json
|
||||
coverage/
|
|
@ -0,0 +1 @@
|
|||
{}
|
|
@ -0,0 +1,41 @@
|
|||
# mobilizon
|
||||
|
||||
## Project setup
|
||||
|
||||
```
|
||||
yarn install
|
||||
```
|
||||
|
||||
### Compiles and hot-reloads for development
|
||||
|
||||
```
|
||||
yarn serve
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
|
||||
```
|
||||
yarn build
|
||||
```
|
||||
|
||||
### Run your unit tests
|
||||
|
||||
```
|
||||
yarn test:unit
|
||||
```
|
||||
|
||||
### Run your end-to-end tests
|
||||
|
||||
```
|
||||
yarn test:e2e
|
||||
```
|
||||
|
||||
### Lints and fixes files
|
||||
|
||||
```
|
||||
yarn lint
|
||||
```
|
||||
|
||||
### Customize configuration
|
||||
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
presets: ["@vue/cli-plugin-babel/preset"],
|
||||
};
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"pluginsFile": "tests/e2e/plugins/index.js",
|
||||
"projectId": "86dpkx",
|
||||
"baseUrl": "http://localhost:4000",
|
||||
"viewportWidth": 1920,
|
||||
"viewportHeight": 1080
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
import fetch from "node-fetch";
|
||||
import fs from "fs";
|
||||
const fetch = require("node-fetch");
|
||||
const fs = require("fs");
|
||||
|
||||
fetch(`http://localhost:4000/api`, {
|
||||
method: "POST",
|
|
@ -0,0 +1,20 @@
|
|||
module.exports = {
|
||||
preset: "@vue/cli-plugin-unit-jest/presets/typescript-and-babel",
|
||||
collectCoverage: true,
|
||||
collectCoverageFrom: [
|
||||
"**/*.{vue,ts}",
|
||||
"!**/node_modules/**",
|
||||
"!get_union_json.ts",
|
||||
],
|
||||
coverageReporters: ["html", "text", "text-summary"],
|
||||
reporters: ["default", "jest-junit"],
|
||||
// The following should fix the issue with svgs and ?inline loader (see Logo.vue), but doesn't work
|
||||
//
|
||||
// transform: {
|
||||
// "^.+\\.svg$": "<rootDir>/tests/unit/svgTransform.js",
|
||||
// },
|
||||
// moduleNameMapper: {
|
||||
// "^@/(.*svg)(\\?inline)$": "<rootDir>/src/$1",
|
||||
// "^@/(.*)$": "<rootDir>/src/$1",
|
||||
// },
|
||||
};
|
|
@ -0,0 +1,112 @@
|
|||
{
|
||||
"name": "mobilizon",
|
||||
"version": "1.3.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "yarn run build:assets && yarn run build:pictures",
|
||||
"test:unit": "LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 TZ=UTC vue-cli-service test:unit",
|
||||
"test:e2e": "vue-cli-service test:e2e",
|
||||
"lint": "vue-cli-service lint",
|
||||
"build:assets": "vue-cli-service build",
|
||||
"build:pictures": "bash ./scripts/build/pictures.sh"
|
||||
},
|
||||
"dependencies": {
|
||||
"@absinthe/socket": "^0.2.1",
|
||||
"@absinthe/socket-apollo-link": "^0.2.1",
|
||||
"@apollo/client": "^3.3.16",
|
||||
"@mdi/font": "^6.1.95",
|
||||
"@tiptap/core": "^2.0.0-beta.41",
|
||||
"@tiptap/extension-blockquote": "^2.0.0-beta.6",
|
||||
"@tiptap/extension-bubble-menu": "^2.0.0-beta.9",
|
||||
"@tiptap/extension-character-count": "^2.0.0-beta.5",
|
||||
"@tiptap/extension-history": "^2.0.0-beta.5",
|
||||
"@tiptap/extension-image": "^2.0.0-beta.6",
|
||||
"@tiptap/extension-link": "^2.0.0-beta.8",
|
||||
"@tiptap/extension-list-item": "^2.0.0-beta.6",
|
||||
"@tiptap/extension-mention": "^2.0.0-beta.42",
|
||||
"@tiptap/extension-ordered-list": "^2.0.0-beta.6",
|
||||
"@tiptap/extension-underline": "^2.0.0-beta.7",
|
||||
"@tiptap/starter-kit": "^2.0.0-beta.37",
|
||||
"@tiptap/vue-2": "^2.0.0-beta.21",
|
||||
"@vue-a11y/announcer": "^2.1.0",
|
||||
"@vue-a11y/skip-to": "^2.1.2",
|
||||
"@vue/apollo-option": "4.0.0-alpha.11",
|
||||
"apollo-absinthe-upload-link": "^1.5.0",
|
||||
"blurhash": "^1.1.3",
|
||||
"buefy": "^0.9.0",
|
||||
"bulma-divider": "^0.2.0",
|
||||
"core-js": "^3.6.4",
|
||||
"date-fns": "^2.16.0",
|
||||
"date-fns-tz": "^1.1.6",
|
||||
"graphql": "^15.0.0",
|
||||
"graphql-tag": "^2.10.3",
|
||||
"intersection-observer": "^0.12.0",
|
||||
"jwt-decode": "^3.1.2",
|
||||
"leaflet": "^1.4.0",
|
||||
"leaflet.locatecontrol": "^0.74.0",
|
||||
"lodash": "^4.17.11",
|
||||
"ngeohash": "^0.6.3",
|
||||
"p-debounce": "^4.0.0",
|
||||
"phoenix": "^1.6",
|
||||
"register-service-worker": "^1.7.2",
|
||||
"tippy.js": "^6.2.3",
|
||||
"unfetch": "^4.2.0",
|
||||
"v-tooltip": "^2.1.3",
|
||||
"vue": "^2.6.11",
|
||||
"vue-class-component": "^7.2.3",
|
||||
"vue-i18n": "^8.14.0",
|
||||
"vue-meta": "^2.3.1",
|
||||
"vue-property-decorator": "^9.0.0",
|
||||
"vue-router": "^3.1.6",
|
||||
"vue-scrollto": "^2.17.1",
|
||||
"vue2-leaflet": "^2.0.3",
|
||||
"vuedraggable": "^2.24.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.0.2",
|
||||
"@types/leaflet": "^1.5.2",
|
||||
"@types/leaflet.locatecontrol": "^0.60.7",
|
||||
"@types/lodash": "^4.14.141",
|
||||
"@types/ngeohash": "^0.6.2",
|
||||
"@types/phoenix": "^1.5.2",
|
||||
"@types/prosemirror-inputrules": "^1.0.2",
|
||||
"@types/prosemirror-model": "^1.7.2",
|
||||
"@types/prosemirror-state": "^1.2.4",
|
||||
"@types/prosemirror-view": "^1.11.4",
|
||||
"@typescript-eslint/eslint-plugin": "^4.18.0",
|
||||
"@typescript-eslint/parser": "^4.18.0",
|
||||
"@vue/cli-plugin-babel": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-e2e-cypress": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-eslint": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-pwa": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-router": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-typescript": "~5.0.0-beta.7",
|
||||
"@vue/cli-plugin-unit-jest": "~5.0.0-beta.7",
|
||||
"@vue/cli-service": "~5.0.0-beta.7",
|
||||
"@vue/eslint-config-prettier": "^6.0.0",
|
||||
"@vue/eslint-config-typescript": "^7.0.0",
|
||||
"@vue/test-utils": "^1.1.0",
|
||||
"@vue/vue2-jest": "^27.0.0-alpha.2",
|
||||
"@vue/vue3-jest": "^27.0.0-alpha.1",
|
||||
"cypress": "^8.3.0",
|
||||
"eslint": "^7.20.0",
|
||||
"eslint-plugin-cypress": "^2.10.3",
|
||||
"eslint-plugin-import": "^2.20.2",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"eslint-plugin-vue": "^7.6.0",
|
||||
"flush-promises": "^1.0.2",
|
||||
"jest": "^27.1.0",
|
||||
"jest-junit": "^13.0.0",
|
||||
"mock-apollo-client": "^1.1.0",
|
||||
"prettier": "^2.2.1",
|
||||
"prettier-eslint": "^13.0.0",
|
||||
"sass": "^1.34.1",
|
||||
"sass-loader": "^12.0.0",
|
||||
"ts-jest": "27",
|
||||
"typescript": "~4.4.3",
|
||||
"vue-i18n-extract": "^2.0.4",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"webpack-cli": "^4.7.0"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 791 B After Width: | Height: | Size: 791 B |
Before Width: | Height: | Size: 1015 B After Width: | Height: | Size: 1015 B |
Before Width: | Height: | Size: 857 B After Width: | Height: | Size: 857 B |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 857 B After Width: | Height: | Size: 857 B |
After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 378 B After Width: | Height: | Size: 378 B |
After Width: | Height: | Size: 725 KiB |
After Width: | Height: | Size: 174 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 1.2 MiB |
After Width: | Height: | Size: 379 KiB |
After Width: | Height: | Size: 359 KiB |
After Width: | Height: | Size: 376 KiB |
After Width: | Height: | Size: 358 KiB |
After Width: | Height: | Size: 518 KiB |
After Width: | Height: | Size: 193 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 1.2 MiB |
After Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 133 KiB |