22 Commits

Author SHA1 Message Date
112a1f6d3a add redis password and increase version. does not work yet
Some checks failed
continuous-integration/drone/pr Build is failing
2025-02-16 11:49:16 +01:00
f65e5eec94 chore: publish 2.0.0+v2.25.3 release
Some checks failed
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2025-02-12 19:00:42 +01:00
134db112a7 upgrade postgres db to version 17 and loomio minor version
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 18:59:18 +01:00
b1e51d5402 chore: publish 1.0.0+v2.25.2 release
Some checks failed
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2025-02-12 17:36:29 +01:00
af0c49e465 prepare releasenotes
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 17:34:39 +01:00
56fae2d10e remove duplicated var
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 17:19:25 +01:00
09269f2303 keep using old db name
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 16:59:32 +01:00
63ecaa148e add some documentation
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 16:10:04 +01:00
11bb2233bf ensure upgradability for postgres database
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-12 15:03:35 +01:00
3wc
6a6f6240b5 Add missing secrets for CI
All checks were successful
continuous-integration/drone/push Build is passing
2025-02-11 11:49:25 -05:00
f8eff5044e remove outdated env vars and fix make_last_user_admin
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-10 15:43:12 +01:00
7581ab7ecf added backup
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-09 20:28:16 +01:00
3587172e5f use docker secret for mail and seperate compose file
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-09 19:48:48 +01:00
6c29012f1b add healthchecks where possible
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-09 18:43:29 +01:00
6004522de6 store DB password in secret. make entrypoint more robust.
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-09 17:59:02 +01:00
4df10ce60d Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-01-08 10:09:13 -08:00
170a1782f6 chore: publish 0.6.0+v2.25.2 release
Some checks failed
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2024-10-09 13:33:34 -04:00
3wc
93f240b959 chore: publish 0.5.0+v2.22.0 release
Some checks failed
continuous-integration/drone/push Build is failing
2024-02-08 14:44:36 -03:00
e81374b8b7 chore: publish 0.4.1+v2.21.2 release
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-10 10:45:41 -05:00
134083eb13 two quotes and a comma to fix cron 2023-11-10 10:42:48 -05:00
baba7e2a0e chore: publish 0.4.0+v2.21.2 release
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-10 10:16:12 -05:00
3wc
30e9ade4dc Add release note about NOTIFICATIONS_EMAIL_ADDRESS
Some checks failed
continuous-integration/drone/push Build is failing
2023-09-22 19:26:58 +01:00
11 changed files with 184 additions and 57 deletions

View File

@ -18,6 +18,10 @@ steps:
STACK_NAME: loomio STACK_NAME: loomio
LETS_ENCRYPT_ENV: production LETS_ENCRYPT_ENV: production
LOOMIO_ENTRYPOINT_VERSION: v1 LOOMIO_ENTRYPOINT_VERSION: v1
SECRET_DEVISE_SECRET_VERSION: v1
SECRET_SECRET_COOKIE_TOKEN_VERSION: v1
SECRET_DB_PASSWORD_VERSION: v1
SECRET_SMTP_PASSWORD_VERSION: v1
trigger: trigger:
branch: branch:
- main - main
@ -33,7 +37,7 @@ steps:
from_secret: drone_abra-bot_token from_secret: drone_abra-bot_token
fork: true fork: true
repositories: repositories:
- coop-cloud/auto-recipes-catalogue-json - toolshed/auto-recipes-catalogue-json
trigger: trigger:
event: tag event: tag

View File

