initial
This commit is contained in:
commit
2434b33665
|
@ -0,0 +1,142 @@
|
|||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
|
||||
clone:
|
||||
# skip_verify: true
|
||||
|
||||
steps:
|
||||
steps:
|
||||
- name: wait
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
|
||||
commands:
|
||||
- sleep 60
|
||||
- name: build-letsencrypt-chat
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh chat $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: scp files
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: appleboy/drone-scp
|
||||
settings:
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-user
|
||||
password:
|
||||
from_secret: ssh-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
command_timeout: 2m
|
||||
target: ~/gitea-drone-stack
|
||||
source:
|
||||
- .
|
||||
- name: deploy
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: appleboy/drone-ssh
|
||||
environment:
|
||||
DRONE_RPC_SECRET:
|
||||
from_secret: drone-rpc-secret
|
||||
DRONE_GITEA_CLIENT_ID:
|
||||
from_secret: drone-gitea-client-id
|
||||
DRONE_GITEA_CLIENT_SECRET:
|
||||
from_secret: drone-gitea-client-secret
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
SSH_USER:
|
||||
from_secret: ssh-user
|
||||
CERTBOT_EMAIL:
|
||||
from_secret: certbot-email
|
||||
GIT_DOMAIN:
|
||||
from_secret: git-domain
|
||||
DRONE_DOMAIN:
|
||||
from_secret: drone-domain
|
||||
CHAT_DOMAIN:
|
||||
from_secret: chat-domain
|
||||
REMOTE_DOMAIN:
|
||||
from_secret: remote-domain
|
||||
BLOG_DOMAIN:
|
||||
from_secret: blog-domain
|
||||
settings:
|
||||
envs:
|
||||
- drone_rpc_secret
|
||||
- drone_gitea_client_id
|
||||
- drone_gitea_client_secret
|
||||
- ssh_user
|
||||
- local_docker_registry
|
||||
- certbot_email
|
||||
- git_domain
|
||||
- drone_domain
|
||||
- chat_domain
|
||||
- remote_domain
|
||||
- blog_domain
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-root-user
|
||||
password:
|
||||
from_secret: ssh-root-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
script:
|
||||
- set -e
|
||||
- export LOCAL_DOCKER_REGISTRY=$LOCAL_DOCKER_REGISTRY
|
||||
- export DRONE_RPC_SECRET=$DRONE_RPC_SECRET
|
||||
- export DRONE_GITEA_CLIENT_ID=$DRONE_GITEA_CLIENT_ID
|
||||
- export DRONE_GITEA_CLIENT_SECRET=$DRONE_GITEA_CLIENT_SECRET
|
||||
- export SSH_USER=$SSH_USER
|
||||
- export CERTBOT_EMAIL=$CERTBOT_EMAIL
|
||||
- export GIT_DOMAIN=$GIT_DOMAIN
|
||||
- export DRONE_DOMAIN=$DRONE_DOMAIN
|
||||
- export CHAT_DOMAIN=$CHAT_DOMAIN
|
||||
- export REMOTE_DOMAIN=$REMOTE_DOMAIN
|
||||
- export BLOG_DOMAIN=$BLOG_DOMAIN
|
||||
- docker network prune -f
|
||||
- cd /home/$SSH_USER/gitea-drone-stack
|
||||
- docker stack rm gitea
|
||||
- sleep 60
|
||||
- docker stack deploy -c docker-compose.yml gitea
|
||||
#- sleep 300
|
||||
|
||||
services:
|
||||
- name: docker
|
||||
image: docker:dind
|
||||
privileged: true
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
- name: ca
|
||||
path: /etc/docker/certs.d
|
||||
|
||||
volumes:
|
||||
- name: dockersock
|
||||
temp: {}
|
||||
- name: ca
|
||||
host:
|
||||
path: /home/giles/gitea-drone-stack/.ca
|
|
@ -0,0 +1,238 @@
|
|||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
|
||||
clone:
|
||||
# skip_verify: true
|
||||
|
||||
steps:
|
||||
steps:
|
||||
- name: test-ssh
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: appleboy/drone-ssh
|
||||
environment:
|
||||
DRONE_RPC_SECRET:
|
||||
from_secret: drone-rpc-secret
|
||||
DRONE_GITEA_CLIENT_ID:
|
||||
from_secret: drone-gitea-client-id
|
||||
DRONE_GITEA_CLIENT_SECRET:
|
||||
from_secret: drone-gitea-client-secret
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
SSH_USER:
|
||||
from_secret: ssh-user
|
||||
CERTBOT_EMAIL:
|
||||
from_secret: certbot-email
|
||||
GIT_DOMAIN:
|
||||
from_secret: git-domain
|
||||
DRONE_DOMAIN:
|
||||
from_secret: drone-domain
|
||||
REMOTE_DOMAIN:
|
||||
from_secret: remote-domain
|
||||
settings:
|
||||
envs:
|
||||
- drone_rpc_secret
|
||||
- drone_gitea_client_id
|
||||
- drone_gitea_client_secret
|
||||
- ssh_user
|
||||
- local_docker_registry
|
||||
- certbot_email
|
||||
- git_domain
|
||||
- drone_domain
|
||||
- remote_domain
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-root-user
|
||||
password:
|
||||
from_secret: ssh-root-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
script:
|
||||
- echo 'ssh ok'
|
||||
- name: wait
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
|
||||
commands:
|
||||
- sleep 60
|
||||
- name: build-postgres
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd guacamole-postgresql
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
||||
- name: build-ngrok
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd ngrok2
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
- name: build-letsencrypt-nginx
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
||||
- name: build-letsencrypt-drone
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh drone $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: build-letsencrypt-remote
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh remote $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: scp files
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: appleboy/drone-scp
|
||||
settings:
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-user
|
||||
password:
|
||||
from_secret: ssh-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
command_timeout: 2m
|
||||
target: ~/gitea-drone-stack
|
||||
source:
|
||||
- .
|
||||
- name: deploy
|
||||
when:
|
||||
branch:
|
||||
- remote
|
||||
image: appleboy/drone-ssh
|
||||
environment:
|
||||
DRONE_RPC_SECRET:
|
||||
from_secret: drone-rpc-secret
|
||||
DRONE_GITEA_CLIENT_ID:
|
||||
from_secret: drone-gitea-client-id
|
||||
DRONE_GITEA_CLIENT_SECRET:
|
||||
from_secret: drone-gitea-client-secret
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
SSH_USER:
|
||||
from_secret: ssh-user
|
||||
CERTBOT_EMAIL:
|
||||
from_secret: certbot-email
|
||||
GIT_DOMAIN:
|
||||
from_secret: git-domain
|
||||
DRONE_DOMAIN:
|
||||
from_secret: drone-domain
|
||||
REMOTE_DOMAIN:
|
||||
from_secret: remote-domain
|
||||
settings:
|
||||
envs:
|
||||
- drone_rpc_secret
|
||||
- drone_gitea_client_id
|
||||
- drone_gitea_client_secret
|
||||
- ssh_user
|
||||
- local_docker_registry
|
||||
- certbot_email
|
||||
- git_domain
|
||||
- drone_domain
|
||||
- remote_domain
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-root-user
|
||||
password:
|
||||
from_secret: ssh-root-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
script:
|
||||
- set -e
|
||||
- export LOCAL_DOCKER_REGISTRY=$LOCAL_DOCKER_REGISTRY
|
||||
- export DRONE_RPC_SECRET=$DRONE_RPC_SECRET
|
||||
- export DRONE_GITEA_CLIENT_ID=$DRONE_GITEA_CLIENT_ID
|
||||
- export DRONE_GITEA_CLIENT_SECRET=$DRONE_GITEA_CLIENT_SECRET
|
||||
- export SSH_USER=$SSH_USER
|
||||
- export CERTBOT_EMAIL=$CERTBOT_EMAIL
|
||||
- export GIT_DOMAIN=$GIT_DOMAIN
|
||||
- export DRONE_DOMAIN=$DRONE_DOMAIN
|
||||
- export REMOTE_DOMAIN=$REMOTE_DOMAIN
|
||||
- docker network prune -f
|
||||
- cd /home/$SSH_USER/gitea-drone-stack
|
||||
- docker stack rm remote-drone
|
||||
- sleep 60
|
||||
- docker stack deploy -c docker-compose-drone.yml remote-drone
|
||||
#- sleep 300
|
||||
|
||||
services:
|
||||
- name: docker
|
||||
image: docker:dind
|
||||
privileged: true
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
- name: ca
|
||||
path: /etc/docker/certs.d
|
||||
|
||||
volumes:
|
||||
- name: dockersock
|
||||
temp: {}
|
||||
- name: ca
|
||||
host:
|
||||
path: /home/giles/gitea-drone-stack/.ca
|
|
@ -0,0 +1,243 @@
|
|||
---
|
||||
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
|
||||
clone:
|
||||
# skip_verify: true
|
||||
|
||||
steps:
|
||||
steps:
|
||||
- name: wait
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
|
||||
commands:
|
||||
- sleep 60
|
||||
- name: build-postgres
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd guacamole-postgresql
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
||||
- name: build-ngrok
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd ngrok2
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
- name: build-letsencrypt-nginx
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- docker build . -t $${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
||||
- docker push $${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
||||
- name: build-letsencrypt-blog
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh blog $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: build-letsencrypt-drone
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh drone $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: build-letsencrypt-git
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh git $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: build-letsencrypt-remote
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh remote $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: build-letsencrypt-chat
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: docker:dind
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
environment:
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
commands:
|
||||
- cd letsencrypt-nginx
|
||||
- sh build.sh chat $${LOCAL_DOCKER_REGISTRY}
|
||||
- name: scp files
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: appleboy/drone-scp
|
||||
settings:
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-user
|
||||
password:
|
||||
from_secret: ssh-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
command_timeout: 2m
|
||||
target: ~/gitea-drone-stack
|
||||
source:
|
||||
- .
|
||||
- name: deploy
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
image: appleboy/drone-ssh
|
||||
environment:
|
||||
DRONE_RPC_SECRET:
|
||||
from_secret: drone-rpc-secret
|
||||
DRONE_GITEA_CLIENT_ID:
|
||||
from_secret: drone-gitea-client-id
|
||||
DRONE_GITEA_CLIENT_SECRET:
|
||||
from_secret: drone-gitea-client-secret
|
||||
LOCAL_DOCKER_REGISTRY:
|
||||
from_secret: local-docker-registry
|
||||
SSH_USER:
|
||||
from_secret: ssh-user
|
||||
CERTBOT_EMAIL:
|
||||
from_secret: certbot-email
|
||||
GIT_DOMAIN:
|
||||
from_secret: git-domain
|
||||
DRONE_DOMAIN:
|
||||
from_secret: drone-domain
|
||||
CHAT_DOMAIN:
|
||||
from_secret: chat-domain
|
||||
REMOTE_DOMAIN:
|
||||
from_secret: remote-domain
|
||||
BLOG_DOMAIN:
|
||||
from_secret: blog-domain
|
||||
settings:
|
||||
envs:
|
||||
- drone_rpc_secret
|
||||
- drone_gitea_client_id
|
||||
- drone_gitea_client_secret
|
||||
- ssh_user
|
||||
- local_docker_registry
|
||||
- certbot_email
|
||||
- git_domain
|
||||
- drone_domain
|
||||
- chat_domain
|
||||
- remote_domain
|
||||
- blog_domain
|
||||
host:
|
||||
from_secret: ssh-host
|
||||
username:
|
||||
from_secret: ssh-root-user
|
||||
password:
|
||||
from_secret: ssh-root-password
|
||||
port:
|
||||
from_secret: ssh-port
|
||||
script:
|
||||
- set -e
|
||||
- export LOCAL_DOCKER_REGISTRY=$LOCAL_DOCKER_REGISTRY
|
||||
- export DRONE_RPC_SECRET=$DRONE_RPC_SECRET
|
||||
- export DRONE_GITEA_CLIENT_ID=$DRONE_GITEA_CLIENT_ID
|
||||
- export DRONE_GITEA_CLIENT_SECRET=$DRONE_GITEA_CLIENT_SECRET
|
||||
- export SSH_USER=$SSH_USER
|
||||
- export CERTBOT_EMAIL=$CERTBOT_EMAIL
|
||||
- export GIT_DOMAIN=$GIT_DOMAIN
|
||||
- export DRONE_DOMAIN=$DRONE_DOMAIN
|
||||
- export CHAT_DOMAIN=$CHAT_DOMAIN
|
||||
- export REMOTE_DOMAIN=$REMOTE_DOMAIN
|
||||
- export BLOG_DOMAIN=$BLOG_DOMAIN
|
||||
- docker network prune -f
|
||||
- cd /home/$SSH_USER/gitea-drone-stack
|
||||
- docker stack rm gitea
|
||||
- sleep 60
|
||||
- docker stack deploy -c docker-compose.yml gitea
|
||||
#- sleep 300
|
||||
|
||||
services:
|
||||
- name: docker
|
||||
image: docker:dind
|
||||
privileged: true
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
- name: ca
|
||||
path: /etc/docker/certs.d
|
||||
|
||||
volumes:
|
||||
- name: dockersock
|
||||
temp: {}
|
||||
- name: ca
|
||||
host:
|
||||
path: /home/giles/gitea-drone-stack/.ca
|
|
@ -0,0 +1,3 @@
|
|||
.certificates
|
||||
.ca
|
||||
.secrets
|
|
@ -0,0 +1,241 @@
|
|||
# gitea in a stack with drone and guacamole
|
||||
|
||||
Remote system support.
|
||||
|
||||
Consisting of
|
||||
|
||||
* gitea repository - github like self hoisted git and web application
|
||||
* drone ci system
|
||||
* guacamole - rdp, vnc and ssh over the internet in the browser
|
||||
|
||||
[![Build Status](https://drone.sigyl.com/api/badges/giles/gitea-drone-stack/status.svg)](https://drone.sigyl.com/giles/gitea-drone-stack)
|
||||
|
||||
(nb when self deploying with drone it will will stick on started and have to be cancelled. This is because the deployment tears down the previous running drone).
|
||||
|
||||
NB each time you deploy this using drone it will leave an orphaned network for example:
|
||||
|
||||
drone-yoZbiXiqssFcSsG0dP5d
|
||||
|
||||
eventually this will start to cause an error with message: Docker “ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network”
|
||||
|
||||
|
||||
## installing docker
|
||||
|
||||
Start with a fresh install of Ubuntu server 19.04 connected to the internet
|
||||
|
||||
### update packages
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get upgrade
|
||||
```
|
||||
|
||||
### remove old versions of docker
|
||||
|
||||
(if it's a fresh install of linux there shouldn't be any)
|
||||
|
||||
```
|
||||
sudo apt-get remove docker docker-engine docker.io
|
||||
```
|
||||
|
||||
### install docker
|
||||
|
||||
```
|
||||
sudo apt install docker.io
|
||||
```
|
||||
|
||||
### add current user to docker group
|
||||
|
||||
logout and back in afterwards
|
||||
|
||||
```
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
### start and enable docker
|
||||
|
||||
```
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### change ssh port to 2022
|
||||
|
||||
```
|
||||
sudo vi /etc/ssh/sshd_config
|
||||
|
||||
```
|
||||
|
||||
change Port 2022
|
||||
|
||||
### allow root to ssh
|
||||
|
||||
```
|
||||
sudo vi /etc/ssh/sshd_config
|
||||
|
||||
```
|
||||
|
||||
## set the root password
|
||||
|
||||
```
|
||||
sudo passwd root
|
||||
```
|
||||
|
||||
change PermitRootLogin yes
|
||||
|
||||
reboot
|
||||
|
||||
start a stack running gitea to host repository.
|
||||
|
||||
## stack
|
||||
|
||||
### labels
|
||||
|
||||
get nodes with
|
||||
|
||||
```
|
||||
docker node ls
|
||||
```
|
||||
|
||||
add label with
|
||||
|
||||
```
|
||||
docker node update --label-add com.sigyl.git-stack=yes [node id]
|
||||
```
|
||||
|
||||
### generate certificates
|
||||
|
||||
where [registry-domain] is the domain on which the registry will be served
|
||||
|
||||
sh ca.sh [registry-domain]:5000
|
||||
|
||||
|
||||
sh make-cert.sh [registry-domain] registry
|
||||
|
||||
### ngrok auth
|
||||
|
||||
obtain ngrok auth token and place in .secrets in form
|
||||
|
||||
authtoken: [token]
|
||||
|
||||
### initial deploy
|
||||
|
||||
```shell
|
||||
export LOCAL_DOCKER_REGISTRY=registry.local-domain:5000
|
||||
export CERTBOT_EMAIL=giles.bradshaw@sigyl.com
|
||||
export GIT_DOMAIN=git.sigyl.com
|
||||
export REMOTE_DOMAIN=remote.sigyl.com
|
||||
export DRONE_DOMAIN=drone.sigyl.com
|
||||
export BLOG_DOMAIN=blog.sigyl.com
|
||||
|
||||
export DRONE_RPC_SECRET=$(openssl rand -base64 48)
|
||||
docker stack deploy -c docker-compose.yml gitea
|
||||
```
|
||||
|
||||
### create gitea drone app with client id and secret
|
||||
|
||||
### add secrets to repository in drone
|
||||
|
||||
|
||||
![add secret](./add-secret.png)
|
||||
|
||||
* blog-domain
|
||||
* certbot-email
|
||||
* drone-domain
|
||||
* drone-gitea-client-id
|
||||
* drone-gitea-client-secret
|
||||
* drone-rpc-secret
|
||||
* git-domain
|
||||
* local-docker-registry
|
||||
* remote-domain
|
||||
* ssh-password
|
||||
* ssh-port
|
||||
* ssh-root-password
|
||||
* ssh-root-user
|
||||
* ssh-user
|
||||
* ssh-host
|
||||
|
||||
### kill orphan docker:dind containers
|
||||
|
||||
Wen the system is deployed by pushing to repository the docker:dind container will be orphaned and will run forever unless killed..
|
||||
|
||||
|
||||
## guacamole
|
||||
|
||||
np no spaces in postgres password
|
||||
|
||||
docker stack for guacamole
|
||||
|
||||
adapted from https://digitalmccullough.com/posts/setting-up-apache-guacamole-with-docker-stack.html
|
||||
|
||||
### initialising
|
||||
|
||||
find id
|
||||
|
||||
```
|
||||
docker ps
|
||||
|
||||
```
|
||||
|
||||
execute initdb.sql
|
||||
|
||||
```
|
||||
docker exec -it [id] psql -U postgres -d guacamole_db -f /initdb.sql
|
||||
docker exec -it [id] psql -U postgres -d guacamole_db -f /init-user.sql -v password='somepassword'
|
||||
```
|
||||
|
||||
initial admin is guacadmin:guacadmin
|
||||
|
||||
create a new admin and delete guacadmin
|
||||
|
||||
## docker-exec-runner on windows
|
||||
|
||||
These instructions are not very good...
|
||||
|
||||
https://exec-runner.docs.drone.io/installation/windows/
|
||||
|
||||
download and unpack on linux with
|
||||
|
||||
```
|
||||
curl -L https://github.com/drone-runners/drone-runner-exec/releases/latest/download/drone_runner_exec_windows_amd64.tar.gz | tar zx
|
||||
```
|
||||
|
||||
|
||||
rename drone-runner-exec to drone-runner-exec.exe
|
||||
|
||||
make directory c:\Drone\drone-runner-exec on windows
|
||||
|
||||
copy drone-runner-exec.exe to directory
|
||||
|
||||
make config file with
|
||||
|
||||
```
|
||||
|
||||
DRONE_RPC_PROTO=https
|
||||
DRONE_RPC_HOST=drone.sigyl.com:443
|
||||
DRONE_RPC_SECRET=[rpc secret]
|
||||
DRONE_LOG_FILE=C:\Drone\drone-runner-exec\log.txt
|
||||
DRONE_RUNNER_LABELS=web:true
|
||||
```
|
||||
|
||||
|
||||
install and start service with
|
||||
|
||||
```
|
||||
drone-runner-exec service install
|
||||
drone-runner-exec service start
|
||||
```
|
||||
|
||||
## chat
|
||||
|
||||
Once the chat-mongo container is up you need to get its id and do
|
||||
|
||||
```
|
||||
docker exec -it [id] mongo --eval "printjson(rs.initiate({_id: 'rs0', members: [ { _id: 0, host: 'localhost:27017' } ]}))"
|
||||
```
|
||||
|
||||
then scale up chat
|
||||
|
||||
```
|
||||
docker service scale gitea_chat=1
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
|
@ -0,0 +1,8 @@
|
|||
mkdir -p ../.certificates
|
||||
openssl genrsa -des3 -out ../.certificates/ca.key 4096
|
||||
|
||||
openssl req -x509 -new -nodes -key ../.certificates/ca.key -sha256 -days 10000 -subj "/C=GB/ST=Devon/O=SiGyl/OU=SiGyl/CN=CA" -out ../.certificates/ca.crt
|
||||
mkdir -p ../.ca/$1
|
||||
cp ../.certificates/ca.crt ../.ca/$1
|
||||
sudo mkdir -p /etc/docker/certs.d/$1
|
||||
sudo cp ../.ca/$1/*.* /etc/docker/certs.d/$1
|
|
@ -0,0 +1,4 @@
|
|||
openssl genrsa -out ../.certificates/$2.key 2048
|
||||
openssl req -new -sha256 -key ../.certificates/$2.key -subj "/C=GB/ST=Devon/O=SiGyl/OU=Gitea/CN=$1" -out ../.certificates/$2.csr
|
||||
|
||||
openssl x509 -req -in ../.certificates/$2.csr -CA ../.certificates/ca.crt -CAkey ../.certificates/ca.key -CAcreateserial -out ../.certificates/$2.crt -days 10000 -sha256
|
|
@ -0,0 +1,159 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
letsencrypt-git:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: letsencrypt-git
|
||||
environment:
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- SERVER_NAME=${GIT_DOMAIN}
|
||||
- PROXY_PASS=http://gitea:3000/
|
||||
- BLOG_PROXY_PASS=http://ghost:2368
|
||||
- CHAT_PROXY_PASS=http://chat:3000
|
||||
- LOCATION=/git/
|
||||
- BLOG_LOCATION=/blog/
|
||||
- CHAT_LOCATION=/chat/
|
||||
volumes:
|
||||
- letsencrypt-git:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
- 5000:5000
|
||||
gitea:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: gitea/gitea:latest
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- ROOT_URL=https://${GIT_DOMAIN}/git
|
||||
- SSH_DOMAIN=${GIT_DOMAIN}
|
||||
volumes:
|
||||
- gitea-app:/data
|
||||
ports:
|
||||
- 3000
|
||||
- 22:22
|
||||
networks:
|
||||
- appnet
|
||||
ghost:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ghost
|
||||
volumes:
|
||||
- ghost-content:/var/lib/ghost/content
|
||||
- ./ghost/config.production.json:/var/lib/ghost/config.production.json
|
||||
environment:
|
||||
- url=https://${GIT_DOMAIN}/blog
|
||||
networks:
|
||||
- appnet
|
||||
chat:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack-chat == yes]
|
||||
replicas: 0 # will scale after mongo initated
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: rocketchat/rocket.chat:latest
|
||||
networks:
|
||||
- appnet
|
||||
environment:
|
||||
- MONGO_OPLOG_URL=mongodb://chat-mongo:27017/local
|
||||
- ROOT_URL=https://${GIT_DOMAIN}/chat/
|
||||
- ROOT_URL_PATH_PREFIX=chat
|
||||
- PORT=3000
|
||||
- MONGO_URL=mongodb://chat-mongo:27017/rocketchat
|
||||
volumes:
|
||||
- chat-uploads:/app/uploads
|
||||
chat-mongo:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack-chat == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: mongo:4.0
|
||||
networks:
|
||||
- appnet
|
||||
environment:
|
||||
- MONGO_DATA_DIR=/data/db
|
||||
- MONGO_LOG_DIR=/dev/null
|
||||
volumes:
|
||||
- mongo-chat:/data/db
|
||||
command: mongod --smallfiles --replSet rs0 --oplogSize 128
|
||||
drone-server:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone:latest
|
||||
volumes:
|
||||
- drone:/var/lib/drone
|
||||
- drone-data:/data
|
||||
depends_on:
|
||||
- gitea
|
||||
environment:
|
||||
- DRONE_LOGS_DEBUG=true
|
||||
- DRONE_LOGS_PRETTY=true
|
||||
- DRONE_GITEA_SERVER=https://${GIT_DOMAIN}/git
|
||||
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
|
||||
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
|
||||
- DRONE_SERVER_HOST=${GIT_DOMAIN}:5000 # tunnel hostname
|
||||
- DRONE_ADMIN=giles
|
||||
- DRONE_SERVER_PROTO=https # tunnel adds https on top
|
||||
- DRONE_SERVER_PORT=:8080
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_USER_CREATE=username:giles,admin:true
|
||||
- DRONE_AGENTS_ENABLED=true
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
networks:
|
||||
- appnet
|
||||
drone-docker-runner:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone-runner-docker:1
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_RPC_PROTO=https
|
||||
- DRONE_RPC_HOST=${DRONE_DOMAIN}:5000
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_RUNNER_CAPACITY=8
|
||||
- DRONE_RUNNER_NAME="docker-runner"
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
|
||||
volumes:
|
||||
gitea-db:
|
||||
gitea-app:
|
||||
letsencrypt-git:
|
||||
ghost-content:
|
||||
mongo-chat:
|
||||
chat-uploads:
|
||||
drone:
|
||||
drone-data:
|
||||
networks:
|
||||
appnet:
|
||||
driver: overlay
|
|
@ -0,0 +1,238 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
letsencrypt-remote:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-remote
|
||||
environment:
|
||||
- SERVER_NAME=${REMOTE_DOMAIN}
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- PROXY_PASS=http://guacamole:8080/guacamole/
|
||||
volumes:
|
||||
- letsencrypt-remote:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- guacamole
|
||||
letsencrypt-drone:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-drone
|
||||
environment:
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- SERVER_NAME=${DRONE_DOMAIN}
|
||||
- PROXY_PASS=http://drone-server:8080/
|
||||
volumes:
|
||||
- letsencrypt-drone:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- drone-server
|
||||
ngrok:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
ports:
|
||||
- "4040:4040"
|
||||
volumes:
|
||||
- ./ngrok2/ngrok.m._yml:/home/ngrok/.ngrok2/ngrok._yml:ro
|
||||
environment:
|
||||
- GIT_DOMAIN=${GIT_DOMAIN}
|
||||
- DRONE_DOMAIN=${DRONE_DOMAIN}
|
||||
- REMOTE_DOMAIN=${REMOTE_DOMAIN}
|
||||
- BLOG_DOMAIN=${BLOG_DOMAIN}
|
||||
depends_on:
|
||||
- gitea
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- ngrok-auth-token
|
||||
drone-server:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone:latest
|
||||
volumes:
|
||||
- drone:/var/lib/drone
|
||||
- drone-data:/data
|
||||
depends_on:
|
||||
- gitea
|
||||
environment:
|
||||
- DRONE_LOGS_DEBUG=true
|
||||
- DRONE_LOGS_PRETTY=true
|
||||
- DRONE_GITEA_SERVER=https://${GIT_DOMAIN}
|
||||
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
|
||||
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
|
||||
- DRONE_SERVER_HOST=${DRONE_DOMAIN} # tunnel hostname
|
||||
- DRONE_ADMIN=giles
|
||||
- DRONE_SERVER_PROTO=https # tunnel adds https on top
|
||||
- DRONE_SERVER_PORT=:8080
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_USER_CREATE=username:giles,admin:true
|
||||
- DRONE_AGENTS_ENABLED=true
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
networks:
|
||||
- appnet
|
||||
drone-docker-runner:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone-runner-docker:1
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_RPC_PROTO=https
|
||||
- DRONE_RPC_HOST=${DRONE_DOMAIN}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_RUNNER_CAPACITY=8
|
||||
- DRONE_RUNNER_NAME="docker-runner"
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
|
||||
registry:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
volumes:
|
||||
- registry-data:/var/lib/registry
|
||||
environment:
|
||||
- REGISTRY_HTTP_ADDR=0.0.0.0:5000
|
||||
- REGISTRY_HTTP_TLS_CERTIFICATE="/run/secrets/registry-cert"
|
||||
- REGISTRY_HTTP_TLS_KEY="/run/secrets/registry-key"
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- registry-cert
|
||||
- registry-key
|
||||
registry-cache:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5001:5001
|
||||
volumes:
|
||||
- registry-cache-data:/var/lib/registry
|
||||
environment:
|
||||
- REGISTRY_HTTP_ADDR=0.0.0.0:5001
|
||||
- REGISTRY_HTTP_TLS_CERTIFICATE="/run/secrets/registry-cert"
|
||||
- REGISTRY_HTTP_TLS_KEY="/run/secrets/registry-key"
|
||||
- REGISTRY_PROXY_REMOTEURL=http://registry-1.docker.io
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- registry-cert
|
||||
- registry-key
|
||||
guacamole-postgresql:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql:latest
|
||||
environment:
|
||||
POSTGRES_PASSWORD: guacroot
|
||||
POSTGRES_DB: guacamole_db
|
||||
volumes:
|
||||
- guacamole-postgresql-data:/var/lib/postgresql/data
|
||||
#secrets:
|
||||
# - source: guacamole-postgresql-password
|
||||
# target: password
|
||||
|
||||
#- /home/giles/guacamole-stack/initdb.sql:/initdb.sql
|
||||
networks:
|
||||
- appnet
|
||||
|
||||
# The backend guacamole server.
|
||||
guacd:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: guacamole/guacd:latest
|
||||
networks:
|
||||
- appnet
|
||||
|
||||
guacamole:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: guacamole/guacamole:latest
|
||||
secrets:
|
||||
- source: guacamole-postgresql-database
|
||||
target: database
|
||||
- source: guacamole-postgresql-user
|
||||
target: user
|
||||
- source: guacamole-postgresql-password
|
||||
target: password
|
||||
environment:
|
||||
- POSTGRES_HOSTNAME=guacamole-postgresql
|
||||
- POSTGRES_PORT=5432
|
||||
- POSTGRES_USER_FILE=/run/secrets/user
|
||||
- POSTGRES_PASSWORD_FILE=/run/secrets/password
|
||||
- POSTGRES_DATABASE_FILE=/run/secrets/database
|
||||
- GUACD_HOSTNAME=guacd
|
||||
networks:
|
||||
- appnet
|
||||
volumes:
|
||||
drone:
|
||||
drone-data:
|
||||
registry-data:
|
||||
registry-cache-data:
|
||||
guacamole-postgresql-data:
|
||||
letsencrypt-remote:
|
||||
letsencrypt-drone:
|
||||
|
||||
networks:
|
||||
appnet:
|
||||
driver: overlay
|
||||
#external: true
|
||||
secrets:
|
||||
'registry-cert':
|
||||
file: .certificates/registry.crt
|
||||
'registry-key':
|
||||
file: .certificates/registry.key
|
||||
'guacamole-postgresql-database':
|
||||
file: .secrets/guacamole-postgresql-database
|
||||
'guacamole-postgresql-user':
|
||||
file: .secrets/guacamole-postgresql-user
|
||||
'guacamole-postgresql-password':
|
||||
file: .secrets/guacamole-postgresql-password
|
||||
'ngrok-auth-token':
|
||||
file: .secrets/ngrok-auth-token
|
|
@ -0,0 +1,370 @@
|
|||
version: "3.7"
|
||||
services:
|
||||
letsencrypt-chat:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-chat
|
||||
environment:
|
||||
- SERVER_NAME=${CHAT_DOMAIN}
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- PROXY_PASS=http://chat:3000/
|
||||
volumes:
|
||||
- letsencrypt-chat:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
letsencrypt-remote:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-remote
|
||||
environment:
|
||||
- SERVER_NAME=${REMOTE_DOMAIN}
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- PROXY_PASS=http://guacamole:8080/guacamole/
|
||||
volumes:
|
||||
- letsencrypt-remote:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- guacamole
|
||||
letsencrypt-git:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-git
|
||||
environment:
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- SERVER_NAME=${GIT_DOMAIN}
|
||||
- PROXY_PASS=http://gitea:3000/
|
||||
volumes:
|
||||
- letsencrypt-git:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- gitea
|
||||
letsencrypt-drone:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-drone
|
||||
environment:
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- SERVER_NAME=${DRONE_DOMAIN}
|
||||
- PROXY_PASS=http://drone-server:8080/
|
||||
volumes:
|
||||
- letsencrypt-drone:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- drone-server
|
||||
gitea:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: gitea/gitea:latest
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- ROOT_URL=https://${GIT_DOMAIN}/
|
||||
- SSH_DOMAIN=${GIT_DOMAIN}
|
||||
volumes:
|
||||
- gitea-app:/data
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 22:22
|
||||
networks:
|
||||
- appnet
|
||||
ngrok:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
ports:
|
||||
- "4040:4040"
|
||||
volumes:
|
||||
- ./ngrok2/ngrok._yml:/home/ngrok/.ngrok2/ngrok._yml:ro
|
||||
environment:
|
||||
- GIT_DOMAIN=${GIT_DOMAIN}
|
||||
- DRONE_DOMAIN=${DRONE_DOMAIN}
|
||||
- REMOTE_DOMAIN=${REMOTE_DOMAIN}
|
||||
- BLOG_DOMAIN=${BLOG_DOMAIN}
|
||||
- CHAT_DOMAIN=${CHAT_DOMAIN}
|
||||
#command: /bin/sh -c " cat /run/secrets/ngrok-auth-token /home/ngrok/.ngrok2/ngrok._yml > /home/ngrok/.ngrok2/ngrok.yml && ngrok start --all"
|
||||
depends_on:
|
||||
- gitea
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- ngrok-auth-token
|
||||
drone-server:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone:latest
|
||||
volumes:
|
||||
- drone:/var/lib/drone
|
||||
- drone-data:/data
|
||||
depends_on:
|
||||
- gitea
|
||||
environment:
|
||||
- DRONE_LOGS_DEBUG=true
|
||||
- DRONE_LOGS_PRETTY=true
|
||||
- DRONE_GITEA_SERVER=https://${GIT_DOMAIN}
|
||||
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
|
||||
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
|
||||
- DRONE_SERVER_HOST=${DRONE_DOMAIN} # tunnel hostname
|
||||
- DRONE_ADMIN=giles
|
||||
- DRONE_SERVER_PROTO=https # tunnel adds https on top
|
||||
- DRONE_SERVER_PORT=:8080
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_USER_CREATE=username:giles,admin:true
|
||||
- DRONE_AGENTS_ENABLED=true
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
networks:
|
||||
- appnet
|
||||
drone-docker-runner:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: drone/drone-runner-docker:1
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_RPC_PROTO=https
|
||||
- DRONE_RPC_HOST=${DRONE_DOMAIN}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
|
||||
- DRONE_RUNNER_CAPACITY=8
|
||||
- DRONE_RUNNER_NAME="docker-runner"
|
||||
#- DRONE_ENV_PLUGIN_ENDPOINT=http://git.local-domain:8888
|
||||
#- DRONE_ENV_PLUGIN_TOKEN=anything
|
||||
|
||||
registry:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
volumes:
|
||||
- registry-data:/var/lib/registry
|
||||
environment:
|
||||
- REGISTRY_HTTP_ADDR=0.0.0.0:5000
|
||||
- REGISTRY_HTTP_TLS_CERTIFICATE="/run/secrets/registry-cert"
|
||||
- REGISTRY_HTTP_TLS_KEY="/run/secrets/registry-key"
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- registry-cert
|
||||
- registry-key
|
||||
registry-cache:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5001:5001
|
||||
volumes:
|
||||
- registry-cache-data:/var/lib/registry
|
||||
environment:
|
||||
- REGISTRY_HTTP_ADDR=0.0.0.0:5001
|
||||
- REGISTRY_HTTP_TLS_CERTIFICATE="/run/secrets/registry-cert"
|
||||
- REGISTRY_HTTP_TLS_KEY="/run/secrets/registry-key"
|
||||
- REGISTRY_PROXY_REMOTEURL=http://registry-1.docker.io
|
||||
networks:
|
||||
- appnet
|
||||
secrets:
|
||||
- registry-cert
|
||||
- registry-key
|
||||
letsencrypt-blog:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/letsencrypt-blog
|
||||
environment:
|
||||
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
|
||||
- SERVER_NAME=${BLOG_DOMAIN}
|
||||
- PROXY_PASS=http://ghost:2368
|
||||
volumes:
|
||||
- letsencrypt-blog:/etc/letsencrypt
|
||||
networks:
|
||||
- appnet
|
||||
depends_on:
|
||||
- blog
|
||||
|
||||
ghost:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ghost
|
||||
volumes:
|
||||
- ghost-content:/var/lib/ghost/content
|
||||
- ./ghost/config.production.json:/var/lib/ghost/config.production.json
|
||||
environment:
|
||||
- url=https://${BLOG_DOMAIN}
|
||||
networks:
|
||||
- appnet
|
||||
|
||||
guacamole-postgresql:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: ${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql:latest
|
||||
environment:
|
||||
POSTGRES_PASSWORD: guacroot
|
||||
POSTGRES_DB: guacamole_db
|
||||
volumes:
|
||||
- guacamole-postgresql-data:/var/lib/postgresql/data
|
||||
#secrets:
|
||||
# - source: guacamole-postgresql-password
|
||||
# target: password
|
||||
|
||||
#- /home/giles/guacamole-stack/initdb.sql:/initdb.sql
|
||||
networks:
|
||||
- appnet
|
||||
|
||||
# The backend guacamole server.
|
||||
guacd:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: guacamole/guacd:latest
|
||||
networks:
|
||||
- appnet
|
||||
|
||||
guacamole:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: guacamole/guacamole:latest
|
||||
secrets:
|
||||
- source: guacamole-postgresql-database
|
||||
target: database
|
||||
- source: guacamole-postgresql-user
|
||||
target: user
|
||||
- source: guacamole-postgresql-password
|
||||
target: password
|
||||
environment:
|
||||
- POSTGRES_HOSTNAME=guacamole-postgresql
|
||||
- POSTGRES_PORT=5432
|
||||
- POSTGRES_USER_FILE=/run/secrets/user
|
||||
- POSTGRES_PASSWORD_FILE=/run/secrets/password
|
||||
- POSTGRES_DATABASE_FILE=/run/secrets/database
|
||||
- GUACD_HOSTNAME=guacd
|
||||
networks:
|
||||
- appnet
|
||||
chat:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 0 # will scale after mongo initated
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: rocketchat/rocket.chat:latest
|
||||
networks:
|
||||
- appnet
|
||||
environment:
|
||||
- MONGO_OPLOG_URL=mongodb://chat-mongo:27017/local
|
||||
- ROOT_URL=https://${CHAT_DOMAIN}
|
||||
- PORT=3000
|
||||
- MONGO_URL=mongodb://chat-mongo:27017/rocketchat
|
||||
volumes:
|
||||
- chat-uploads:/app/uploads
|
||||
chat-mongo:
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: any
|
||||
image: mongo:4.0
|
||||
networks:
|
||||
- appnet
|
||||
environment:
|
||||
- MONGO_DATA_DIR=/data/db
|
||||
- MONGO_LOG_DIR=/dev/null
|
||||
volumes:
|
||||
- mongo-chat:/data/db
|
||||
command: mongod --smallfiles --replSet rs0 --oplogSize 128
|
||||
volumes:
|
||||
gitea-app:
|
||||
gitea-db:
|
||||
drone:
|
||||
drone-data:
|
||||
registry-data:
|
||||
registry-cache-data:
|
||||
guacamole-postgresql-data:
|
||||
letsencrypt-remote:
|
||||
letsencrypt-chat:
|
||||
letsencrypt-git:
|
||||
letsencrypt-drone:
|
||||
letsencrypt-blog:
|
||||
ghost-content:
|
||||
mongo-chat:
|
||||
chat-uploads:
|
||||
|
||||
networks:
|
||||
appnet:
|
||||
driver: overlay
|
||||
#external: true
|
||||
secrets:
|
||||
'registry-cert':
|
||||
file: .certificates/registry.crt
|
||||
'registry-key':
|
||||
file: .certificates/registry.key
|
||||
'guacamole-postgresql-database':
|
||||
file: .secrets/guacamole-postgresql-database
|
||||
'guacamole-postgresql-user':
|
||||
file: .secrets/guacamole-postgresql-user
|
||||
'guacamole-postgresql-password':
|
||||
file: .secrets/guacamole-postgresql-password
|
||||
'ngrok-auth-token':
|
||||
file: .secrets/ngrok-auth-token
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"url": "https://sigyl.com/ghost",
|
||||
"server": {
|
||||
"port": 2368,
|
||||
"host": "0.0.0.0"
|
||||
},
|
||||
"database": {
|
||||
"client": "sqlite3",
|
||||
"connection": {
|
||||
"filename": "/var/lib/ghost/content/data/ghost.db"
|
||||
}
|
||||
},
|
||||
"mail": {
|
||||
"transport": "SMTP",
|
||||
"options": {
|
||||
"service": "Mailgun",
|
||||
"auth": {
|
||||
"user": "postmaster@sandboxb393ecccde2a4447923b56a149879324.mailgun.org",
|
||||
"pass": "85828e2f386a89851ddd4b8e32bfebdb"
|
||||
}
|
||||
}
|
||||
},
|
||||
"logging": {
|
||||
"transports": [
|
||||
"file",
|
||||
"stdout"
|
||||
]
|
||||
},
|
||||
"process": "systemd",
|
||||
"paths": {
|
||||
"contentPath": "/var/lib/ghost/content"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
FROM postgres:12
|
||||
|
||||
COPY *.sql /
|
|
@ -0,0 +1,3 @@
|
|||
CREATE USER guacamole_user WITH PASSWORD :'password';
|
||||
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO guacamole_user;
|
||||
GRANT SELECT,USAGE ON ALL SEQUENCES IN SCHEMA public TO guacamole_user;
|
|
@ -0,0 +1,791 @@
|
|||
--
|
||||
-- Licensed to the Apache Software Foundation (ASF) under one
|
||||
-- or more contributor license agreements. See the NOTICE file
|
||||
-- distributed with this work for additional information
|
||||
-- regarding copyright ownership. The ASF licenses this file
|
||||
-- to you under the Apache License, Version 2.0 (the
|
||||
-- "License"); you may not use this file except in compliance
|
||||
-- with the License. You may obtain a copy of the License at
|
||||
--
|
||||
-- http://www.apache.org/licenses/LICENSE-2.0
|
||||
--
|
||||
-- Unless required by applicable law or agreed to in writing,
|
||||
-- software distributed under the License is distributed on an
|
||||
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
-- KIND, either express or implied. See the License for the
|
||||
-- specific language governing permissions and limitations
|
||||
-- under the License.
|
||||
--
|
||||
|
||||
--
|
||||
-- Connection group types
|
||||
--
|
||||
|
||||
CREATE TYPE guacamole_connection_group_type AS ENUM(
|
||||
'ORGANIZATIONAL',
|
||||
'BALANCING'
|
||||
);
|
||||
|
||||
--
|
||||
-- Entity types
|
||||
--
|
||||
|
||||
CREATE TYPE guacamole_entity_type AS ENUM(
|
||||
'USER',
|
||||
'USER_GROUP'
|
||||
);
|
||||
|
||||
--
|
||||
-- Object permission types
|
||||
--
|
||||
|
||||
CREATE TYPE guacamole_object_permission_type AS ENUM(
|
||||
'READ',
|
||||
'UPDATE',
|
||||
'DELETE',
|
||||
'ADMINISTER'
|
||||
);
|
||||
|
||||
--
|
||||
-- System permission types
|
||||
--
|
||||
|
||||
CREATE TYPE guacamole_system_permission_type AS ENUM(
|
||||
'CREATE_CONNECTION',
|
||||
'CREATE_CONNECTION_GROUP',
|
||||
'CREATE_SHARING_PROFILE',
|
||||
'CREATE_USER',
|
||||
'CREATE_USER_GROUP',
|
||||
'ADMINISTER'
|
||||
);
|
||||
|
||||
--
|
||||
-- Guacamole proxy (guacd) encryption methods
|
||||
--
|
||||
|
||||
CREATE TYPE guacamole_proxy_encryption_method AS ENUM(
|
||||
'NONE',
|
||||
'SSL'
|
||||
);
|
||||
|
||||
--
|
||||
-- Table of connection groups. Each connection group has a name.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_group (
|
||||
|
||||
connection_group_id serial NOT NULL,
|
||||
parent_id integer,
|
||||
connection_group_name varchar(128) NOT NULL,
|
||||
type guacamole_connection_group_type
|
||||
NOT NULL DEFAULT 'ORGANIZATIONAL',
|
||||
|
||||
-- Concurrency limits
|
||||
max_connections integer,
|
||||
max_connections_per_user integer,
|
||||
enable_session_affinity boolean NOT NULL DEFAULT FALSE,
|
||||
|
||||
PRIMARY KEY (connection_group_id),
|
||||
|
||||
CONSTRAINT connection_group_name_parent
|
||||
UNIQUE (connection_group_name, parent_id),
|
||||
|
||||
CONSTRAINT guacamole_connection_group_ibfk_1
|
||||
FOREIGN KEY (parent_id)
|
||||
REFERENCES guacamole_connection_group (connection_group_id)
|
||||
ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_group_parent_id
|
||||
ON guacamole_connection_group(parent_id);
|
||||
|
||||
--
|
||||
-- Table of connections. Each connection has a name, protocol, and
|
||||
-- associated set of parameters.
|
||||
-- A connection may belong to a connection group.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection (
|
||||
|
||||
connection_id serial NOT NULL,
|
||||
connection_name varchar(128) NOT NULL,
|
||||
parent_id integer,
|
||||
protocol varchar(32) NOT NULL,
|
||||
|
||||
-- Concurrency limits
|
||||
max_connections integer,
|
||||
max_connections_per_user integer,
|
||||
|
||||
-- Connection Weight
|
||||
connection_weight integer,
|
||||
failover_only boolean NOT NULL DEFAULT FALSE,
|
||||
|
||||
-- Guacamole proxy (guacd) overrides
|
||||
proxy_port integer,
|
||||
proxy_hostname varchar(512),
|
||||
proxy_encryption_method guacamole_proxy_encryption_method,
|
||||
|
||||
PRIMARY KEY (connection_id),
|
||||
|
||||
CONSTRAINT connection_name_parent
|
||||
UNIQUE (connection_name, parent_id),
|
||||
|
||||
CONSTRAINT guacamole_connection_ibfk_1
|
||||
FOREIGN KEY (parent_id)
|
||||
REFERENCES guacamole_connection_group (connection_group_id)
|
||||
ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_parent_id
|
||||
ON guacamole_connection(parent_id);
|
||||
|
||||
--
|
||||
-- Table of base entities which may each be either a user or user group. Other
|
||||
-- tables which represent qualities shared by both users and groups will point
|
||||
-- to guacamole_entity, while tables which represent qualities specific to
|
||||
-- users or groups will point to guacamole_user or guacamole_user_group.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_entity (
|
||||
|
||||
entity_id serial NOT NULL,
|
||||
name varchar(128) NOT NULL,
|
||||
type guacamole_entity_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id),
|
||||
|
||||
CONSTRAINT guacamole_entity_name_scope
|
||||
UNIQUE (type, name)
|
||||
|
||||
);
|
||||
|
||||
--
|
||||
-- Table of users. Each user has a unique username and a hashed password
|
||||
-- with corresponding salt. Although the authentication system will always set
|
||||
-- salted passwords, other systems may set unsalted passwords by simply not
|
||||
-- providing the salt.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user (
|
||||
|
||||
user_id serial NOT NULL,
|
||||
entity_id integer NOT NULL,
|
||||
|
||||
-- Optionally-salted password
|
||||
password_hash bytea NOT NULL,
|
||||
password_salt bytea,
|
||||
password_date timestamptz NOT NULL,
|
||||
|
||||
-- Account disabled/expired status
|
||||
disabled boolean NOT NULL DEFAULT FALSE,
|
||||
expired boolean NOT NULL DEFAULT FALSE,
|
||||
|
||||
-- Time-based access restriction
|
||||
access_window_start time,
|
||||
access_window_end time,
|
||||
|
||||
-- Date-based access restriction
|
||||
valid_from date,
|
||||
valid_until date,
|
||||
|
||||
-- Timezone used for all date/time comparisons and interpretation
|
||||
timezone varchar(64),
|
||||
|
||||
-- Profile information
|
||||
full_name varchar(256),
|
||||
email_address varchar(256),
|
||||
organization varchar(256),
|
||||
organizational_role varchar(256),
|
||||
|
||||
PRIMARY KEY (user_id),
|
||||
|
||||
CONSTRAINT guacamole_user_single_entity
|
||||
UNIQUE (entity_id),
|
||||
|
||||
CONSTRAINT guacamole_user_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id)
|
||||
ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
--
|
||||
-- Table of user groups. Each user group may have an arbitrary set of member
|
||||
-- users and member groups, with those members inheriting the permissions
|
||||
-- granted to that group.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_group (
|
||||
|
||||
user_group_id serial NOT NULL,
|
||||
entity_id integer NOT NULL,
|
||||
|
||||
-- Group disabled status
|
||||
disabled boolean NOT NULL DEFAULT FALSE,
|
||||
|
||||
PRIMARY KEY (user_group_id),
|
||||
|
||||
CONSTRAINT guacamole_user_group_single_entity
|
||||
UNIQUE (entity_id),
|
||||
|
||||
CONSTRAINT guacamole_user_group_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id)
|
||||
ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
--
|
||||
-- Table of users which are members of given user groups.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_group_member (
|
||||
|
||||
user_group_id integer NOT NULL,
|
||||
member_entity_id integer NOT NULL,
|
||||
|
||||
PRIMARY KEY (user_group_id, member_entity_id),
|
||||
|
||||
-- Parent must be a user group
|
||||
CONSTRAINT guacamole_user_group_member_parent
|
||||
FOREIGN KEY (user_group_id)
|
||||
REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE,
|
||||
|
||||
-- Member may be either a user or a user group (any entity)
|
||||
CONSTRAINT guacamole_user_group_member_entity
|
||||
FOREIGN KEY (member_entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
--
|
||||
-- Table of sharing profiles. Each sharing profile has a name, associated set
|
||||
-- of parameters, and a primary connection. The primary connection is the
|
||||
-- connection that the sharing profile shares, and the parameters dictate the
|
||||
-- restrictions/features which apply to the user joining the connection via the
|
||||
-- sharing profile.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_sharing_profile (
|
||||
|
||||
sharing_profile_id serial NOT NULL,
|
||||
sharing_profile_name varchar(128) NOT NULL,
|
||||
primary_connection_id integer NOT NULL,
|
||||
|
||||
PRIMARY KEY (sharing_profile_id),
|
||||
|
||||
CONSTRAINT sharing_profile_name_primary
|
||||
UNIQUE (sharing_profile_name, primary_connection_id),
|
||||
|
||||
CONSTRAINT guacamole_sharing_profile_ibfk_1
|
||||
FOREIGN KEY (primary_connection_id)
|
||||
REFERENCES guacamole_connection (connection_id)
|
||||
ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_sharing_profile_primary_connection_id
|
||||
ON guacamole_sharing_profile(primary_connection_id);
|
||||
|
||||
--
|
||||
-- Table of connection parameters. Each parameter is simply a name/value pair
|
||||
-- associated with a connection.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_parameter (
|
||||
|
||||
connection_id integer NOT NULL,
|
||||
parameter_name varchar(128) NOT NULL,
|
||||
parameter_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (connection_id,parameter_name),
|
||||
|
||||
CONSTRAINT guacamole_connection_parameter_ibfk_1
|
||||
FOREIGN KEY (connection_id)
|
||||
REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_parameter_connection_id
|
||||
ON guacamole_connection_parameter(connection_id);
|
||||
|
||||
--
|
||||
-- Table of sharing profile parameters. Each parameter is simply
|
||||
-- name/value pair associated with a sharing profile. These parameters dictate
|
||||
-- the restrictions/features which apply to the user joining the associated
|
||||
-- connection via the sharing profile.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_sharing_profile_parameter (
|
||||
|
||||
sharing_profile_id integer NOT NULL,
|
||||
parameter_name varchar(128) NOT NULL,
|
||||
parameter_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (sharing_profile_id, parameter_name),
|
||||
|
||||
CONSTRAINT guacamole_sharing_profile_parameter_ibfk_1
|
||||
FOREIGN KEY (sharing_profile_id)
|
||||
REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_sharing_profile_parameter_sharing_profile_id
|
||||
ON guacamole_sharing_profile_parameter(sharing_profile_id);
|
||||
|
||||
--
|
||||
-- Table of arbitrary user attributes. Each attribute is simply a name/value
|
||||
-- pair associated with a user. Arbitrary attributes are defined by other
|
||||
-- extensions. Attributes defined by this extension will be mapped to
|
||||
-- properly-typed columns of a specific table.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_attribute (
|
||||
|
||||
user_id integer NOT NULL,
|
||||
attribute_name varchar(128) NOT NULL,
|
||||
attribute_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (user_id, attribute_name),
|
||||
|
||||
CONSTRAINT guacamole_user_attribute_ibfk_1
|
||||
FOREIGN KEY (user_id)
|
||||
REFERENCES guacamole_user (user_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_attribute_user_id
|
||||
ON guacamole_user_attribute(user_id);
|
||||
|
||||
--
|
||||
-- Table of arbitrary user group attributes. Each attribute is simply a
|
||||
-- name/value pair associated with a user group. Arbitrary attributes are
|
||||
-- defined by other extensions. Attributes defined by this extension will be
|
||||
-- mapped to properly-typed columns of a specific table.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_group_attribute (
|
||||
|
||||
user_group_id integer NOT NULL,
|
||||
attribute_name varchar(128) NOT NULL,
|
||||
attribute_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (user_group_id, attribute_name),
|
||||
|
||||
CONSTRAINT guacamole_user_group_attribute_ibfk_1
|
||||
FOREIGN KEY (user_group_id)
|
||||
REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_group_attribute_user_group_id
|
||||
ON guacamole_user_group_attribute(user_group_id);
|
||||
|
||||
--
|
||||
-- Table of arbitrary connection attributes. Each attribute is simply a
|
||||
-- name/value pair associated with a connection. Arbitrary attributes are
|
||||
-- defined by other extensions. Attributes defined by this extension will be
|
||||
-- mapped to properly-typed columns of a specific table.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_attribute (
|
||||
|
||||
connection_id integer NOT NULL,
|
||||
attribute_name varchar(128) NOT NULL,
|
||||
attribute_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (connection_id, attribute_name),
|
||||
|
||||
CONSTRAINT guacamole_connection_attribute_ibfk_1
|
||||
FOREIGN KEY (connection_id)
|
||||
REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_attribute_connection_id
|
||||
ON guacamole_connection_attribute(connection_id);
|
||||
|
||||
--
|
||||
-- Table of arbitrary connection group attributes. Each attribute is simply a
|
||||
-- name/value pair associated with a connection group. Arbitrary attributes are
|
||||
-- defined by other extensions. Attributes defined by this extension will be
|
||||
-- mapped to properly-typed columns of a specific table.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_group_attribute (
|
||||
|
||||
connection_group_id integer NOT NULL,
|
||||
attribute_name varchar(128) NOT NULL,
|
||||
attribute_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (connection_group_id, attribute_name),
|
||||
|
||||
CONSTRAINT guacamole_connection_group_attribute_ibfk_1
|
||||
FOREIGN KEY (connection_group_id)
|
||||
REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_group_attribute_connection_group_id
|
||||
ON guacamole_connection_group_attribute(connection_group_id);
|
||||
|
||||
--
|
||||
-- Table of arbitrary sharing profile attributes. Each attribute is simply a
|
||||
-- name/value pair associated with a sharing profile. Arbitrary attributes are
|
||||
-- defined by other extensions. Attributes defined by this extension will be
|
||||
-- mapped to properly-typed columns of a specific table.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_sharing_profile_attribute (
|
||||
|
||||
sharing_profile_id integer NOT NULL,
|
||||
attribute_name varchar(128) NOT NULL,
|
||||
attribute_value varchar(4096) NOT NULL,
|
||||
|
||||
PRIMARY KEY (sharing_profile_id, attribute_name),
|
||||
|
||||
CONSTRAINT guacamole_sharing_profile_attribute_ibfk_1
|
||||
FOREIGN KEY (sharing_profile_id)
|
||||
REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_sharing_profile_attribute_sharing_profile_id
|
||||
ON guacamole_sharing_profile_attribute(sharing_profile_id);
|
||||
|
||||
--
|
||||
-- Table of connection permissions. Each connection permission grants a user or
|
||||
-- user group specific access to a connection.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
connection_id integer NOT NULL,
|
||||
permission guacamole_object_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, connection_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_connection_permission_ibfk_1
|
||||
FOREIGN KEY (connection_id)
|
||||
REFERENCES guacamole_connection (connection_id) ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT guacamole_connection_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_permission_connection_id
|
||||
ON guacamole_connection_permission(connection_id);
|
||||
|
||||
CREATE INDEX guacamole_connection_permission_entity_id
|
||||
ON guacamole_connection_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of connection group permissions. Each group permission grants a user
|
||||
-- or user group specific access to a connection group.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_group_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
connection_group_id integer NOT NULL,
|
||||
permission guacamole_object_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, connection_group_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_connection_group_permission_ibfk_1
|
||||
FOREIGN KEY (connection_group_id)
|
||||
REFERENCES guacamole_connection_group (connection_group_id) ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT guacamole_connection_group_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_group_permission_connection_group_id
|
||||
ON guacamole_connection_group_permission(connection_group_id);
|
||||
|
||||
CREATE INDEX guacamole_connection_group_permission_entity_id
|
||||
ON guacamole_connection_group_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of sharing profile permissions. Each sharing profile permission grants
|
||||
-- a user or user group specific access to a sharing profile.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_sharing_profile_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
sharing_profile_id integer NOT NULL,
|
||||
permission guacamole_object_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, sharing_profile_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_sharing_profile_permission_ibfk_1
|
||||
FOREIGN KEY (sharing_profile_id)
|
||||
REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT guacamole_sharing_profile_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_sharing_profile_permission_sharing_profile_id
|
||||
ON guacamole_sharing_profile_permission(sharing_profile_id);
|
||||
|
||||
CREATE INDEX guacamole_sharing_profile_permission_entity_id
|
||||
ON guacamole_sharing_profile_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of system permissions. Each system permission grants a user or user
|
||||
-- group a system-level privilege of some kind.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_system_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
permission guacamole_system_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_system_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_system_permission_entity_id
|
||||
ON guacamole_system_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of user permissions. Each user permission grants a user or user group
|
||||
-- access to another user (the "affected" user) for a specific type of
|
||||
-- operation.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
affected_user_id integer NOT NULL,
|
||||
permission guacamole_object_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, affected_user_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_user_permission_ibfk_1
|
||||
FOREIGN KEY (affected_user_id)
|
||||
REFERENCES guacamole_user (user_id) ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT guacamole_user_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_permission_affected_user_id
|
||||
ON guacamole_user_permission(affected_user_id);
|
||||
|
||||
CREATE INDEX guacamole_user_permission_entity_id
|
||||
ON guacamole_user_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of user group permissions. Each user group permission grants a user
|
||||
-- or user group access to a another user group (the "affected" user group) for
|
||||
-- a specific type of operation.
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_group_permission (
|
||||
|
||||
entity_id integer NOT NULL,
|
||||
affected_user_group_id integer NOT NULL,
|
||||
permission guacamole_object_permission_type NOT NULL,
|
||||
|
||||
PRIMARY KEY (entity_id, affected_user_group_id, permission),
|
||||
|
||||
CONSTRAINT guacamole_user_group_permission_affected_user_group
|
||||
FOREIGN KEY (affected_user_group_id)
|
||||
REFERENCES guacamole_user_group (user_group_id) ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT guacamole_user_group_permission_entity
|
||||
FOREIGN KEY (entity_id)
|
||||
REFERENCES guacamole_entity (entity_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_group_permission_affected_user_group_id
|
||||
ON guacamole_user_group_permission(affected_user_group_id);
|
||||
|
||||
CREATE INDEX guacamole_user_group_permission_entity_id
|
||||
ON guacamole_user_group_permission(entity_id);
|
||||
|
||||
--
|
||||
-- Table of connection history records. Each record defines a specific user's
|
||||
-- session, including the connection used, the start time, and the end time
|
||||
-- (if any).
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_connection_history (
|
||||
|
||||
history_id serial NOT NULL,
|
||||
user_id integer DEFAULT NULL,
|
||||
username varchar(128) NOT NULL,
|
||||
remote_host varchar(256) DEFAULT NULL,
|
||||
connection_id integer DEFAULT NULL,
|
||||
connection_name varchar(128) NOT NULL,
|
||||
sharing_profile_id integer DEFAULT NULL,
|
||||
sharing_profile_name varchar(128) DEFAULT NULL,
|
||||
start_date timestamptz NOT NULL,
|
||||
end_date timestamptz DEFAULT NULL,
|
||||
|
||||
PRIMARY KEY (history_id),
|
||||
|
||||
CONSTRAINT guacamole_connection_history_ibfk_1
|
||||
FOREIGN KEY (user_id)
|
||||
REFERENCES guacamole_user (user_id) ON DELETE SET NULL,
|
||||
|
||||
CONSTRAINT guacamole_connection_history_ibfk_2
|
||||
FOREIGN KEY (connection_id)
|
||||
REFERENCES guacamole_connection (connection_id) ON DELETE SET NULL,
|
||||
|
||||
CONSTRAINT guacamole_connection_history_ibfk_3
|
||||
FOREIGN KEY (sharing_profile_id)
|
||||
REFERENCES guacamole_sharing_profile (sharing_profile_id) ON DELETE SET NULL
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_user_id
|
||||
ON guacamole_connection_history(user_id);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_connection_id
|
||||
ON guacamole_connection_history(connection_id);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_sharing_profile_id
|
||||
ON guacamole_connection_history(sharing_profile_id);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_start_date
|
||||
ON guacamole_connection_history(start_date);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_end_date
|
||||
ON guacamole_connection_history(end_date);
|
||||
|
||||
CREATE INDEX guacamole_connection_history_connection_id_start_date
|
||||
ON guacamole_connection_history(connection_id, start_date);
|
||||
|
||||
--
|
||||
-- User login/logout history
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_history (
|
||||
|
||||
history_id serial NOT NULL,
|
||||
user_id integer DEFAULT NULL,
|
||||
username varchar(128) NOT NULL,
|
||||
remote_host varchar(256) DEFAULT NULL,
|
||||
start_date timestamptz NOT NULL,
|
||||
end_date timestamptz DEFAULT NULL,
|
||||
|
||||
PRIMARY KEY (history_id),
|
||||
|
||||
CONSTRAINT guacamole_user_history_ibfk_1
|
||||
FOREIGN KEY (user_id)
|
||||
REFERENCES guacamole_user (user_id) ON DELETE SET NULL
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_history_user_id
|
||||
ON guacamole_user_history(user_id);
|
||||
|
||||
CREATE INDEX guacamole_user_history_start_date
|
||||
ON guacamole_user_history(start_date);
|
||||
|
||||
CREATE INDEX guacamole_user_history_end_date
|
||||
ON guacamole_user_history(end_date);
|
||||
|
||||
CREATE INDEX guacamole_user_history_user_id_start_date
|
||||
ON guacamole_user_history(user_id, start_date);
|
||||
|
||||
--
|
||||
-- User password history
|
||||
--
|
||||
|
||||
CREATE TABLE guacamole_user_password_history (
|
||||
|
||||
password_history_id serial NOT NULL,
|
||||
user_id integer NOT NULL,
|
||||
|
||||
-- Salted password
|
||||
password_hash bytea NOT NULL,
|
||||
password_salt bytea,
|
||||
password_date timestamptz NOT NULL,
|
||||
|
||||
PRIMARY KEY (password_history_id),
|
||||
|
||||
CONSTRAINT guacamole_user_password_history_ibfk_1
|
||||
FOREIGN KEY (user_id)
|
||||
REFERENCES guacamole_user (user_id) ON DELETE CASCADE
|
||||
|
||||
);
|
||||
|
||||
CREATE INDEX guacamole_user_password_history_user_id
|
||||
ON guacamole_user_password_history(user_id);
|
||||
|
||||
--
|
||||
-- Licensed to the Apache Software Foundation (ASF) under one
|
||||
-- or more contributor license agreements. See the NOTICE file
|
||||
-- distributed with this work for additional information
|
||||
-- regarding copyright ownership. The ASF licenses this file
|
||||
-- to you under the Apache License, Version 2.0 (the
|
||||
-- "License"); you may not use this file except in compliance
|
||||
-- with the License. You may obtain a copy of the License at
|
||||
--
|
||||
-- http://www.apache.org/licenses/LICENSE-2.0
|
||||
--
|
||||
-- Unless required by applicable law or agreed to in writing,
|
||||
-- software distributed under the License is distributed on an
|
||||
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
-- KIND, either express or implied. See the License for the
|
||||
-- specific language governing permissions and limitations
|
||||
-- under the License.
|
||||
--
|
||||
|
||||
-- Create default user "guacadmin" with password "guacadmin"
|
||||
INSERT INTO guacamole_entity (name, type) VALUES ('guacadmin', 'USER');
|
||||
INSERT INTO guacamole_user (entity_id, password_hash, password_salt, password_date)
|
||||
SELECT
|
||||
entity_id,
|
||||
decode('CA458A7D494E3BE824F5E1E175A1556C0F8EEF2C2D7DF3633BEC4A29C4411960', 'hex'), -- 'guacadmin'
|
||||
decode('FE24ADC5E11E2B25288D1704ABE67A79E342ECC26064CE69C5B3177795A82264', 'hex'),
|
||||
CURRENT_TIMESTAMP
|
||||
FROM guacamole_entity WHERE name = 'guacadmin' AND guacamole_entity.type = 'USER';
|
||||
|
||||
-- Grant this user all system permissions
|
||||
INSERT INTO guacamole_system_permission (entity_id, permission)
|
||||
SELECT entity_id, permission::guacamole_system_permission_type
|
||||
FROM (
|
||||
VALUES
|
||||
('guacadmin', 'CREATE_CONNECTION'),
|
||||
('guacadmin', 'CREATE_CONNECTION_GROUP'),
|
||||
('guacadmin', 'CREATE_SHARING_PROFILE'),
|
||||
('guacadmin', 'CREATE_USER'),
|
||||
('guacadmin', 'CREATE_USER_GROUP'),
|
||||
('guacadmin', 'ADMINISTER')
|
||||
) permissions (username, permission)
|
||||
JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER';
|
||||
|
||||
-- Grant admin permission to read/update/administer self
|
||||
INSERT INTO guacamole_user_permission (entity_id, affected_user_id, permission)
|
||||
SELECT guacamole_entity.entity_id, guacamole_user.user_id, permission::guacamole_object_permission_type
|
||||
FROM (
|
||||
VALUES
|
||||
('guacadmin', 'guacadmin', 'READ'),
|
||||
('guacadmin', 'guacadmin', 'UPDATE'),
|
||||
('guacadmin', 'guacadmin', 'ADMINISTER')
|
||||
) permissions (username, affected_username, permission)
|
||||
JOIN guacamole_entity ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER'
|
||||
JOIN guacamole_entity affected ON permissions.affected_username = affected.name AND guacamole_entity.type = 'USER'
|
||||
JOIN guacamole_user ON guacamole_user.entity_id = affected.entity_id;
|
|
@ -0,0 +1,2 @@
|
|||
docker build letsencrypt-nginx -t ${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
||||
docker push ${LOCAL_DOCKER_REGISTRY}/letsencrypt-nginx
|
|
@ -0,0 +1,3 @@
|
|||
FROM staticfloat/nginx-certbot
|
||||
COPY run.sh /
|
||||
CMD sh /run.sh
|
|
@ -0,0 +1,3 @@
|
|||
ARG image
|
||||
FROM $image
|
||||
COPY ./conf/blog.conf /etc/nginx/user.conf.d/server._conf
|
|
@ -0,0 +1,3 @@
|
|||
ARG image
|
||||
FROM $image
|
||||
COPY ./conf/chat.conf /etc/nginx/user.conf.d/server._conf
|
|
@ -0,0 +1,3 @@
|
|||
ARG image
|
||||
FROM $image
|
||||
COPY ./conf/drone.conf /etc/nginx/user.conf.d/server._conf
|
|
@ -0,0 +1,3 @@
|
|||
ARG image
|
||||
FROM $image
|
||||
COPY ./conf/git.conf /etc/nginx/user.conf.d/server._conf
|
|
@ -0,0 +1,3 @@
|
|||
ARG image
|
||||
FROM $image
|
||||
COPY ./conf/remote.conf /etc/nginx/user.conf.d/server._conf
|
|
@ -0,0 +1,3 @@
|
|||
set -e
|
||||
docker build . -f Dockerfile.$1 --build-arg image=$2/letsencrypt-nginx -t $2/letsencrypt-$1
|
||||
docker push $2/letsencrypt-$1
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://${DOLLAR}host${DOLLAR}request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen 444
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location / {
|
||||
proxy_set_header Host ${DOLLAR}http_host;
|
||||
proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
|
||||
proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto ${DOLLAR}scheme;
|
||||
proxy_buffering off;
|
||||
proxy_pass ${PROXY_PASS};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://${DOLLAR}host${DOLLAR}request_uri;
|
||||
}
|
||||
}
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen on port 80
|
||||
# listen 443
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location /sockjs {
|
||||
proxy_pass ${PROXY_PASS}sockjs;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host ${DOLLAR}host;
|
||||
}
|
||||
location /sockjs/ {
|
||||
proxy_pass ${PROXY_PASS}sockjs/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host ${DOLLAR}host;
|
||||
}
|
||||
location / {
|
||||
proxy_pass ${PROXY_PASS};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://${DOLLAR}host${DOLLAR}request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen 444
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location / {
|
||||
proxy_pass ${PROXY_PASS} ;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://${DOLLAR}host${DOLLAR}request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen 444
|
||||
listen 5000 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location / {
|
||||
proxy_pass http://drone-server:8080/;
|
||||
}
|
||||
}
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen 444
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location ${LOCATION} {
|
||||
proxy_pass ${PROXY_PASS};
|
||||
}
|
||||
location ${BLOG_LOCATION} {
|
||||
proxy_set_header Host ${DOLLAR}http_host;
|
||||
proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
|
||||
proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto ${DOLLAR}scheme;
|
||||
proxy_buffering off;
|
||||
proxy_pass ${BLOG_PROXY_PASS};
|
||||
}
|
||||
|
||||
location ${CHAT_LOCATION}sockjs {
|
||||
proxy_pass ${CHAT_PROXY_PASS}/chat/sockjs;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host ${DOLLAR}host;
|
||||
proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
|
||||
proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forward-Proto http;
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_redirect off;
|
||||
|
||||
}
|
||||
location ${CHAT_LOCATION}sockjs/ {
|
||||
proxy_pass ${CHAT_PROXY_PASS}/chat/sockjs/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host ${DOLLAR}host;
|
||||
proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
|
||||
proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forward-Proto http;
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_redirect off;
|
||||
|
||||
|
||||
}
|
||||
location ${CHAT_LOCATION} {
|
||||
proxy_pass ${CHAT_PROXY_PASS};
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host ${DOLLAR}http_host;
|
||||
proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
|
||||
proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forward-Proto http;
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_redirect off;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://${DOLLAR}host${DOLLAR}request_uri;
|
||||
}
|
||||
}
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen on port 80
|
||||
# listen 443
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/${SERVER_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${SERVER_NAME}/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name ${SERVER_NAME};
|
||||
|
||||
location /websocket-tunnel {
|
||||
proxy_pass ${PROXY_PASS}websocket-tunnel;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade ${DOLLAR}http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host ${DOLLAR}host;
|
||||
}
|
||||
location / {
|
||||
proxy_pass ${PROXY_PASS};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
listen 80;
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
|
||||
# save logs here
|
||||
|
||||
server_name sigyl.com;
|
||||
|
||||
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
# resolver 127.0.0.11 valid=30s; ## internal docker dns
|
||||
#listen [::]:3011 default ipv6only=on; ## listen for ipv6
|
||||
# listen 444
|
||||
listen 443 ssl;
|
||||
# this should allow large docs
|
||||
client_header_timeout 120s;
|
||||
client_body_timeout 120s;
|
||||
client_max_body_size 200m;
|
||||
ssl_certificate /etc/letsencrypt/live/sigyl.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/sigyl.com/privkey.pem;
|
||||
# save logs here
|
||||
#access_log /var/log/nginx/access.log compression;
|
||||
|
||||
server_name sigyl.com;
|
||||
|
||||
location /git/ {
|
||||
proxy_pass http://gitea:3000/;
|
||||
}
|
||||
location /blog/ {
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_buffering off;
|
||||
proxy_pass http://ghost:2368;
|
||||
}
|
||||
|
||||
location /chat/sockjs {
|
||||
proxy_pass http://chat:3000sockjs;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
}
|
||||
location /chat/sockjs/ {
|
||||
proxy_pass http://chat:3000sockjs/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
}
|
||||
location /chat/ {
|
||||
proxy_pass http://chat:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forward-Proto http;
|
||||
proxy_set_header X-Nginx-Proxy true;
|
||||
proxy_redirect off;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
templating scripts from /etc/nginx/user.conf.d to /etc/nginx/conf.d
|
||||
Substituting variables
|
|
@ -0,0 +1,4 @@
|
|||
export DOLLAR='$'
|
||||
envsubst < /etc/nginx/user.conf.d/server._conf > /etc/nginx/user.conf.d/server.conf
|
||||
cat /etc/nginx/user.conf.d/server.conf
|
||||
/bin/bash /scripts/entrypoint.sh
|
|
@ -0,0 +1,2 @@
|
|||
docker build ngrok2 -t ${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
||||
docker push ${LOCAL_DOCKER_REGISTRY}/ngrok-gitea
|
|
@ -0,0 +1,5 @@
|
|||
FROM wernight/ngrok
|
||||
COPY run.sh /
|
||||
USER root
|
||||
RUN apk add gettext # enables envsubst
|
||||
CMD sh /run.sh
|
|
@ -0,0 +1,41 @@
|
|||
web_addr: 0.0.0.0:4040
|
||||
update: false
|
||||
log: stdout
|
||||
region: eu
|
||||
tunnels:
|
||||
gitea:
|
||||
addr: letsencrypt-git:80
|
||||
proto: http
|
||||
hostname: ${GIT_DOMAIN}
|
||||
bind-tls: false
|
||||
gitea-tls:
|
||||
addr: letsencrypt-git:443
|
||||
proto: tls
|
||||
hostname: ${GIT_DOMAIN}
|
||||
drone:
|
||||
addr: letsencrypt-drone:80
|
||||
proto: http
|
||||
hostname: ${DRONE_DOMAIN}
|
||||
bind_tls: false
|
||||
drone-tls:
|
||||
addr: letsencrypt-drone:443
|
||||
proto: tls
|
||||
hostname: ${DRONE_DOMAIN}
|
||||
#blog:
|
||||
# addr: letsencrypt-blog:80
|
||||
# proto: http
|
||||
# hostname: ${BLOG_DOMAIN}
|
||||
# bind-tls: false
|
||||
#blog-tls:
|
||||
# addr: letsencrypt-blog:443
|
||||
# proto: tls
|
||||
# hostname: ${BLOG_DOMAIN}
|
||||
#chat:
|
||||
# addr: letsencrypt-chat:80
|
||||
# proto: http
|
||||
# hostname: ${CHAT_DOMAIN}
|
||||
# bind_tls: false
|
||||
#chat-tls:
|
||||
# addr: letsencrypt-chat:443
|
||||
# proto: tls
|
||||
# hostname: ${CHAT_DOMAIN}
|
|
@ -0,0 +1,24 @@
|
|||
web_addr: 0.0.0.0:4040
|
||||
update: false
|
||||
log: stdout
|
||||
region: eu
|
||||
tunnels:
|
||||
drone:
|
||||
addr: letsencrypt-drone:80
|
||||
proto: http
|
||||
hostname: ${DRONE_DOMAIN}
|
||||
bind_tls: false
|
||||
drone-tls:
|
||||
addr: letsencrypt-drone:443
|
||||
proto: tls
|
||||
hostname: ${DRONE_DOMAIN}
|
||||
remote:
|
||||
addr: letsencrypt-remote:80
|
||||
proto: http
|
||||
hostname: ${REMOTE_DOMAIN}
|
||||
bind-tls: false
|
||||
remote-tls:
|
||||
addr: letsencrypt-remote:443
|
||||
proto: tls
|
||||
hostname: ${REMOTE_DOMAIN}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
cat /run/secrets/ngrok-auth-token /home/ngrok/.ngrok2/ngrok._yml > /home/ngrok/.ngrok2/ngrok.__yml
|
||||
envsubst < /home/ngrok/.ngrok2/ngrok.__yml > /home/ngrok/.ngrok2/ngrok.yml
|
||||
ngrok start --all --config /home/ngrok/.ngrok2/ngrok.yml
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
docker build guacamole-postgresql -t ${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
||||
docker push ${LOCAL_DOCKER_REGISTRY}/guacamole-postgresql
|
Reference in New Issue