Skip to content

Commit 4229510

Browse files
authored
Merge pull request #22 from Monadical-SAS/afreydev/improvements-0.1.1
Improvements version 0.1.1
2 parents c9978f5 + 9605a1c commit 4229510

24 files changed

Lines changed: 431 additions & 154 deletions

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,10 @@ next-env.d.ts
4343
**/.env
4444

4545
apps/homer/etc/config.yaml
46+
apps/homer/config/config.yml
4647
etc/basedomain.txt
48+
etc/default_admin_email.txt
49+
etc/environment.txt
50+
etc/config.yaml
51+
52+
etc/supervisor/conf.d/*

Dockerfile.manager

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ RUN apt-get update -y && apt-get install -y \
2020
git \
2121
apache2-utils
2222

23+
RUN curl -L https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq && \
24+
chmod +x /usr/bin/yq
25+
2326
RUN python3 -m pip install virtualenv && \
2427
virtualenv "/opt/$VENV_NAME"
2528

README.md

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,19 @@ Get up and running in minutes with our automated installer that configures every
6363

6464
3. Configure Let's Encrypt for SSL certificates:
6565
```bash
66-
docker compose run --rm manager shtool setup_letsencrypt <domain> <email> [traefik_username] [traefik_password]
66+
docker compose run --rm manager shtool setup_letsencrypt <domain> <email> [traefik_username] [traefik_password] [environment]
6767
```
6868

6969
Parameters:
7070
- `<domain>`: Your domain name (required)
7171
- `<email>`: Email for Let's Encrypt notifications (required)
7272
- `[username]`: Admin username (optional, defaults to "admin")
7373
- `[password]`: Admin password (optional, auto-generated if not specified)
74+
- `[environment]`: Environment type - "prod" or "dev" (optional, defaults to "prod")
7475

7576
Example:
7677
```bash
77-
docker compose run --rm manager shtool setup_letsencrypt example.com admin@example.com myadmin mysecurepass
78+
docker compose run --rm manager shtool setup_letsencrypt example.com admin@example.com myadmin mysecurepass prod
7879
```
7980
Note: If password is omitted, a secure random password will be generated.
8081

@@ -99,6 +100,24 @@ Get up and running in minutes with our automated installer that configures every
99100
docker compose up -d
100101
```
101102

103+
## Environment Configuration
104+
105+
SelfHostYour.Tech supports two deployment environments:
106+
107+
### Production Environment (prod)
108+
- **HTTPS enabled**: All services use SSL/TLS certificates from Let's Encrypt
109+
- **Secure redirects**: HTTP traffic is automatically redirected to HTTPS
110+
- **Full SSL validation**: Complete certificate chain validation
111+
- **Recommended for**: Live deployments, production use
112+
113+
### Development Environment (dev)
114+
- **HTTP only**: Services run without SSL certificates
115+
- **No redirects**: Direct HTTP access without HTTPS enforcement
116+
- **Local development**: Suitable for localhost testing
117+
- **Recommended for**: Testing, development, local setups
118+
119+
The environment is configured during the `setup_letsencrypt` step and affects all services automatically.
120+
102121
## Starting/Stopping/Status Services
103122

104123
```bash
@@ -107,6 +126,7 @@ docker compose exec -ti manager shtool stop
107126
docker compose exec -ti manager shtool start <service>
108127
docker compose exec -ti manager shtool stop <service>
109128
docker compose exec -ti manager shtool status
129+
docker compose exec -ti manager shtool reload
110130
```
111131

112132
## Managing Services by Docker Compose wrapper
@@ -123,6 +143,64 @@ Examples:
123143
- Start a service: `docker compose run --rm manager shtool manage nextcloud up -d`
124144
- View logs: `docker compose run --rm manager shtool manage ghost logs -f`
125145

146+
## Deployment Management
147+
148+
### Deploy Individual Services
149+
150+
Deploy or redeploy a specific service:
151+
```bash
152+
docker compose run --rm manager shtool deploy <service_name> [force_rebuild]
153+
docker compose run --rm manager shtool redeploy <service_name> [force_rebuild]
154+
```
155+
156+
Examples:
157+
```bash
158+
# Deploy Nextcloud
159+
docker compose run --rm manager shtool deploy nextcloud
160+
161+
# Redeploy with forced rebuild
162+
docker compose run --rm manager shtool redeploy nextcloud true
163+
```
164+
165+
### Deploy All Services
166+
167+
Redeploy all enabled services:
168+
```bash
169+
docker compose run --rm manager shtool redeploy_all [force_rebuild]
170+
```
171+
172+
Example:
173+
```bash
174+
# Redeploy all services with forced rebuild
175+
docker compose run --rm manager shtool redeploy_all true
176+
```
177+
178+
## Data Management and Cleanup
179+
180+
### Clean All Data
181+
**⚠️ WARNING: This will permanently delete ALL data**
182+
183+
```bash
184+
docker compose run --rm manager shtool clean
185+
```
186+
187+
This command will:
188+
- Stop all services
189+
- Remove all Docker volumes
190+
- Require confirmation with a randomly generated code
191+
192+
### Clean Individual Service Data
193+
**⚠️ WARNING: This will permanently delete data for the specified service**
194+
195+
```bash
196+
docker compose run --rm manager shtool clean_app <service_name>
197+
```
198+
199+
Example:
200+
```bash
201+
docker compose run --rm manager shtool clean_app nextcloud
202+
```
203+
126204
### Application Configuration
127205

128206
Configure all applications at once:
@@ -227,6 +305,19 @@ The following services are in development or planned for future releases:
227305
- **SSL certificate problems**: Run `docker compose run --rm manager shtool setup_letsencrypt` again
228306
- **Incorrect credentials**: Reconfigure application settings with `docker compose run --rm manager shtool configure_app_settings`
229307
- **Configuration issues**: Check application-specific configuration files in the service directory
308+
- **Environment mismatch**: Ensure your environment (prod/dev) is correctly configured
309+
310+
### Environment-Specific Issues
311+
312+
**Production Environment:**
313+
- Verify domain DNS is pointing to your server
314+
- Ensure ports 80 and 443 are open and accessible
315+
- Check Let's Encrypt certificate generation in Traefik logs
316+
317+
**Development Environment:**
318+
- Services will be accessible via HTTP only
319+
- Use `localhost` or your local IP address
320+
- No SSL certificates required
230321

231322
## Best Practices
232323

@@ -235,6 +326,8 @@ The following services are in development or planned for future releases:
235326
3. Monitor system resources to ensure adequate capacity
236327
4. Implement proper security measures and network isolation
237328
5. Set up monitoring for critical services
329+
6. Use production environment for live deployments
330+
7. Test changes in development environment first
238331

239332
## Support and Community
240333

apps/authentik/bin/app_hook.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ update_env_record "PG_PASS" "$(openssl rand -hex 16)" "$ENV_FILE"
1313
update_env_record "AUTHENTIK_LISTEN__HTTP" "0.0.0.0:9000" "$ENV_FILE"
1414
update_env_record "AUTHENTIK_LISTEN__HTTPS" "0.0.0.0:9443" "$ENV_FILE"
1515

16-
BASE_DOMAIN_VALUE=$(cat "$ROOT/etc/basedomain.txt")
16+
BASE_DOMAIN_VALUE=$(yq '.base_domain' "$SELFHOSTYOURTECH_ROOT/etc/config.yaml")
1717
add_key_in_env "BASE_DOMAIN" "$BASE_DOMAIN_VALUE" "$ENV_FILE"

apps/authentik/docker-compose.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,28 @@ services:
5252
- traefik-public
5353
- authentik-internal
5454
labels:
55-
- traefik.enable=true
55+
- traefik.enable=${ENABLE_TRAEFIK:-false}
5656
- traefik.docker.network=traefik-public
5757
# Define the service explicitly
5858
- traefik.http.services.authentik.loadbalancer.server.port=9000
5959
# HTTP router
6060
- traefik.http.routers.authentik.rule=Host(`authentik.${BASE_DOMAIN}`)
6161
- traefik.http.routers.authentik.entrypoints=web
62-
- traefik.http.routers.authentik.middlewares=redirect-to-https
62+
- "${HTTPS_MIDDLEWARE:+traefik.http.routers.authentik.middlewares=${HTTPS_MIDDLEWARE}}"
6363
# HTTPS router
6464
- traefik.http.routers.authentik-secure.rule=Host(`authentik.${BASE_DOMAIN}`)
65-
- traefik.http.routers.authentik-secure.entrypoints=websecure
66-
- traefik.http.routers.authentik-secure.tls=true
67-
- traefik.http.routers.authentik-secure.tls.certresolver=letsencrypt
65+
- traefik.http.routers.authentik-secure.entrypoints=${HTTPS_ENTRYPOINT:-}
66+
- traefik.http.routers.authentik-secure.tls=${ENABLE_TLS:-}"
67+
- traefik.http.routers.authentik-secure.tls.certresolver=${TLS_RESOLVER:-}
6868
- traefik.http.routers.authentik-secure.service=authentik
6969
# Outpost endpoints
7070
- traefik.http.routers.authentik-outpost.rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.${BASE_DOMAIN}`) && PathPrefix(`/outpost.goauthentik.io/`)
71-
- traefik.http.routers.authentik-outpost.entrypoints=websecure
72-
- traefik.http.routers.authentik-outpost.tls=true
73-
- traefik.http.routers.authentik-outpost.tls.certresolver=letsencrypt
71+
- traefik.http.routers.authentik-outpost.entrypoints=${HTTPS_ENTRYPOINT:-}
72+
- traefik.http.routers.authentik-outpost.tls=${ENABLE_TLS:-}"
73+
- traefik.http.routers.authentik-outpost.tls.certresolver=${TLS_RESOLVER:-}
7474
# HTTPS redirect middleware
75-
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
76-
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
75+
- "${REDIRECT_SCHEME:+traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=${REDIRECT_SCHEME}}"
76+
- "${REDIRECT_PERMANENT:+traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=${REDIRECT_PERMANENT}}"
7777
# Forward auth configuration
7878
- traefik.http.middlewares.authentik.forwardauth.address=http://authentik-proxy:9000/outpost.goauthentik.io/auth/traefik
7979
- traefik.http.middlewares.authentik.forwardauth.trustForwardHeader=true
@@ -103,7 +103,7 @@ services:
103103
- authentik-internal
104104

105105
networks:
106-
traefik-public:
107-
external: true
108106
authentik-internal:
109-
internal: true
107+
traefik-public:
108+
external: ${ENABLE_TRAEFIK:-false}
109+
name: ${TRAEFIK_NETWORK:-traefik-public}

apps/baserow/docker-compose.yml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ services:
22
baserow:
33
image: baserow/baserow:1.30.1
44
environment:
5-
BASEROW_PUBLIC_URL: 'https://baserow.${BASE_DOMAIN}'
5+
BASEROW_PUBLIC_URL: '${HTTP_SCHEME}://baserow.${BASE_DOMAIN}'
66
env_file:
77
- ./.env
88
networks:
@@ -11,20 +11,21 @@ services:
1111
volumes:
1212
- ./data/baserow:/baserow/data
1313
labels:
14-
- traefik.enable=true
14+
- traefik.enable=${ENABLE_TRAEFIK:-false}
1515
- traefik.docker.network=traefik-public
1616
- traefik.http.routers.baserow.rule=Host(`baserow.${BASE_DOMAIN}`)
1717
- traefik.http.routers.baserow.entrypoints=web
18-
- traefik.http.routers.baserow.middlewares=redirect-to-https
18+
- "${HTTPS_MIDDLEWARE:+traefik.http.routers.baserow.middlewares=${HTTPS_MIDDLEWARE}}"
1919
- traefik.http.routers.baserow-secure.rule=Host(`baserow.${BASE_DOMAIN}`)
20-
- traefik.http.routers.baserow-secure.entrypoints=websecure
21-
- traefik.http.routers.baserow-secure.tls=true
22-
- traefik.http.routers.baserow-secure.tls.certresolver=letsencrypt
20+
- traefik.http.routers.baserow-secure.entrypoints=${HTTPS_ENTRYPOINT:-}
21+
- traefik.http.routers.baserow-secure.tls=${ENABLE_TLS:-}"
22+
- traefik.http.routers.baserow-secure.tls.certresolver=${TLS_RESOLVER:-}
2323
- traefik.http.services.baserow.loadbalancer.server.port=80
24-
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
25-
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
24+
- "${REDIRECT_SCHEME:+traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=${REDIRECT_SCHEME}}"
25+
- "${REDIRECT_PERMANENT:+traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=${REDIRECT_PERMANENT}}"
2626
networks:
2727
internal:
2828
driver: bridge
2929
traefik-public:
30-
external: true
30+
external: ${ENABLE_TRAEFIK:-false}
31+
name: ${TRAEFIK_NETWORK:-traefik-public}

apps/docs/docker-compose.yml

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,29 @@ services:
1111
environment:
1212
- ALLOWED_ORIGINS=${BASE_DOMAIN},www.${BASE_DOMAIN}
1313
labels:
14-
- traefik.enable=true
14+
- traefik.enable=${ENABLE_TRAEFIK:-false}
1515
- traefik.docker.network=traefik-public
1616
- traefik.constraint-label=traefik-public
1717
# Main domain route
1818
- traefik.http.routers.docs-base.rule=Host(`${BASE_DOMAIN}`)
1919
- traefik.http.routers.docs-base.entrypoints=web
20-
- traefik.http.routers.docs-base.middlewares=redirect-to-https
20+
- "${HTTPS_MIDDLEWARE:+traefik.http.routers.docs-base.middlewares=${HTTPS_MIDDLEWARE}}"
2121
- traefik.http.routers.docs-base-secure.rule=Host(`${BASE_DOMAIN}`)
22-
- traefik.http.routers.docs-base-secure.entrypoints=websecure
23-
- traefik.http.routers.docs-base-secure.tls=true
24-
- traefik.http.routers.docs-base-secure.tls.certresolver=letsencrypt
22+
- traefik.http.routers.docs-base-secure.entrypoints=${HTTPS_ENTRYPOINT:-}
23+
- traefik.http.routers.docs-base-secure.tls=${ENABLE_TLS:-}"
24+
- traefik.http.routers.docs-base-secure.tls.certresolver=${TLS_RESOLVER:-}
2525
- traefik.http.routers.docs.rule=Host(`www.${BASE_DOMAIN}`)
2626
- traefik.http.routers.docs.entrypoints=web
27-
- traefik.http.routers.docs.middlewares=redirect-to-https
27+
- "${HTTPS_MIDDLEWARE:+traefik.http.routers.docs.middlewares=${HTTPS_MIDDLEWARE}}"
2828
- traefik.http.routers.docs-secure.rule=Host(`www.${BASE_DOMAIN}`)
29-
- traefik.http.routers.docs-secure.entrypoints=websecure
30-
- traefik.http.routers.docs-secure.tls=true
31-
- traefik.http.routers.docs-secure.tls.certresolver=letsencrypt
29+
- traefik.http.routers.docs-secure.entrypoints=${HTTPS_ENTRYPOINT:-}
30+
- traefik.http.routers.docs-secure.tls=${ENABLE_TLS:-}"
31+
- traefik.http.routers.docs-secure.tls.certresolver=${TLS_RESOLVER:-}
3232
- traefik.http.services.docs.loadbalancer.server.port=3000
33-
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
34-
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
33+
- "${REDIRECT_SCHEME:+traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=${REDIRECT_SCHEME}}"
34+
- "${REDIRECT_PERMANENT:+traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=${REDIRECT_PERMANENT}}"
3535

3636
networks:
3737
traefik-public:
38-
external: true
38+
external: ${ENABLE_TRAEFIK:-false}
39+
name: ${TRAEFIK_NETWORK:-traefik-public}

apps/ghost/bin/app_hook.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ update_env_record "MYSQL_USER" "ghost" "$ENV_FILE"
1111
update_env_record "MYSQL_ROOT_PASSWORD" "$(openssl rand -hex 32)" "$ENV_FILE"
1212
update_env_record "MYSQL_PASSWORD" "$(openssl rand -hex 32)" "$ENV_FILE"
1313

14-
BASE_DOMAIN_VALUE=$(cat "$SELFHOSTYOURTECH_ROOT/etc/basedomain.txt")
14+
BASE_DOMAIN_VALUE=$(yq '.base_domain' "$SELFHOSTYOURTECH_ROOT/etc/config.yaml")
1515
add_key_in_env "BASE_DOMAIN" "$BASE_DOMAIN_VALUE" "$ENV_FILE"

apps/ghost/docker-compose.yml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ services:
44
depends_on:
55
- mysql
66
networks:
7-
- ghost-internal # Add internal network for DB communication
87
- traefik-public # Keep traefik network for external access
8+
- internal
99
environment:
1010
# see https://ghost.org/docs/config/#configuration-options
1111
database__client: mysql
@@ -14,36 +14,36 @@ services:
1414
database__connection__password: "${MYSQL_PASSWORD}"
1515
database__connection__database: "${MYSQL_DATABASE}"
1616
# this url value is just an example, and is likely wrong for your environment!
17-
url: "https://ghost.${BASE_DOMAIN}" # Update to use HTTPS
17+
url: "${HTTP_SCHEME}://ghost.${BASE_DOMAIN}" # Update to use HTTPS
1818
# contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
1919
NODE_ENV: production
2020
privacy__useUpdateCheck: false
2121
# This tells Ghost to trust the X-Forwarded-Proto header from Traefik
22-
url_base: "https://ghost.${BASE_DOMAIN}"
22+
url_base: "${HTTP_SCHEME}://ghost.${BASE_DOMAIN}"
2323
server__host: "0.0.0.0"
2424
server__port: 2368
2525
trust_proxy: true
2626
volumes:
2727
- ./data/ghost:/var/lib/ghost/content
2828
labels:
29-
- traefik.enable=true
29+
- traefik.enable=${ENABLE_TRAEFIK:-false}
3030
- traefik.docker.network=traefik-public
3131
- traefik.http.services.ghost-service.loadbalancer.server.port=2368
3232
- traefik.http.routers.ghost.rule=Host(`ghost.${BASE_DOMAIN}`)
3333
- traefik.http.routers.ghost.entrypoints=web
34-
- traefik.http.routers.ghost.middlewares=redirect-to-https
34+
- "${HTTPS_MIDDLEWARE:+traefik.http.routers.ghost.middlewares=${HTTPS_MIDDLEWARE}}"
3535
- traefik.http.routers.ghost-secure.rule=Host(`ghost.${BASE_DOMAIN}`)
36-
- traefik.http.routers.ghost-secure.entrypoints=websecure
37-
- traefik.http.routers.ghost-secure.tls=true
38-
- traefik.http.routers.ghost-secure.tls.certresolver=letsencrypt
36+
- traefik.http.routers.ghost-secure.entrypoints=${HTTPS_ENTRYPOINT:-}
37+
- traefik.http.routers.ghost-secure.tls=${ENABLE_TLS:-}"
38+
- traefik.http.routers.ghost-secure.tls.certresolver=${TLS_RESOLVER:-}
3939
- traefik.http.routers.ghost-secure.service=ghost-service
40-
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
41-
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
40+
- "${REDIRECT_SCHEME:+traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=${REDIRECT_SCHEME}}"
41+
- "${REDIRECT_PERMANENT:+traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=${REDIRECT_PERMANENT}}"
4242

4343
mysql:
4444
image: mysql:8.0
4545
networks:
46-
- ghost-internal # Only internal network needed for DB
46+
- internal # Only internal network needed for DB
4747
environment:
4848
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
4949
- MYSQL_DATABASE=${MYSQL_DATABASE}
@@ -53,7 +53,7 @@ services:
5353
- ./data/mysql:/var/lib/mysql
5454

5555
networks:
56-
ghost-internal:
57-
internal: true # This makes it only accessible within the stack
56+
internal:
5857
traefik-public:
59-
external: true
58+
external: ${ENABLE_TRAEFIK:-false}
59+
name: ${TRAEFIK_NETWORK:-traefik-public}

apps/hedgedoc/bin/app_hook.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ update_env_record "POSTGRES_DB" "hedgedoc" "$ENV_FILE"
1111
update_env_record "POSTGRES_PASSWORD" "$(openssl rand -hex 16)" "$ENV_FILE"
1212
update_env_record "HD_SESSION_SECRET" "$(openssl rand -hex 32)" "$ENV_FILE"
1313

14-
BASE_DOMAIN_VALUE=$(cat "$ROOT/etc/basedomain.txt")
14+
BASE_DOMAIN_VALUE=$(yq '.base_domain' "$SELFHOSTYOURTECH_ROOT/etc/config.yaml")
1515
add_key_in_env "BASE_DOMAIN" "$BASE_DOMAIN_VALUE" "$ENV_FILE"

0 commit comments

Comments
 (0)