forked from coop-cloud/outline
		
	Compare commits
	
		
			26 Commits
		
	
	
		
			0.6.0+0.67
			...
			add-local-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 907597aab3 | |||
| d9ce8fb168 | |||
| 73de12d12f | |||
| 8c3521b87f | |||
| 4273faad76 | |||
| 0e84bbc2ee | |||
| ca60a0f1a3 | |||
| 3b1eeb6160 | |||
| 52f3bf31ed | |||
| e229ab6e30 | |||
| 0ab6c0c244 | |||
| 5e2a13a93a | |||
| 8796269ad2 | |||
| a4f75f2da0 | |||
| 76523535ca | |||
| 68f23084aa | |||
| e487a36bb5 | |||
| 8426058959 | |||
| 277a5d2343 | |||
| 56be9efd22 | |||
| 7d2f35277b | |||
| 53913b92cd | |||
| e0cc0ff9af | |||
| 5e3e8a655b | |||
| 53e4d82aa3 | |||
| 361908fe84 | 
| @ -21,7 +21,6 @@ steps: | ||||
|       SECRET_DB_PASSWORD_VERSION: v1 | ||||
|       SECRET_SECRET_KEY_VERSION: v1  # length=64 | ||||
|       SECRET_UTILS_SECRET_VERSION: v1  # length=64 | ||||
|       SECRET_AWS_SECRET_KEY_VERSION: v1 | ||||
| trigger: | ||||
|   branch: | ||||
|     - main | ||||
|  | ||||
							
								
								
									
										29
									
								
								.env.sample
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								.env.sample
									
									
									
									
									
								
							| @ -15,15 +15,9 @@ COMPOSE_FILE="compose.yml" | ||||
| SECRET_DB_PASSWORD_VERSION=v1 | ||||
| SECRET_SECRET_KEY_VERSION=v1  # length=64 | ||||
| SECRET_UTILS_SECRET_VERSION=v1  # length=64 | ||||
| SECRET_AWS_SECRET_KEY_VERSION=v1 | ||||
|  | ||||
| AWS_ACCESS_KEY_ID= | ||||
| AWS_REGION= | ||||
| AWS_S3_UPLOAD_BUCKET_URL= | ||||
| AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| AWS_S3_UPLOAD_MAX_SIZE=26214400 | ||||
| AWS_S3_FORCE_PATH_STYLE=true | ||||
| AWS_S3_ACL=private | ||||
| # Set to s3 to use AWS S3 bucket | ||||
| FILE_STORAGE=local | ||||
|  | ||||
| # –––––––––––––––– OPTIONAL –––––––––––––––– | ||||
|  | ||||
| @ -55,18 +49,20 @@ DEBUG=http | ||||
| # set, all domains are allowed by default when using Google OAuth to signin | ||||
| ALLOWED_DOMAINS= | ||||
|  | ||||
| # TODO: setup compose.smtp.yml | ||||
| # To support sending outgoing transactional emails such as "document updated" or | ||||
| # "you've been invited" you'll need to provide authentication for an SMTP server | ||||
| # By default, this enables email login. You can disable this in the settings | ||||
| # for configuration details see https://docs.getoutline.com/s/hosting/doc/smtp-cqCJyZGMIB | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml" | ||||
| #SMTP_ENABLED=1 | ||||
| #SMTP_HOST= | ||||
| #SMTP_PORT= | ||||
| #SMTP_USERNAME= | ||||
| #SMTP_PASSWORD= | ||||
| #SMTP_FROM_EMAIL= | ||||
| #SMTP_REPLY_EMAIL= | ||||
| #SMTP_TLS_CIPHERS= | ||||
| #SMTP_SECURE=true | ||||
| #SECRET_SMTP_PASSWORD_VERSION=v1 | ||||
|  | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.oidc.yml" | ||||
| #OIDC_ENABLED=1 | ||||
| @ -83,3 +79,16 @@ ALLOWED_DOMAINS= | ||||
| #GOOGLE_ENABLED=1 | ||||
| #GOOGLE_CLIENT_ID= | ||||
| #SECRET_GOOGLE_CLIENT_SECRET_VERSION=v1 | ||||
|  | ||||
| COMPOSE_FILE="$COMPOSE_FILE:compose.local.yml" | ||||
| FILE_STORAGE_UPLOAD_MAX_SIZE=26214400 | ||||
|  | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.aws.yml" | ||||
| #AWS_ACCESS_KEY_ID= | ||||
| #AWS_REGION= | ||||
| #AWS_S3_UPLOAD_BUCKET_URL= | ||||
| #AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| #AWS_S3_UPLOAD_MAX_SIZE=26214400 | ||||
| #AWS_S3_FORCE_PATH_STYLE=true | ||||
| #AWS_S3_ACL=private | ||||
| #SECRET_AWS_SECRET_KEY_VERSION=v1 | ||||
|  | ||||
							
								
								
									
										26
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								README.md
									
									
									
									
									
								
							| @ -5,12 +5,12 @@ Wiki and knowledge base for growing teams | ||||