@ -1,31 +1,29 @@
TYPE=loomio TYPE=loomio
COMPOSE_FILE="compose.yml"
DOMAIN=loomio.example.com DOMAIN=loomio.example.com
## Domain aliases ## Domain aliases
#EXTRA_DOMAINS=', `www.loomio.example.com`' #EXTRA_DOMAINS=', `www.loomio.example.com`'
LETS_ENCRYPT_ENV=production LETS_ENCRYPT_ENV=production
# the number of dots in your hostname # mail setup
TLD_LENGTH=3 COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
# TODO 3wc: is this needed?
SUPPORT_EMAIL=noreply@example.com SUPPORT_EMAIL=noreply@example.com
SMTP_AUTH=plain SMTP_AUTH=plain
SMTP_DOMAIN=example.com SMTP_DOMAIN=example.com
SMTP_SERVER=example.com SMTP_SERVER=example.com
SMTP_PORT=587 SMTP_PORT=587
SMTP_USERNAME=noreply@example.com SMTP_USERNAME=noreply@example.com
SMTP_PASSWORD=password
SMTP_USE_SSL=1 SMTP_USE_SSL=1
# to disable SSL comment out line rather than changing to 0 # to disable SSL comment out line rather than changing to 0
SECRET_SMTP_PASSWORD_VERSION=v1
# Whyyyy does this need to be set separately # From field for notification e-mails
NOTIFICATIONS_EMAIL_ADDRESS=noreply@example.com NOTIFICATIONS_EMAIL_ADDRESS=noreply@example.com
REPLY_HOSTNAME=loomio.example.com # reply-to in email notifications
REPLY_HOSTNAME=$DOMAIN
# helper bot is the account which welcomes people to their groups.
HELPER_BOT_EMAIL=noreply@loomio.example.com
RAILS_ENV=production RAILS_ENV=production
# Number of webserver processes and threads # Number of webserver processes and threads
@ -42,6 +40,8 @@ USE_RACK_ATTACK=1
SECRET_DEVISE_SECRET_VERSION=v1 #length=64 SECRET_DEVISE_SECRET_VERSION=v1 #length=64
SECRET_SECRET_COOKIE_TOKEN_VERSION=v1 #length=64 SECRET_SECRET_COOKIE_TOKEN_VERSION=v1 #length=64
SECRET_DB_PASSWORD_VERSION=v1
SECRET_REDIS_PASSWORD_VERSION=v1
# Send catch up email (missed yesterday) weekly # Send catch up email (missed yesterday) weekly
# EMAIL_CATCH_UP_WEEKLY=1 # EMAIL_CATCH_UP_WEEKLY=1

View File

