Compare commits

..

9 Commits

Author SHA1 Message Date
Chris (wolcen) Thompson 8407841da3 Merge branch 'main' of https://git.coopcloud.tech/coop-cloud/hedgedoc
continuous-integration/drone/pr Build is failing
2023-10-26 17:08:30 -04:00
Chris Thompson d299d5461d Add basic health check for db container
continuous-integration/drone/pr Build is failing
2023-10-26 14:21:14 -04:00
Chris Thompson 7159b36272 Add FREEURL_AUTH setting 2023-10-26 14:20:17 -04:00
Chris Thompson 317e6517a8 Add SESSION_SECRET variable 2023-10-26 14:20:17 -04:00
Chris Thompson e53e97e8d9 Remove legacy backup configuration 2023-10-26 14:19:40 -04:00
Chris Thompson 398c254b89 Make backup configuration functional
Add in hedgedoc documents
2023-10-26 14:17:25 -04:00
Chris Thompson 01a360cf60 Remove unnecessary mode assignment for config.json 2023-10-26 14:13:22 -04:00
Chris Thompson a3fecc1e36 Correct location of public upload files 2023-10-26 14:13:22 -04:00
Chris Thompson f543dfab04 Correct README re: configuring users 2023-10-26 14:13:22 -04:00
18 changed files with 82 additions and 213 deletions
+1 -3
View File
@@ -18,9 +18,7 @@ steps:
STACK_NAME: hedgedoc
LETS_ENCRYPT_ENV: production
SECRET_DB_PASSWORD_VERSION: v1
SECRET_SESSION_SECRET_VERSION: v1
ENTRYPOINT_CONF_VERSION: v1
PG_BACKUP_VERSION: v1
trigger:
branch:
- main
@@ -36,7 +34,7 @@ steps:
from_secret: drone_abra-bot_token
fork: true
repositories:
- toolshed/auto-recipes-catalogue-json
- coop-cloud/auto-recipes-catalogue-json
trigger:
event: tag
+3 -14
View File
@@ -1,25 +1,16 @@
TYPE=hedgedoc
TIMEOUT=300
ENABLE_AUTO_UPDATE=true
ENABLE_BACKUPS=true
DOMAIN=hedgedoc.example.com
## Domain aliases
#EXTRA_DOMAINS=', `www.hedgedoc.example.com`'
LETS_ENCRYPT_ENV=production
SECRET_SESSION_SECRET_VERSION=v1
SECRET_DB_PASSWORD_VERSION=v1
SECRET_CMD_SESSION_SECRET=v1
COMPOSE_FILE="compose.yml"
# Anubis
#COMPOSE_FILE="$COMPOSE_FILE:compose.anubis.yml"
# PostgreSQL
#COMPOSE_FILE="$COMPOSE_FILE:compose.postgresql.yml"
#SECRET_DB_PASSWORD_VERSION=v1
# OAuth, see https://docs.hedgedoc.org/guides/auth/keycloak/
#COMPOSE_FILE="$COMPOSE_FILE:compose.oauth.yml"
@@ -29,7 +20,6 @@ COMPOSE_FILE="compose.yml"
#CMD_OAUTH2_TOKEN_URL="https://keycloak.example.com/auth/realms/realmname/protocol/openid-connect/token"
#CMD_OAUTH2_USER_PROFILE_URL="https://keycloak.example.com/auth/realms/realmname/protocol/openid-connect/userinfo"
#CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR=ocs.data.id
#CMD_OAUTH2_USER_PROFILE_ID_ATTR=
#CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR=ocs.data.display-name
#CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR=ocs.data.email
#CMD_OAUTH2_PROVIDERNAME=Keycloak
@@ -43,7 +33,6 @@ COMPOSE_FILE="compose.yml"
# CMD_ALLOW_ANONYMOUS_EDITS=false
# CMD_ALLOW_EMAIL_REGISTER=true
# CMD_ALLOW_FREEURL=false
# CMD_REQUIRE_FREEURL_AUTHENTICATION=true
# CMD_ALLOW_GRAVATAR=true
# CMD_ALLOW_ORIGIN=localhost
# CMD_COOKIE_POLICY=lax
@@ -53,7 +42,7 @@ COMPOSE_FILE="compose.yml"
# CMD_CSP_REPORTURI=undefined
# CMD_DEFAULT_PERMISSION=editable
# CMD_EMAIL=true
# CMD_REQUIRE_FREEURL_AUTHENTICATION=false
# CMD_SESSION_LIFE=1209600000
# Only present in config.json (no equivalent env var):
# DOCUMENT_MAX_LENGTH=100000
# CMD_ENABLE_UPLOADS=registered
+1 -7
View File
@@ -31,10 +31,4 @@
[hedegedoc]: https://github.com/hedgedoc/hedgedoc
[abra]: https://git.autonomic.zone/autonomic-cooperative/abra
[compose-traefik]: https://git.autonomic.zone/coop-cloud/traefik
## Protect Forgejo from scrapers with Anubis
Uncomment the Anubis compose file from the `.env` file and re-deploy the
app. Don't forget to actually [enable Anubis on the Traefik app
too](https://recipes.coopcloud.tech/traefik)!
[compose-traefik]: https://git.autonomic.zone/coop-cloud/traefik
+1 -3
View File
@@ -1,3 +1 @@
export ENTRYPOINT_CONF_VERSION=v13
export CONFIG_JSON_VERSION=v1
export PG_BACKUP_VERSION=v1
export ENTRYPOINT_CONF_VERSION=v9
-15
View File
@@ -1,15 +0,0 @@
authentik:
env:
CMD_OAUTH2_USER_PROFILE_URL: https://authentik.example.com/application/o/userinfo/
CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR: preferred_username
CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR: name
CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR: email
CMD_OAUTH2_TOKEN_URL: https://authentik.example.com/application/o/token/
CMD_OAUTH2_AUTHORIZATION_URL: https://authentik.example.com/application/o/authorize/
CMD_OAUTH2_CLIENT_ID: hedgedoc
CMD_OAUTH2_PROVIDERNAME: Authentik
uncomment:
- compose.oauth.yml
- SECRET_OAUTH_KEY_VERSION
shared_secrets:
hedgedoc_secret: oauth_key
-7
View File
@@ -1,7 +0,0 @@
---
version: "3.8"
services:
app:
deploy:
labels:
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirectscheme,${STACK_NAME}-redirecthostname,anubis"
-1
View File
@@ -13,7 +13,6 @@ services:
- CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR
- CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR
- CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR
- CMD_OAUTH2_USER_PROFILE_ID_ATTR
- CMD_OAUTH2_SCOPE
secrets:
- oauth_key
-55
View File
@@ -1,55 +0,0 @@
version: "3.8"
services:
app:
environment:
- CMD_DB_TYPE=postgres
- CMD_DB_NAME=codimd
- CMD_DB_USER=codimd
- CMD_DB_HOST=db
- CMD_DB_PASSWORD_FILE=/run/secrets/db_password
depends_on:
- db
networks:
- internal
secrets:
- db_password
db:
image: pgautoupgrade/pgautoupgrade:16-alpine
environment:
- POSTGRES_USER=codimd
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_DB=codimd
volumes:
- "postgres:/var/lib/postgresql/data"
secrets:
- db_password
networks:
- internal
deploy:
labels:
backupbot.backup: "${ENABLE_BACKUPS:-true}"
backupbot.backup.pre-hook: "/pg_backup.sh backup"
backupbot.backup.volumes.postgres.path: "backup.sql"
backupbot.restore.post-hook: '/pg_backup.sh restore'
healthcheck:
test: "pg_isready"
interval: 30s
timeout: 10s
retries: 5
start_period: 1m
configs:
- source: pg_backup
target: /pg_backup.sh
mode: 0555
volumes:
postgres:
secrets:
db_password:
external: true
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
networks:
internal:
configs:
pg_backup:
name: ${STACK_NAME}_pg_backup_${PG_BACKUP_VERSION}
file: pg_backup.sh
+48 -20
View File
@@ -1,19 +1,21 @@
version: "3.8"
services:
app:
image: quay.io/hedgedoc/hedgedoc:1.10.5
image: quay.io/hedgedoc/hedgedoc:1.9.9
environment:
- CMD_USECDN=false
- CMD_URL_ADDPORT=false
- CMD_DOMAIN=$DOMAIN
- CMD_PROTOCOL_USESSL=true
- CMD_HSTS_ENABLE=false
- CMD_DB_URL=sqlite:/database/db.sqlite3
- CMD_DB_NAME=codimd
- CMD_DB_USER=codimd
- CMD_DB_HOST=db
- CMD_DB_PASSWORD_FILE=/run/secrets/db_password
- CMD_ALLOW_ANONYMOUS
- CMD_ALLOW_ANONYMOUS_EDITS
- CMD_ALLOW_EMAIL_REGISTER
- CMD_ALLOW_FREEURL
- CMD_REQUIRE_FREEURL_AUTHENTICATION
- CMD_ALLOW_GRAVATAR
- CMD_ALLOW_ORIGIN
- CMD_COOKIE_POLICY
@@ -23,17 +25,18 @@ services:
- CMD_CSP_REPORTURI
- CMD_DEFAULT_PERMISSION
- CMD_EMAIL
- CMD_REQUIRE_FREEURL_AUTHENTICATION
- CMD_SESSION_LIFE
- CMD_SESSION_SECRET_FILE=/run/secrets/session_secret
- DOCUMENT_MAX_LENGTH
- CMD_ENABLE_UPLOADS
depends_on:
- db
networks:
- proxy
- internal
volumes:
- codimd_uploads:/hedgedoc/public/uploads
- codimd_database:/database
secrets:
- session_secret
- db_password
entrypoint: /docker-entrypoint.sh
configs:
- source: entrypoint_conf
@@ -51,34 +54,59 @@ services:
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirectscheme,${STACK_NAME}-redirecthostname"
- "traefik.http.middlewares.${STACK_NAME}-redirectscheme.redirectscheme.scheme=https"
- "traefik.http.middlewares.${STACK_NAME}-redirectscheme.redirectscheme.permanent=true"
- "traefik.http.middlewares.${STACK_NAME}-redirecthostname.redirectregex.regex=^http[s]?://([^/]*)/(.*)"
- "traefik.http.middlewares.${STACK_NAME}-redirecthostname.redirectregex.replacement=https://${DOMAIN}/$${2}"
- "traefik.http.middlewares.${STACK_NAME}-redirecthostname.redirectregex.permanent=true"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "coop-cloud.${STACK_NAME}.version=3.0.5+1.10.5"
- "backupbot.backup=${ENABLE_BACKUPS:-true}"
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}"
- "backupbot.backup=true"
- "backupbot.backup.path=/hedgedoc/public/uploads"
- coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}
- coop-cloud.${STACK_NAME}.version=0.6.0+1.9.9
healthcheck:
test: "nodejs -e \"http.get('http://localhost:3000', (res) => { console.log('status: ', res.statusCode); if (res.statusCode == 200) { process.exit(0); } else { process.exit(1); } });\""
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
db:
image: postgres:11.20-alpine
environment:
- POSTGRES_USER=codimd
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_DB=codimd
volumes:
- "postgres:/var/lib/postgresql/data"
secrets:
- db_password
networks:
- internal
deploy:
labels:
backupbot.backup: "true"
backupbot.backup.pre-hook: "mkdir -p /tmp/backup/ && PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /tmp/backup/backup.sql"
backupbot.backup.post-hook: "rm -rf /tmp/backup"
backupbot.backup.path: "/tmp/backup/"
backupbot.restore: "true"
backupbot.restore.post-hook: "sh -c 'psql -U $${POSTGRES_USER} -d $${POSTGRES_DB} < ./backup.sql && rm -f ./backup.sql'"
healthcheck:
test: "pg_isready"
interval: 30s
timeout: 10s
retries: 5
start_period: 1m
volumes:
postgres:
codimd_uploads:
codimd_database:
secrets:
session_secret:
db_password:
external: true
name: ${STACK_NAME}_session_secret_${SECRET_SESSION_SECRET_VERSION}
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
networks:
proxy:
external: true
internal:
configs:
config_json:
name: ${STACK_NAME}_config_json_${CONFIG_JSON_VERSION}
name: ${STACK_NAME}_config_${ENTRYPOINT_CONF_VERSION}
file: config.json.tmpl
template_driver: golang
entrypoint_conf:
+28 -37
View File
@@ -1,57 +1,48 @@
#!/usr/bin/env bash
file_env() {
# 3wc: Load $VAR_FILE into $VAR - useful for secrets. See
# https://medium.com/@adrian.gheorghe.dev/using-docker-secrets-in-your-environment-variables-7a0609659aab
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
# 3wc: Load $VAR_FILE into $VAR - useful for secrets. See
# https://medium.com/@adrian.gheorghe.dev/using-docker-secrets-in-your-environment-variables-7a0609659aab
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
load_vars() {
if [ -n "${CMD_DB_PASSWORD_FILE:-""}" ] ; then
file_env "CMD_DB_PASSWORD"
fi
file_env "CMD_OAUTH2_CLIENT_SECRET"
file_env "CMD_SESSION_SECRET"
file_env "CMD_DB_PASSWORD"
file_env "CMD_OAUTH2_CLIENT_SECRET"
}
main() {
set -eu
set -eu
load_vars
mkdir -p "/hedgedoc/.npm" && \
chown -R 10000:65534 "/hedgedoc/.npm" && \
chmod "u+rwx" "/hedgedoc/.npm"
chown -R 10000:65534 /database
load_vars
mkdir "/hedgedoc/.npm" && chown -R 10000:65534 "/hedgedoc/.npm" && chmod "u+rwx" "/hedgedoc/.npm"
}
main
if [ -n "${CMD_DB_PASSWORD:-""}" ] ; then
export CMD_DB_URL="${CMD_DB_TYPE}://$CMD_DB_USER:$CMD_DB_PASSWORD@$CMD_DB_HOST:5432/$CMD_DB_NAME"
fi
export CMD_DB_URL=postgres://$CMD_DB_USER:$CMD_DB_PASSWORD@$CMD_DB_HOST:5432/$CMD_DB_NAME
# 3wc: `source /docker-entrypoint.sh -e` to load CMD_DB_URL for CLI scripts
# 3wc: `source /docker-entrypoint2.sh -e` to load CMD_DB_URL for CLI scripts
if [ ! "${1-}" == "-e" ]; then
# 3wc: upstream ENTRYPOINT
# https://github.com/hedgedoc/container/blob/master/alpine/Dockerfile
mkdir -p "/hedgedoc/.npm" && chown -R 10000:65534 "/hedgedoc/.npm"
/usr/local/bin/docker-entrypoint.sh npm start
# 3wc: upstream ENTRYPOINT
# https://github.com/hedgedoc/container/blob/master/alpine/Dockerfile
mkdir -p "/hedgedoc/.npm" && chown -R 10000:65534 "/hedgedoc/.npm"
/usr/local/bin/docker-entrypoint.sh npm start
fi
set +eu
-34
View File
@@ -1,34 +0,0 @@
#!/bin/bash
set -e
BACKUP_FILE='/var/lib/postgresql/data/backup.sql'
function backup {
export PGPASSWORD=$(cat /run/secrets/db_password)
pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > $BACKUP_FILE
}
function restore {
cd /var/lib/postgresql/data/
restore_config(){
# Restore allowed connections
cat pg_hba.conf.bak > pg_hba.conf
su postgres -c 'pg_ctl reload'
}
# Don't allow any other connections than local
cp pg_hba.conf pg_hba.conf.bak
echo "local all all trust" > pg_hba.conf
su postgres -c 'pg_ctl reload'
trap restore_config EXIT INT TERM
# Recreate Database
psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);"
createdb -U ${POSTGRES_USER} ${POSTGRES_DB}
psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f $BACKUP_FILE
trap - EXIT INT TERM
restore_config
}
$@
-7
View File
@@ -1,7 +0,0 @@
WARNING WARNING WARNING 🚨
This release includes a major Postgres database upgrade, but does not yet include tools to automatically upgrade from older Postgres releases.
PLEASE DO NOT UPGRADE EXISTING INSTANCES TO THIS VERSION.
This should be fixed soon.
-1
View File
@@ -1 +0,0 @@
Fixes security issue: https://github.com/hedgedoc/hedgedoc/security/advisories/GHSA-pjf2-269h-cx7p
-5
View File
@@ -1,5 +0,0 @@
Upgrade to fix GHSA-6w39-x2c6-6mpf
BREAKING CHANGE!! new secret "session_secret" added, run:
abra app secret generate <app_domain> session_secret v1
-1
View File
@@ -1 +0,0 @@
This release adds SQLite support by default, if you were using PostgreSQL make sure to update the env file!
-1
View File
@@ -1 +0,0 @@
This release switches to `pgaautoupgrade` for easier Postgresql upgrades. If you are using Postgres, please take extra care to take a backup before upgrading.
-1
View File
@@ -1 +0,0 @@
Security upgrade for GHSA-3983-rrqh-mvx5
-1
View File
@@ -1 +0,0 @@
CRITICAL FIX: since version 3 this recipe uses always sqlite as database. This patch fixes instances running postgres