| <!-- metadata --> | ||||
|  | ||||
| * **Category**: Apps | ||||
| * **Status**: 1, alpha | ||||
| * **Image**: [outlinewiki/outline](https://hub.docker.com/r/outlinewiki/outline) | ||||
| * **Status**: 3, beta | ||||
| * **Image**: [outlinewiki/outline](https://hub.docker.com/r/outlinewiki/outline), 4, upstream | ||||
| * **Healthcheck**: No | ||||
| * **Backups**: No | ||||
| * **Email**: No | ||||
| * **Tests**: No | ||||
| * **Backups**: Yes | ||||
| * **Email**: Yes | ||||
| * **Tests**: 2 | ||||
| * **SSO**: 3 (OAuth) | ||||
|  | ||||
| <!-- endmetadata --> | ||||
| @ -19,10 +19,14 @@ Wiki and knowledge base for growing teams | ||||
|  | ||||
| 1. Set up Docker Swarm and [`abra`] | ||||
| 2. Deploy [`coop-cloud/traefik`] | ||||
| 3. `abra app new ${REPO_NAME} --secrets` (optionally with `--pass` if you'd like | ||||
|    to save secrets in `pass`) | ||||
| 3. `abra app new ${REPO_NAME}` | ||||
|    - **WARNING**: Choose "n" when `abra` asks if you'd like to generate secrets | ||||
| 4. `abra app config YOURAPPNAME` - be sure to change `$DOMAIN` to something that resolves to | ||||
|    your Docker swarm box | ||||
|    your Docker swarm box. For Minio, you'll want: | ||||
|    - `AWS_ACCESS_KEY_ID=<minio username>` | ||||
|    - `AWS_REGION="us-east-1"` | ||||
|    - `AWS_S3_UPLOAD_BUCKET_URL=https://minio.example.com` | ||||
|    - `AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| 5. `abra app deploy YOURAPPNAME` | ||||
| 7. Open the configured domain in your browser to finish set-up | ||||
|  | ||||
| @ -31,6 +35,12 @@ Wiki and knowledge base for growing teams | ||||
|  | ||||
| ## Tips & Tricks | ||||
|  | ||||
| ### Create an initial admin user | ||||
|  | ||||
| ``` | ||||
| abra app cmd YOURAPPNAME app create_email_user test@example.com | ||||
| ``` | ||||
|  | ||||
| ### Post-deploy migration | ||||
|  | ||||
| ``` | ||||
|  | ||||
							
								
								
									
										15
									
								
								abra.sh
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								abra.sh
									
									
									
									
									
								
							| @ -1,4 +1,17 @@ | ||||
| export APP_ENTRYPOINT_VERSION=v6 | ||||
| export APP_ENTRYPOINT_VERSION=v8 | ||||
| export DB_ENTRYPOINT_VERSION=v2 | ||||
|  | ||||
| create_email_user() { | ||||
| 	if [ -z "$1" ]; then | ||||
| 		echo "Usage: ... create_email_user <email_address>" | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 	export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| 	export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_db:5432/outline" | ||||
| 	export UTILS_SECRET=$(cat /run/secrets/utils_secret) | ||||
| 	export SECRET_KEY=$(cat /run/secrets/secret_key) | ||||
| 	node build/server/scripts/seed.js "$1" | ||||
| } | ||||
|  | ||||
| migrate() { | ||||
| 	export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
|  | ||||
							
								
								
									
										22
									
								
								compose.aws.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								compose.aws.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - aws_secret_key | ||||
|     environment: | ||||
|       - AWS_ACCESS_KEY_ID | ||||
|       - AWS_REGION | ||||
|       - AWS_S3_ACL | ||||
|       - AWS_S3_FORCE_PATH_STYLE | ||||
|       - AWS_S3_UPLOAD_BUCKET_NAME | ||||
|       - AWS_S3_UPLOAD_BUCKET_URL | ||||
|       - AWS_S3_UPLOAD_MAX_SIZE | ||||
|       - AWS_SDK_LOAD_CONFIG=0 | ||||
|       - AWS_SECRET_KEY_FILE=/run/secrets/aws_secret_key | ||||
|  | ||||
| secrets: | ||||
|   aws_secret_key: | ||||
|     name: ${STACK_NAME}_aws_secret_key_${SECRET_AWS_SECRET_KEY_VERSION} | ||||
|     external: true | ||||
							
								
								
									
										13
									
								
								compose.local.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								compose.local.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     volumes: | ||||
|       - storage-data:/var/lib/outline/data | ||||
|     environment: | ||||
|       - FILE_STORAGE | ||||
|       - FILE_STORAGE_UPLOAD_MAX_SIZE | ||||
|  | ||||
| volumes: | ||||
|   storage-data: | ||||
							
								
								
									
										18
									
								
								compose.smtp.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								compose.smtp.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| version: "3.8" | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - smtp_password | ||||
|     environment: | ||||
|       - SMTP_HOST | ||||
|       - SMTP_PORT | ||||
|       - SMTP_USERNAME | ||||
|       - SMTP_FROM_EMAIL | ||||
|       - SMTP_REPLY_EMAIL | ||||
|       - SMTP_TLS_CIPHERS | ||||
|       - SMTP_SECURE | ||||
|  | ||||
| secrets: | ||||
|   smtp_password: | ||||
|     external: true | ||||
|     name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION} | ||||
							
								
								
									
										31
									
								
								compose.yml
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								compose.yml
									
									
									
									
									
								
							| @ -6,9 +6,8 @@ services: | ||||
|     networks: | ||||
|       - backend | ||||
|       - proxy | ||||
|     image: outlinewiki/outline:0.67.2 | ||||
|     image: outlinewiki/outline:0.73.1 | ||||
|     secrets: | ||||
|       - aws_secret_key | ||||
|       - db_password | ||||
|       - secret_key | ||||
|       - utils_secret | ||||
| @ -17,15 +16,7 @@ services: | ||||
|         target: /docker-entrypoint.sh | ||||
|         mode: 0555 | ||||
|     environment: | ||||
|       - AWS_ACCESS_KEY_ID | ||||
|       - AWS_REGION | ||||
|       - AWS_S3_ACL | ||||
|       - AWS_S3_FORCE_PATH_STYLE | ||||
|       - AWS_S3_UPLOAD_BUCKET_NAME | ||||
|       - AWS_S3_UPLOAD_BUCKET_URL | ||||
|       - AWS_S3_UPLOAD_MAX_SIZE | ||||
|       - AWS_SDK_LOAD_CONFIG=0 | ||||
|       - AWS_SECRET_KEY_FILE=/run/secrets/aws_secret_key | ||||
|       - FILE_STORAGE | ||||
|       - DATABASE_PASSWORD_FILE=/run/secrets/db_password | ||||
|       - FORCE_HTTPS=true | ||||
|       - PGSSLMODE=disable | ||||
| @ -43,29 +34,34 @@ services: | ||||
|         - "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})" | ||||
|         - "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure" | ||||
|         - "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}" | ||||
|         - "coop-cloud.${STACK_NAME}.version=0.6.0+0.67.2" | ||||
|         - "coop-cloud.${STACK_NAME}.version=1.1.0+0.73.1" | ||||
|         ## Redirect from EXTRA_DOMAINS to DOMAIN | ||||
|         #- "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}" | ||||
|  | ||||
|   cache: | ||||
|     image: redis:6.2.6 | ||||
|     image: redis:7.2.3 | ||||
|     networks: | ||||
|       - backend | ||||
|  | ||||
|   db: | ||||
|     image: postgres:11 | ||||
|     image: postgres:15.5 | ||||
|     networks: | ||||
|       - backend | ||||
|     secrets: | ||||
|       - db_password | ||||
|     configs: | ||||
|       - source: db_entrypoint | ||||
|         target: /docker-entrypoint.sh | ||||
|         mode: 0555 | ||||
|     environment: | ||||
|       POSTGRES_DB: outline | ||||
|       POSTGRES_PASSWORD_FILE: /run/secrets/db_password | ||||
|       POSTGRES_USER: outline | ||||
|     volumes: | ||||
|       - "postgres_data:/var/lib/postgresql/data" | ||||
|     entrypoint: /docker-entrypoint.sh | ||||
|     deploy: | ||||
|       labels: | ||||
|         backupbot.backup: "true" | ||||
| @ -80,9 +76,6 @@ secrets: | ||||
|   utils_secret: | ||||
|     name: ${STACK_NAME}_utils_secret_${SECRET_UTILS_SECRET_VERSION} | ||||
|     external: true | ||||
|   aws_secret_key: | ||||
|     name: ${STACK_NAME}_aws_secret_key_${SECRET_AWS_SECRET_KEY_VERSION} | ||||
|     external: true | ||||
|   db_password: | ||||
|     name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION} | ||||
|     external: true | ||||
| @ -100,3 +93,7 @@ configs: | ||||
|     name: ${STACK_NAME}_app_entrypoint_${APP_ENTRYPOINT_VERSION} | ||||
|     file: entrypoint.sh.tmpl | ||||
|     template_driver: golang | ||||
|   db_entrypoint: | ||||
|     name: ${STACK_NAME}_db_entrypoint_${DB_ENTRYPOINT_VERSION} | ||||
|     file: entrypoint.postgres.sh.tmpl | ||||
|     template_driver: golang | ||||
|  | ||||
							
								
								
									
										44
									
								
								entrypoint.postgres.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								entrypoint.postgres.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| set -e | ||||
|  | ||||
| MIGRATION_MARKER=$PGDATA/migration_in_progress | ||||
| OLDDATA=$PGDATA/old_data | ||||
| NEWDATA=$PGDATA/new_data | ||||
|  | ||||
| if [ -e $MIGRATION_MARKER ]; then | ||||
|   echo "FATAL: migration was started but did not complete in a previous run. manual recovery necessary" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| if [ -f $PGDATA/PG_VERSION ]; then | ||||
|   DATA_VERSION=$(cat $PGDATA/PG_VERSION) | ||||
|  | ||||
|   if [ -n "$DATA_VERSION" -a "$PG_MAJOR" != "$DATA_VERSION" ]; then | ||||
|     echo "postgres data version $DATA_VERSION found, but need $PG_MAJOR. Starting migration" | ||||
|     echo "Installing postgres $DATA_VERSION" | ||||
|     sed -i "s/$/ $DATA_VERSION/" /etc/apt/sources.list.d/pgdg.list | ||||
|     apt-get update && apt-get install -y --no-install-recommends \ | ||||
|       postgresql-$DATA_VERSION \ | ||||
|       && rm -rf /var/lib/apt/lists/* | ||||
|     echo "shuffling around" | ||||
|     gosu postgres mkdir $OLDDATA $NEWDATA | ||||
|     chmod 700 $OLDDATA $NEWDATA | ||||
|     mv $PGDATA/* $OLDDATA/ || true | ||||
|     touch $MIGRATION_MARKER | ||||
|     echo "running initdb" | ||||
|     # abuse entrypoint script for initdb by making server error out | ||||
|     gosu postgres bash -c "export PGDATA=$NEWDATA ; /usr/local/bin/docker-entrypoint.sh --invalid-arg || true" | ||||
|     echo "running pg_upgrade" | ||||
|     cd /tmp | ||||
|     gosu postgres pg_upgrade --link -b /usr/lib/postgresql/$DATA_VERSION/bin -d $OLDDATA -D $NEWDATA -U $POSTGRES_USER | ||||
|     cp $OLDDATA/pg_hba.conf $NEWDATA/ | ||||
|     mv $NEWDATA/* $PGDATA | ||||
|     rm -rf $OLDDATA | ||||
|     rmdir $NEWDATA | ||||
|     rm $MIGRATION_MARKER | ||||
|     echo "migration complete" | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| /usr/local/bin/docker-entrypoint.sh postgres | ||||
| @ -1,6 +1,12 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| {{ if eq (env "FILE_STORAGE")  "s3" }} | ||||
| export AWS_SECRET_ACCESS_KEY=$(cat /run/secrets/aws_secret_key) | ||||
| {{ end }} | ||||
|  | ||||
| {{ if eq (env "SMTP_ENABLED") "1" }} | ||||
| export SMTP_PASSWORD=$(cat /run/secrets/smtp_password) | ||||
| {{ end }} | ||||
|  | ||||
| {{ if eq (env "OIDC_ENABLED") "1" }} | ||||
| export OIDC_CLIENT_SECRET=$(cat /run/secrets/oidc_client_secret) | ||||
| @ -15,5 +21,7 @@ export SECRET_KEY=$(cat /run/secrets/secret_key) | ||||
| export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_db:5432/outline" | ||||
|  | ||||
| if [ ! "$1" = "-e" ]; then | ||||
| 	/usr/local/bin/yarn db:migrate --env=production-ssl-disabled | ||||
| 	/usr/local/bin/yarn start "$@" | ||||
| fi | ||||
|  | ||||
		Reference in New Issue
	
	Block a user