@ -4,27 +4,31 @@
<!-- metadata --> <!-- metadata -->
* **Category**: Apps * **Category**: Apps
* **Status**: 0, work-in-progress * **Status**: 3, work-in-progress
* **Image**: [`loomio/*`](https://hub.docker.com/r/loomio) * **Image**: [`loomio/*`](https://hub.docker.com/r/loomio), 4, upstream
* **Healthcheck**: No * **Healthcheck**: Yes
* **Backups**: No * **Backups**: Yes
* **Email**: ? * **Email**: Outgoing yes, incoming no
* **Tests**: No * **Tests**: No
* **SSO**: No * **SSO**: No
<!-- endmetadata --> <!-- endmetadata -->
## Basic usage ## Basic usage
1. Set up Docker Swarm and [`abra`] * `abra app new loomio --secrets ` (optionally with `--pass` if you'd like to save secrets in `pass`)
2. Deploy [`coop-cloud/traefik`] * `abra app config <app-name>`
3. `abra app new loomio` (optionally with `--pass` if you'd like * insert your smtp password with `abra app secret insert <app-name> smtp_password v1 "<your-password>"`
to save secrets in `pass`) * `abra app deploy <app-name>`
4. `abra app config YOURAPPDOMAIN` - be sure to change `$DOMAIN` to something that resolves to * Open the configured domain in your browser to create your user account (only works in case mail is configured correctly)
your Docker swarm box * Give yourself admin rights by running `abra app cmd <app-name> app make_last_user_admin`
5. `abra app deploy YOURAPPDOMAIN`
6. This should be automated but you also need to run `abra app run loomio_some_domain app rake db:migrate`
7. Open the configured domain in your browser to finish set-up
8. Give yourself admin rights by running `User.last.update(is_admin: true)`
[`abra`]: https://git.autonomic.zone/autonomic-cooperative/abra ## Manuel migration steps when upgrading from 0.6.0+v2.25.2 and earlier to 1.0.0+v2.25.2 and later
[`coop-cloud/traefik`]: https://git.autonomic.zone/coop-cloud/traefik
* adapt your env file with the new vars, especially SECRET_DB_PASSWORD_VERSION=v1 and SECRET_SMTP_PASSWORD_VERSION=v1
* insert your smtp password with `abra app secret insert <app-name> smtp_password v1 "<your-password>"`
* `abra app secret generate <app-name> db_password v1`
* `abra app deploy <app-name>`
* set the new password in DB: `abra app cmd <app-name> db set_new_db_password`
* redeploy if necessary
For more, see [docs.coopcloud.tech](https://docs.coopcloud.tech).

18
abra.sh
View File

@ -1 +1,17 @@
export LOOMIO_ENTRYPOINT_VERSION=v3 export LOOMIO_ENTRYPOINT_VERSION=v5
export REDIS_ENTRYPOINT_VERSION=v1
# cannot be integrated into entrypoint.sh as it requires the operator to create a user first
function make_last_user_admin()
{
export DATABASE_URL="postgresql://${POSTGRES_USER}:$(cat /run/secrets/db_password)@db/${POSTGRES_DB}"
SECRET_KEY_BASE=$(rake secret) rails runner "User.last.update(is_admin: true)"
}
# only run when upgrading from 0.6.0+v2.25.2 and earlier to 1.0.0+v2.25.2 and later
function set_new_db_password()
{
echo "setting new password for db user..."
psql -U $POSTGRES_USER -c "ALTER USER $POSTGRES_USER PASSWORD '$(cat /run/secrets/db_password)';"
echo "done"
}

28
compose.smtp.yml Normal file
View File

@ -0,0 +1,28 @@
version: "3.8"
x-mail-env: &mail-env
SMTP_AUTH: ${SMTP_AUTH}
SMTP_DOMAIN: ${SMTP_DOMAIN}
SMTP_SERVER: ${SMTP_SERVER}
SMTP_PORT: ${SMTP_PORT}
SMTP_USERNAME: ${SMTP_USERNAME}
SMTP_PASSWORD:
SMTP_PASSWORD_FILE: /run/secrets/smtp_password
SMTP_USE_SSL: ${SMTP_USE_SSL}
services:
app:
secrets:
- smtp_password
environment:
*mail-env
worker:
secrets:
- smtp_password
environment:
*mail-env
secrets:
smtp_password:
name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION}
external: true

View File

@ -1,24 +1,24 @@
--- ---
version: "3.8" version: "3.8"
x-db-env: &db-env
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
POSTGRES_DB: loomio_production
POSTGRES_USER: postgres
x-redis-env: &redis-env
REDIS_PASSWORD_FILE: /run/secrets/redis_password
REDIS_URL: redis://:{REDIS_PASSWORD}@redis:6379
x-environment: &default-env x-environment: &default-env
DATABASE_URL: postgresql://postgres:password@db/loomio_production <<: *db-env
REDIS_URL: redis://redis:6379 <<: *redis-env
CANONICAL_HOST: ${DOMAIN} CANONICAL_HOST: ${DOMAIN}
VIRTUAL_HOST: ${DOMAIN} VIRTUAL_HOST: ${DOMAIN}
CHANNELS_URI: wss://channels.${DOMAIN} CHANNELS_URI: wss://channels.${DOMAIN}
TLD_LENGTH: ${TLD_LENGTH}
SUPPORT_EMAIL: ${SUPPORT_EMAIL} SUPPORT_EMAIL: ${SUPPORT_EMAIL}
SMTP_AUTH: ${SMTP_AUTH}
SMTP_DOMAIN: ${SMTP_DOMAIN}
SMTP_SERVER: ${SMTP_SERVER}
SMTP_PORT: ${SMTP_PORT}
SMTP_USERNAME: ${SMTP_USERNAME}
SMTP_PASSWORD: ${SMTP_PASSWORD}
SMTP_USE_SSL: ${SMTP_USE_SSL}
NOTIFICATIONS_EMAIL_ADDRESS: ${NOTIFICATIONS_EMAIL_ADDRESS} NOTIFICATIONS_EMAIL_ADDRESS: ${NOTIFICATIONS_EMAIL_ADDRESS}
REPLY_HOSTNAME: ${REPLY_HOSTNAME} REPLY_HOSTNAME: ${REPLY_HOSTNAME}
HELPER_BOT_EMAIL: ${HELPER_BOT_EMAIL}
RAILS_ENV: ${RAILS_ENV} RAILS_ENV: ${RAILS_ENV}
PUMA_WORKERS: ${PUMA_WORKERS} PUMA_WORKERS: ${PUMA_WORKERS}
MIN_THREADS: ${MIN_THREADS} MIN_THREADS: ${MIN_THREADS}
@ -34,7 +34,7 @@ x-environment: &default-env
services: services:
app: app:
image: loomio/loomio:v2.19.0 image: loomio/loomio:v2.25.3
configs: configs:
- source: entrypoint - source: entrypoint
target: /entrypoint.sh target: /entrypoint.sh
@ -43,6 +43,8 @@ services:
secrets: secrets:
- devise_secret - devise_secret
- secret_cookie_token - secret_cookie_token
- db_password
- redis_password
volumes: volumes:
- loomio_uploads:/loomio/public/system - loomio_uploads:/loomio/public/system
- loomio_storage:/loomio/storage - loomio_storage:/loomio/storage
@ -56,6 +58,12 @@ services:
- db - db
- redis - redis
environment: *default-env environment: *default-env
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 10
start_period: 2m
deploy: deploy:
restart_policy: restart_policy:
condition: on-failure condition: on-failure
@ -65,9 +73,10 @@ services:
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})" - "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure" - "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}" - "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "coop-cloud.${STACK_NAME}.version=0.3.1+v2.19.0" - "coop-cloud.${STACK_NAME}.version=2.0.0+v2.25.3"
- "backupbot.backup:=${ENABLE_BACKUPS:-true}"
worker: worker:
image: loomio/loomio:v2.19.0 image: loomio/loomio:v2.25.3
configs: configs:
- source: entrypoint - source: entrypoint
target: /entrypoint.sh target: /entrypoint.sh
@ -76,6 +85,8 @@ services:
secrets: secrets:
- devise_secret - devise_secret
- secret_cookie_token - secret_cookie_token
- db_password
- redis_password
networks: networks:
- backend - backend
environment: environment:
@ -89,20 +100,38 @@ services:
- loomio_files:/loomio/public/files - loomio_files:/loomio/public/files
- loomio_plugins:/loomio/plugins/docker - loomio_plugins:/loomio/plugins/docker
db: db:
image: postgres:12.14 image: pgautoupgrade/pgautoupgrade:17-debian
networks: networks:
- backend - backend
volumes: volumes:
- pgdata:/pgdata - pgdata:/pgdata
- pgdumps:/pgdumps secrets:
- db_password
environment: environment:
- POSTGRES_PASSWORD=password <<: *db-env
- POSTGRES_DB=loomio_production PGDATA: /pgdata
- PGDATA=/pgdata deploy:
labels:
backupbot.backup: "${ENABLE_BACKUPS:-true}"
backupbot.backup.pre-hook: sh -c 'pg_dump -U "$$POSTGRES_USER" -Fc "$$POSTGRES_DB" | gzip > "/postgres.dump.gz"'
backupbot.backup.path: "/postgres.dump.gz"
backupbot.backup.post-hook: "rm -f /postgres.dump.gz"
backupbot.restore: "true"
backupbot.restore.post-hook: sh -c 'gzip -d /postgres.dump.gz && pg_restore --clean -U "$$POSTGRES_USER" --dbname="$$POSTGRES_DB" < /postgres.dump && rm -f /postgres.dump'
redis: redis:
image: redis:5.0 image: redis:7.4
networks: networks:
- backend - backend
command: /bin/sh -c "redis-server redis.conf --loglevel debug"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
secrets:
- redis_password
configs:
- source: entrypoint_redis
target: /entrypoint.sh
mode: 0555
entrypoint: /entrypoint.sh
#mailin: #mailin:
# image: loomio/mailin-docker:latest # image: loomio/mailin-docker:latest
# networks: # networks:
@ -117,19 +146,23 @@ services:
- backend - backend
depends_on: depends_on:
- redis - redis
secrets:
- redis_password
environment: environment:
- REDIS_URL=redis://redis:6379 <<: *redis-env
cron: cron:
image: loomio/loomio:v2.19.0 image: loomio/loomio:v2.25.3
configs: configs:
- source: entrypoint - source: entrypoint
target: /entrypoint.sh target: /entrypoint.sh
mode: 0555 mode: 0555
entrypoint: [ "/entrypoint.sh", "rake", "loomio:hourly_tasks" ] entrypoint: [ "/entrypoint.sh", "rake loomio:hourly_tasks" ]
environment: *default-env environment: *default-env
secrets: secrets:
- devise_secret - devise_secret
- secret_cookie_token - secret_cookie_token
- db_password
- redis_password
volumes: volumes:
- loomio_uploads:/loomio/public/system - loomio_uploads:/loomio/public/system
- loomio_storage:/loomio/storage - loomio_storage:/loomio/storage
@ -160,12 +193,14 @@ volumes:
loomio_plugins: loomio_plugins:
loomio_import: loomio_import:
pgdata: pgdata:
pgdumps:
configs: configs:
entrypoint: entrypoint:
name: ${STACK_NAME}_entrypoint_${LOOMIO_ENTRYPOINT_VERSION} name: ${STACK_NAME}_entrypoint_${LOOMIO_ENTRYPOINT_VERSION}
file: entrypoint.sh file: entrypoint.sh
entrypoint_redis:
name: ${STACK_NAME}_entrypoint_redis_${REDIS_ENTRYPOINT_VERSION}
file: entrypoint.redis.sh
secrets: secrets:
devise_secret: devise_secret:
@ -174,3 +209,9 @@ secrets:
secret_cookie_token: secret_cookie_token:
external: true external: true
name: ${STACK_NAME}_secret_cookie_token_${SECRET_SECRET_COOKIE_TOKEN_VERSION} name: ${STACK_NAME}_secret_cookie_token_${SECRET_SECRET_COOKIE_TOKEN_VERSION}
db_password:
external: true
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
redis_password:
external: true
name: ${STACK_NAME}_redis_password_${SECRET_REDIS_PASSWORD_VERSION}

6
entrypoint.redis.sh Normal file
View File

@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -e
echo "creating redis.conf..."
echo "requirepass $(cat /run/secrets/redis_password)" > redis.conf
echo "redis.conf created"

View File

@ -23,16 +23,24 @@ file_env() {
file_env "DEVISE_SECRET" file_env "DEVISE_SECRET"
file_env "SECRET_COOKIE_TOKEN" file_env "SECRET_COOKIE_TOKEN"
file_env "POSTGRES_PASSWORD"
file_env "SMTP_PASSWORD"
export DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/${POSTGRES_DB}"
if test ! -f /loomio/storage/migrations_ran; then
echo "first deploy, running migrations..."
rake db:setup
touch /loomio/storage/migrations_ran
fi
if [ -n "$1" ]; then if [ -n "$1" ]; then
echo "Running '$1'" echo "Running '$1'"
$1 $1
else else
if [ ! -f /loomio/storage/migrations_ran ] && [ "${TASK:-}" = "worker" ]; then
echo "first deploy, running DB setup..."
rake db:setup
touch /loomio/storage/migrations_ran
fi
echo "running DB migrations..."
rake db:migrate
echo "DB migrations finished"
echo "starting loomio!" echo "starting loomio!"
/loomio/docker_start.sh /loomio/docker_start.sh
fi fi

9
release/0.3.1+v2.19.0 Normal file
View File

@ -0,0 +1,9 @@
Loomio seems to have added a new setting, NOTIFICATIONS_EMAIL_ADDRESS, to
define what address transactional emails should come from.
If you don't set it, it will default to notifications@$MAIL_DOMAIN, which is
unlikely to work in many cases.
If you find that transactional emails aren't working, try setting
NOTIFICATIONS_EMAIL_ADDRESS to the same value as SUPPORT_EMAIL,
HELPER_BOT_EMAIL, or SMTP_USERNAME.

9
release/1.0.0+v2.25.2 Normal file
View File

@ -0,0 +1,9 @@
In this release the passwords for smtp and postgres DB were moved into docker secrets. Therefore a few manual steps need to be performed (also available in recipe documentation)
* adapt your env file with the new vars, especially SECRET_DB_PASSWORD_VERSION=v1 and SECRET_SMTP_PASSWORD_VERSION=v1
* insert your smtp password with abra app secret insert <app-name> smtp_password v1 "<your-password>"
* abra app secret generate <app-name> db_password v1
* abra app deploy <app-name>
* set the new password in DB: abra app cmd <app-name> db set_new_db_password
* redeploy

2
release/2.0.0+v2.25.3 Normal file
View File

@ -0,0 +1,2 @@
The major change in this release is the upgrade of postgres db from 10 to 17. As we use a container with automatic migration, this should work seemlessly without operator intervention.
NEVERTHELESS, please create a BACKUP before you upgrade to this version!